有人利用STM32G474芯片的高精度定時器實現(xiàn)兩對互補輸出,即用到TIMA和TIMB兩個定時單元分別輸出兩對互補信號。
可是他發(fā)現(xiàn)兩個定時器單元輸出的同頻PWM波形存在著明顯的相位差,就像下面的截圖一樣。
但是他希望二者的輸出完全同步且無相位差,那有沒有辦法做到呢?
這是可以的。我們讓HRTIM的定時單元基于某個觸發(fā)事件來同步啟動。對于HRTIM來說,可以利用外部觸發(fā)輸入信號或通用定時器TIM1的觸發(fā)輸出信號來同步HRTIM各定時單元的啟動。這里就如何使用TIM1的觸發(fā)輸出作為HRTIM的同步信號讓HRTIM的定時器單元同步啟動做下簡單介紹。
HRTIM的各個單元間的同步操作是通過HRTIM里的Master TIMER進行管理的,所以要實現(xiàn)HRTIM各單元間的同步就必須啟用Master TIMER,顯然,除了啟用TIMA/TIMB外,還得使能Master TIMER。
關(guān)于同步配置可以參考下面截圖:
這里對Master TIMER的配置主要是開啟它,讓它能工作,能管理同步事件即可。
經(jīng)過上面的配置,再對TIMA/TIMB做“同步事件啟動定時器的配置”后,二者就能做到同步啟動了,加上二者配置了相同的PER周期值,這樣就可以輸出如下圖所示的同步同相信號了。
如果說除了TIMA/TIMB的輸出保持同步同相外,還希望中途不時修改周期及占空比且不破壞同相,那又怎么辦呢? 即如何在輸出頻率和占空比可調(diào)的情況下仍然保持著兩個定時器的輸出同步呢?
我們可以開啟TIMA或TIMB的更新中斷,在其中任意一個定時器的更新中斷服務(wù)程序里同時修改兩個定時器的計數(shù)周期值和比較值,并開啟預裝功能,讓參數(shù)在下一個溢出更新事件到來時生效,這樣就可以做到既能調(diào)整定時器的周期值和比較值,又能保證二者的輸出同步。
下面簡單介紹下實現(xiàn)過程。
Master TIMER的配置沒啥特別的,主要是讓它工作起來,能讓HRTIM的定時單元的同步起作用。TIMA和TIMB的配置這里基本一樣,二者的配置差別主要體現(xiàn)在比較值不一樣而已。
來看看TIMA的相關(guān)配置。重點留意下面截圖中下劃線標識的地方。主要配置內(nèi)容包括設(shè)置PER、CMP1的參數(shù),開啟同步啟動、使能預裝功能、啟用TIM更新中斷,對TIMA-TA1/TA2的輸出進行配置。
上面是TIMA的基本配置,因為TIMB的配置跟TIMA的相比,除了CMP值不同外,其它基本一樣,這里就不重復貼圖了。
配置完成后,生成HAL類初始化代碼。然后添加如下用戶代碼。
HAL_HRTIM_WaveformCountStart_IT(&hhrtim1,HRTIM_TIMERID_TIMER_A);//使能TIMA
HAL_HRTIM_WaveformOutputStart(&hhrtim1 , HRTIM_OUTPUT_TA1);
HAL_HRTIM_WaveformOutputStart(&hhrtim1 , HRTIM_OUTPUT_TA2);
HAL_HRTIM_WaveformCountStart_IT(&hhrtim1, HRTIM_TIMERID_TIMER_B); //使能TIMB
HAL_HRTIM_WaveformOutputStart(&hhrtim1 , HRTIM_OUTPUT_TB1);
HAL_HRTIM_WaveformOutputStart(&hhrtim1 , HRTIM_OUTPUT_TB2);
HAL_TIM_Base_Start(&htim1);//讓TIM1產(chǎn)生同步觸發(fā)信號
上面的黃色代碼行,基本功能就是開啟TIM1,它的TRGO輸出信號作為HRTIM-TIMA/TIMB的同步啟動信號。如果沒有這行代碼,此時的TIMA/TIMB是不會工作的。
我在TIMA的更新中斷服務(wù)程序里修改TIMA/TIMB的PER/CMP的值,查看輸出結(jié)果。
extern uint16_t Interrupt_Count;
#define HRTIMReg (HRTIM1-》sTimerxRegs)
void HRTIM1_TIMA_IRQHandler(void)
{
/*USER CODE BEGIN HRTIM1_TIMA_IRQn 0 */
/*USER CODE END HRTIM1_TIMA_IRQn 0 */
HAL_HRTIM_IRQHandler(&hhrtim1,HRTIM_TIMERINDEX_TIMER_A);
/*USER CODE BEGIN HRTIM1_TIMA_IRQn 1 */
Interrupt_Count++;
if(Interrupt_Count 《 20000)
{
HRTIMReg[HRTIM_TIMERINDEX_TIMER_A].PERxR= 0xa000;
HRTIMReg[HRTIM_TIMERINDEX_TIMER_A].CMP1xR= 0x2000;
HRTIMReg[HRTIM_TIMERINDEX_TIMER_B].PERxR= 0xa000;
HRTIMReg[HRTIM_TIMERINDEX_TIMER_B].CMP1xR= 0x3000;
}
else if(Interrupt_Count 《 40000)
{
HRTIMReg[HRTIM_TIMERINDEX_TIMER_A].PERxR= 0x9000;
HRTIMReg[HRTIM_TIMERINDEX_TIMER_A].CMP1xR= 0x4000;
HRTIMReg[HRTIM_TIMERINDEX_TIMER_B].PERxR= 0x9000;
HRTIMReg[HRTIM_TIMERINDEX_TIMER_B].CMP1xR= 0x5000;
}
else
{
HRTIMReg[HRTIM_TIMERINDEX_TIMER_A].PERxR= 0x7000;
HRTIMReg[HRTIM_TIMERINDEX_TIMER_A].CMP1xR= 0x2000;
HRTIMReg[HRTIM_TIMERINDEX_TIMER_B].PERxR= 0x7000;
HRTIMReg[HRTIM_TIMERINDEX_TIMER_B].CMP1xR= 0x5000;
}
}
經(jīng)過測試,即使修改了兩個定時器單元的計時周期和占空比,二者的同步一直都可以保持得很好。關(guān)于這個話題就交流到這里,分享以上內(nèi)容供有需要的人士參考,祝君好運!
編輯:jq
-
定時器
+關(guān)注
關(guān)注
23文章
3241瀏覽量
114520 -
CMP
+關(guān)注
關(guān)注
6文章
142瀏覽量
25950 -
Tim
+關(guān)注
關(guān)注
0文章
81瀏覽量
17876
原文標題:STM32高精度定時器定時單元間的同步問題
文章出處:【微信號:aidanpianji,微信公眾號:單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論