# STM32G4 HRTIM死区补偿实战:数字电源中的纳秒级精度控制 ## 一、为什么数字电源需要死区补偿? 在同步Buck、全桥LLC等拓扑中,上下桥臂MOSFET的开关切换必须插入死区时间(Dead-Time),防止直通短路。但死区过长会导致输出波形畸变、效率下降;过短则可能引发击穿。STM32G4的HRTIM(高分辨率定时器)提供可编程死区插入与补偿功能,其内部时钟高达4GHz(经PLL倍频),可实现184ps的步进精度,远超普通定时器的几十纳秒。 ## 二、HRTIM死区工作原理 HRTIM的每个定时器单元(如TIM_A)输出两路互补信号:`TA1`和`TA2`。死区发生器位于输出级,通过`DTR`(上升沿延迟)和`DTF`(下降沿延迟)寄存器控制插入时间。关键点: - **死区插入**:在互补信号切换时,主动插入延迟,确保先关断后导通。 - **死区补偿**:通过调整PWM占空比,抵消死区造成的电压损失(尤其在轻载或高开关频率下)。 - **高分辨率**:HRTIM的DTR/DTF寄存器支持小数步进(`HRTIM_DTR`的`DTR`字段+`DTRF`子步),实现亚纳秒级调整。 ## 三、死区补偿策略 数字电源中常用两种补偿方法: 1. **固定补偿**:根据MOSFET关断延迟(`td(off)`)和开通延迟(`td(on)`)差,设置固定死区值。适用于负载变化小的场景。 2. **动态补偿**:实时采样输出电流,通过查表或PID调整死区。本文聚焦固定补偿,但代码结构支持扩展。 补偿公式:`死区时间 = td(off) - td(on) + 安全裕量`。例如,若`td(off)=50ns`,`td(on)=30ns`,则死区设为`20ns+10ns=30ns`。 ## 四、STM32G4 HRTIM配置步骤 ### 1. 时钟配置 使用CubeMX或直接寄存器操作,将HRTIM时钟源设为PLL,使能`HRTIM1`时钟。确保`HRTIM_CLK`为170MHz(以G474为例),内部倍频至4GHz。 ### 2. 定时器单元配置 以TIM_A为例,配置为PWM模式1,输出极性高有效。 ### 3. 死区寄存器设置 ```c // 设置死区时间:30ns,HRTIM时钟4GHz,步进0.25ns // DTR = 30ns / 0.25ns = 120,但需拆分为整数部分+子步 uint32_t dtr_val = 120; // 整数部分 uint32_t dtr_sub = 0; // 子步(0-3),对应0.25ns步进 HRTIM1->sTimRegs[HRTIM_TIM_A].DTR = (dtr_sub << HRTIM_DTR_DTRF_Pos) | dtr_val; HRTIM1->sTimRegs[HRTIM_TIM_A].DTF = (dtr_sub << HRTIM_DTF_DTFF_Pos) | dtr_val; ``` ### 4. 使能死区输出 ```c HRTIM1->sTimRegs[HRTIM_TIM_A].OUTR |= HRTIM_OUTR_DTEN; // 使能死区 ``` ### 5. 补偿调整 在PWM更新中断中,根据负载动态微调占空比: ```c void HAL_HRTIM_PWM_PulseFinishedCallback(HRTIM_HandleTypeDef *hhrtim) { // 假设死区导致输出电压下降,补偿占空比 uint32_t compensation = (uint32_t)((float)dead_time_ns / period_ns * 1000); // 千分比 __HAL_HRTIM_SET_COMPARE(hhrtim, HRTIM_TIM_A, base_duty + compensation); } ``` ## 五、完整代码示例 以下为基于STM32G474的HRTIM初始化与死区补偿核心代码(使用LL库): ```c #include "stm32g4xx_ll_hrtim.h" void HRTIM_Init_With_DeadTime(void) { // 1. 使能HRTIM时钟 LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_HRTIM1); // 2. 配置TIM_A为PWM模式 LL_HRTIM_TIM_SetMode(HRTIM1, LL_HRTIM_TIM_A, LL_HRTIM_TIM_MODE_PWM); LL_HRTIM_TIM_SetPWMMode(HRTIM1, LL_HRTIM_TIM_A, LL_HRTIM_TIM_PWM_MODE_1); // 3. 设置周期和占空比(周期1MHz,占空比50%) LL_HRTIM_TIM_SetPeriod(HRTIM1, LL_HRTIM_TIM_A, 3999); // 4GHz/1MHz - 1 LL_HRTIM_TIM_SetCompare(HRTIM1, LL_HRTIM_TIM_A, 1999); // 4. 配置死区:30ns,整数120,子步0 LL_HRTIM_TIM_SetDeadTime(HRTIM1, LL_HRTIM_TIM_A, 120, 0, 120, 0); // 5. 使能死区输出 LL_HRTIM_TIM_EnableDeadTime(HRTIM1, LL_HRTIM_TIM_A); // 6. 使能输出 LL_HRTIM_TIM_EnableOutput(HRTIM1, LL_HRTIM_TIM_A); LL_HRTIM_Enable(HRTIM1); } // 死区补偿函数:根据负载电流调整占空比 void DeadTime_Compensation(uint16_t load_current_mA) { // 查表或计算补偿值,这里简单线性映射 uint32_t comp = (load_current_mA * 10) / 1000; // 每A补偿10个计数 LL_HRTIM_TIM_SetCompare(HRTIM1, LL_HRTIM_TIM_A, 1999 + comp); } ``` ## 六、注意事项 - **死区精度**:HRTIM的DTR/DTF寄存器是10位整数+2位子步,最大死区约1024*0.25ns=256ns,超出需分频或调整时钟。 - **互补输出**:确保`OUTA`和`OUTB`极性正确,否则死区可能无效。 - **死区插入时机**:仅在PWM模式1和2下有效,其他模式需手动处理。 - **补偿过冲**:动态补偿时需加限幅,防止占空比超过100%。 - **调试建议**:使用逻辑分析仪测量实际死区,与寄存器值对比,校准子步设置。 ## 七、总结 STM32G4的HRTIM通过纳秒级死区控制,让数字电源设计者能精确平衡效率与安全。本文从原理到代码,展示了死区补偿的完整链路。实际项目中,建议结合MOSFET数据手册参数和实测波形,反复调优死区值,才能发挥HRTIM的最大潜力。