PWM在51的运用
PWM个人理解
-
PWM脉冲快读调制(英文我不会,度娘救一下), 51单片不借助其他芯片或模块的帮助,四十个引脚都只能发出高5v或者低0V的电压,那要做出直流电机或者IED呼吸灯这种需要电压变化的效果呢?这就要靠PWM通过频率变化来模拟电压变化。
-
一秒的5v电压等于一秒10V电+一秒0v电;这就是PWM的基本原理,把时间拉长一秒内电压变化50次,在这20毫秒变化一次的变化中我让他高电频输出5毫秒,低电平输出15毫秒是不是完成了一秒5/20*5V=1.25V的电压输出了呢?
-
如果能用51完成以上步骤说明你就可以调出50Hz每周期空占比25%的PWM的输出了。
程序奉上
- PWM需要时刻变化如果放在主函数里太浪费资源了而且51单核运转这样main函数就干不了任何事了所以为了不浪费资源一般放在外置硬件或者用内置定时器调用。
#include <REGX52.h>
#define uchar unsigned char
uchar high,low;
sbit EM=P2^5;
low=5;
void main(void)
{ //设置计时器为一毫秒计时,打开计时器0的中断和总中断的开关
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x18;
TH0 = 0xFC;
TF0 = 0;
TR0 = 1;
ET0=1;
EA=1;
PT0=0;
while(1);
}
void Timer0_Routine() interrupt 1
{
//为计时器设定,不然下一次计时器将从0~65534开始计时。
//这个计时和单片机的频率有关,一个周期计数加一还是什么,
//反正这个东西不是赋值一般我用软件算没太了解。
static unsigned int T0Count;
TL0 = 0x18;
TH0 = 0xFC;
high++;
high%=20;//当high=20时归零
if(high<low)//这样就做到25%的空占比了
{
EM=1;
}
else Em=0;
}