新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Lattice MXO2: LED呼吸燈

        Lattice MXO2: LED呼吸燈

        作者: 時間:2023-11-16 來源:電子森林 收藏

        本節,我們將通過脈寬調制技術來實現“”,實現LED的亮度由最暗逐漸增加到最亮,再逐漸變暗的過程。 脈沖寬度調制(PWM:Pulse Width Modulation),簡稱脈寬調制。它是利用微控制器的數字輸出調制實現,是對模擬電路進行控制的一種非常有效的技術,廣泛應用于測量、通信、功率控制與變換等眾多領域。

        硬件說明


        的設計較為簡單,我們使用12MHz的系統時鐘作為高頻信號做分頻處理,調整占空比實現PWM,通過LED燈LD1指示輸出狀態。

        本文引用地址:http://www.104case.com/article/202311/452950.htm

        LED電路連接

        脈沖信號有效值

        實現原理如上圖所示,脈沖信號的周期為T,高電平脈沖寬度為t,占空比為t/T。為了實現PWM脈寬調制,我們需要保持周期T不變,調整高電平脈寬t的時間,從而改變占空比。

        • 當t = 0時,占空比為0%,因為我們的LED硬件為低電平點亮,所以為最亮的狀態。
        • 當t = T時,占空比為100%,LED燈為最暗(熄滅)的狀態。

        結合呼吸燈的原理,整個呼吸的周期為最亮→最暗→最亮的時間,即t的值的變化:0→T→0逐漸變化,這個時間應該為2s

        呼吸燈程序設計

        呼吸燈設計要求呼吸的周期為2s,也就是說LED燈從最亮的狀態開始,第一秒時間內逐漸變暗,第二秒的時間內再逐漸變亮,依次進行。

        本設計中需要兩個計數器cnt1和cnt2,cnt1隨系統時鐘同步計數(系統時鐘上升沿時cnt1自加1)范圍為0~T,cnt2隨cnt1的周期同步計數(cnt1等于T時,cnt2自加1)范圍也是0~T,這樣每次cnt1在0~T的計數時,cnt2為一個固定值,相鄰cnt1計數周期對應的cnt2的值逐漸增大,我們將cnt1計數0~T的時間作為脈沖周期,cnt2的值作為脈沖寬度,則占空比 = cnt2/T,占空比從0%到100%的時間 = cnt2*cnt1 = T^2 = 1s = 12M個系統時鐘,T = 2400,我們定義CNT_NUM = 2400作為兩個計數器的計數最大值。

        PWM呼吸燈原理

        Verilog代碼


        // ********************************************************************
        // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
        // ********************************************************************
        // File name    : breath_led.v
        // Module name  : breath_led
        // Author       : STEP// Description  : 
        // 
        // --------------------------------------------------------------------
        // Code Revision History : 
        // --------------------------------------------------------------------
        // Version: |Mod. Date:   |Changes Made:
        // V1.0     |2017/03/02   |Initial ver
        // --------------------------------------------------------------------
        // Module Function:呼吸燈
        module breath_led(clk,rst,led); 	
        input clk;             //系統時鐘輸入
        	input rst;             //復位輸出
        	output led;            //led輸出 	
        	reg [24:0] cnt1;       //計數器1
        	reg [24:0] cnt2;       //計數器2
        	reg flag;              //呼吸燈變亮和變暗的標志位 	
        	parameter   CNT_NUM = 2400;	//計數器的最大值 
        	period = (2400^2)*2 = 24000000 = 2s
        	//產生計數器cnt1
        	always@(posedge clk or negedge rst) 
        	begin 
        		if(!rst) begin
        			cnt1<=13'd0;
        			end 
                else if(cnt1>=CNT_NUM-1) 
        				cnt1<=1'b0;
        		     else 
                        cnt1<=cnt1+1'b1; 
        		end 	//產生計數器cnt2
        	always@(posedge clk or negedge rst) 
        	begin 
        		if(!rst) begin
        			cnt2<=13'd0;
        			flag<=1'b0;
        			end 
                else if(cnt1==CNT_NUM-1) begin //當計數器1計滿時計數器2開始計數加一或減一
        			if(!flag) 
        			begin            //當標志位為0時計數器2遞增計數,表示呼吸燈效果由暗變亮
        				if(cnt2>=CNT_NUM-1)    //計數器2計滿時,表示亮度已最大,標志位變高,之后計數器2開始遞減
        					flag<=1'b1;
        				else
        					cnt2<=cnt2+1'b1;
        				end
        			else 
        			begin
        				if(cnt2<=0)      //當標志位為高時計數器2遞減計數
        					flag<=1'b0;		   //計數器2級到0,表示亮度已最小,標志位變低,之后計數器2開始遞增
        				else 	
        					cnt2<=cnt2-1'b1;
        				end		 			end
        		else 
        			cnt2<=cnt2;                //計數器1在計數過程中計數器2保持不變
        		end 	//比較計數器1和計數器2的值產生自動調整占空比輸出的信號,輸出到led產生呼吸燈效果
        	assign	led = (cnt1<cnt2)?1'b0:1'b1; 
        	endmodule

        引腳分配


        引腳分配如下:

        管腳名稱clkrstled
        管腳C1L14N13

        小結


        脈寬調制是一種值得廣大工程師在許多應用設計中使用的有效技術,你也可以根據本節介紹的流水燈程序,實現RGB三色燈的呼吸。在下一小節我們會學習狀態機的使用方法:交通燈的設計。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 阳城县| 靖江市| 礼泉县| 太湖县| 泗洪县| 岑巩县| 永清县| 白水县| 望都县| 双辽市| 泸定县| 阿拉尔市| 南安市| 高青县| 黄平县| 洛扎县| 芒康县| 会同县| 中山市| 新建县| 杭州市| 新竹县| 和政县| 南宁市| 湖州市| 五寨县| 施甸县| 巴南区| 宿州市| 顺义区| 龙山县| 锡林浩特市| 宁德市| 保亭| 慈溪市| 阳东县| 西盟| 齐齐哈尔市| 武乡县| 尚志市| 博兴县|