所謂PWM,就是用高電平時間和波形周期的比值代表某個數(shù)。如果這個數(shù)經(jīng)過濾波后變成了接近連續(xù)的曲線表現(xiàn)出來那就是DA轉(zhuǎn)換;如果通過這個比值表達(dá)的是控制電機(jī)的電壓,那么表現(xiàn)出來就是電機(jī)控制。一切可以量化的東西都可以用PWM的方式去表示,這也是PWM應(yīng)用廣泛的原因。
產(chǎn)生PWM的方法:
1.產(chǎn)生一個計(jì)數(shù)器,滿脈沖周期后翻轉(zhuǎn)。
2.產(chǎn)生一個比較器,到達(dá)比例位置的時候輸出高電平,否則輸出低電平,整個過程見下圖

FPGA本質(zhì)上是數(shù)字電路。為了生成上圖的結(jié)果,所以我們需要按照上述的2步流程設(shè)計(jì)兩個電路,第一個電路是計(jì)數(shù)器,第二個電路是在計(jì)數(shù)器后面的比較器,對計(jì)數(shù)器輸出進(jìn)行監(jiān)控,一旦高于占空比對應(yīng)的計(jì)數(shù)值的時候里面變?yōu)?,其余時候?yàn)?,這樣就基本實(shí)現(xiàn)了PWM。也就對應(yīng)了下面兩段代碼:
//計(jì)數(shù)器電路,cnt_cycle就是計(jì)數(shù)器輸出計(jì)數(shù)結(jié)果 always@(posedge clk)
begin
cnt_cycle <= (cnt_cycle == (T-1)) ? 0 : cnt_cycle + 1;
end
/ 比較器電路 ,pwm_buf 為輸出PWM結(jié)果,紅色字為計(jì)數(shù)器輸入,綠色字為比較器比較線 /
always@(posedge clk)
begin
pwm_buf <= (cnt_cycle < duty_cycle_buf) ? 1'b1 : 1'b0;
end
也就是說,以上兩段代碼對應(yīng)的電路如下圖:

針對以上電路我要作一點(diǎn)說明:計(jì)數(shù)器在FPGA里面的實(shí)現(xiàn)就是加法器和觸發(fā)器組成的,加法器每次對輸出+1,下一個時鐘把+1的結(jié)果給到輸出端,根本不是數(shù)電書上異步2分頻的結(jié)果!另外再次強(qiáng)調(diào),由于FPGA的設(shè)計(jì)收到實(shí)際因素的限制,數(shù)電書上某些理模型是難以在實(shí)際中大量應(yīng)用的,所以FPGA內(nèi)部很多結(jié)構(gòu)和綜合結(jié)果都與數(shù)電書上有差異,但是數(shù)字電路的基本原理是沒有任何改變的!
PWM還差最后一點(diǎn),因?yàn)檩斎胝伎毡瓤梢圆粩喔淖儯簿褪堑谝粡垐D的比較線是會上下移動的,為了不影響我們在計(jì)數(shù)的過程中突然采集到突變的值最終導(dǎo)致,不平滑的占空比,所以占空比輸入在每個計(jì)數(shù)周期完成后才會去采集。也就是大家看到的這句:
always@(posedge clk)
begin
if(cnt_cycle == (T-1)) duty_cycle_buf <= (duty_cycle > T-1) ? T-1 : duty_cycle;
end
只有在cnt_cycle計(jì)數(shù)一個周期T的時候,占空比值才會更新,也就是比較線才會移動!
-
FPGA設(shè)計(jì)
+關(guān)注
關(guān)注
9文章
431瀏覽量
28117 -
電機(jī)控制
+關(guān)注
關(guān)注
3600文章
2125瀏覽量
277431 -
PWM
+關(guān)注
關(guān)注
116文章
5865瀏覽量
225422 -
比較器
+關(guān)注
關(guān)注
14文章
1927瀏覽量
111829 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2055瀏覽量
63360
發(fā)布評論請先 登錄
眨眼學(xué)會PWM
評論