STM32一個定時器輸出四路不同頻率和佔空比PWM波的方法

一蓑煙雨任平生&wf發表於2023-12-03

一般來說,一個定時器輸出4路頻率相同、佔空比不同的PWM波是比較容易的,使用PWM模式即可實現。如果說是輸出4路頻率不同、佔空比不同的PWM就沒有現成的模式,是不是無法實現了呢?答案肯定是“不”,只要肯思考就肯定有解決方案(計算機是人類發明的,我們所能遇到的大部分問題是可以透過我們的智慧去解決的,這也就是“只要思想不滑坡,方法總比困難多”)。那麼問題來了,怎麼實現?我們知道一個定時器只有一個ARR,而ARR暫存器又決定了頻率,這就意味著只能有一個頻率,但這是有前提的那就是使用定時器自帶的PWM模式。只要我們能自己控制引腳電平的變化,就可以實現4路不同頻率、佔空比的PWM輸出,怎麼才能做到呢?沒錯!就是輸出比較模式(翻轉模式),下面將介紹透過輸出比較模式實現的方法:

1、配置定時器的輸出比較通道

image
輸出比較模式配置為翻轉,輸出極性為高電平(個人認為在翻轉模式下輸出極性似乎沒有作用,當然也有可能是自己知識不夠不能理解它的作用)。還有一點很重要,就是要禁用預載入暫存器,至於為什麼我們來看一下參考手冊上的一段話:

image
也就是說,如果使能了預裝載暫存器,那麼CCRx的值只能在發生更新事件時被修改(從影子暫存器中載入),而我們需要的是在任意時刻都可以對CCRx進行更改以達到我們所需要的波形,所以要禁用預裝載暫存器。

2、佔空比和頻率的設定

image
這是四路PWM波的頻率和佔空比(72MHZ主頻,定時器2在72分頻條件下),這裡我們也可以封裝出相應的函式來進行佔空比和頻率的設定。

3、輸出比較中斷處理

image
下面將以通道1為例進行說明,首先是獲取計數器的值,這裡用的是TIM_GetCapture()函式,其實其內部就是讀取CNT暫存器的值,然後就是根據cc1_flag來設定下次比較觸發的值,即分別設定高電平時間和低電平時間,如下圖所示:
image
其中,val1、val2、val3均為TIM_GetCapture的捕獲值。

輸出引腳極性設定新發現:
1、輸出設定高電平有效時,程式按照預期的一樣輸出PWM波
2、輸出設定為低電平有效時,輸出的是和預期互補的PWM波
推測:輸出極性決定了初始狀態下引腳的電平,配置為高電平有效時,引腳初始電平為低電平;配置為低電平有效時,引腳初始電平為高電平。這種區別就會導致翻轉設定高低電平相反,產生互補的PWM波。
最終,透過邏輯分析儀抓的波形如下所示:
image
透過實驗,驗證了上述推測,在設定輸出極性為低電平有效後,將通道1翻轉設定條件修改與原來相反,用邏輯分析儀採集波形後發現通道2、3、4均輸出互補波形,而通道1輸出預期波形,可以判定,輸出極性決定了引腳初始狀態電平。

4、總結

至此,一個定時器就可以成功輸出四路不同頻率、佔空比的PWM波。實際上核心原理就是根據捕獲值(CNT)來設定比較值(CCRx).