在电力电子和通信系统中,精确控制多路PWM信号的相位关系往往决定着整个系统的性能上限。传统方案依赖软件延时或外部同步信号,但面对微秒级的时间精度需求时,这些方法往往捉襟见肘。STM32F407的高级定时器TIM1和TIM8内置的硬件级互联机制,为这个问题提供了优雅的硬件解决方案——通过将定时器通道转化为内部触发源,实现两路互补PWM的亚微秒级相位同步控制。
当我们需要在逆变器或无线充电系统中控制两路互补PWM信号时,最头疼的莫过于发现两路信号随着运行时间增加逐渐出现相位漂移。这种漂移在示波器上表现为两个波形峰峰值之间的时间差不断变化,最终可能导致桥臂直通或能量传输效率下降。
硬件同步的核心优势在于:
以TIM1作为主定时器、TIM8作为从定时器的配置为例,其信号传递路径如下图所示(图示省略,文字描述):
这种硬件直连的触发方式,其时间抖动仅取决于时钟稳定性。在168MHz主频下,理论同步精度可达5.95ns。
让定时器通道放弃输出功能转而充当内部触发源,这种用法在官方文档中鲜有详细说明。关键在于理解三个寄存器位的组合效果:
c复制TIM_OCInitTypeDef ocConfig;
ocConfig.TIM_OCMode = TIM_OCMode_Active; // 比较匹配时生成有效电平
ocConfig.TIM_OutputState = TIM_OutputState_Disable; // 关闭物理输出
ocConfig.TIM_Pulse = phaseDelay; // 相位差对应的计数值
TIM_OC2Init(TIM1, &ocConfig);
TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_OC2Ref); // 将OC2REF设为TRGO
这段配置实现了通道的"裁判"化改造:
TIM_OCMode_Active确保比较匹配时生成高电平信号注意:TIM1的TRGO信号默认连接到ITR0线路,这是TIM8的专用触发输入源。不同定时器组合对应的ITRx编号需查阅参考手册的"定时器内部触发连接"表格。
从定时器TIM8的配置需要重点关注两个关键点:
c复制TIM_SelectSlaveMode(TIM8, TIM_SlaveMode_Reset);
TIM_SelectInputTrigger(TIM8, TIM_TS_ITR0);
复位模式的工作机制:
这种模式下,TIM8的PWM输出波形相当于被"硬同步"到TIM1的相位基准上。通过调整TIM1通道2的比较值(TIM_Pulse),可以精确控制两路PWM的相位差:
| TIM_Pulse值 | 相位差(度) | 应用场景示例 |
|---|---|---|
| 0 | 0 | 普通互补PWM |
| 6250 | 90 | 正交调制 |
| 12500 | 180 | 交错并联拓扑 |
在实际项目中,我们可能需要动态调整相位差。通过修改TIM_Pulse寄存器即可实现:
c复制void SetPhaseShift(TIM_TypeDef* TIMx, uint32_t channel, uint32_t shift)
{
uint32_t tmp = TIMx->CCR1; // 保存当前占空比
switch(channel) {
case 2:
TIMx->CCR2 = shift;
TIMx->CCR1 = tmp; // 恢复占空比
break;
// 其他通道处理...
}
}
性能边界测试数据:
在电机控制实测中,这种方法实现的相位同步精度比软件方案提升两个数量级,特别适合:
死区时间的特殊处理:
当使用硬件触发同步时,两路PWM的死区时间配置需要特别注意:
异常情况处理:
一个实用的调试技巧是在TIM1通道2上临时启用输出,用示波器观察触发信号的实际产生时刻。这比单纯看寄存器值直观得多,也能快速定位配置错误。
通过这种硬件级同步方案,我们成功在400kHz工作的无线充电发射端实现了两路PWM的±10ns相位精度控制。实际测试发现,当系统负载突变时,硬件同步方案的相位稳定性比软件方案提升近20倍。