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