1. 项目背景与核心需求
在电力电子和电机控制领域,全桥移相控制技术是实现高效能量转换的关键。STM32F334作为STMicroelectronics推出的高精度定时器系列MCU,其内置的HRTIM(High Resolution Timer)模块能够提供高达217ps的分辨率,特别适合需要精确时序控制的应用场景。
这个项目的核心是实现:
- 基于STM32F334的高精度定时器生成4路PWM波形
- 实时动态调整各通道间的相位关系
- 确保全桥拓扑中开关管的精确时序控制
- 支持死区时间可配置的互补输出
实际工程中常见的问题:当移相角动态变化时,如何确保PWM波形切换无毛刺?这关系到功率器件的安全工作区。
2. 硬件平台选型与配置
2.1 STM32F334的HRTIM模块解析
STM32F334的HRTIM包含:
- 6个相互独立又可同步的定时器(TIM A-F)
- 每个定时器有4个比较单元
- 12个输出通道(HRTIM_OUTx)
- 交叉触发网络实现复杂时序联动
关键寄存器:
c复制typedef struct {
__IO uint32_t PERxR; // 周期寄存器
__IO uint32_t CMP1xR; // 比较寄存器1
__IO uint32_t CMP2xR; // 比较寄存器2
__IO uint32_t CMP3xR; // 比较寄存器3
__IO uint32_t CMP4xR; // 比较寄存器4
__IO uint32_t DTxR; // 死区时间寄存器
} HRTIM_TIMx_TypeDef;
2.2 全桥移相的硬件连接方案
典型应用电路:
code复制MOSFET驱动电路:
HRTIM_OUT1 -> 高端管Q1
HRTIM_OUT2 -> 低端管Q2
HRTIM_OUT3 -> 高端管Q3
HRTIM_OUT4 -> 低端管Q4
死区时间计算:
code复制死区时间(ns) = DTxR[DTG] × 2^(DTxR[DTPRSC]+1) × HRTIM时钟周期
3. 软件实现详解
3.1 基础PWM生成配置
初始化流程:
- 使能HRTIM时钟
c复制RCC->APB2ENR |= RCC_APB2ENR_HRTIM1EN;
- 配置时基单元
c复制HRTIM1->sTimerxRegs[HRTIM_TIMER_A].PERxR = 1000-1; // 1kHz PWM
HRTIM1->sTimerxRegs[HRTIM_TIMER_A].CMP1xR = 300; // 30%占空比
- 设置输出极性
c复制HRTIM1->OUTxR = (HRTIM_OUTxR_POL1 | HRTIM_OUTxR_IDLEM1);
3.2 移相控制实现
动态相位调整代码:
c复制void UpdatePhaseShift(uint8_t ch, uint16_t phase_deg) {
float phase_ticks = (phase_deg / 360.0f) * HRTIM1->sTimerxRegs[HRTIM_TIMER_A].PERxR;
HRTIM1->sTimerxRegs[ch].REPxR = (uint32_t)phase_ticks;
// 触发立即更新
HRTIM1->sCommonRegs.UPDGATR = (1 << ch);
HRTIM1->sCommonRegs.UPDGATR = 0;
}
3.3 实时刷新机制
中断服务例程:
c复制void HRTIM1_TIM_A_IRQHandler(void) {
if(HRTIM1->sTimerxISR & HRTIM_TIM_ISR_REP_CMP1) {
// 读取新相位值并更新
uint16_t new_phase = GetNewPhaseFromADC();
UpdatePhaseShift(HRTIM_TIMER_B, new_phase);
HRTIM1->sTimerxICR = HRTIM_TIM_ICR_REP_CMP1C;
}
}
4. 关键问题与解决方案
4.1 移相过渡期的波形稳定
实测发现的问题:当相位角突变超过90°时,会出现短暂的输出重叠现象。
解决方案:
- 采用斜坡过渡算法
c复制void SmoothPhaseTransition(uint8_t ch, uint16_t target_phase) {
uint16_t current = HRTIM1->sTimerxRegs[ch].REPxR;
uint16_t step = (target_phase > current) ? 5 : -5;
while(abs(current - target_phase) > 10) {
current += step;
UpdatePhaseShift(ch, current);
Delay_us(100);
}
}
- 在硬件上增加RC滤波(时间常数约1μs)
4.2 死区时间动态补偿
发现的现象:当开关频率超过50kHz时,固定的死区时间会导致效率下降。
优化方案:
c复制void AdjustDeadTime(uint16_t freq_khz) {
uint8_t dtg = (freq_khz > 50) ? 10 : 15;
HRTIM1->sTimerxRegs[HRTIM_TIMER_A].DTxR = (dtg << 16) | dtg;
}
5. 性能测试数据
测试条件:
- 供电电压:24V DC
- 负载:1Ω功率电阻
- 开关频率:20kHz
| 参数 | 测量值 |
|---|---|
| 相位分辨率 | 0.1° |
| 刷新延迟 | <2μs |
| 占空比精度 | ±0.5% |
| 死区时间范围 | 50ns-5μs |
| 最大移相范围 | 0-360° |
6. 工程实践经验
- PCB布局要点:
- HRTIM输出走线应等长(差异<5mm)
- 每个MOSFET栅极串联10Ω电阻
- 在MCU电源引脚放置0.1μF去耦电容
- 代码优化技巧:
c复制// 使用DMA加速参数更新
HRTIM1->sCommonRegs.DLLCR = HRTIM_DLLCR_DTEN | HRTIM_DLLCR_DMASRC_0;
DMA1_Channel5->CCR |= DMA_CCR_EN;
- 调试小技巧:
- 利用HRTIM的故障输入功能实现硬件保护
- 通过HRTIM的Burst模式实现突发PWM控制
- 使用Timer E作为高精度时间戳计数器
这个方案已经成功应用于:
- 3kW LLC谐振变换器
- 伺服电机驱动器
- 无线充电发射端控制
实际测试中发现,当环境温度从25℃升至85℃时,PWM时序漂移小于0.05%,证明了HRTIM出色的温度稳定性。对于需要更高精度的场合,建议使用外部温度补偿晶体振荡器(TCXO)作为HRTIM时钟源。
