STM32H7高精度定時器(HRTIM)的移相配置

由于缺少獨立的倍頻器,H7最高僅支持主頻頻率的HRTIM,對于H750而言是480M
一、時鐘配置
首先在RCC中將HSE選好,并調(diào)整H7的版本,Y版最高400M,V版最高480M
Y版可以將Power Regulator Voltage Scale調(diào)整至0,V版只能調(diào)整至1

接下來先把HRTIM勾選上,我這里需要4路PWM,主時鐘用來移相,其他四個時鐘用來輸出

接下來進時鐘樹,將PLL達到HSE上(CSI RC也行,不過正常做東西都有外部時鐘吧),System Clock Mux打到PLL上,系統(tǒng)時鐘打個480讓cube自己搜索,搜索完后拉到下面調(diào)整一下HRTIM Clock Mux


二、HRTIM配置
stm32的HRTIM模塊下面有6個獨立的時鐘,分別是Master和A、B、C、D、E五個slave時鐘,每個時鐘下面有4個比較器。其中,Master可以用來產(chǎn)生trigger啟動其他的時鐘
配置移相的基本思路就是Master用來控制移相角度,在合適的時間通過比較器產(chǎn)生trigger啟動對應的slave時鐘,slave通過自己的比較器產(chǎn)生脈寬可調(diào)的PWM
簡單來說就是Master的比較器控制移相角,其他時鐘的比較器控制波形形狀,頻率由Master確定,移相角可以做到±180°

首先調(diào)整Master:
HRTIM的頻率,F(xiàn)334和G474都能在主時鐘的基礎上倍頻,H7不行,只能調(diào)整到480M上
Master時鐘的周期,決定了開關頻率,我這里配置的500kHz,在這個頻率下PWM分辨率約10bits
Repetition Counter用來控制中斷頻率,0x00意味著每個周期進一次中斷
Preload Enable需要enable
Repetition Update也要enable
Interrupt Requests Sources數(shù)量調(diào)整到1,并且調(diào)整中斷源
需要幾路移相就開幾個Compare Unit

Timer A~E的配置都類似,這里以A為例:
時鐘和周期與Master一致,其實周期隨便配置,配成0xFFFF都沒問題
這里要改成單次觸發(fā)模式,否則在調(diào)整移相角時占空比會出問題
Preload和Repetition Update和Master一樣
這里一定要打開,將寄存器更新延后到了reset時刻
Reset Trigger要改成Master Timer Compare event,這個和前面配置的Master Cpmpare Unit是對應的
Compare Unit用于控制波形,我這里是占空比50%的半橋,所以前面Dead Time Insertion Mode改成了Deadtime is inserted,這里只需要使用一個Compare Unit
死區(qū)按照自己想法設置
輸出配置,我這里配置的是Timer A被Master的trigger reset的同時輸出拉高,并在Compare Unit 1處置低,這樣占空比剛好是50%(0->480)


最后把Master的全局中斷打開

三、初始化代碼
HRTIM初始化完成后需要手動打開輸出和Counter
? ?HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TA1);
? ?HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TA2);
? ?HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TB1);
? ?HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TB2);
? ?HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TC1);
? ?HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TC2);
? ?HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TD1);
? ?HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TD2);
? ?HAL_HRTIM_WaveformCountStart_IT(&hhrtim, HRTIM_TIMERID_MASTER | HRTIM_TIMERID_TIMER_A | HRTIM_TIMERID_TIMER_B |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? HRTIM_TIMERID_TIMER_C | HRTIM_TIMERID_TIMER_D);
中斷回調(diào)函數(shù)是void HAL_HRTIM_RepetitionEventCallback(HRTIM_HandleTypeDef *hhrtim,uint32_t TimerIdx)
占空比與周期的調(diào)節(jié)可以通過直接寫寄存器來完成,也可以通過HAL庫提供的宏來實現(xiàn)
? ?//調(diào)整周期
? ?__HAL_HRTIM_SETPERIOD(&hhrtim, HRTIM_TIMERINDEX_MASTER, SPS_BASE_PERIOD + delta_tick / 2);
? ?//調(diào)整相位
? ?__HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_1, phaseAB);
? ?__HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_2, phaseAB);
? ?__HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_3, phaseCD);
? ?__HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_4, phaseCD);
? ?//調(diào)整占空比
? ?__HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, phi_tick);
? ?__HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_1, phi_tick);
? ?__HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_TIMER_C, HRTIM_COMPAREUNIT_1, SPS_BASE_PERIOD / 2);
? ?__HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_TIMER_D, HRTIM_COMPAREUNIT_1, SPS_BASE_PERIOD / 2);

密麻麻的b站什么爛編輯器,連個代碼格式化都沒有