我們有時會利用STM32片內的多個TIMER進行級聯,實現同步啟動。不過有人會遇到沒法同步啟動的情況;或者說基于相同的配置,某次可以成功,下次再來又不行了;或者說同樣的芯片、同樣的代碼,別人的可以,而自己卻不行云云。所謂不行、不成功就是指基于同步啟動后,主從TIMER的PWM輸出相位肉眼可見的不同步,明顯存在啟動時間差。
我這里不妨先以STM32G4芯片內TIM1/TIM2/TIM3為例來演示下實現過程。看看到底能否實現,會不會碰到無法同步的情形。如果有,可否解決。
根據該系列參考手冊有關TIMER內部互聯關系圖可知TIM1/TIM2/TIM3就可以建立起主從關系。下圖便是其中的一部分TIMER信號互聯觸發關系圖。
我將TIM1/TIM2/TIM3按照下面的方式前后主從級聯。
TIM1的觸發輸出TRGO作為TIM2的觸發輸入【ITR0】,TIM2的觸發輸出TRGO作為TIM3的觸發輸入【ITR1】,其中TIM2/TIM3均配置在Trigger從模式。至于TIM1和TIM2的觸發輸出【TRGO】信號均選擇各自計數器的使能動作,即對定時器的TIMx_CR1@CEN位置1。對于處在Trigger從模式的定時器,外來觸發信號具有對TIMER計數器使能的同等效果。TIM3的TRGO不必關注,因為TIMER級聯應用時,TRGO信號是給下一級TIMER用的。
使用CubeMx對STM32G431進行配置。配置過程中將主從模式控制位MSM使能,具體參考下面配置。【注:3個定時器的時基參數及PWM配置都一樣。未對計數時鐘做分頻。最后希望輸出3路完全同頻同相的波形。】
利用CubeMx完成配置后,基于STM32 HAL庫添加用戶代碼進行驗證測試。經測試,發現3路輸出同步與否 跟 3個定時器的初始化代碼順序有明顯的關系。
比如,基于上面初始配置順序的3路輸出就沒有做到同步啟動,貌似互不理睬。
同樣,基于上面初始配置順序的3路輸出也沒有做到完美同步啟動,中間那路明顯異類。
然而,基于上面初始化順序的3路輸出倒是同步完美。
現在3個TIMER,初始化配置代碼擺放先后順序共6種組合,我把6種組合的實現結果集中在下面表格里一起來看。
我們發現上面6種組合中,僅表格里最后一組可以實現完美同步輸出,符合預期。
也就是說,只有初始化時遵循先主后從的配置順序才可能實現完美同步啟動。
在正確的配置順序下,我們不妨看看啟動后三個定時器的計數情況:【下圖是兩次隨機暫停程序讀到的3個計數器的值,見紅線下劃線標示的】
我們可以清晰地看到任意兩次暫停得到的三個計數器的值,兩兩主從定時器的計數值相差1個定時器外設時鐘單位,注意是TIMER外設時鐘,并不是計數時鐘,具體到這里就是1us/170。【因此刻沒有對時鐘源分頻,計數時鐘剛好等于TIMER外設時鐘】
一般來講,主從間的這1個TIMER外設時鐘的延時不該對應用構成影響,若覺得有影響,大概率是您選錯芯片了,或許該選個主頻更高的。何況當對計數時鐘做分頻后,計數器往往沒法感覺和區分這個細小延時的。當然,實在有強迫癥或其它想法,如果計數時鐘跟TIMER外設時鐘相同,即未做分頻前提下,我們還可以通過修改計數器初始值保證啟動后保持相同計數值或預期值。比方,在正確初始配置順序下,啟動前將三個計數器的初始值稍作調整,見下圖紅線方框里的代碼。
這樣調整后,每次暫停程序運行時,三個計數器的值總是保持高度一致,不差分毫。
提醒:剛才通過調整計數初值實現徹底的計數器同步計數僅限于計數時鐘源沒有做分頻的前提下,若計數時鐘有被分頻是不需要這么做的,也不能這么做。因為那1個主從啟動硬件延時是跟著外設時鐘走的,不是跟著計數時鐘走的。當計數時鐘被分頻后,計數器往往感受不到那個延時了,顯然分頻系數越大越感覺不到主從間的那個延時。如果此時手動額外在計數器初值上加1或加2就弄巧成拙了,本來可以忽略的延時被你這么一加反而加大延時了。當然,為產生啟動相差而有意調整計數初始值又是另外一回事了。
到此,我們也順便看看像下面級聯的情形,主從級聯,從級并列多個定時器被同一觸發信號觸發。
具體到這里,TIM1的觸發輸出同時接到TIM2/TIM3/TIM4的內部觸發輸入。內部信號接法見上圖。
我們照樣使用cubeMx配置4個TIMER。
完成配置后,添加用戶代碼、稍加整理 。注意各定時器的初始化順序,必須按照先主后從的順序進行,同級并聯的無所謂先后。至于各定時器的啟動函數順序,原則上要求跟初始化順序反過來,即按照先從后主的順序來啟動。
運行代碼,可以看到4個TIMER輸出的PWM輸出同步得很完美。同樣,我們也可以通過隨機暫停程序查看4個定時器的計數值的情況。下圖就是任意時刻暫停程序后得到的4個計數器的數據。詳見下面截圖底部表格說明。
顯然,在初始計數值相同情況下,主從定時器的計數值相差1個定時外設時鐘,這點跟上面的測試是一致的。另外,基于一個觸發信號下的同級定時器沒有計數差值。
總的說來,STM32芯片內多個TIMER實現同步啟動完全可以實現,而且可以做到很好的同步,配置也簡單。通常使用計數器的使能信號作為觸發信號。應用中最常見的問題莫過于定時器初始化順序不當,記得按照先主后從的順序進行,否則會導致無法實現整體同步啟動及預期輸出,這里特作提醒。
審核編輯:湯梓紅
-
芯片
+關注
關注
455文章
50817瀏覽量
423677 -
PWM
+關注
關注
114文章
5186瀏覽量
213957 -
STM32
+關注
關注
2270文章
10900瀏覽量
356054 -
定時器
+關注
關注
23文章
3248瀏覽量
114821
發布評論請先 登錄
相關推薦
評論