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

關(guān)于STM32定時(shí)器觸發(fā)SPI逐字收發(fā)之應(yīng)用示例
基于STM32定時(shí)器捕獲測(cè)量脈寬的應(yīng)用示例

[STM32]通用定時(shí)器的使用
![[<b class='flag-5'>STM32</b>]通用<b class='flag-5'>定時(shí)器</b>的使用](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32定時(shí)器-基本定時(shí)器

STM32——高級(jí)定時(shí)器、通用定時(shí)器、基本定時(shí)器的區(qū)別

STM32定時(shí)器學(xué)習(xí)---基本定時(shí)器

???STM32之玩轉(zhuǎn)定時(shí)器TIMX???

STM32各類系列定時(shí)器概覽
定時(shí)器的定時(shí)啟動(dòng)信號(hào)特點(diǎn)
STM32H7芯片系列中定時(shí)器同步啟動(dòng)并輸出PWM波形的實(shí)現(xiàn)方法

評(píng)論