限時乾貨下載:回復「教程」獲取單片機電子書,回復「仿真」獲取Proteus仿真資料,百度盤群組分享連結更新時間:2016-03-06,失效請在文末留言,不要在後臺留言
簡述PWMPWM——脈寬調製信號(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。
設計圖如上所示,完後就可以照圖施工了,附上部分代碼。
//延時1us
always @(posedge mclk or negedge rst_n)
begin
if(!rst_n)
cnt1 <= 6'b0;
else if(cnt1 < STOP_50 - 1'b1)
cnt1 <= cnt1 + 1'b1;
else
cnt1 <= 6'b0;
end
assign delay_1us = (cnt1 == STOP_50 - 1'b1)?1'b1:1'b0;
//延時1ms
always @(posedge mclk or negedge rst_n)
begin
if(!rst_n)
cnt2 <= 10'b0;
else if(delay_1us)
begin
if(cnt2 < STOP_1000 - 1'b1)
cnt2 <= cnt2 + 1'b1;
else
cnt2 <= 10'b0;
end
end
assign delay_1ms = ((delay_1us == 1'b1) && (cnt2 == STOP_1000 - 1'b1))?1'b1:1'b0;
//延時1s
always @(posedge mclk or negedge rst_n)
begin
if(!rst_n)
cnt3 <= 10'b0;
else if(delay_1ms)
begin
if(cnt3 < STOP_1000 - 1'b1)
cnt3 <= cnt3 + 1'b1;
else
cnt3 <= 10'b0;
end
end
assign delay_1s = ((delay_1ms == 1'b1) && (cnt3 == STOP_1000 - 1'b1))?1'b1:1'b0;
//state change
always @(posedge mclk or negedge rst_n)
begin
if(!rst_n)
display_state <= 1'b0;
else if(delay_1s)//每一秒切換一次led燈顯示狀態
display_state <= ~display_state;
else
display_state <= display_state;
end
//pwm信號的產生
always @(posedge mclk or negedge rst_n)
begin
if(!rst_n)
pwm <= 1'b0;
else
case(display_state)
1'b0: pwm <= (cnt2 < cnt3)?1'b1:1'b0;
1'b1: pwm <= (cnt2 < cnt3)?1'b0:1'b1;
default: pwm <= pwm;
endcase
end
//位拼接使得輸出八位led呼吸燈
assign led_out = {8{pwm}};
產生的pwm信號原來是一位的,所以最後要是需要控制多個LED的亮滅,使用一個位拼接運算即可,如最後一行代碼所示。
來源:http://www.cnblogs.com/ninghechuan/p/6291499.html
限時乾貨下載:回復「教程」獲取單片機電子書,回復「仿真」獲取Proteus仿真資料。
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
如何分享到朋友圈點擊右上角「...」 三個點,在彈出菜單選擇「分享到朋友圈」單片機訂閱號微信名:單片機回復下面數字或直接點擊,獲取相關文章:
001:《單片機初學者必看》
002:《周立功寫給學單片機的年輕人的話》
003:《牛人談:軟體與硬體的入門難度與精通時間跨度》
004:《學習51單片機有感;學習用書推薦;必寫的幾個程序》
005:《幾種使用過的單片機比較》
006:《ARM+LINUX學習路線(學習順序,知識點及書籍推薦)》
007:《ARM/DSP/FPGA/CPLD/SOPC/SOC區別和聯繫》
008:《趣味電子製作:藝術家手中的食品發電-電子diy》
009:《我的經歷: 從一名產線工人到單片機工程師》
010:《哥們花20萬從德國帶回來一工具箱》
點擊左下角「閱讀原文」,進入論壇交流!!!