
51单片机对直流电机的控制(使用proteus仿真)
·
一、直流电机及其控制
(一)直流电机:输出或输入为直流电能得旋转电机,能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。
(二)直流电机的控制
1.方向控制:直流电机只有正负极,只需交换正负极就可以调节正反转。
2.转速控制:在负载变化不大的时候,加在直流电动机两端的电压大小与其速度近似成正比。
二、PWM技术
在一里,我们大概了解电机是通过电压控制转速,正负极控制方向,可到底是怎么控制电压和正负极的呢?不得不说PWM啦。
但在说之前,还得了解一下占空比:D为PWM信号的占空比:D=t1/T(即高电平持续时间比整个周期的值)
则电动机的电枢组两端电压平均值U为:U = (t1/T)*Us=D*Us
三、使用L298驱动直流电机范例
原理图如下:
原理图需要的器件如下:
其中主要是电机,电机选MOTOR或MOTOR-DC都可,剩下的电机就不要选啦,这个之所以有这么多电机,是因为我之前试错来着,当然也可以自己康康每一个电机运行起来是什么样子的,
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit ENA=P1^2;
sbit k0=P2^0;//正转
sbit k1=P2^1;//反转
sbit k2=P2^2;//加速
sbit k3=P2^3;//减速
sbit k4=P2^4;//停止
uchar Counter=0,Compare=0;
void delay(uint n)
{
uint i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<120;j++);
}
}
void Timer0_init()//100us
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x9C; //设置定时初值
TH0 = 0xFF; //设置定时初值
ET0=1;
EA=1;
TR0=1;
}
void main()
{
ENA=0;
IN1=0;
IN2=0;//一开始让电机停止
Timer0_init();
Compare=50;
while(1)
{
if(k0==0)//正转
{
delay(100);
while(!k0);
ENA=1;
IN1=1;
IN2=0;
}
else if(k1==0)//反转
{
delay(100);
while(!k1);
ENA=1;
IN1=0;
IN2=1;
}
else if(k2==0)//加速
{
delay(100);
while(!k2);
Compare=Compare+20;
}
else if(k3==0)//减速
{
delay(100);
while(!k3);
Compare=Compare-20;
}
if(k4==0)//停止
{
delay(100);
while(!k4);
ENA=0;
TR0=0;
IN1=0;
IN2=0;
}
}
}
void Timer0() interrupt 1
{
TL0 = 0x9C; //设置定时初值
TH0 = 0xFF; //设置定时初值
Counter++;
Counter%=100;
if(Counter<Compare)//如果小于占空比
{
IN1=1;
}
else
{
IN1=0;
}
}
这个代码应该是能实现效果,如果不能实现,欢迎私我讨论。
更多推荐
所有评论(0)