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