STM32G4 HRTIM死区补偿实战:数字电源中的纳秒级精度控制

一、为什么数字电源需要死区补偿?

在同步Buck、全桥LLC等拓扑中,上下桥臂MOSFET的开关切换必须插入死区时间(Dead-Time),防止直通短路。但死区过长会导致输出波形畸变、效率下降;过短则可能引发击穿。STM32G4的HRTIM(高分辨率定时器)提供可编程死区插入与补偿功能,其内部时钟高达4GHz(经PLL倍频),可实现184ps的步进精度,远超普通定时器的几十纳秒。

二、HRTIM死区工作原理

HRTIM的每个定时器单元(如TIM_A)输出两路互补信号:TA1TA2。死区发生器位于输出级,通过DTR(上升沿延迟)和DTF(下降沿延迟)寄存器控制插入时间。关键点:

  • 死区插入:在互补信号切换时,主动插入延迟,确保先关断后导通。
  • 死区补偿:通过调整PWM占空比,抵消死区造成的电压损失(尤其在轻载或高开关频率下)。
  • 高分辨率:HRTIM的DTR/DTF寄存器支持小数步进(HRTIM_DTRDTR字段+DTRF子步),实现亚纳秒级调整。

三、死区补偿策略

数字电源中常用两种补偿方法:

  1. 固定补偿:根据MOSFET关断延迟(td(off))和开通延迟(td(on))差,设置固定死区值。适用于负载变化小的场景。
  2. 动态补偿:实时采样输出电流,通过查表或PID调整死区。本文聚焦固定补偿,但代码结构支持扩展。

补偿公式:死区时间 = td(off) - td(on) + 安全裕量。例如,若td(off)=50nstd(on)=30ns,则死区设为20ns+10ns=30ns

四、STM32G4 HRTIM配置步骤

1. 时钟配置

使用CubeMX或直接寄存器操作,将HRTIM时钟源设为PLL,使能HRTIM1时钟。确保HRTIM_CLK为170MHz(以G474为例),内部倍频至4GHz。

2. 定时器单元配置

以TIM_A为例,配置为PWM模式1,输出极性高有效。

3. 死区寄存器设置

// 设置死区时间: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. 使能死区输出

HRTIM1->sTimRegs[HRTIM_TIM_A].OUTR |= HRTIM_OUTR_DTEN; // 使能死区

5. 补偿调整

在PWM更新中断中,根据负载动态微调占空比:

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库):

#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,超出需分频或调整时钟。
  • 互补输出:确保OUTAOUTB极性正确,否则死区可能无效。
  • 死区插入时机:仅在PWM模式1和2下有效,其他模式需手动处理。
  • 补偿过冲:动态补偿时需加限幅,防止占空比超过100%。
  • 调试建议:使用逻辑分析仪测量实际死区,与寄存器值对比,校准子步设置。

七、总结

STM32G4的HRTIM通过纳秒级死区控制,让数字电源设计者能精确平衡效率与安全。本文从原理到代码,展示了死区补偿的完整链路。实际项目中,建议结合MOSFET数据手册参数和实测波形,反复调优死区值,才能发挥HRTIM的最大潜力。