事先声明哈,这个帖子讲述的知识,只适用于初学者,大佬可以无视哈。
PWM,是英文pulse-width modulating的缩写,中文意思是脉冲宽度调制。啥意思呢?我们大家都知道数字脉冲是有高低电平组成的信号。单片机的工作始就是这种信号。
通常这种信号是由晶振或者RC谐振电路产生的,占空比50%。这里的占空比是指在一个脉冲周期内,通电时间相对于总时间所占的比例。这里的通电时间,我们可以理解为高电平占用的时间。上图中,高电平占用的时间,占总时间(也就是低电平加上高电平占用的时间和)的50%,所以占空比就是50%。用这种信号驱动LED时,我们看到的结果是LED交替亮灭。当然,如果这个时钟周期很短的话,我们会看到LED保持常亮(虽然亮度不是固定高电平时的亮度),这是由于视觉暂留一起的现象,和我要讲的内容无关。
如果在高频脉冲下我们想用这种脉冲信号控制LED的亮度怎么办呢?这个时候PWM就起作用了。在高频状态下,对于占空比为50%的脉冲,,在一个标准时钟脉冲内,平均电压为0.5Vdd。提高这个平均电压,就意味着增加LED的亮度。那么如何提高这个平均电压呢?当然就是缩短低电平持续的时间,增加高电平的时间。比如下图,将占空比从50%调整为75%,
那么平均电压将变为0.75Vdd。如果占空比调整为100%,就意味着平均电压就是Vdd了。LED回答道对应于这个电压的最高亮度。占空比调整为0%,则意味着平均电压为0,没有给LED施加电压,就是灭的状态。在实际运用中,除了可以用PWM调整发光器件的亮度外,还经常用在电机速度的调整功能上。
针对上面的例子,我们要实现PWM信号,需要做到以下两点:
1、脉冲周期稳定不变
2、脉冲占空比可调
在早期的电路中,我们熟知的555,就非常适合用于PWM信号的控制输出,如以下电路:
可以看到调整电位器RV1,可以在不改变整个脉冲周期的情况下,可以改变输出脉冲的占空比的。但这个电路是无法做到0%和100%的处理的,可能需要更复杂的电路才能实现。
现在我们有了单片机,那么利用单片机的定时器,按照之前实现PWM信号需要的两个要点,就会容易做出更完美的PWN信号,能实现占空比从0%到100%的变化。如果单片机内部没有设置专用的PWM处理,那也一样很容易。以51单片机为例,首先我们固定定时器的周期为一个固定的值,让定时器自动装填,然后利用这个周期使某个IO电平翻转,那么在这个IO就会以固定的周期产生高低电平的脉冲信号,
如果我们让定时器产生中断,每次中断累计次数达到100次的时候,IO口电平翻转,同时让这个计数清零,重新开始计数,那么在这个IO仍旧会以固定的约100倍的周期产生高低电平的脉冲信号(注意下面这个图和上面那个图看起来一样,实际上时钟周期的宽度是不一样的,我懒得修改了,你注意看定时周期数总不一样),
然后在理解了这个处理过程的基础上,我们在做一个比较复杂的规则:
1、中断总次数200个作为一个总的周期;
2、每次中断发生的时候,将中断次数对200取余;这样处理的结果,使累计次数始终处于0-199之间。
3、当中断次数小于某个固定临界次数的时候,IO口输出低电平;
4、当中断次数大于等于某个临界次数的时候,IO口输出高电平;
这样按照上面的规则,只要调整这个固定此数值,就可以改变IO口高低电平的变化时机,从而实现固定周期内脉冲信号的占空比变化,也就是输出PWM信号。
在程序中,我们可以把这个固定值作为用户可以调节的量,配合200的那个上限值,就可以让用户灵活调节占空比了。或者让用户设置一个占空比数据,那么占空比数据 *上限值(前面例子中的200),得到的就是那个临界次数。