STM32F103移相全桥PWM寄存器级配置实战

张开发
2026/4/11 5:16:38 15 分钟阅读
STM32F103移相全桥PWM寄存器级配置实战
1. STM32F103移相全桥PWM控制的核心原理移相全桥拓扑在DCDC电源设计中非常常见它通过调节两个桥臂之间的相位差来控制功率传输。STM32F103的高级定时器TIM1和TIM8正好可以完美实现这个功能。我做过好几个电源项目发现直接操作寄存器比用库函数效率高得多代码体积能减少30%以上。这里的关键在于让TIM1作为主定时器TIM8作为从定时器。TIM1的OC1REF信号触发TIM8计数器复位这样两个定时器就形成了主从关系。具体来说当TIM1的计数器值达到CCR1时会产生一个触发信号这个信号会让TIM8的计数器立即复位。通过调整TIM1的CCR1值就能改变两个桥臂PWM波形的相位差。2. 硬件准备与引脚配置在开始写代码前得先把硬件连接好。我用的是STM32F103C8T6最小系统板引脚分配如下TIM1_CH1 (PA8): 第一个桥臂的上管驱动TIM1_CH1N (PB13): 第一个桥臂的下管驱动TIM8_CH2 (PC7): 第二个桥臂的上管驱动TIM8_CH2N (PB0): 第二个桥臂的下管驱动配置GPIO时要注意高级定时器的互补输出需要配置为复用推挽输出模式。这里有个坑我踩过PB3/PB4默认是JTAG功能如果用这两个引脚记得先禁用JTAG。// TIM1通道1和互补输出配置 GPIOA-CRH 0xFFFFFFF0; // PA8 GPIOA-CRH | 0x0000000B; // 复用推挽输出 GPIOB-CRH 0xFF0FFFFF; // PB13 GPIOB-CRH | 0x00B00000; // TIM8通道2和互补输出配置 GPIOC-CRL 0x0FFFFFFF; // PC7 GPIOC-CRL | 0xB0000000; GPIOB-CRL 0xFFFFFFF0; // PB0 GPIOB-CRL | 0x0000000B;3. TIM1主定时器配置详解TIM1的配置是整个系统的核心这里每一步都很关键。我建议按照这个顺序来配置先使能时钟TIM1在APB2总线上别忘了同时使能GPIO时钟配置时基单元ARR决定PWM频率PSC设置分频设置PWM模式我们用的是PWM模式1配置主从模式让OC1REF作为触发输出开启输出和互补输出RCC-APB2ENR | 111; // 使能TIM1时钟 TIM1-ARR 1599; // 假设PWM频率为10kHz(72MHz/(15991)) TIM1-PSC 0; // 不分频 // PWM模式1配置 TIM1-CCMR1 | 612; // CH1 PWM模式1 TIM1-CCMR1 | 111; // 开启CCR1预装载 // 主模式配置 TIM1-CR2 | 44; // OC1REF作为触发输出 TIM1-CCER | 10; // 开启CH1输出 TIM1-CCER | 12; // 开启CH1N输出 // 死区时间配置这个很重要 TIM1-BDTR 900 | 115; // 90个时钟周期的死区特别注意BDTR寄存器它控制死区时间。电源电路中上下管不能同时导通这个参数设置不当会直接烧管我建议先用示波器观察波形确保死区时间足够。4. TIM8从定时器配置技巧TIM8的配置要和TIM1配合重点在于从模式设置。我们需要让TIM8在TIM1的触发信号到来时复位计数器这样就能实现移相控制。RCC-APB2ENR | 113; // 使能TIM8时钟 TIM8-ARR 1599; // 必须和TIM1相同 TIM8-PSC 0; // 从模式配置 TIM8-SMCR | 17; // 从模式使能 TIM8-SMCR | 40; // 复位模式 TIM8-SMCR | 04; // 选择ITR0触发源 // PWM输出配置 TIM8-CCMR1 | 612; // CH2 PWM模式1 TIM8-CCER | 14; // 开启CH2输出 TIM8-CCER | 16; // 开启CH2N输出 TIM8-BDTR | 115; // 主输出使能这里有个细节要注意TIM8的触发源选择ITR0这意味着它接收来自TIM1的触发信号。STM32内部有专门的触发路由TIM1的TRGO连接到TIM8的ITR0。5. 移相角度控制实战移相控制的关键在于动态调整TIM1的CCR1值。CCR1的值决定了TIM8相对于TIM1的相位延迟。在实际项目中我通常这样实现void set_phase_shift(uint16_t angle) { // 角度转换为CCR值0-180度对应0-ARR uint16_t ccr (angle * TIM1-ARR) / 180; TIM1-CCR1 ccr; // 保持TIM8的占空比50% TIM8-CCR2 TIM8-ARR / 2; }调用这个函数时输入0-180之间的角度值就能实现0-180度的移相控制。比如要设置90度移相set_phase_shift(90); // 设置90度移相实测中发现移相角度在30-150度之间效率最高。角度太小可能死区不够太大则有效功率传输时间太短。6. 调试技巧与常见问题调试这种寄存器级项目我有几个实用建议先用逻辑分析仪或示波器观察PWM波形确保基础时序正确逐步增加移相角度观察两个桥臂的相位差变化特别注意死区时间可以用示波器的双通道测量上下管的驱动信号如果发现异常按这个顺序检查时钟是否使能GPIO配置是否正确定时器是否使能主从触发链路是否畅通常见问题解决方案没有输出检查BDTR的MOE位是否置1移相不起作用确认SMCR寄存器配置正确波形抖动可能是中断干扰尝试关闭不必要的中断7. 性能优化建议经过几个项目的实践我总结出这些优化经验如果对实时性要求高可以关闭所有预装载功能但要注意这样就不能动态修改ARR了最小化中断使用用DMA传输PWM参数可以大幅提高响应速度在72MHz主频下死区时间最小可以设置到约70ns(5个时钟周期)如果需要更精细的移相控制可以降低ARR值提高分辨率但要注意开关损耗会增加// 关闭预装载的示例 TIM1-CCMR1 ~(111); // 关闭CCR1预装载 TIM1-CR1 ~(17); // 关闭ARR预装载电源项目中我通常会保留ARR预装载但关闭CCR预装载这样既能动态调整移相角度又能保证PWM周期稳定。

更多文章