# 引言 在数字电源(如LLC、全桥变换器)中,功率管开关瞬间需要死区时间以避免直通短路,但死区过长会增大占空比损失和谐波,过短则可能引发击穿。传统MCU定时器分辨率有限(通常ns级),而STM32G4的HRTIM将分辨率提升至184ps(当时钟为5.4GHz时),使得死区补偿可以精确到亚纳秒级,显著提升电源效率与EMI性能。 # HRTIM死区补偿原理 ## 1. 高分辨率时钟架构 HRTIM并非直接使用系统时钟,而是通过内部PLL将时钟倍频至高达5.4GHz,再经分频产生基础定时时钟。每个定时器通道(如TIM_A、TIM_B)支持独立的分频与比较值,且比较事件可触发死区发生器。 ## 2. 死区插入机制 HRTIM的每个输出单元(如OUT_A)可配置为互补模式(PWM_A和PWM_AH)。当主输出翻转时,死区发生器自动插入一段延迟,延迟时间由寄存器HRTIM_DTR(上升沿死区)和HRTIM_DTF(下降沿死区)控制,分辨率均为184ps。 ## 3. 补偿策略 实际应用中,功率管(如MOSFET)的开关延迟(开通延迟、关断延迟)不同,导致有效死区偏离设定值。补偿方法: - 测量实际死区(通过电流探头或波形分析) - 计算补偿量:补偿值 = 目标死区 - (关断延迟 - 开通延迟) - 将补偿值写入HRTIM_DTR或HRTIM_DTF(注意正负号) 例如,若目标死区100ns,MOSFET关断延迟30ns,开通延迟20ns,则实际死区 = 100 + (30-20) = 110ns,需将DTR减小10ns(约54个184ps步进)。 # 配置步骤(以STM32G474为例) ## 1. 时钟配置 - 使用HSE或HSI,通过PLL使HRTIM时钟为170MHz(系统时钟),然后内部倍频至5.4GHz。 - 在CubeMX中:RCC -> HSE -> Crystal/Ceramic Resonator;Clock Configuration -> PLL Source = HSE,PLLM=2,PLLN=85,PLLR=2,得到170MHz;HRTIM的时钟源选择PLL(需在HRTIM配置中使能内部倍频)。 ## 2. 引脚分配 - 将PA8配置为HRTIM_CHA(主输出),PA9配置为HRTIM_CHAH(互补输出)。 - 在CubeMX中:Pinout & Configuration -> Timers -> HRTIM1 -> Channel A -> PWM Generation CHA and CHAH。 ## 3. 参数设置 - 周期:例如20kHz,则周期值 = 5.4GHz / 20kHz = 270000(约0x41EB0)。 - 占空比:50%时比较值 = 135000。 - 死区:初始设定100ns,对应步进数 = 100e-9 / 184e-12 ≈ 543步进。 - 使能死区:在HRTIM1配置中,Dead-Time Insertion -> Enable,并设置Rise Dead Time = 543,Fall Dead Time = 543。 # 完整代码示例 以下代码基于STM32CubeHAL,假设已初始化HRTIM1并配置为PWM互补输出。 ```c #include "hrtim.h" // 定义死区补偿函数 void HRTIM_DeadTimeCompensation(HRTIM_HandleTypeDef *hhrtim, uint32_t target_ns, int32_t delay_diff_ns) { // 计算补偿后的死区步进数(184ps/步) int32_t base_steps = (int32_t)((target_ns * 1000) / 184); // 转换为皮秒再除以184 int32_t comp_steps = (int32_t)((delay_diff_ns * 1000) / 184); int32_t final_steps = base_steps - comp_steps; // 补偿公式 // 限制范围(寄存器为16位) if (final_steps < 0) final_steps = 0; if (final_steps > 0xFFFF) final_steps = 0xFFFF; // 写入上升沿和下降沿死区寄存器 WRITE_REG(hhrtim->Instance->DTR, final_steps); WRITE_REG(hhrtim->Instance->DTF, final_steps); } // 主函数示例 int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_HRTIM1_Init(); // 启动HRTIM HAL_HRTIM_PWMStart(&hhrtim1, HRTIM_TIMERID_TIMER_A); // 假设实测延迟差:关断延迟-开通延迟 = 10ns(正数表示需要减小死区) HRTIM_DeadTimeCompensation(&hhrtim1, 100, 10); while(1) { // 主循环 } } ``` # 注意事项 - **死区寄存器位宽**:HRTIM_DTR和HRTIM_DTF均为16位,最大死区约12μs(5.4GHz下),超出需分频处理。 - **死区模式选择**:HRTIM支持独立死区(上升和下降分别设置)和对称死区,根据功率管特性选择。 - **死区补偿的实时性**:若负载变化导致延迟漂移,可在中断中动态更新DTR/DTF,但需注意写入时机(建议在PWM周期开始时写入)。 - **调试陷阱**:使用示波器测量死区时,探头电容会影响波形,建议使用差分探头;同时注意HRTIM输出极性(高有效或低有效)会影响死区方向。 - **与ADC联动**:数字电源常需根据电流/电压反馈调整死区,可利用HRTIM的触发事件同步ADC采样,实现闭环补偿。 # 总结 STM32G4的HRTIM以其超高分辨率,为数字电源死区控制提供了前所未有的精度。通过理解死区插入原理,掌握补偿计算方法,并利用HAL库快速配置,开发者可以显著提升电源效率与可靠性。实际项目中,务必结合硬件实测进行补偿校准,并注意寄存器限制与动态更新策略。希望本文能为你打开HRTIM实战的大门。