一、HRTIM 与 LLC 谐振变换器简介
STM32G4 系列内置的高分辨率定时器(HRTIM)提供 184ps 的分辨率,非常适合 LLC 谐振变换器这类对时序精度要求极高的应用。LLC 拓扑通过调节开关频率实现输出电压稳定,而移相控制(Phase Shift)则用于优化轻载效率或实现宽范围调节。HRTIM 的多路输出与灵活的死区插入机制,可精确生成带死区的互补 PWM 信号,满足原边全桥/半桥驱动需求。
- HRTIM 核心特性:高分辨率(184ps)、多定时器单元(Master + 5 Timer)、交叉同步、死区发生器、事件触发。
- LLC 移相需求:原边两个桥臂之间的相位差可调(0°~180°),用于调节谐振腔输入电压的基波幅值。
- 死区必要性:防止桥臂直通,同时为谐振电流提供续流路径,死区时间需根据 MOSFET 结电容与谐振电流优化。
二、HRTIM 移相配置原理
HRTIM 的每个 Timer 单元(如 Timer A、Timer B)均可独立产生一对互补 PWM(输出 A1/A2)。通过配置 Master 定时器或使用交叉比较器,可实现 Timer A 与 Timer B 之间的相位偏移。
- 移相实现方式:将 Timer A 作为主参考,Timer B 的计数器启动受 Master 的周期事件或比较事件触发,通过设置触发点偏移量实现相位差。
- 死区插入:每个 Timer 的输出通道均配有独立死区发生器,可设置上升沿/下降沿死区时间(单位:HRTIM 时钟周期)。
-
关键寄存器:
HRTIM_TIMxCR(控制寄存器)、HRTIM_TIMxCMPx(比较寄存器)、HRTIM_TIMxDTxR(死区寄存器)、HRTIM_MCR(主控制寄存器)。
三、CubeMX 配置步骤
- 在 STM32CubeMX 中启用 HRTIM1,选择 Timer A 和 Timer B 为“PWM 模式”,输出 A1/A2 与 B1/B2。
- 配置 Master 定时器周期为开关周期(如 100kHz 对应 10μs),预分频器设为 1(最高分辨率)。
- 设置 Timer A 为连续模式,Timer B 为“触发启动”模式,触发源选择 Master 的周期事件或 Timer A 的复位事件。
- 在 Timer B 的“相位偏移”参数中填入偏移值(0~周期值),实现移相。
- 使能各通道死区发生器,设置死区时间(例如 100ns,对应 HRTIM 时钟周期数)。
- 生成代码,初始化函数将自动配置相关寄存器。
四、完整代码示例
以下代码基于 HAL 库,展示如何动态调整移相角与死区时间。
#include "stm32g4xx_hal.h"
HRTIM_HandleTypeDef hhrtim1;
// 初始化 HRTIM(CubeMX 已生成基础配置,此处补充动态调整函数)
void HRTIM_Init(void)
{
// 假设系统时钟 170MHz,HRTIM 时钟 170MHz,分辨率 184ps
// 开关频率 100kHz -> 周期 = 1700 计数(170MHz / 100kHz)
// 死区时间 100ns -> 17 计数
// 移相 90° -> 偏移 425 计数
// 设置 Timer A 周期
__HAL_HRTIM_SETPERIOD(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, 1700 - 1);
// 设置 Timer B 周期与 A 相同
__HAL_HRTIM_SETPERIOD(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, 1700 - 1);
// 设置 Timer A 比较值(占空比 50%)
__HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, 850);
// 设置 Timer B 比较值
__HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_1, 850);
// 配置 Timer B 相位偏移(通过 Master 周期事件触发启动,偏移量由比较寄存器实现)
// 实际使用 HRTIM_TIMxCR 的 PHS 位或交叉比较器
// 此处简化:设置 Timer B 的复位事件为 Master 比较值 425
__HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_1, 425);
HAL_HRTIM_ConfigTimerTrigger(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_TIMERINDEX_MASTER, HRTIM_EVENT_1, HRTIM_TRIGGER_SOURCE_COMPARE_1, HRTIM_TRIGGER_SYNC_START);
// 死区配置:上升沿死区 17 计数,下降沿死区 17 计数
__HAL_HRTIM_DEADTIME_CONF(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_TIMER_A, 17, 17);
__HAL_HRTIM_DEADTIME_CONF(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_TIMER_B, 17, 17);
// 启动 HRTIM
HAL_HRTIM_Start(&hhrtim1, HRTIM_TIMERINDEX_MASTER);
HAL_HRTIM_Start(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A);
HAL_HRTIM_Start(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B);
}
// 动态调整移相角(单位:度,0~180)
void HRTIM_SetPhaseShift(uint16_t phase_deg)
{
uint32_t period = 1700; // 当前周期计数
uint32_t offset = (period * phase_deg) / 360;
__HAL_HRTIM_SETCOMPARE(&hhrtim1, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_1, offset);
}
// 动态调整死区时间(单位:ns)
void HRTIM_SetDeadTime(uint16_t dead_ns)
{
// HRTIM 时钟 170MHz -> 1 计数 ≈ 5.88ns
uint32_t counts = (dead_ns * 170) / 1000;
__HAL_HRTIM_DEADTIME_CONF(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_TIMER_A, counts, counts);
__HAL_HRTIM_DEADTIME_CONF(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_TIMER_B, counts, counts);
}
五、注意事项
- 死区时间与谐振电流:死区过大导致体二极管导通损耗增加,过小则可能直通。建议通过示波器观察桥臂中点电压与驱动信号,结合负载调整。
- 移相精度:HRTIM 分辨率极高,但需注意比较寄存器写入时机,避免在计数器运行中产生毛刺。可使用预装载(Preload)功能。
- 同步与触发:确保 Timer B 的启动触发源正确配置,否则移相失效。推荐使用 Master 比较事件触发。
- 保护机制:利用 HRTIM 的故障输入(FAULT)快速关断输出,提高系统安全性。
- 时钟配置:HRTIM 时钟必须使能并稳定,否则输出异常。
通过合理配置 HRTIM 的移相与死区,可显著提升 LLC 变换器在宽负载范围内的效率与可靠性。建议结合 STM32CubeMonitor 实时监测波形,加速调试。
暂无评论,来抢沙发~