PWM(脉宽调制)——LED特效呼吸灯设计
Posted NingHeChuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PWM(脉宽调制)——LED特效呼吸灯设计相关的知识,希望对你有一定的参考价值。
简述PWM
PWM——脉宽调制信号(Pulse Width Modulation),它利用微处理器的数字输出来实现,是对模拟电路控制的一种非常有效的技术,广泛应用于测量、通信、功率控制与变化等许多领域。
LED特效呼吸灯原理
采用pwm的方式,在固定的频率下,采用占空比的方式来实现LED亮度的变化。占空比为0,LED灯不亮,占空比为100%,则LED灯最亮。所以将占空比从0到100%,再从100%到0不断变化,就可以实现LED灯实现特效呼吸。
设计思路、框图
变亮:当cnt2 < cnt3时为高电平,反之为低电平。
变暗:当cnt2 < cnt3时为低电平,反之为高电平。
先分频出延时为1us的延时电路,作为后面电路的驱动电路,然后是1ms延时和1s延时,会产生两个计数器,刚好是1000倍的关系。
(1)在第一秒时,随着cnt3由0到999逐渐增大,每一个1ms的占空比通过cnt2去调节。当cnt2 < cnt3时为高电平,反之为低电平。 因此,随着cnt3的逐渐增大,高电平的时间逐渐增大,直到100%。
(2)在第二秒时,随着cnt3由0到999逐渐增大,每一个1ms的占空比通过cnt2去调节。当cnt2 < cnt3时为低电平,反之为高电平。 因此,随着cnt3的逐渐增大,高电平的时间逐渐减小,直到0。
设计图如上所示,完后就可以照图施工了,附上部分代码。
1 //延时1us 2 always @(posedge mclk or negedge rst_n) 3 begin 4 if(!rst_n) 5 cnt1 <= 6\'b0; 6 else if(cnt1 < STOP_50 - 1\'b1) 7 cnt1 <= cnt1 + 1\'b1; 8 else 9 cnt1 <= 6\'b0; 10 end 11 assign delay_1us = (cnt1 == STOP_50 - 1\'b1)?1\'b1:1\'b0; 12 13 //延时1ms 14 always @(posedge mclk or negedge rst_n) 15 begin 16 if(!rst_n) 17 cnt2 <= 10\'b0; 18 else if(delay_1us) 19 begin 20 if(cnt2 < STOP_1000 - 1\'b1) 21 cnt2 <= cnt2 + 1\'b1; 22 else 23 cnt2 <= 10\'b0; 24 end 25 end 26 assign delay_1ms = ((delay_1us == 1\'b1) && (cnt2 == STOP_1000 - 1\'b1))?1\'b1:1\'b0; 27 28 //延时1s 29 always @(posedge mclk or negedge rst_n) 30 begin 31 if(!rst_n) 32 cnt3 <= 10\'b0; 33 else if(delay_1ms) 34 begin 35 if(cnt3 < STOP_1000 - 1\'b1) 36 cnt3 <= cnt3 + 1\'b1; 37 else 38 cnt3 <= 10\'b0; 39 end 40 41 end 42 assign delay_1s = ((delay_1ms == 1\'b1) && (cnt3 == STOP_1000 - 1\'b1))?1\'b1:1\'b0; 43 44 //state change 45 always @(posedge mclk or negedge rst_n) 46 begin 47 if(!rst_n) 48 display_state <= 1\'b0; 49 else if(delay_1s)//每一秒切换一次led灯显示状态 50 display_state <= ~display_state; 51 else 52 display_state <= display_state; 53 end 54 55 //pwm信号的产生 56 always @(posedge mclk or negedge rst_n) 57 begin 58 if(!rst_n) 59 pwm <= 1\'b0; 60 else 61 case(display_state) 62 1\'b0: pwm <= (cnt2 < cnt3)?1\'b1:1\'b0; 63 1\'b1: pwm <= (cnt2 < cnt3)?1\'b0:1\'b1; 64 default: pwm <= pwm; 65 endcase 66 end 67 68 //位拼接使得输出八位led呼吸灯 69 assign led_out = {8{pwm}}; 70
产生的pwm信号原来是一位的,所以最后要是需要控制多个LED的亮灭,使用一个位拼接运算即可,如最后一行代码所示。
转载请注明出处:NingHeChuan(宁河川)
个人微信订阅号:NingHeChuan
如果你想及时收到个人撰写的博文推送,可以扫描左边二维码(或者长按识别二维码)关注个人微信订阅号
知乎ID:NingHeChuan
微博ID:NingHeChuan
以上是关于PWM(脉宽调制)——LED特效呼吸灯设计的主要内容,如果未能解决你的问题,请参考以下文章
Windows 10 IoT Core用PWM控制器控制树莓派LED灯亮度
Windows 10 IoT Core用PWM控制器控制树莓派LED灯亮度
LabVIEW控制Arduino实现PWM呼吸灯(基础篇—5)