今天終于要說(shuō)到脈沖寬度調(diào)制技術(shù)了。聽(tīng)到這一串由漢字組成的X%#@&*思密達(dá),老司機(jī)不屑一顧揚(yáng)長(zhǎng)而去,新司機(jī)不明覺(jué)厲直接嚇走,于是就剩下我們這百來(lái)號(hào)低頭看手機(jī)的瓜友在這里逛蕩了。
我們還是先從脈沖寬度調(diào)制的基礎(chǔ)說(shuō)起。脈沖寬度調(diào)制,英文縮寫為:PWM(Pulse Width Modulation),是通過(guò)數(shù)字信號(hào)實(shí)現(xiàn)對(duì)模擬電路控制的一種非常有效的技術(shù),常被廣泛應(yīng)用于測(cè)量、通信、功率控制與變換等眾多領(lǐng)域。
那么PWM是如何工作的?
我們知道,數(shù)字電路只能產(chǎn)生高電平(1)或低電平(0),在小腳丫上也就意味著3.3V和0V。那么如果我們的應(yīng)用恰好在這之間怎么辦?比如,將3.3V直接連到LED上會(huì)導(dǎo)致LED燈很亮。如何將LED燈調(diào)暗呢?當(dāng)然,最簡(jiǎn)單的辦法就是直接串聯(lián)一個(gè)限流電阻但這樣一來(lái),限流電阻就需要不斷產(chǎn)生功耗,而這個(gè)功耗實(shí)際上是完全浪費(fèi)掉的。
無(wú)非就是調(diào)節(jié)LED的亮度而已,難道就沒(méi)有其他更好的辦法了嗎?當(dāng)然有,用我們今天學(xué)習(xí)的PWM就可以輕松實(shí)現(xiàn)。在進(jìn)一步探討點(diǎn)亮LED之前,我們先通過(guò)圖1了解一些基本的參數(shù):

圖1
圖1中,脈沖信號(hào)的周期為T,高電平寬度為t。如果我們將t/T定義為占空比,占空比就是2/3,因?yàn)楦唠娖降膶挾日剂苏麄€(gè)周期的2/3。在圖1中我們還可以看到一條紅色虛線,畫在了脈沖高度2/3的位置。這條虛線實(shí)際上就對(duì)應(yīng)著最終的有效值。那么如何在FPGA上生成PWM信號(hào)呢?
我們還是習(xí)慣看圖說(shuō)話,請(qǐng)看圖2。假如我們有一個(gè)鋸齒波,然后在鋸齒波上設(shè)置一個(gè)閾值(黑色水平虛線),凡是大于該閾值時(shí)輸出均為高電平,反之則為低電平,這樣我們是不是就得到一個(gè)PWM信號(hào)呢?如果我們想調(diào)整它的占空比,那么調(diào)節(jié)閾值的高低就可以了。在本例中,閾值線越低占空比越高。

圖2
如果把上面的描述再抽象化一下,就可以畫出圖3的模塊框圖。鋸齒波實(shí)際上就可以用計(jì)數(shù)器生成,閾值就是一個(gè)數(shù)值而已,比較器是用來(lái)生成最后輸出高低電平用的。

圖3
有了設(shè)計(jì)思路之后,我們來(lái)看一下最終代碼。
module pwm (PWM_out, clk, reset);input clk, reset;output reg PWM_out;wire [7:0] counter_out; //計(jì)數(shù)器的8位寬儲(chǔ)存,可以最多數(shù)128次時(shí)鐘的嘀嗒parameter PWM_ontime = 32; //閾值設(shè)在32,對(duì)應(yīng)25%的占空比always @ (posedge clk) begin //比較器if (PWM_ontime > counter_out)= 0;else= 1;end//調(diào)用計(jì)數(shù)器.clk (clk),.counter_out (counter_out),.reset(reset));endmodule//計(jì)數(shù)器模塊代碼:0] counter_out;input clk, reset;:0] counter_out;always @(posedge clk)if (reset) //如果沒(méi)有按reset,則計(jì)數(shù)器清零= 8'b0;else //如果按下reset,則計(jì)數(shù)器開(kāi)始計(jì)數(shù)counter_out <= counter_out + 1;endmodule
在代碼中,我們?cè)O(shè)置的計(jì)數(shù)器位寬是8位,也就是每128次后自動(dòng)重新計(jì)數(shù)。所以,該計(jì)數(shù)器的最大頻率也就是12MHz/128=93.75KHz。圖3中可以看出,PWM信號(hào)的頻率和計(jì)數(shù)器的頻率相同,因此也是93.78KHz。
試想一下,LED現(xiàn)在正以超過(guò)每秒9萬(wàn)次的速度閃爍,肉眼是完全分辨不出來(lái)的。那么閃爍過(guò)程中,亮/滅的比值越大,LED的視覺(jué)發(fā)光效果就越強(qiáng),反之則越弱。我們最后將上述程序?qū)胄∧_丫中,并通過(guò)調(diào)節(jié)閾值來(lái)觀察小腳丫上的LED發(fā)光強(qiáng)度的變化。
現(xiàn)在思考題來(lái)了:
1. 已知小腳丫的板載LED的正向點(diǎn)亮電壓為1.8V
2. 已知小腳丫的高電平為3.3V,低電平為0V
現(xiàn)在我們將一個(gè)占空比為10%的PWM信號(hào)接到LED上,能不能看到LED點(diǎn)亮?
點(diǎn)擊空白處查看答案
回答錯(cuò)誤的你一定非常不服,于是從積灰的古董箱里翻出來(lái)寶刀已老的萬(wàn)用表,調(diào)成直流電壓測(cè)量模式后一測(cè)發(fā)現(xiàn):沒(méi)錯(cuò)啊!就是0.33V,和預(yù)期的3.3*10%=0.33V一樣!那怎么可能還會(huì)點(diǎn)亮,一定是LED壞了,哦不,是萬(wàn)用表壞了,好像也不是…難道是小腳丫壞了?
NO,NO,NO,請(qǐng)不要告訴我小腳丫壞了。
目前《小腳丫FPGA在數(shù)字電路設(shè)計(jì)中的應(yīng)用》直播課程也正在進(jìn)行中,且針對(duì)在校學(xué)生免費(fèi)開(kāi)放,還沒(méi)申請(qǐng)的同學(xué)快來(lái)申請(qǐng)吧,點(diǎn)擊“閱讀原文”或掃描下方二維碼了解詳情,每天下午兩點(diǎn)跟著Daniel老師來(lái)學(xué)習(xí)數(shù)字電路。交流群也已建好,請(qǐng)關(guān)注“硬禾學(xué)堂”公眾號(hào),回復(fù)關(guān)鍵字“數(shù)字電路”或“FPFA”,即可獲取。

往期數(shù)電實(shí)驗(yàn)復(fù)習(xí)
基于FPGA的數(shù)字電路實(shí)驗(yàn)1:實(shí)現(xiàn)門電路
END
硬禾學(xué)堂
硬禾團(tuán)隊(duì)一直致力于給電子工程師和相關(guān)專業(yè)的同學(xué),帶來(lái)規(guī)范的核心技能課程,幫助大家在學(xué)習(xí)和工作的各個(gè)階段,都能有效地提升自己的職業(yè)能力。
硬禾學(xué)堂
我們一起在電子領(lǐng)域探索前進(jìn)
關(guān)注硬禾公眾號(hào),隨時(shí)直達(dá)課堂
點(diǎn)擊閱讀原文報(bào)名課程