STM32G4 HRTIM死区补偿实战:数字电源中的纳秒级精度控制
👁 1 阅读 · 2026-08-27 · 嵌入式
STM32G4系列内置的高分辨率定时器(HRTIM)以184皮秒的时间分辨率,成为数字电源控制的核心外设。但在实际应用中,死区时间的设置与补偿直接影响电源效率与可靠性。本文深入剖析HRTIM死区产生原理,结合数字电源场景,给出死区补偿的完整配置流程与代码实现,帮助开发者规避MOSFET直通风险,提升系统稳定性。
# 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的最大潜力。