所謂PWM,就是用高電平時(shí)間和波形周期的比值代表某個(gè)數(shù)。如果這個(gè)數(shù)經(jīng)過濾波后變成了接近連續(xù)的曲線表現(xiàn)出來那就是DA轉(zhuǎn)換;如果通過這個(gè)比值表達(dá)的是控制電機(jī)的電壓,那么表現(xiàn)出來就是電機(jī)控制。一切可以量化的東西都可以用PWM的方式去表示,這也是PWM應(yīng)用廣泛的原因。
產(chǎn)生PWM的方法:
1.產(chǎn)生一個(gè)計(jì)數(shù)器,滿脈沖周期后翻轉(zhuǎn)。
2.產(chǎn)生一個(gè)比較器,到達(dá)比例位置的時(shí)候輸出高電平,否則輸出低電平,整個(gè)過程見下圖
FPGA本質(zhì)上是數(shù)字電路。為了生成上圖的結(jié)果,所以我們需要按照上述的2步流程設(shè)計(jì)兩個(gè)電路,第一個(gè)電路是計(jì)數(shù)器,第二個(gè)電路是在計(jì)數(shù)器后面的比較器,對(duì)計(jì)數(shù)器輸出進(jìn)行監(jiān)控,一旦高于占空比對(duì)應(yīng)的計(jì)數(shù)值的時(shí)候里面變?yōu)?,其余時(shí)候?yàn)?,這樣就基本實(shí)現(xiàn)了PWM。也就對(duì)應(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
也就是說,以上兩段代碼對(duì)應(yīng)的電路如下圖:
針對(duì)以上電路我要作一點(diǎn)說明:計(jì)數(shù)器在FPGA里面的實(shí)現(xiàn)就是加法器和觸發(fā)器組成的,加法器每次對(duì)輸出+1,下一個(gè)時(shí)鐘把+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)檩斎胝伎毡瓤梢圆粩喔淖?,也就是第一張圖的比較線是會(huì)上下移動(dòng)的,為了不影響我們?cè)谟?jì)數(shù)的過程中突然采集到突變的值最終導(dǎo)致,不平滑的占空比,所以占空比輸入在每個(gè)計(jì)數(shù)周期完成后才會(huì)去采集。也就是大家看到的這句:
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ù)一個(gè)周期T的時(shí)候,占空比值才會(huì)更新,也就是比較線才會(huì)移動(dòng)!
-
FPGA設(shè)計(jì)
+關(guān)注
關(guān)注
9文章
428瀏覽量
27314 -
電機(jī)控制
+關(guān)注
關(guān)注
3572文章
1958瀏覽量
271882 -
PWM
+關(guān)注
關(guān)注
116文章
5482瀏覽量
219134 -
比較器
+關(guān)注
關(guān)注
14文章
1844瀏覽量
109009 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2039瀏覽量
62097
發(fā)布評(píng)論請(qǐng)先 登錄

評(píng)論