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

原文地址:http://www.cnblogs.com/ninghechuan/p/6291499.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM