4、死区时间设置:什么是死区时间、死区时间对电机的影响、如何计算和配置死区

好,咱们接着聊PWM调制。前面讲了互补输出、载波频率,今天要聊的这个话题,我敢说——每个做电机驱动的工程师,都在这上面吃过亏。它就是死区时间

死区时间,英文叫Dead Time,也有人叫它“死区”、“死区延时”。说白了,就是上下桥臂同时关断的那一小段时间

你想想看,我们用的MOSFET或IGBT,开关速度再快,也不是瞬间完成的。关断需要时间,开通也需要时间。如果上管还没完全关断,下管就导通了——那结果就是直通短路,电流瞬间飙升,管子直接冒烟。

所以,我们必须人为地在上下管切换时,插入一段“空白期”。这段时间里,两个管子都关着。这就是死区时间。

核心定义:死区时间 = 上管关断后到下管开通前,或下管关断后到上管开通前,插入的一段“同时关断”的保护时间。

4.1 死区时间对电机的影响

死区时间不是越大越好,也不是越小越好。它是一把双刃剑。

先说坏处——死区时间带来的负面影响:

  • 电压损失:死区时间内,电流通过续流二极管续流。这会导致实际输出电压比理论值偏低。我做过一个项目,死区设了3μs,结果电机在低速运行时,明显感觉扭矩不足。一测波形,电压畸变得厉害。
  • 电流谐波增加:死区效应会让电流波形产生“削顶”或“台阶”,谐波含量上升。电机发热会更严重,噪音也会变大。
  • 低速性能变差:转速越低,死区时间占一个PWM周期的比例越大,影响越明显。电机在低速时容易抖动、甚至爬行。
  • 零电流钳位:当电流过零时,死区效应会导致电流在零点附近“卡住”一段时间。这个现象叫“零电流钳位”。电机在轻载或空载时,电流波形会变得很难看。

再说好处——为什么必须有死区:

  • 防止直通短路:这是最根本的原因。没有死区,炸管是迟早的事。
  • 保护功率器件:MOSFET和IGBT的开关损耗、应力都会因为直通而急剧增加。死区是给它们留的“喘息空间”。

⚠️ 重要提醒:死区时间设置过小,风险极大。我曾经调试一个48V/500W的BLDC驱动器,把死区从2μs改到0.5μs,想提升效率。结果上电不到3秒,MOSFET直接炸了,PCB都烧了个洞。从那以后,我给自己定了个规矩:死区宁大勿小,安全第一。

4.2 如何计算死区时间

死区时间不是拍脑袋定的。它取决于几个关键参数:

  1. 功率器件的关断延迟时间(t_off)——从驱动信号撤去到管子完全关断的时间。
  2. 功率器件的开通延迟时间(t_on)——从驱动信号给出到管子完全开通的时间。
  3. 驱动芯片的传输延迟——驱动信号从MCU到栅极的延迟。
  4. 死区时间裕量——通常留20%~50%的安全余量。

计算公式很简单:

死区时间 ≥ (t_off_max - t_on_min) + 裕量

但实际工程中,我们更常用的是:

死区时间 = t_off_max + 裕量

为什么?因为t_off通常比t_on大,而且更不稳定。我习惯直接查器件手册里的“关断延迟时间”典型值和最大值,然后加上0.5μs~1μs的裕量。

举个例子:

假设你用的MOSFET是IRFS3006,手册上写着:

  • t_d(off) 典型值:45ns,最大值:70ns
  • t_d(on) 典型值:25ns,最大值:40ns

那么,死区时间至少需要:70ns - 25ns + 裕量 ≈ 45ns + 500ns ≈ 545ns。

实际工程中,我一般取1μs~3μs作为起步值。对于IGBT,因为开关速度慢,死区通常取2μs~5μs

💡 我的经验:如果你不确定,先设一个偏大的值(比如3μs),然后逐步减小,同时用示波器观察上下管栅极波形。确保在死区时间内,两个管子确实都关断了。我习惯在死区中间时刻,检查一下Vgs波形是否有“交叠”。一旦发现交叠,立刻加大死区。

4.3 如何配置死区

配置死区,通常有两种方式:

方式一:硬件死区(推荐)

很多电机驱动专用芯片(如DRV8301、IR2136)内部自带死区插入电路。你只需要通过寄存器设置死区时间即可。这种方式最可靠,因为死区是硬件生成的,不受软件干扰。

方式二:软件死区

在MCU的PWM模块里,通过配置死区寄存器来实现。以STM32为例:

// STM32 TIM1 死区配置示例
TIM_BDTRInitTypeDef BDTR_InitStructure;

BDTR_InitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
BDTR_InitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
BDTR_InitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
BDTR_InitStructure.TIM_DeadTime = 0x64;  // 死区时间 = 0x64 * T_clk
BDTR_InitStructure.TIM_Break = TIM_Break_Disable;
BDTR_InitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
BDTR_InitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

TIM_BDTRConfig(TIM1, &BDTR_InitStructure);

这里的TIM_DeadTime寄存器值,需要根据你的时钟频率来计算。比如,TIM1的时钟是72MHz,那么一个计数周期是13.89ns。如果死区寄存器设为0x64(100),死区时间就是100 × 13.89ns ≈ 1.389μs。

配置要点:

  • 死区时间单位通常是PWM时钟周期,不是微秒。一定要换算清楚。
  • 配置完成后,用示波器测量上下管栅极波形,确认死区时间是否正确。
  • 如果使用互补PWM,记得同时配置上升沿和下降沿的死区。有些MCU支持分别配置。

4.4 避坑指南

最后,分享几个我踩过的坑:

  • 坑1:死区时间设得太小,导致炸管。我曾经为了追求效率,把死区从2μs改到0.8μs。结果上电瞬间,MOSFET直接击穿。后来发现,驱动芯片的传输延迟比我想象的大,实际死区只有0.3μs。
  • 坑2:死区时间设得太大,导致电机抖动。有一次调试一个伺服电机,死区设了5μs。电机在低速时抖得厉害,电流波形全是毛刺。后来把死区降到1.5μs,问题解决。
  • 坑3:忽略了温度对死区的影响。MOSFET的关断延迟时间会随温度升高而增加。我建议在高温环境下(比如85°C),适当增加死区裕量。

⚠️ 最终建议:死区时间没有“万能值”。每个项目都要根据实际器件、驱动芯片、工作频率、温度范围来调整。我的习惯是:先保守,再优化,最后用示波器验证。安全第一,效率第二。

好了,死区时间就聊到这里。下一章,我们聊聊PWM调制策略中的另一个关键参数——调制比。这东西直接决定了你能把电机驱动到多高的转速。