zoukankan      html  css  js  c++  java
  • 一个定时器搞定呼吸灯

    呼吸灯,这个在手机或者其他设备设备上面都有类似的灯,生活中比较常见的。
    单片机中怎么实现呢,通常是两种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级别的执行时间。

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

  • 相关阅读:
    云原生 Serverless Database 使用体验
    如何画一张架构图(内含知识图谱)
    阿里云 Serverless Kubernetes 的落地实践分享
    【阿里云 CDP 公开课】 第二讲:CDH/HDP 何去何从
    阿里云数据治理系列(一):治理项目启动前的必答三问
    使用递归方法全选/反选TreeView中CheckBox子节点
    C# 安装部署项目 【转】
    HashTable存储树形数据
    Delphi中MessageBox用法【转】
    js nextSibling属性和previousSibling属性
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/14202358.html
Copyright © 2011-2022 走看看