STM32 高级定时器 PWM 实战:互补输出、死区、刹车,驱动半桥不炸管

STM32 高级定时器 PWM 实战:互补输出、死区、刹车,驱动半桥不炸管 用 MCU 驱动电机、推挽电源、或者任何半桥电路最怕一件事上下两个管子同时导通。母线电压直接从上端管子穿过下端管子短路到地几毫秒就能把 MOS 或 IGBT 烧穿板子冒烟。普通定时器一个通道只能出一路 PWM管不了「一上一下必须错开」这种活。STM32 的高级定时器TIM1、TIM8专门为此设计它一个通道能出两路互补的 PWM还能在切换瞬间插入一段「两路都关断」的死区时间外面再来个过流信号刹车引脚一拉就强制全部关输出。这篇文章把互补输出、死区、刹车这三件套讲透顺带把中心对齐和换相时机也说清楚。半桥为什么需要互补和死区半桥是上下两个开关管中间点是输出。理想状态是上管开时下管关、下管开时上管关。但管子关断有延迟如果上管命令「关」到下管命令「开」之间没有间隙会出现一瞬间两个都半开电流直通。死区Dead Time就是插在互补切换之间的保险上管关掉后等一段固定时间比如 500ns确认它真的关死了再让下管开。这段时间两路输出都强制为无效电平谁都不通。高级定时器的每个通道有主输出 CHx 和互补输出 CHxN。它们电平天然相反CHx 高时 CHxN 低。死区插在它们交越的地方。互补输出和死区的时序下面这张时序图是核心。CHx 从高变低之后要等死区时间CHxN 才允许从低变高。反过来也一样。CubeMX 里配置 TIM1Clock Source 选 Internal ClockChannel1 选 PWM Generation CH1 CH1N带 N 的就是互补计数周期 Counter PeriodARR决定频率PulseCCR决定占空比Dead Time 填死区时间单位是时钟周期工具会换算成纳秒提示关键代码启动互补输出// 普通通道用 HAL_TIM_PWM_StartHAL_TIM_PWM_Start(htim1,TIM_CHANNEL_1);// 互补通道必须用带 N 的函数否则 CH1N 没输出HAL_TIMEx_PWMN_Start(htim1,TIM_CHANNEL_1);// 高级定时器还要开主输出使能 MOE否则任何引脚都不动__HAL_TIM_MOE_ENABLE(htim1);改占空比随时调 CCR 就行__HAL_TIM_SET_COMPARE(htim1,TIM_CHANNEL_1,new_pulse);刹车过流时一键关断刹车Break是保命功能。把比较器的过流信号、或者硬件保护脚接到 TIM 的 BKIN 引脚。一旦这个信号有效定时器立刻把所有 PWM 输出强制拉到预设的安全电平通常全关不依赖 CPU 跑中断反应速度是纳秒级。// CubeMX 里 Break 使能配置有效电平、输出空闲状态// 刹车触发后进入这个回调voidHAL_TIMEx_BreakCallback(TIM_HandleTypeDef*htim){// 这里通常只是记录状态真正的关断由硬件完成fault_flag1;}注意刹车触发后 MOE 会被硬件自动清零所有输出关掉。想恢复必须软件重新使能 MOE并且清掉刹车标志。很多人卡在这里过流解除后 PWM 死活不输出就是因为没重新开 MOE。中心对齐与换相时机普通 PWM 是边沿对齐计数器从 0 数到 ARR 再归零比较点在一边。中心对齐Center-Aligned是计数器先上数到 ARR 再下数回 0波形关于周期中点对称。好处是谐波更集中在开关频率两倍处EMC 好做一些电机驱动里常用。中心对齐模式下有个细节更新事件UVE发生在计数到 0 或到 ARR 的位置和边沿对齐不一样。如果你用更新事件去触发 ADC 采样采样点会落在 PWM 中点此时桥臂刚好在死区或换相边缘正好是开关噪声最小的位置这点对 FOC 的电流采样特别关键。十个坑烧管子基本都在这死区没设或设太短。互补切换瞬间两管直通母线直接短路板子冒烟。死区必须覆盖管子的关断延迟留余量。互补极性没配对。CHx 和 CHxN 的有效电平要一正一反配反了等于两路同相一上电就同时导通。用示波器量上下管栅极确认相位相反。刹车没使能或没接硬件信号。过流时 PWM 还在输出炸管没法救。Break 功能一定要开信号取自硬件比较器而非软件判断。互补通道用错启动函数。只调HAL_TIM_PWM_Start开的是 CHxCHxN 静悄悄没输出半桥只有上管在动。互补必须HAL_TIMEx_PWMN_Start。刹车后没重新开 MOE。过流解除后 PWM 不恢复查TIMx-BDTR的 MOE 位软件__HAL_TIM_MOE_ENABLE重新使能并清标志。高级定时器忘了开主输出 MOE。这个最容易忽略HAL_TIM_PWM_Start之后输出引脚纹丝不动加一句__HAL_TIM_MOE_ENABLE立刻好。占空比算错超过 ARR。CCR 大于 ARR输出一直高或一直低桥臂卡在一个状态。占空比按ARR * duty算钳在 0 到 ARR 之间。死区时间不是任意值。死区寄存器按时钟周期分档有最小步进工具显示的时间和实际有量化误差。高速桥臂死区别卡在边界值。中心对齐下 ADC 触发点选错。更新事件位置变了采样点落在开关动作瞬间采到全是尖峰噪声。把触发对齐到 PWM 中点或死区。换相和更新事件竞争。电机换相改 CCR 的瞬间正好撞上更新事件可能出现一帧占空比错乱。用预装载Preload让 CCR 在下个周期才生效避免毛刺。把这件事收一下互补、死区、刹车这三件套是 MCU 碰功率器件的安全底线。死区防直通互补管半桥刹车做过流硬保护缺一不可。配置上最容易被坑的不是算法是那几个高级定时器特有的开关MOE 没开、互补函数没调、刹车后没恢复。示波器量一下上下管栅极的相位和间隙比任何理论推演都管用。驱动半桥先保命再谈性能。死区插在切换缝里刹车挂在硬件脚上MOE 和互补函数一个都不能漏上电前用示波器量相位别用板子赌。