1 項目背景 隨著(zhù)LED在照明領(lǐng)域的不斷發(fā)展,其控制方式也越來(lái)越多樣化,形成不同的視覺(jué)效果。相比較的只具備“開(kāi)”“關(guān)”功能的傳統LED照明,能夠實(shí)現從0到100%光的亮度的調節的LED燈,在家裝燈飾、舞美燈光等領(lǐng)域的需求更為突出。 呼吸燈是指燈光由高到暗的逐漸變化,感覺(jué)好像是人在呼吸。所謂的“呼吸燈”就是根據人的呼吸頻率通過(guò)光的強弱表現出來(lái):呼吸分為兩個(gè)過(guò)程,一個(gè)是“呼”的過(guò)程,一個(gè)是“吸”的過(guò)程。其廣泛應用于手機之上,并成為各大品牌手機的賣(mài)點(diǎn)之一。如果你的手機里面有未處理的通知,比如說(shuō)未接來(lái)電,未查收的短信等,呼吸燈就會(huì )由暗到亮的變化,像呼吸一樣那么有節奏,起到一個(gè)通知提醒的作用。 呼吸燈的設計方法有很多,有的是用單片機產(chǎn)生PWM(脈沖寬度調制)來(lái)驅動(dòng)LED,也有采用555定時(shí)器來(lái)做。電路利用電容充放電原理,較為簡(jiǎn)單。 脈寬調制(Pulse WidthModelation,PWM),是利用微處理器/FPGA的數字輸出來(lái)對模擬電路進(jìn)行控制的一種非常有效的技術(shù),廣泛應用在測量、通信、功率控制與變換等許多領(lǐng)域。PWM數字信號從處理器到被控系統都是數字形式,無(wú)需數模轉換。 航模中的控制信號大多是PWM信號,比如FUTABA,JR等舵機的控制都采用PWM方式。 發(fā)射機給接收機一串脈沖,比如基礎脈寬是100ms,那么發(fā)射機的脈寬變大時(shí),比如增大為150ms,那么接收機就控制舵機正向旋轉,發(fā)射的脈寬減小時(shí),比如減小為50ms,那么接收機就控制舵機逆向旋轉。 PWM是一種對模擬信號電平進(jìn)行數字編碼的方法。通過(guò)高分辨率計數器的使用,方波的占空比被調制用來(lái)對一個(gè)具體模擬信號的電平進(jìn)行編碼。PWM信號仍然是數字的,因為在給定的任何時(shí)刻,滿(mǎn)幅值的直流供電要么完全有(ON),要么完全無(wú)(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重復脈沖序列被加到模擬負載上去的。通的時(shí)候即是直流供電被加到負載上的時(shí)候,斷的時(shí)候即是供電被斷開(kāi)的時(shí)候。只要帶寬足夠,任何模擬值都可以使用PWM進(jìn)行編碼。 通俗來(lái)說(shuō),PWM就是連續的、一定比例占空比的脈沖信號。通過(guò)控制占空比來(lái)實(shí)現不同的控制。簡(jiǎn)單地,我們可以認為PWM就是一種方波。如圖所示: PWM波形圖 PWM實(shí)現呼吸燈的原理 當輸出為低電平時(shí)控制LED燈,當輸出低電平時(shí),燈亮,當輸出高電平時(shí),燈滅。如果一直輸出低電平,則燈一直亮;如果一直輸出高電平,則燈一直暗;如果50%時(shí)間輸出低電平,50%時(shí)間輸出高電平,則燈會(huì )暗一些。所以占空比會(huì )影響到LED燈的明暗程度。 另一個(gè)影響LED亮度的是PWM波形的周期。試想一下,如果PWM的周期是2秒,占空比為50%,那我們看到的是將是LED暗1秒、亮1秒,而不是半亮的狀態(tài)。只是我們提高PWM的周期,才能看到半亮的狀態(tài)。根據經(jīng)驗值,PWM的周期是10毫秒為宜。 也就是說(shuō),控制高低電平的時(shí)間,也就是占空比(高電平占周期的百分比,例如上面是60%),以及控制PWM的周期,就可以控制燈的亮暗程度。 2 設計目標 本工程實(shí)現一個(gè)控制LED燈亮度的功能,具體要求:上電后,LED燈顯示接近于滅,然后在10秒內,每隔2秒,亮度變化一次,逐漸變亮。在下一個(gè)10秒內,每隔2秒,亮度變化一次,逐漸變暗?偠灾,就是20秒一次循環(huán),每隔2秒變化一次,前10秒亮度增大,后10秒,亮度減小。 開(kāi)發(fā)板的硬件原理圖 上板效果圖如下圖所示。 綜上所述,我們這個(gè)工程需要三個(gè)信號,時(shí)鐘clk,復位rst_n和輸出信號led。將module的名稱(chēng)定義為pwmled。為此,代碼如下: 其中clk、rst_n是輸入信號,led是輸出信號,并且三個(gè)信號都是1比特的,根據這些信息,我們補充輸入輸出端口定義。代碼如下: 3.2 信號設計 我們首先分析一下需求:上電后,LED燈顯示接近于滅,然后在10秒內,每隔2秒,亮度變化一次,逐漸變亮。在下一個(gè)10秒內,每隔2秒,亮度變化一次,逐漸變暗?偠灾,就是20秒一次循環(huán),每隔2秒變化一次,前10秒亮度增大,后10秒,亮度減小。 另外,根據PWM的原理,通過(guò)控制PWM的占空比就可以實(shí)現亮度控制。占空比越大(高電平時(shí)間越長(cháng),低電平時(shí)間越低),燈的亮度越暗。 根據這個(gè)原理,可以翻譯成:FPGA控制led信號,輸出PWM波形,并調整占空比。調整方法:20秒一次循環(huán),每隔2秒變化led的占空比一次,前10秒占空比變大,后10秒,占空比變小。 由于需求沒(méi)有說(shuō)明具體的占空比是多少,那我們就自行制定一下占空比,讀者可以在上板時(shí),根據視覺(jué)效果,調整占空比的大小。自行制定的占空比如下: 第1個(gè)2秒內,占空比為95%; 第2個(gè)2秒內,占空比為85%; 第3個(gè)2秒內,占空比為70%; 第4個(gè)2秒內,占空比為50%; 第5個(gè)2秒內,占空比為20%; 第6個(gè)2秒內,占空比為20%; 第7個(gè)2秒內,占空比為50%; 第8個(gè)2秒內,占空比為70%; 第9個(gè)2秒內,占空比為85%; 第10個(gè)2秒內,占空比為95%。 然后按上面的過(guò)程循環(huán)。 PWM的波的周期,根據經(jīng)驗值可以設為10毫秒。 根據上述分析,這個(gè)led信號的變化情況如下: 第1次持續時(shí)間2秒,每10毫秒輸出一個(gè)PWM波(9.5毫秒時(shí)變低); 第2次持續時(shí)間2秒,每10毫秒輸出一個(gè)PWM波(8.5毫秒時(shí)變低); 第3次持續時(shí)間2秒,每10毫秒輸出一個(gè)PWM波(7.0毫秒時(shí)變低); 第4次持續時(shí)間2秒,每10毫秒輸出一個(gè)PWM波(5.0毫秒時(shí)變低); 第5次持續時(shí)間2秒,每10毫秒輸出一個(gè)PWM波(2.0毫秒時(shí)變低); 第6次持續時(shí)間2秒,每10毫秒輸出一個(gè)PWM波(2.0毫秒時(shí)變低); 第7次持續時(shí)間2秒,每10毫秒輸出一個(gè)PWM波(5.0毫秒時(shí)變低); 第8次持續時(shí)間2秒,每10毫秒輸出一個(gè)PWM波(7.0毫秒時(shí)變低); 第9次持續時(shí)間2秒,每10毫秒輸出一個(gè)PWM波(8.5毫秒時(shí)變低); 第10次持續時(shí)間2秒,每10毫秒輸出一個(gè)PWM波(9.5毫秒時(shí)變低); 從中我們可以得到有以下幾個(gè)計數器:計數10毫秒時(shí)間的計數器;計數2秒時(shí)間的計數器以及計數第1~10次的計數器。 計數10毫秒的計數器的設計思路。本工程的工作時(shí)鐘是50MHz,即周期為20ns,計數器計數到10_000_000/20=500_000個(gè),我們就能知道10毫秒時(shí)間到了。另外,由于該計數器是不停地計數,永遠不停止的,可以認為加1條件一直有效,可寫(xiě)成: assignadd_cnt==1。該計數器一共要數500_000個(gè)。綜上所述,該計數器的代碼如下。 2秒時(shí)間計數器的設計思路。本工程的工作時(shí)鐘是50MHz,即周期為20ns,計數器計數到2_000_000_000/20=100_000_000個(gè),我們就能知道2秒時(shí)間到了。這是一種設計思路。但我們也可以以10毫秒為基礎,通過(guò)數有2_000_000_000/10_000_000=200個(gè)10毫秒時(shí)間,就能知道2秒時(shí)間到了。所以該計數器的加1條件是end_cnt0,一共有數200個(gè)。綜上所述,該計數器的代碼如下。 第1~第10次計數器的設計思路。該計數器是每隔2秒就會(huì )加1,也就是end_cnt1的時(shí)候,就會(huì )加1;該計數器一共要數10個(gè)。綜上所述,該計數器的代碼如下。 有了這三個(gè)計數器,我們來(lái)思考輸出信號led的變化。概括起來(lái),led有兩個(gè)變化點(diǎn):變0和變1。變0的原因都是在10毫秒計數器數到一定個(gè)數時(shí)變0,但這個(gè)計數是會(huì )變的,那么我們可以假設為x,也就是數到x個(gè)時(shí),led變0。變1則是由于10毫秒計數時(shí)間到了,也就是end_cnt0時(shí),led變1 。綜上所述,led信號的代碼如下: 最后我們再來(lái)思考變量x。x是led變0的時(shí)間。這個(gè)時(shí)間在不同的次數時(shí),值會(huì )不相同。例如第1次是數到9.5毫秒(cnt0數到475_000個(gè)),第2次則是在8.5毫秒(cnt0數到425_000個(gè))。也就是說(shuō)x的值與第幾次有關(guān),即與cnt2有關(guān)。根據題意,可知x的代碼如下: 3.3 信號定義 接下來(lái)定義信號類(lèi)型。 cnt0是用always產(chǎn)生的信號,因此類(lèi)型為reg。cnt0計數的最大值為500_000,需要用19根線(xiàn)表示,即位寬是19位。因此代碼如下: add_cnt0和end_cnt0都是用assign方式設計的,因此類(lèi)型為wire。并且其值是0或者1,1個(gè)線(xiàn)表示即可。因此代碼如下: cnt1是用always產(chǎn)生的信號,因此類(lèi)型為reg。cnt1計數的最大值為200,需要用8根線(xiàn)表示,即位寬是8位。因此代碼如下: add_cnt1和end_cnt1都是用assign方式設計的,因此類(lèi)型為wire。并且其值是0或者1,1根線(xiàn)表示即可。因此代碼如下: cnt2是用always產(chǎn)生的信號,因此類(lèi)型為reg。cnt2計數的最大值為9,需要用4根線(xiàn)表示,即位寬是4位。因此代碼如下: add_cnt2和end_cnt2都是用assign方式設計的,因此類(lèi)型為wire。并且其值是0或者1,1根線(xiàn)表示即可。因此代碼如下: led是用always方式設計的,因此類(lèi)型為reg。并且其值是0或者1,1根線(xiàn)表示即可。因此代碼如下: x是用always方式設計的,因此類(lèi)型為reg。并且其值是最大是475_000,需要19根線(xiàn)表示即可。因此代碼如下: 至此,整個(gè)代碼的設計工作已經(jīng)完成。下一步是新建工程和上板查看現象。 4 綜合與上板4.1 新建工程 首先在d盤(pán)中創(chuàng )建名為“pwmled”的工程文件夾,將寫(xiě)的代碼命名為“pwmled.v”,頂層模塊名為“pwmled”。 然后打開(kāi)Quartus Ⅱ,點(diǎn)擊File下拉列表中的New Project Wzard...新建工程選項。 3.在出現的界面中直接點(diǎn)擊最下方的“Next”。 4.之后出現的是工程文件夾、工程名、頂層模塊名設置界面。按照之前的命名進(jìn)行填寫(xiě),第一欄選擇工程文件夾“pwmled”,第二欄選擇工程文件“pwmled.v”,最后一欄選擇頂層模塊名“pwmled”,然后點(diǎn)擊”Next”,再出現的界面選擇emptyproject。 5.之后是文件添加界面。在上方一欄中添加之前寫(xiě)的”pwmled.v”文件,點(diǎn)擊右側的“Add”按鈕,之后文件還會(huì )出現在大方框中,之后點(diǎn)擊“Next”。 器件型號選擇界面。在“Device family”處選擇Cyclone ⅣE,在“Available devices”處選擇EP4CE15F23C8,然后點(diǎn)擊“Next” EDA工具界面。該頁(yè)面用默認的就行,直接點(diǎn)擊最下方“Next”。 8.之后出現的界面是我們前面的設置的總結,確認沒(méi)有錯誤后點(diǎn)擊“Finish”。 4.2 綜合 1.新建工程步驟完成后,就會(huì )出現以下界面。在“Project Navigator”下選中要編譯的文件,點(diǎn)擊上方工具欄中“StartCompilation”編譯按鈕(藍色三角形)。 2.編譯成功后會(huì )出現以下界面。 4.3 配置管腳 在菜單欄中,選中Assignments,然后選擇Pin Planner,就會(huì )彈出配置管腳的窗口。 在配置窗口最下方中的location一列,參考下表中最右兩列配置好FPGA管腳。 4.4 再次綜合 在菜單欄中,選中Processing,然后選擇Start Compilation,再次對整個(gè)工程進(jìn)行編譯和綜合。 出現上面的界面,就說(shuō)明編譯綜合成功。 4.5 連接開(kāi)發(fā)板 圖中,下載器接入電腦USB接口,電源接入電源,然后摁下下方藍色開(kāi)關(guān),看到開(kāi)發(fā)板燈亮。 4.6 上板 1.雙擊Tasks一欄中”P(pán)rogram Device”。 2.會(huì )出現如下界面,點(diǎn)擊add file添加.sof文件,在左側點(diǎn)擊“Start”,會(huì )在上方的“Progress”處顯示進(jìn)度。 3.進(jìn)度條中提示成功后,即可在開(kāi)發(fā)板上觀(guān)察到相應的現象。 |