STM32高階定時器PWM輸出響應延遲解決辦法

2021-10-09 22:21:38 字數 1729 閱讀 3747

最近做了下門禁系統用到了舵機,但是用tim1生成pwm驅動舵機時,發現給出命令後(程式改變完占空比),要等一會兒舵機才能響應轉動。 於是四處查詢,終於找到一些有用資訊,在這裡做下記錄,防止自己忘掉了又找不到,也希望幫到遇到同樣問題的人。

問題符合且心急的小夥伴直接到最後~~~

先來了解兩點

tim_timebasestructure.tim_repetitioncounter = 0; //重複計數

這是個高階定時器才有的乙個配置引數,普通定時器並沒有。它影響著高階定時器溢位次數和產生更新事件次數的關係。

------------- 更新事件次數 = 溢位次數 x(tim_repetitioncounter +1)

於是它也就同時影響著:

進入更新中斷的次數(這個好理解,開啟了中斷就是更新一次進一次)

pwm占空比改變的延遲時間(下條說明)

注意!!!不配置這個引數並且沒有在開頭復位外設(tim_deinit(tim1))的情況下,這個引數是隨機的!隨機的!隨機的!!!我就是,結果找問題找了兩天。

就是下面這行**:

tim_oc2preloadconfig(tim1, tim_ocpreload_disable);

這個函式使能

只能在每次更新事件時改變占空比,就算程式執行了tim_setcompare2(tim1,val),也要等更新事件產生才起作用。(也就是只寫進了預裝載暫存器,待到更新事件之後才會自動裝進比較暫存器)

這個函式失能

每次只要執行了 tim_setcompare2(tim1,val) 就會立刻改變占空比。

結合上面兩點,舉個例子:

tim1設定7200分頻 ,週期200。即產生50hz的pwm波。

tim_repetitioncounter 設定為 199,使能oc預裝載。(這個是8位暫存器,最大255)

此時定時器每20ms溢位一次,每20*(199+1)= 4000ms產生一次更新事件,同樣的每4000ms從預裝載暫存器裡搬運數值到比較暫存器,來改變輸出的占空比。

如果程式在剛產生更新事件之後執行了tim_setcompare2(tim1,val)來試圖改變占空比,那麼就要等上4000ms實際輸出pwm的占空比才會發生相應的改變。延遲相當大。

儘管是為了突出問題,tim_repetitioncounter 特意取值大了點,但事實上延遲是的的確確存在的,而且很明顯。

(我也是做舵機的控制才發現延遲這麼明顯,如果是用於直流電機的控制大概就理解成系統自身的延遲了。)

經過以上了解可知,解決辦法:

簡單粗暴 關掉tim_oc2preloadconfig(tim1, tim_ocpreload_disable); 的使能,占空比就會在程式執行後立刻改變。缺點是,可能會有乙個波形不完整(被強行打斷了),只要不是特殊應用場合,這個應該問題不大。

將tim_repetitioncounter 設定為0,這樣就算有延遲也最多乙個pwm週期而已,可以接受。(不配置且開頭沒復位外設的話為隨機數

注:上述預裝載暫存器僅僅指比較暫存器對應的,不是其他地方的預裝載暫存器!!

以上內容為查資料及自己的理解所得,如有錯誤還請指正。

stm32 高階定時器產生PWM

用stm32的高階定時器tim1和tim8產生pwm,需要注意 1.都有tim1,但只有flash容量大於256k的大容量微控制器才有tim8 2.高階定時器相對於通用定時器,多了tim ctrlpwmoutputs tim8,enable tim1產生四路pwm程式 static void tim...

STM32定時器輸出 捕獲PWM

硬體 德飛萊stm32f407 功能 tim4 ch1 pb6輸出pwm,tim3 ch1 pc6捕獲高電平時間 include timer.h void tim4 pwm init void void tim3 cap init void tim3 ch1定時器獲取 u8 tim3 irq sta...

stm32定時器之pwm輸出

stm32定時器之pwm輸出 新手上路,希望大家指教 使用定時器輸出pwm就是操作標準庫來實現,就像點亮led燈操作gpio類似 函式名稱timx pwm init 對某個定時器進行初始化 我們初始化函式中有這幾步 1 首先就是要開啟時鐘,所有的定時器都掛在了apb1上,所以我們要開啟時鐘,2 確定...