4、死区时间插入:硬件死区与软件死区、死区时间计算、防止直通短路

死区时间,说白了就是给上下桥臂开关管之间留出的一个“安全间隙”。

我刚开始做电机驱动那会儿,觉得这玩意儿就是个小延迟,随便设个值就行。结果有一次调试,板子刚上电,MOS管直接冒烟了。嗯,从那以后,我再也不敢小看死区时间了。

4.1 为什么需要死区时间?

先看一个最简单的半桥结构。上管Q1和下管Q2交替导通,理想情况下,一个关断另一个立刻开通。但现实是——开关管不是瞬间完成的。

关断有延迟,开通也有延迟。如果Q1还没完全关断,Q2就开通了,那上下管直接导通,电源到地短路。这就是我们常说的“直通短路”(Shoot-Through)。

⚠ 直通短路的后果:
  • 瞬间大电流烧毁MOS管或IGBT
  • 驱动芯片过流损坏
  • 母线电容爆炸风险
  • 严重时可能烧毁整个驱动板

死区时间就是故意插入一段“都关断”的时间,让一个管子彻底关断后,另一个再开通。你想想看,这就像过马路——先确认左边没车了,再迈步。

4.2 硬件死区 vs 软件死区

实现死区插入有两种方式:硬件做,或者软件做。我两种都用过,各有各的坑。

对比项 硬件死区 软件死区
实现方式 专用死区插入芯片或MCU内部硬件定时器 PWM中断中手动修改比较值
精度 高,ns级精度 受中断响应时间影响,μs级
CPU开销 无 每个PWM周期都要处理
灵活性 固定值,运行时难调整 可动态调整,适应不同工况
典型应用 工业变频器、伺服驱动器 低成本方案、原型验证

4.2.1 硬件死区实现

现在主流MCU的PWM模块都内置了死区插入功能。以STM32的TIM高级定时器为例,配置起来其实很简单:

// STM32 TIM1 死区配置示例
TIM_BDTRInitTypeDef bdtr;
bdtr.OSSR = TIM_OSSR_Enable;      // 运行模式关闭状态
bdtr.OSSI = TIM_OSSI_Enable;      // 空闲模式关闭状态
bdtr.LOCK = TIM_LOCKLevel_1;      // 锁定配置
bdtr.DTG = 100;                   // 死区时间值
bdtr.BKE = TIM_Break_Enable;      // 刹车功能
bdtr.BKP = TIM_BreakPolarity_High;
bdtr.AOE = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIM1, &bdtr);

硬件死区的原理,说白了就是PWM硬件在输出时自动插入延迟。上管关断信号发出后,硬件计数器开始计时,计时结束才允许下管开通。整个过程不需要CPU干预。

💡 我的经验: 硬件死区适合固定频率、固定负载的场景。如果电机转速变化范围很大,硬件死区可能不够灵活——死区设大了影响效率,设小了又有风险。

4.2.2 软件死区实现

软件死区是在PWM中断里手动调整占空比。比如上管关断时,先输出一个低电平,等一段时间后再更新下管的比较值。

// 软件死区伪代码
void PWM_IRQHandler(void) {
    if (需要切换方向) {
        // 1. 先关断上管
        TIM->CCR1 = 0;
        // 2. 等待死区时间
        delay_us(DEAD_TIME_US);
        // 3. 再开通下管
        TIM->CCR2 = target_duty;
    }
}

软件死区最大的问题——延迟不稳定。中断响应时间受其他中断优先级影响,死区时间会抖动。我在一个项目中用过软件死区,结果电机低速运行时噪音特别大,后来一查,死区时间抖动了将近2μs。

⚠ 软件死区的坑:
  • 中断延迟导致死区时间不精确
  • 高频率PWM下CPU负载过高
  • 多中断嵌套时可能丢失死区
  • 调试困难,难以复现问题

4.3 死区时间计算

死区时间不是拍脑袋定的。我见过有人直接抄别人的参数,结果板子发热严重。死区时间需要根据器件参数和系统要求来算。

核心公式:

T_dead > T_off_max - T_on_min + 安全裕量

其中:
T_off_max = 开关管最大关断延迟时间
T_on_min  = 开关管最小开通延迟时间
安全裕量  = 通常取 T_off_max 的 20%~50%

举个例子,我常用的IRFP460 MOSFET:

参数 典型值 最大值
开通延迟 td(on) 25ns 50ns
上升时间 tr 45ns 90ns
关断延迟 td(off) 70ns 130ns
下降时间 tf 35ns 70ns

计算过程:

T_off_max = td(off)_max + tf_max = 130 + 70 = 200ns
T_on_min  = td(on)_min + tr_min = 25 + 45 = 70ns
理论最小死区 = 200 - 70 = 130ns
加50%裕量 = 130 * 1.5 = 195ns
实际取整 = 200ns
🔑 关键点: 死区时间不是越大越好。死区越大,PWM有效占空比损失越多,电机电流波形畸变越严重,效率越低。我一般取计算值的1.2~1.5倍,既保证安全又不牺牲太多性能。

4.4 防止直通短路的其他措施

死区时间只是第一道防线。我在实际项目中还遇到过死区时间设对了,但依然直通的情况。为什么?因为PCB布局和驱动电路设计也有问题。

4.4.1 驱动电路设计

  • 栅极电阻要匹配:上下管的栅极电阻不能差太多,否则开通/关断速度不一致
  • 独立驱动通道:上下管用独立的驱动信号,不要共用
  • 驱动芯片选型:选择带互锁功能的驱动芯片,比如IR2110自带死区保护

4.4.2 PCB布局要点

  • 功率回路尽量短:减少寄生电感,降低关断过冲
  • 驱动信号远离功率回路:避免耦合干扰导致误触发
  • 地线分离:功率地和信号地单点连接

4.4.3 软件保护

  • 互锁逻辑:在软件层面确保上下管PWM不会同时为高
  • 故障检测:检测母线电流,超过阈值立即关闭所有PWM
  • 看门狗:防止程序跑飞导致PWM输出异常
💡 我曾经踩过的坑: 有一次PCB布局时,驱动信号线和功率线走得太近,结果上管关断时产生的di/dt耦合到了下管驱动信号上,导致下管误开通。后来把驱动信号线包地处理,问题就解决了。所以,死区时间设对了,硬件布局不对照样直通。

4.5 死区时间对电机性能的影响

死区时间不是免费的午餐。它会影响电机电流波形,尤其是在低速轻载时。

  • 电流畸变:死区导致电压损失,电流波形出现“平顶”现象
  • 转矩脉动:电流畸变引起转矩波动,低速时尤其明显
  • 效率下降:死区时间越长,有效电压越低,电机效率越差

我做过一个对比实验:死区时间从200ns增加到1μs,电机在100rpm时的电流THD从5%飙升到了18%。所以,死区时间要在安全和性能之间找平衡。

🔑 总结:
  • 死区时间必须大于开关管关断延迟与开通延迟之差
  • 硬件死区精度高,适合量产产品;软件死区灵活,适合原型验证
  • 死区时间不是越大越好,要在安全裕量和性能损失之间权衡
  • 防止直通需要从死区、驱动电路、PCB布局、软件保护多管齐下
死区时间与直通保护知识体系 死区时间插入 为什么需要死区 开关管关断/开通延迟 防止直通短路(Shoot-Through) 实现方式 硬件死区 软件死区 高精度/无CPU开销 灵活/可动态调整 死区时间计算 T_dead > T_off_max - T_on_min 加20%~50%安全裕量 防止直通的其他措施 驱动电路设计 PCB布局优化 软件保护机制

死区时间这个知识点,说白了就是“安全第一,效率第二”。设得太小,管子烧了;设得太大,电机性能差了。我个人的习惯是:先按器件手册算一个理论值,然后在实际调试中用示波器观察上下管栅极波形,确保没有交叠,再逐步减小死区时间,直到找到那个“刚好安全”的点。