簡述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