1.PWM介绍
PWM(Pulse Width Modulation)即脉冲宽度调制(如电机:转5ms停1ms还是转5ms停2ms),在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域。LED没有电的时候也不是马上熄灭的,尽管很快(余晖);这里只做简单介绍,具体原理可以自己上网查找;
PWM重要参数:
频率 = 1 / TS 占空比 = TON / TS 精度 = 占空比变化步距
频率低电机抖动明显,启动 停止 启动...频率越高越平缓
占空比1%—>2%—>3%...精度就为1%
2.源码
通常为了保证周期是恒定的(不随着占空比变化而变化)所以Delay中的两个延时时间加起来要是一个固定值,那么它的PWM的周期就是一个固定值。控制Delay中的两个延时时间(Time与100-Time)不断变化,那么就可以控制亮度不断进行变化了,从而完成呼吸灯的效果。(由暗变亮再由亮变暗不断循环)
其中两个for循环是用来延缓亮度变化的,要不然太快了;
这里设计的缺点:占用主循环,不断翻转I/O口来延时,在整个呼吸灯过程中,主循环是没有办法来干其它事情的。所以通常我们把PWM写到定时器中去;
#include <REGX52.H>
//简易的延时函数
void Delay(unsigned int t)
{
while(t--);
}
void main()
{
unsigned char Time,i;
while(1)
{
for(Time=0;Time<100;Time++) //改变亮灭时间,由暗到亮
{
for(i=0;i<15;i++) //计次延时
{
P2_0=0; //LED亮
Delay(Time); //延时Time
P2_0=1; //LED灭
Delay(100-Time); //延时100-Time
}
}
for(Time=100;Time>0;Time--) //改变亮灭时间,由亮到暗
{
for(i=0;i<15;i++) //计次延时
{
P2_0=0; //LED亮
Delay(Time); //延时Time
P2_0=1; //LED灭
Delay(100-Time); //延时100-Time
}
}
}
}