很多STM32系列的MCU內置高精度定時器,比方STM32F334、STM32G4、STM32H7等系列。利用高精度定時器實現PWM輸出應該說是最基本的功能了。不過,在實際應用中,常有人覺得無法實現duty=0或duty=100%的PWM輸出情形。這里以STM32F334的HRTIM為例,簡單介紹下利用它實現PWM輸出的實現原理。
STM32F334的HRTIM的功能框圖如下,由一個MASTER定時器和ABCDE五個定時器單元組成。其中ABCDE五個定時器單元各可以產生2路輸出信號,并支持互補輸出。
先看看跟HRTIM有關的時鐘。別的系列有支持向上、向下計數模式的。
在利用HRTIM中的定時器單元實現PWM輸出時,基于不同的分頻系數對應著不同的分辨率和最低頻率。如下表所示:【截圖來自STM32F334的參考手冊】
顯然,不同分頻比對應不同的計數時鐘fHRCK,根據計數時鐘結合16位的計數寬度可求出最長計數時間,亦即最小的PWM輸出頻率。
但對于高精度定時器HRTIM,由于其自身特定機制的原因,在實現PWM功能時,設計比較值和計數周期值時需遵循下面兩個原則:【注意是FHRTIM時鐘單位,即未被倍頻的時鐘,這里就是那個144Mhz時鐘】
1、 最小值必須不小于3個fHRTIM時鐘單位;
2、最大值不得大于0xFFFE個fHRTIM時鐘單位;
剛才上面說了,HRTIM里面的定時器單元所用的計數時鐘是fHRTIM先經過倍頻后再經過分頻器而來的,那么結合上面的兩個原則,不同分頻比條件下可以設定的計數周期或比較值的范圍就對應到如下表格:
上面表格就是定時器單元不同分頻比時可以設置的計數周期值或用于比較的比較寄存器的值的范圍。比方我們以上面TABLE82中的CKPSC=3時來看看。CKPSC=3,從上面Table81可以得知此時的計數時鐘為源時鐘倍頻后的8分頻,我們在設計PWM計數周期值或比較值時就要求在0x00c~~0xFFFB范圍內配置。鑒于此,有人就得出沒法實現PWM輸出的0占空比或100%占空比,其實這是誤解。
假設此時我們所需要的PWM周期值剛好0xff00.那么比較寄存器CMP的值就可以在0x000c~~0xff00任意設置并能實現有效、可靠比較,顯然,CMP值不要小于0x000c這個起點值【實際上Table82中的Min值都是對應著3個fHRTIM源時鐘單位,因不同分頻比而呈現不同數據】,那這不是說PWM輸出不能實現0占空比的情況嗎?非也!
對于HRTIM的輸出,通常是根據計數器的值與比較寄存器的值發生相等匹配事件時進行SET【置1】或RESET【清零】輸出。【用過STM32常規定時器的人這里可能會感受到一些差異。】
比方如上圖所示,在發生比較事件時做RESET輸出,發生PER周期性事件時做SET輸出。
顯然,當我們不斷增加CMP的值,占空比也會相應增大。當CMP的值增加到剛好等于PER的值時,則輸出RESET。因為此時CMP比較事件、PER周期性事件在同一時間點發生,會涉及到事件競爭的仲裁問題。由于比較事件響應優先級高于周期性事件的,所以此時的輸出按比較事件來定,這里輸出RESET,此時也剛好對應著Duty=0的情形。兩個事件總是同時發生,而PER事件競爭不過CMP事件,輸出只好由CMP事件說了算。
按照這種配置,那又如何實現Duty=100%的輸出呢?
很簡單,當我們將CMP的值設置成任意被PER還大的值時,就始終輸出SET信號了。因為此時CMP永遠不會等于PER,即不會發生有效比較匹配事件,無有效比較事件則不會有RESET的輸出,輸出始終由PER事件掌控。
在基于HRTIM做PWM輸出時,弄清了原理后就知道如何靈活編寫代碼了。上面只是大致做了PWM輸出的原理介紹,更多細節還是得細看手冊,比方上面提到的定時器事件及事件響應競爭時的仲裁。
-
PWM
+關注
關注
114文章
5191瀏覽量
214173 -
STM32
+關注
關注
2270文章
10906瀏覽量
356479 -
定時器
+關注
關注
23文章
3251瀏覽量
114959
原文標題:STM32高精度定時器PWM輸出話題
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論