基于单片机的直流电机控制与仿真
(PWM)脉冲宽度调制
脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
所谓PWM,就是脉冲宽度调制技术,其具有两个很重要的参数:频率和占空比。频率,就是周期的倒数;占空比,就是高电平在一个周期内所占的比例。
本次使用了电机驱动模块是L298N
实物图如下,改模块常用直流电机的驱动
其内部结构图如下图所示
续流二极管(flyback diode),有时也称为飞轮二极管或是snubber二极管,是一种配合电感性负载使用的二极管,当电感性负载的电流有突然的变化或减少时,电感二端会产生突变电压,可能会破坏其他元件。配合续流二极管时,其电流可以较平缓地变化,避免突波电压的发生。
我们通常所说的“续流二极管”由于在电路中起到续流的作用而得名,一般选择快速恢复二极管或者肖特基二极管来作为“续流二极管”,它在电路中一般用来保护元件不被感应电压击穿或烧坏,以并联的方式接到产生感应电动势的元件两端,并与其形成回路,使其产生的高电动势在回路以续电流方式消耗,从而起到保护电路中的元件不被损坏的作用 [1] 。
本次程序实现原理通过单片机IO口输出高低电平驱动电机的正反转,然后再通过定时器产生PWM信号进而调速
定时器初始化
void motor_Init()
{
EA=1;//打开总中断
TMOD=0x01; //定时器工作方式
TH0=(65535-1000)/256; //初值约1ms
TL0=(65535-1000)%256;
ET0=1; //打开定时器中断
TR0=1; //打开定时器
}
定时器中断函数
void Time() interrupt 1
{
static unsigned char count=0;
TH0=(65535-1000)/256; //重装初值
TL0=(65535-1000)%256; //重装初值
count++;
if(count==20)count=0;
if(count>=speedA)
{
ENA=1;
}
else{
ENA=0;
}
if(count>=speedB)
{
ENB=1;
}
else{
ENB=0;
}
}
控制电机方向
void motor(unsigned char status)
{
if(status==0)
{
IN1=0;
IN2=1;
}
if(status==1)
{
IN1=1;
IN2=0;
}
if(status==3)
{
IN3=0;
IN4=1;
}
if(status==4)
{
IN3=1;
IN4=0;
}
}
通过PWM信号占空比调节AB的速度
单片机定时器产生1ms一次中断,并且通过调节speedA与speedB调节速度
PWM
两个重要的概念,频率、占空比
频率是指每秒钟信号从高电平到低电平再回到高电平的次数,为一个PWM波周期的倒数。上图中频率=1/(0.003+0.001)=250 HZ
占空比是指高电平持续时间比一个周期持续的时间。上图中占空比=1/(1+3)=25%,所以可以通过控制占空比,来控制输出的等效电压。
所以对于方波的话,频率和占空比就确定了一个波。
怎么能产生一个PWM波?
方法1:利用芯片内部模块输出PWM信号,STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM 输出! 但是!!!同一个定时器TIM只能产生一个频率的PWM波,你只能改变占空比。 具体例程见一下实战篇STM32部分。
方法2:利用IO口高低电平转变输出PWM信号,比如上图中先把电平置1,维持1ms,然后将电平拉低,维持3ms,再将电平置高,如此循环往复下去,就可以产生一个周期4毫秒占空比为25%的PWM波了。具体方法就是给IO口加一个定时器,用定时器中断来实现及时切换高低电平。 具体历程见以下51单片机部分。
定时器
要想使用51单片机来产生一路PWM,根据上述的方法2,首先你应该知道什么是定时器?定时器是怎么工作的?
定时器:和计数器说的是一个东西,因为它既能计时也能计数。定时器的实质是,由机器频率向一个16位寄存器累加,累加满溢出时触发中断。为了产生一个我们想要的时间间隔。比如说1s,所以我们要在这个寄存器里设定一个初值,以至于让它在这个初值上累加可以产生一个1s的倍数。这样我们就得到了稳定的时间间隔。
这个寄存器分为TH(高八位)和TL(低八位)。所以我们需要把计算好的初值分成两部分分别放入TH和TL。
需要的可以自己去下载哦!
需要该源码的可以关注公众号:智慧小巷
回复:PWM电机调速
即可!