STM32 互补 PWM 死区时间:为什么上下管不能同时导通?从桥臂直通到死区计算
一、问题从一次烧管说起
驱动电机、DCDC 或者逆变桥时,同一个桥臂的上管和下管绝不能同时导通。理想的 PWM 是互补的:上管开,下管就关;下管开,上管就关。但真实的 MOSFET 不是理想开关,关断比导通慢,驱动电路、寄生参数还会再加延迟。如果按理想互补时序直接切换,就会出现一个极短的时间窗口:上管还没完全关断,下管已经导通,电源经过两个管子直接对地短路,这就是桥臂直通(shoot-through)。电流在几十纳秒内冲上去,轻则发热效率下降,重则烧管。所以工程上的做法不是让两者无缝衔接,而是在两者之间人为插入一段“都关断”的空窗,这段空窗就是死区时间。
二、死区时间的本质:给关断留出余量
死区时间的下限由器件的开关时间差决定。记上管关断时间为 t_off,下管导通时间为 t_on,驱动延迟差为 t_skew,则至少需要:T_dead > (t_off_max - t_on_min) + t_skew + 裕量。裕量一般取开关时间差的 30%~100%,还要考虑温度漂移:高温下关断往往更慢,低温下导通可能更快,datasheet 给的是典型值,设计要按最大值留余量。举例:某 MOSFET t_off 最大 80ns,t_on 最小 30ns,驱动延迟差约 20ns,则 T_dead 至少要大于 70ns,工程上常取 200ns~500ns。死区也不是越大越好:死区过大会让输出电压在每个周期损失一部分有效占空比,电流波形出现畸变,电机低速时抖动、DCDC 轻载时纹波变大。死区时间的上限由允许的电压损失决定,经验是死区占 PWM 周期的比例一般不超过 2%~5%。20kHz 周期 50us,500ns 死区只占 1%,可以接受;200kHz 周期 5us,500ns 就占了 10%,必须重新选管子或降频。
三、STM32 的实现:TIM1/TIM8 的 BDTR 死区
STM32 的高级定时器 TIM1/TIM8 天生为互补输出准备了死区发生器,死区由 BDTR 寄存器的 DTG[7:0] 配置,计数时钟为定时器时钟,编码分四段,步进随死区变大而变粗。HAL 里不需要自己算寄存器位,配置结构体里直接填:TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 100; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig); 注意 DeadTime 这个数不是纳秒,而是 DTG 编码值,必须按手册的四段公式换算,不能直接填 200 以为是 200ns。换算前先确认定时器时钟:APB2 分频后的 TIM1 时钟是多少,DTG 步进就是一个定时器时钟周期。算错时钟,死区就会成倍偏差。配置完成后一定要用示波器双通道同时看上下管栅极:先确认两者之间确实存在都为低的空窗,再确认空窗宽度与计算值一致,最后在满载、高温下复测一次。只看代码、不看波形,是死区调试最常见的翻车原因。
四、三个工程坑
第一,死区只加在一边。互补输出的两条边都要插死区,只处理上升沿、不处理下降沿,等于只堵了一半的直通窗口。第二,刹车与死区混淆。BDTR 的 Break 是故障保护,死区是正常换相时序,两者都要配,但不能互相代替:Break 触发后输出关断,恢复需要重新使能;死区每个周期都存在。第三,软件延时代替硬件死区。用延时函数在关管和开管之间插空窗,会被中断打断、抖动大,且换相频率一高就失真;硬件死区由定时器保证,抖动只有一个时钟周期,优先用硬件。
五、结论
死区时间不是“随便加一点延迟”,而是用器件开关时间差算出来的安全余量:下限防直通,上限保波形,中间取值靠 datasheet 最大值加温度裕量。先算、再配 BDTR、最后用示波器验波形,这三步缺一不可。桥臂直通烧掉的管子,多数不是器件质量问题,而是死区算错或者根本没加。
- 点赞
- 收藏
- 关注作者
评论(0)