赞
踩
呼吸灯
1.简介
呼吸灯效果是小灯在一段时间内从完全熄灭的状态逐渐变到最亮,再在同样的时间段内逐渐达到完全熄灭的状态,并循环往复。这种效果就像“呼吸”一样,有张有弛,而且给人一种很舒服的感觉。其工作原理是利用PWM来控制小灯在相同时间段内的不同占空比, 即在同样小时间段内,小灯亮的时间依次增加到最大后再依次减小,从而实现渐亮到渐灭的“呼吸”效果。
2.波形图绘制
在画波形之前,我们先分析一下该如何才能让 led灯实现“呼吸”的效果。整个呼吸灯“呼吸”的效果分为两部分,一个过程是从灭到亮,另一个过程是从亮到灭。为了把复杂的问题简单化,我们把led整个“呼吸”的动作进行分解,先分析从灭到亮的过程,而从亮到灭则是与之相反的一个过程。
为了让“呼吸”的效果表达的比较完美,我们把从灭到亮的时间设置为1s,也就是led灯在1s的时间内完成从灭到亮的效果,同理从亮到灭也是一样的时间。
怎么该如何具体实现?首先我们需要在1s的时间内产生很多个时间相等的小段,然后控制每个时间小段中低电平持续的时间渐渐增加就可以了。为了让“呼吸”效果显得更加细腻,我们把1s的时间分成1000个时间相等的时间小段,每个小段的时间就是1ms,这1000个1ms的时间小段中低电平持 续的时间还不能相等,要有一个从少到多渐渐递增的关系,为了让1000个1ms的时间小段都不一样,我们就需要将1ms再分成1000个时间小段,那么每一个时间小段就是1us, 在逐渐变亮的过程中我们可以让led灯在第1个1ms的时间小段内亮0us,即全灭;第2个1ms的时间小段亮1us;第3个1ms的时间 小段亮2us,……,第998个1ms的时间小段亮997us,第999个1ms的时间小段亮998us,第1000个1ms的时间小段亮999us。在逐渐变灭的过程中同理,我们划分的等级越多,“呼吸”的就越顺畅,看上去的效果就越好,但是人眼的分辨率的有限的,当大于这个分辨率人眼就看不出来这种差异了。
下面我们开始进行波形的绘制,首先画出输入时钟和复位的波形,根据分析我们至少需要设计三个计数器,分别为用于计数从灭到亮1s时间的cnt_1s计数器、用于划分1000个1ms时间小段的cnt_1ms计数器和用于划分1000个1us时间小段的cnt_1us计数器。然后就是要确定每个计数器计数开始和清零的条 件。我们先画出cnt_1us计数器的波形,根据50MHz的时钟计算得需要计50个数,即计数器从0计数到49,只要不复位则计数器一直计数,cnt_1us计数器计数满即可清零。接下来就是产生cnt_1ms计数器的波形,我们想是不是可以利用已经产生好的cnt_1us计数器来产生cnt_1ms计数器呢?答案 是当然可以的,我们完全没有必要再重新产生一个计数1ms的计数器,而是利用已经做好的1us计数器,根据cnt_1us计数器的时间计算得每当cnt_1us计数器计数到49时cnt_1ms计数器加1,cnt_1ms计数器计数到999且cnt_1us计数器同时也计数到49时cnt_1ms计数器才能清零,如果 少了cnt_1us计数器计数到49这个条件,仿真时会发现最后一个1ms的时间小段是不够1ms时间的。我们也用同样的方法产生cnt_1s计数器,每当cnt_1ms计数器计数到999且cnt_1us计数器计数到49时cnt_1s计数器加1,cnt_1s计数器计数到999且cnt_1ms计数器计数到999 且cnt_1us计数器计数到49三个条件同时满足时cnt_1s计数器清零(条件如此多的原因和cnt_1us计数器的分析是相同的,编写代码仿真时可以观察效果)。
完全熄灭~完全点亮的波形图
cnt_1s计数器: 1s分成了1千份,每个T就是1ms,份数分的越大,呼吸效果越细腻
cnt_1ms计数器:计数1ms时的0—999单位是1Us,加一起就是1ms.以此类推,1s
cnt_1us计数器: 0.000 001 微秒/0.000_000_02s=50个
led_out: 当1ms计数值小于1s计数值时,给led低电平,这样低电平的时间越来越长
cnt_1s_en: 呼吸灯有两个部分组成,怎么区分2个过程尼?因此加入使能信号,初值为低电平,当1s计数器到最大值时进行取反,其他时刻保持不变,当使能信号为高电平时表示完全熄灭~完全点亮这个过程。
完全点亮~完全熄灭的波形图
3.代码
仿真代码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。