所謂PWM,就是用高電平時間和波形周期的比值代表某個數。如果這個數經過濾波后變成了接近連續的曲線表現出來那就是DA轉換;如果通過這個比值表達的是控制電機的電壓,那么表現出來就是電機控制。一切可以量化的東西都可以用PWM的方式去表示,這也是PWM應用廣泛的原因。
產生PWM的方法:
1.產生一個計數器,滿脈沖周期后翻轉。
2.產生一個比較器,到達比例位置的時候輸出高電平,否則輸出低電平,整個過程見下圖
FPGA本質上是數字電路。為了生成上圖的結果,所以我們需要按照上述的2步流程設計兩個電路,第一個電路是計數器,第二個電路是在計數器后面的比較器,對計數器輸出進行監控,一旦高于占空比對應的計數值的時候里面變為0,其余時候為1,這樣就基本實現了PWM。也就對應了下面兩段代碼:
//計數器電路,cnt_cycle就是計數器輸出計數結果 always@(posedge clk)
begin
cnt_cycle <= (cnt_cycle == (T-1)) ? 0 : cnt_cycle + 1;
end
/ 比較器電路 ,pwm_buf 為輸出PWM結果,紅色字為計數器輸入,綠色字為比較器比較線 /
always@(posedge clk)
begin
pwm_buf <= (cnt_cycle < duty_cycle_buf) ? 1'b1 : 1'b0;
end
也就是說,以上兩段代碼對應的電路如下圖:
針對以上電路我要作一點說明:計數器在FPGA里面的實現就是加法器和觸發器組成的,加法器每次對輸出+1,下一個時鐘把+1的結果給到輸出端,根本不是數電書上異步2分頻的結果!另外再次強調,由于FPGA的設計收到實際因素的限制,數電書上某些理模型是難以在實際中大量應用的,所以FPGA內部很多結構和綜合結果都與數電書上有差異,但是數字電路的基本原理是沒有任何改變的!
PWM還差最后一點,因為輸入占空比可以不斷改變,也就是第一張圖的比較線是會上下移動的,為了不影響我們在計數的過程中突然采集到突變的值最終導致,不平滑的占空比,所以占空比輸入在每個計數周期完成后才會去采集。也就是大家看到的這句:
always@(posedge clk)
begin
if(cnt_cycle == (T-1)) duty_cycle_buf <= (duty_cycle > T-1) ? T-1 : duty_cycle;
end
只有在cnt_cycle計數一個周期T的時候,占空比值才會更新,也就是比較線才會移動!
-
FPGA設計
+關注
關注
9文章
428瀏覽量
26489 -
電機控制
+關注
關注
3530文章
1859瀏覽量
268406 -
PWM
+關注
關注
114文章
5149瀏覽量
213436 -
比較器
+關注
關注
14文章
1637瀏覽量
107111 -
觸發器
+關注
關注
14文章
1996瀏覽量
61056
發布評論請先 登錄
相關推薦
評論