1)實驗平臺:正點原子新起點V2開發板
2)平臺購買地址:https://detail.tmall.com/item.htm?id=609758951113
2)全套實驗原始碼+手冊+視頻下載地址:http://www.openedv.com/thread-300792-1-1.html
3)對正點原子FPGA感興趣的同學可以加群討論:994244016
4)關注正點原子公眾號,獲取最新資料更新

第十二章呼吸燈實驗
呼吸燈最早由蘋果公司發明并應用于筆記本睡眠提示上,其一經展出,立刻吸引眾多科技廠商爭相效仿,并廣泛用于各種電子產品中,尤其是智能手機,呼吸燈其實是在微處理器的控制下,由暗漸亮、然后再由亮漸暗,模仿人呼吸方式的LED燈,
本章分為以下幾個章節:
1212.1簡介
12.2實驗任務
12.3硬體設計
12.4程式設計
12.5下載驗證
12.1簡介
呼吸燈采用PWM的方式,在固定的頻率下,通過調整占空比的方式來控制LED燈亮度的變化,PWM(Pulse Width Modulation),即脈沖寬度調制,它利用微處理器輸出的PWM信號,實作對模擬電路控制的一種非常有效的技術,廣泛應用于測量、通信、功率控制等領域,
在由計數器產生的固定周期的PWM信號下,如果其占空比為0,則LED燈不亮;如果其占空比為100%,則LED燈最亮,所以將占空比從0到100%,再從100%到0不斷變化,就可以實作LED燈的“呼吸”效果,
PWM占空比調節示意圖如下圖所示:

圖 12.1.1 呼吸燈PWM占空比示意圖
由上圖可知,LED高電平的時間由長漸漸變短,再由短漸漸變長,如果LED燈是高電平點亮,則LED燈會呈現出亮度由亮到暗,再由暗到亮的程序,
12.2實驗任務
本節實驗任務是使用新起點開發板上的LED,實作呼吸燈的效果,即由滅漸亮,然后再由亮漸滅,
12.3硬體設計
LED原理圖與“流水燈實驗”完全相同,請參考“流水燈實驗”硬體設計部分,由于LED燈在前面相應的章節中已經給出它們的管腳串列,這里不再列出管腳分配,
12.4程式設計
本次實驗的模塊埠及結構框圖如下圖所示,

圖 12.4.1 模塊埠及信號連接圖
周期信號計數器用于產生驅動LED的脈沖信號,本次實驗的周期信號頻率為1Khz,其占空比由后級邏輯在每個周期之后進行遞增或遞減,最后再對當前計數值和占空比計數值進行比較,以輸出占空比可調的脈沖信號,
呼吸燈代碼如下:
1 module breath_led(
2 input sys_clk , //時鐘信號50Mhz
3 input sys_rst_n , //復位信號
4
5 output led //LED
6 );
7
8 //reg define
9 reg [15:0] period_cnt ; //周期計數器頻率:1khz 周期:1ms 計數值:1ms/20ns=50000
10 reg [15:0] duty_cycle ; //占空比數值
11 reg inc_dec_flag ; //0 遞增 1 遞減
12
13 //*****************************************************
14 //** main code
15 //*****************************************************
16
17 //根據占空比和計數值之間的大小關系來輸出LED
18 assign led = (period_cnt >= duty_cycle) ? 1'b1 : 1'b0;
19
20 //周期計數器
21 always @(posedge sys_clk or negedge sys_rst_n) begin
22 if(!sys_rst_n)
23 period_cnt <= 16'd0;
24 else if(period_cnt == 16'd50000)
25 period_cnt <= 16'd0;
26 else
27 period_cnt <= period_cnt + 1'b1;
28 end
29
30 //在周期計數器的節拍下遞增或遞減占空比
31 always @(posedge sys_clk or negedge sys_rst_n) begin
32 if(!sys_rst_n) begin
33 duty_cycle <= 16'd0;
34 inc_dec_flag <= 1'b0;
35 end
36 else begin
37 if(period_cnt == 16'd50000) begin //計滿1ms
38 if(inc_dec_flag == 1'b0) begin //占空比遞增狀態
39 if(duty_cycle == 16'd50000) //如果占空比已遞增至最大
40 inc_dec_flag <= 1'b1; //則占空比開始遞減
41 else //否則占空比以25為單位遞增
42 duty_cycle <= duty_cycle + 16'd25;
43 end
44 else begin //占空比遞減狀態
45 if(duty_cycle == 16'd0) //如果占空比已遞減至0
46 inc_dec_flag <= 1'b0; //則占空比開始遞增
47 else //否則占空比以25為單位遞減
48 duty_cycle <= duty_cycle - 16'd25;
49 end
50 end
51 end
52 end
53
54 endmodule
第21-28行是1KHz周期信號的計數器,用于產生1KHz的LED驅動信號,第31-52行的always塊為占空比設定模塊,每次計數完了一個周期,就根據遞增/遞減標志來對占空比計數值(duty_cycle)進行遞增/遞減25個計數值,這個遞增或者遞減的數值大小可以用來控制呼吸燈的呼吸頻率,
如果占空比計數值(duty_cycle)已經遞增到了最大,則呼吸燈已經處于最亮的狀態,接下來開始遞減;反之,如果占空比計數至已經遞減到了最小,即0,則呼吸燈處于熄滅的狀態,接下來開始遞增;如此回圈往復,最終實作了流水燈的效果,
在代碼的第18行通過組合邏輯把當前的周期計數值和占空比計數值進行比較,來判斷LED的輸出電平,在一個周期內,如果當前的周期計數值大于等于占空比計數值,則LED輸出高電平,即點亮;如果當前的周期計數值小于占空比計數值,則LED輸出低電平,即熄滅,
12.5下載驗證
編譯工程并生成位元流sof檔案,將下載器一端連接電腦,另一端與開發板上的JTAG下載口連接,連接電源線,并打開開發板的電源開關,然后下載程式,
程式下載完成后,可以看到新起點開發板上的LED燈由暗慢慢變亮,再由亮慢慢變暗,即呈現出“呼吸”的效果,如下圖所示:

圖 12.5.1 開發板實驗現象
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/335305.html
標籤:其他
上一篇:STM32的串口通訊協議
