首页 / 驱动算法 / 高级篇

死区补偿:电压前馈与电流极性判断

逆变器为什么必须留死区?死区如何"偷走"输出电压、把电流波形拧变形?本文讲透死区效应的机理、电压前馈补偿的原理,以及决定补偿成败的电流极性判断。

1. 什么是死区(Dead-Time)?为什么必须有它

三相逆变器每个桥臂都由上管 + 下管两个开关管组成。它们绝不能同时导通——一旦直通,母线电压直接短路,瞬间烧毁开关管。

但开关管有开通/关断时间:上管还没完全关断、下管就开通的瞬间,两者都会短暂导通(直通)。为了彻底避免直通,必须插入一段上下管都关断的时间,这就是死区时间(Dead-Time)td

死区时间

td > toff,max − ton,min + 裕量,典型值几百 ns ~ 几 μs

💡 死区时间由什么决定?

开关管的数据手册开关时间(ton/toff)、门极驱动电路的延迟、续流二极管反向恢复时间,以及 EMI/共模抑制的要求。死区太短有直通风险,太长则电压误差大——这是一个需要权衡的设计量。

2. 死区效应:电压误差是怎么产生的

死区期间上下管都关断,相电流只能经续流二极管续流。此时相电压不再是"指令决定的",而是由电流方向决定

也就是说,在死区这段本该"三态悬空"的时间里,输出电压被续流二极管"强制"到了与指令相反的方向。平均下来,实际输出电压比指令电压少了一块固定的量

死区等效电压误差

Verr ≈ (td / Tsw) · Vdc

vactual = vcmd − sign(i) · Verr

其中 Tsw 是 PWM 周期。例如 20kHz 开关、2.5μs 死区、24V 母线:Verr = (2.5/50)·24 = 1.2V——在 24V 系统里接近 5% 的电压损失。

⚠️ 别忘了管压降

严格地讲,死区误差还应包括开关管导通压降 VCE(sat) 和续流二极管压降 VF,以及开通/关断时间不对称 (ton−toff)/Tsw·Vdc。在低压大电流场合(如 24V 以下、电流几十安),管压降项占比很大,不可忽略。

3. 死区效应对 FOC 的影响

与齿槽转矩、角度误差不同,死区是电压域的扰动,直接从"驱动源头"污染电流——所以补偿也必须在电压域做(前馈补偿电压)。

4. 补偿原理:电压前馈

核心思想很直接:死区"偷走"了 sign(i)·Verr 的电压,那就原样补回去

电压前馈补偿

vcmd,comp = vcmd + sign(i) · Verr

三相各算各的:知道每相电流方向,就把 Verr 加回该相电压指令。实现上有两种主流做法:

  1. 电压前馈法:在反 Park 之后、SVPWM 之前,把补偿电压叠加到三相电压指令(或在 αβ 域构造补偿矢量)。实现简单,不依赖 PWM 硬件。
  2. PWM 脉宽修正法:直接修改比较寄存器的计数值,电流为正就延长导通时间、为负就缩短。更贴近硬件,但要注意计数上下溢。
✅ 补偿的本质是"预测"

死区误差是确定性的(方向由电流极性决定、大小由 td/Tsw·Vdc 决定),所以用前馈即可精确抵消,不改变闭环稳定性。前提是:电流极性判断要准(见下一节)。

5. 电流极性判断:补偿的成败关键

电压前馈补偿需要知道每相电流的符号 sign(i)。问题在于电流过零附近

工程上的解决办法:

  1. 滞回比较(hysteresis):电流超过 +Ith 判正、低于 −Ith 判负,中间保持上一极性。简单有效。
  2. 电流矢量角判断:用 iα/iβ(或 id/iq)的矢量角度判断三相极性,而不是逐相看瞬时值——利用了三相 120° 关系,抗抖动更强。
  3. 只补偿可靠区:|i| 小于阈值的相不补偿,或降低补偿增益,避免误补。
  4. 观测器估计过零:用电流观测器/滤波器平滑后的值判断极性。

6. 交互式演示:死区时序与补偿效果

左侧是单相 PWM 时序(上管 S1 / 下管 S4,红色竖条为死区),下方是相电压的理想值(蓝虚线)与实际值(红实线)——注意死区期间实际电压被续流二极管"拽"到与电流方向相反的电平。右侧是电流波形:理想(灰)、死区畸变(红,过零处出现台阶)、补偿后(绿)。

死区效应与电压前馈补偿演示
死区电压误差 V_err=(td/Tsw)·Vdc = 1.20 V · 过零畸变宽度 ≈ 17° · 补偿后残余 ≈ 0°

观察要点:

7. 代码实现(C语言)

7.1 电压前馈补偿

/* 死区电压前馈补偿:在 αβ 电压上叠加由三相电流极性决定的补偿量 */ typedef struct { float v_err; /* 死区等效电压误差 V_err = (td/Tsw)*Vdc + Vce + Vf */ float i_thresh; /* 极性判断阈值,防过零抖动 */ } dt_comp_t; /* 三相电流 → 极性(带滞回保持,避免过零误判) */ void dt_polarity(const float *i, float *sign, const dt_comp_t *dt) { static float prev[3] = { 1, -1, 1 }; for (int k = 0; k < 3; k++) { if (i[k] > dt->i_thresh) sign[k] = 1.0f; else if (i[k] < -dt->i_thresh) sign[k] = -1.0f; else sign[k] = prev[k]; /* 过零带内保持上一极性 */ prev[k] = sign[k]; } } /* 在 v_alpha / v_beta 上叠加死区补偿 */ void dt_comp_apply(float *v_alpha, float *v_beta, const float *i_abc, const dt_comp_t *dt) { float sign[3]; dt_polarity(i_abc, sign, dt); /* 反 Clarke:αβ → 三相电压指令(等幅值) */ float va = *v_alpha; float vb = (-*v_alpha + 1.7320508f*v_beta) * 0.5f; float vc = (-*v_alpha - 1.7320508f*v_beta) * 0.5f; /* 各相叠加补偿电压 */ va += sign[0] * dt->v_err; vb += sign[1] * dt->v_err; vc += sign[2] * dt->v_err; /* 正 Clarke:三相 → αβ */ *v_alpha = va; *v_beta = (va + 2.0f*vb) * 0.57735027f; }

7.2 PWM 脉宽修正法

/* 直接修正中心对齐 PWM 比较值:电流为正拉长导通,为负缩短 */ void dt_comp_pwm(uint16_t *cmp_a, uint16_t *cmp_b, uint16_t *cmp_c, const int8_t *sign, uint16_t dt_ticks) { /* dt_ticks = t_d / (T_sw/2) * 定时器计数峰值,换算到比较值 */ *cmp_a = (uint16_t)(*cmp_a + sign[0] * dt_ticks); *cmp_b = (uint16_t)(*cmp_b + sign[1] * dt_ticks); *cmp_c = (uint16_t)(*cmp_c + sign[2] * dt_ticks); /* 注意:必须做上下限钳位,防止比较值越界(负值/超周期) */ }

7.3 参数来源与标定

  1. Verrtd 取实际配置的死区时间(不是理论值),Tsw 取 PWM 周期
  2. 低压大电流场合把 VCE(sat)、VF 折算进去:Verr = (td/Tsw)·Vdc + VCE + VF
  3. 极性判断阈值 Ith 取电流纹波幅值的一半左右,太小会抖动、太大会漏补
  4. 补偿效果验证:看电流波形过零处是否还有台阶、iq 的 6 次谐波是否下降

8. 工程要点与常见误区

要点 1:死区时间要权衡,不是越小越好

死区太短有直通风险(炸管),太长则电压误差大、低速性能差。在满足可靠性(开关时间+驱动延迟+反向恢复+裕量)的前提下尽量短,再用补偿把残余误差去掉。

要点 2:低速轻载补偿收益最大

低速时电压指令小、电流小,死区误差相对占比大,过零畸变明显;高速大电流时相对影响小,但 6 次谐波噪音仍可能存在。补偿算法通常全程开启即可。

要点 3:电流极性判断是成败关键

过零附近的极性误判会让补偿"帮倒忙"。务必用滞回 + 阈值电流矢量角判断,别直接用原始采样瞬时值比零。

要点 4:低压大电流要补管压降

VCE(sat) 和 VF 在低压系统里可能和死区误差同一量级。只补死区时间会补偿不足,需把管压降一并计入 Verr

要点 5:最小脉宽问题

指令脉宽接近死区时,PWM 脉冲可能被"吃掉"(窄脉冲丢失),此时前馈模型失效。可在 PWM 生成时做最小脉宽钳制,或用高分辨率定时器。

要点 6:与其它补偿的分工

死区补偿在电压域(补电压),齿槽转矩补偿在电流域(补 iq),磁编校正在角度域(补角度)。三者互补,互不冲突,但要各自管理好参数,别重复叠加同一个扰动。

误区 1:死区时间越小越好

过小有直通风险。正确做法是在可靠前提下尽量小,剩余误差交给补偿。

误区 2:只补偿死区时间,忽略管压降

低压大电流场合管压降占比很大,忽略会导致补偿不足、电流仍畸变。

误区 3:直接用采样瞬时值判断电流极性

过零附近噪声/纹波使极性抖动,补偿方向反复横跳。要用滞回、阈值或矢量角。

误区 4:高速就不需要死区补偿

相对影响变小,但 6 次谐波引起的振动噪音在高速反而更突出(频率更高、更刺耳),一般仍需开启。

误区 5:死区补偿 = 齿槽转矩补偿

死区是电压域扰动(与电流极性、td、Vdc 相关),齿槽是电流域扰动(与转子角度相关)。补偿量不同、位置不同,别混为一谈。

9. 小结

  1. 死区是防止上下管直通的安全时间,代价是输出电压误差
  2. 死区期间相电压由电流方向决定(续流二极管),等效电压误差 Verr = (td/Tsw)·Vdc,还要加管压降
  3. 死区误差造成相电压畸变 → 6/12 次谐波电流 → 转矩脉动与噪音,低速轻载最严重
  4. 补偿核心是电压前馈:vcmd + sign(i)·Verr;也可直接修 PWM 比较值
  5. 成败关键在于电流极性判断:滞回/阈值/矢量角,避免过零误判
  6. 与齿槽(电流域)、磁编(角度域)补偿分工互补,按电压域→电流域→角度域分层治理

下一篇我们回到转矩品质的另一面——齿槽转矩补偿,看看"与电流无关"的定位转矩怎么用 q 轴前馈抹平。