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
4.4 防止直通短路的其他措施
死区时间只是第一道防线。我在实际项目中还遇到过死区时间设对了,但依然直通的情况。为什么?因为PCB布局和驱动电路设计也有问题。
4.4.1 驱动电路设计
- 栅极电阻要匹配:上下管的栅极电阻不能差太多,否则开通/关断速度不一致
- 独立驱动通道:上下管用独立的驱动信号,不要共用
- 驱动芯片选型:选择带互锁功能的驱动芯片,比如IR2110自带死区保护
4.4.2 PCB布局要点
- 功率回路尽量短:减少寄生电感,降低关断过冲
- 驱动信号远离功率回路:避免耦合干扰导致误触发
- 地线分离:功率地和信号地单点连接
4.4.3 软件保护
- 互锁逻辑:在软件层面确保上下管PWM不会同时为高
- 故障检测:检测母线电流,超过阈值立即关闭所有PWM
- 看门狗:防止程序跑飞导致PWM输出异常
4.5 死区时间对电机性能的影响
死区时间不是免费的午餐。它会影响电机电流波形,尤其是在低速轻载时。
- 电流畸变:死区导致电压损失,电流波形出现“平顶”现象
- 转矩脉动:电流畸变引起转矩波动,低速时尤其明显
- 效率下降:死区时间越长,有效电压越低,电机效率越差
我做过一个对比实验:死区时间从200ns增加到1μs,电机在100rpm时的电流THD从5%飙升到了18%。所以,死区时间要在安全和性能之间找平衡。
- 死区时间必须大于开关管关断延迟与开通延迟之差
- 硬件死区精度高,适合量产产品;软件死区灵活,适合原型验证
- 死区时间不是越大越好,要在安全裕量和性能损失之间权衡
- 防止直通需要从死区、驱动电路、PCB布局、软件保护多管齐下
死区时间这个知识点,说白了就是“安全第一,效率第二”。设得太小,管子烧了;设得太大,电机性能差了。我个人的习惯是:先按器件手册算一个理论值,然后在实际调试中用示波器观察上下管栅极波形,确保没有交叠,再逐步减小死区时间,直到找到那个“刚好安全”的点。