什么是PWM?如何对直流电机调速?怎样通过定时器中断实现?
- 时间:
- 浏览:170
- 来源:中国微特电机网
你说这PWM,听起来怪高深的,可实际上却在咱们身边好多电器设备里都藏着!它到底是啥东西,又咋给直流电机调速?还有那定时器中断实现PWM调速,这都是啥原理?看完这篇文章,说不定你这脑袋里就跟拨云见日似的,敞亮多!
PWM基本概念
PWM也就是脉宽调制这名字特别专业。它干的事就是改变脉冲宽度,以此来控制输出的电压;改变脉冲的周期,就能控制输出的频率。这脉冲,你就把它当成IO口一次高低电平的改变,这么一想就容易理解多了。生活里好多地方都离不开这PWM,咱家里的电器设备里基本都有它的影子。
PWM可太重要,电压和频率就跟它手心手背似的,它都能掐得死死的。好多电子产品要是没了PWM,那运转得肯定乱糟糟。
PWM对直流电机调速原理
用PWM给直流电机调速的时候,得改变占空比才行。就这占空比,指的是一个脉冲循环内,通电也就是高电平的时间pwm控制电机原理,在总时间里占的比例。改变占空比,实际上就是改变脉冲宽度,电压跟着被控制,电压小了pwm控制电机原理,电机转速自然就降下来了。
这脉冲的频率对电机转速那也是有决定性作用的。脉冲频率越高,电机转动的连续性就越好。打个比方,你要是玩遥控车,调整它的速度就得靠这手法。这就是咱们通过改变占空比调整电机转速的办法。
定时器中断实现PWM调速的缘由
51单片机没有附带PWM硬件电路,这不就得想其他办法。所以大家一般会利用软件模拟PWM,这里头具体就靠定时器中断来实现PWM调速。
定时器中断来弄PWM调速,就能弥补硬件的不足。软件来搞定脉冲变化,可灵活多。市面上不少这一类需要调速的设备都采用这个方法。
改变脉冲宽度的方法
改变脉冲宽度咱利用定时器0的工作方式2,这是8位自动装填,设置TMOD = 0X02。每次计时有溢出就代表一次脉冲,改变占空比也就是在中断函数里改变脉冲宽度。就是在中断函数里面设置占空比。
打个典型的例子,不同脉冲下的电机转速实验,能直接证明咱这设置是对的。好多厂家对旗下的小电机也是这样来做参数设置的。
void timer0() interrupt 1
{
pwm_t++;
if(pwm_t == 255) //将一个周期分成256份
pwm_t = left_en = right_en = 0;
if(pwm_left_val == pwm_t)//达到pwm_left_val后开启左使能开关
left_en = 1;
if(pwm_right_val == pwm_t)//达到pwm_left_val后开启右使能开关
right_en = 1;
}
改变周期的依据
那改变周期是根据啥来弄?肯定是控制溢出时间,也就是控制TH0和TL0的初始值。这脉冲周期是定时器溢出时间和占空比总份数相乘得到的。设置周期0.01s,占空比总份数设置成256,依据这些算下来,就能知道TH0和TL0的初始值是220。
专业人士设计电路时,这样的计算就是家常便饭。经过精确计算和调试,产品性能才能得到保证。
上代码及测试情况
现在就把代码拿出来讲讲,这里代码经过亲测,可以达到预想的效果。用了这些代码,能实现咱前面说的PWM调速等功能。大家调试代码的时候,要注意各种参数的设置是不是合适。好多从事嵌入式开发的小伙伴写过类似的调试代码。
我都解说得差不多,对于这个PWM调速代码实现的难点你是咋看的?
#include
sbit left_en=P1^4;
sbit right_en=P1^5;
sbit left_advance=P1^3;
sbit left_back=P1^2;
sbit right_advance=P1^6;
sbit right_back=P1^7;
unsigned char pwm_left_val = 200;//左电机占空比值 取值范围0-170,0最快
unsigned char pwm_right_val = 0;//右电机占空比值取值范围0-170 ,0最快
unsigned char pwm_t=0;//周期计数变量
/*小车前进*/
void forward()
{
left_advance=1; //左电机前进
left_back=0;
right_advance=1; //右电机前进
right_back=0;
}
//定时器0中断
void timer0() interrupt 1
{
pwm_t++;
if(pwm_t == 255) //将一个周期分成256份
pwm_t = left_en = right_en = 0;
if(pwm_left_val == pwm_t)//达到pwm_left_val后开启左使能开关
left_en = 1;
if(pwm_right_val == pwm_t)//达到pwm_left_val后开启右使能开关
right_en = 1;
}
void main()
{
TMOD |= 0x02;//8位自动重装模块
TH0 = 220;
TL0 = 220;//11.0592M晶振下占空比最大比值是256,输出100HZ
TR0 = 1;//启动定时器0
ET0 = 1;//允许定时器0中断
EA = 1;//总中断允许
while(1)
{
forward();//前进
}
}
猜你喜欢