一个定时器搞定呼吸灯

呼吸灯,这个在手机或者其他设备设备上面都有类似的灯,生活中比较常见的。
单片机中怎么实现呢,通常是两种2中方案,1、硬件pwm输出控制,2、使用io模拟

0、视觉残留,人的眼睛有视觉残留,对于快速闪烁的东西无法分辨出来,看电影电视就是这个道理,其实就是快速的播放很多张静止的画面,就以为是动起来了,放映室里的交卷就是这样的快速播放,我们就可以看电影了。日光灯也有闪烁,只是我们看不到,通常就是50HZ,和交流电是一样的频率,周期就是20ms。呼吸灯就是快速的改变占空比二导致看起来渐亮渐暗,而不会有闪烁的感觉。

1、硬件pwm,在高级的单片机中都有,和定时器相结合的,就是快速的更新pwm的占空比,来欺骗人的眼睛,周期设置为20ms左右,每一个周期分100份,那么200us就可以翻转一次,也可以快一点,快慢需要根据led的翻转速率。如果周期不变,分成50份,那么每400us就可以翻转一次。400us就称为最小分辨率。
假设,周期=20ms,细分50等分,那么从全灭到全亮的过程,单片机每20ms更新一次占空比,可以更新50次,(0%~100%=0-49)每一次更新一次占空比的大小,就可以实现呼吸灯的效果,使用硬件pwm可以很方便的实现这个效果,而且单片机处理起来很轻松。

2、如果用io模拟,就稍微需要点技巧,还是上面的假设,假设,周期=20ms,细分50等分,那么从全灭到全亮的过程,单片机每20ms更新一次占空比,可以更新50次,(0%~100%=0-49)每一次更新一次占空比的大小。
哪里更新呢?就是定时器中断中,定时器中断设置为400us,每一次调用定时中断,都计数一次,然后和当前的占空比对比,比如占空比=0,那么计数50次(时间就累计了20ms),如果计数器都不小于占空比,则熄灭led灯,50次比较后,占空比+1,那么led灯就会灯亮2%的时间,下次点亮4%的时间,以此类推。。。到98%,每20ms多2%的点亮时间。
渐暗的过程,就是将占空比渐渐减少即可。计数器依然是0-50的计数,然后进行对比。

如果定时中断=100us,那么可以将一个pwm周期(20ms)细分成200份,更加精细控制。

3、小结
不过io模拟的方式是比较耗费定时器资源的,尤其是几百us级别的中断,而且led的翻转速率也是有上限的,因此,中断里的函数执行速度不可能因为主频上升了,就能提升很多。毕竟瓶颈在led灯的翻转速度,中断里的语句至少是us级别的执行时间。

这个原理不难,具体到过程我也是看来网上的代码,运行后分析得出。

原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/14202358.html