我們?cè)谑褂?a target="_blank">STM32定時(shí)器做PWM輸出過(guò)程中,當(dāng)借助示波器或邏輯分析儀查看波形時(shí),有時(shí)會(huì)發(fā)現(xiàn)輸出的第一個(gè)PWM脈沖跟后續(xù)的輸出脈沖不一樣。比方像下面的輸出波形,第一個(gè)脈沖的高電平要寬于所有其它后續(xù)脈沖。
對(duì)于這種情況,有些應(yīng)用是不太在乎的,但有些應(yīng)用場(chǎng)合可能就不能接受。那這個(gè)問(wèn)題是怎么產(chǎn)生的?有沒(méi)有辦法解決?
產(chǎn)生這個(gè)現(xiàn)象的原因簡(jiǎn)單點(diǎn)說(shuō)就是在于定時(shí)器比較輸出模塊的工作與定時(shí)器計(jì)數(shù)單元的工作具有相對(duì)獨(dú)立性。使能比較通道的輸出功能的操作與使能計(jì)數(shù)器的操作有個(gè)時(shí)間差,其長(zhǎng)短往往跟用戶處理代碼有關(guān)。
我們知道,STM32的高級(jí)定時(shí)器或通用定時(shí)器,可以大致看成由四個(gè)模塊組成,分別是主從控制模塊、時(shí)基單元、輸入捕捉模塊、輸出比較模塊。下面截圖是STM32F4系列高級(jí)定時(shí)器TIM1的功能框圖的一部分,這里沒(méi)有將定時(shí)器的主從模塊截取進(jìn)來(lái),只保留了時(shí)基單元、輸入捕捉單元、輸出比較單元。
這三個(gè)單元既可以相互配合協(xié)調(diào)工作,也可以各自獨(dú)立工作。比方說(shuō),輸出比較單元的工作并不要求時(shí)基單元的計(jì)數(shù)器工作,換言之,即使計(jì)數(shù)器不被開(kāi)啟計(jì)數(shù),輸出比較單元依然可以根據(jù)默認(rèn)配置或用戶的有關(guān)輸出配置而發(fā)揮作用。
我們不妨結(jié)合一個(gè)具體實(shí)例來(lái)看下。假設(shè)定時(shí)器TIM1的計(jì)數(shù)模式選擇向上計(jì)數(shù)模式,讓通道CH1按照PWM1模式的規(guī)則實(shí)現(xiàn)PWM輸出。配置好ARR和CCR1,極性選擇高有效,即OC輸出與OCRef參考信號(hào)保持同相。
對(duì)于定時(shí)器的初始化,我們一般會(huì)先對(duì)時(shí)基單元的相關(guān)參數(shù)做配置,比如時(shí)鐘源、ARR,PSC等,然后對(duì)比較輸出功能做配置和使能。當(dāng)完成比較輸出的配置及使能后,即使此時(shí)沒(méi)有使能時(shí)基單元的計(jì)數(shù)器,比較輸出單元就發(fā)揮作用了,即它會(huì)結(jié)合比較輸出配置和CNT與CCR的比較結(jié)果在OC端輸出相應(yīng)電平。
根據(jù)上述配置,若CCR大于計(jì)數(shù)器CNT的值時(shí)OC端輸出高電平,否則輸出低電平。若用戶沒(méi)有專門對(duì)CNT寄存器進(jìn)行賦值,芯片復(fù)位后,它的默認(rèn)值就是0,顯然CCR的值要大于此時(shí)的CNT的值,自然此時(shí)OC端就輸出高電平。如果此時(shí)計(jì)數(shù)器還未被開(kāi)啟,這個(gè)高電平就會(huì)保持到計(jì)數(shù)器被啟動(dòng),并延申到后續(xù)的PWM輸出動(dòng)作中。即這個(gè)高電平會(huì)跟第一個(gè)PWM脈沖的輸出連在一起。若剛好碰到第一個(gè)PWM脈沖首先是輸出高電平,這就導(dǎo)致第一個(gè)脈沖的高電平寬度要寬于后面其它所有PWM脈沖的。
下圖第1處乃通道OC功能配置完成被使能的時(shí)間點(diǎn),第2處乃計(jì)數(shù)器被啟動(dòng)時(shí)間點(diǎn)。
在跟上述相同模式和極性條件下,有沒(méi)有辦法消除第一個(gè)脈沖的多余寬度呢?
辦法是有的。既然OC通道被使能后,其輸出由CCR與CNT的比較結(jié)果和PWM模式?jīng)Q定,這時(shí)我們可以考慮在使能OC通道之前手動(dòng)將CNT的值進(jìn)行修改,讓它等于ARR或0xffff【若是32位計(jì)數(shù)器就是0xffffffff】,此時(shí)CNT的值不可能會(huì)小于用戶配置的CCR值,就這樣通過(guò)改變CCR與CNT的比較結(jié)果達(dá)到改變OC端輸出電平之目的。
比方,如果你用STM32標(biāo)準(zhǔn)庫(kù)寫的話,你可以在下面紅圈的那個(gè)地方加一句:【arr對(duì)應(yīng)著時(shí)基單元中ARR寄存器的值】
參照上面相同定時(shí)器配置【向上計(jì)數(shù)模式、PWM1模式、極性選擇高有效】,下面基于Cube庫(kù)使用STM32F4的TIM1的通道2進(jìn)一步做個(gè)驗(yàn)證測(cè)試。
使用CubeMx配置完成生成初始化代碼,需添加的用戶代碼比較簡(jiǎn)單。如下圖所示。其中方框里的延時(shí)函數(shù)代碼是用來(lái)模擬比較輸出使能與使能計(jì)數(shù)器兩個(gè)操作間的間隔,以便觀察效果。
基于上述代碼,我們通過(guò)示波器可以看到第一個(gè)脈沖明顯寬于其它后續(xù)PWM脈沖?!救缦聢D所示】
在上面代碼的基礎(chǔ)上,我們?cè)谑鼓蹸H2比較輸出功能的代碼前添加一句修改CNT寄存器的語(yǔ)句,令其值等于ARR或等于計(jì)數(shù)器的滿量程值。下圖中橢圓圈內(nèi)的代碼?!救舭袰NT值改成等于ARR的值,效果也一樣】
然后再進(jìn)行測(cè)試,第一個(gè)脈沖也就不再異常了。【如下圖所示】
最后小結(jié)下,這個(gè)現(xiàn)象只有在使能定時(shí)器通道的比較輸出操作與使能計(jì)數(shù)器操作存在較為明顯的時(shí)差時(shí)才可能發(fā)現(xiàn),而且它還跟所選擇的PWM模式有關(guān),上面只是針對(duì)向上計(jì)數(shù)模式、PWM1模式做了分析和分享,當(dāng)涉及其它應(yīng)用模式時(shí)可具體問(wèn)題具體分析,只要弄清原因了也就不難靈活應(yīng)對(duì)。
-
PWM
+關(guān)注
關(guān)注
114文章
5058瀏覽量
212195 -
STM32
+關(guān)注
關(guān)注
2258文章
10828瀏覽量
352484 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3218瀏覽量
113681
原文標(biāo)題:PWM輸出第一個(gè)脈沖寬帶異常的話題
文章出處:【微信號(hào):stmcu832,微信公眾號(hào):茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論