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