3. 死区补偿基础方法

死区补偿,说白了就是跟死区效应对着干。你加了死区时间,它带来了电压误差和电流畸变,那我们就想办法把这部分误差补回去。我做了这么多年电机控制,死区补偿的方法见过不下十种,但最基础、最常用的,就是下面这三种。

核心思路:死区补偿的本质是“反向注入”。死区让实际输出电压偏离了指令值,我们就主动调整开关时刻或电压指令,让实际输出重新逼近理想值。

3.1 基于电流极性检测的补偿法

这是最直观的方法。你想想看,死区效应导致的电压误差,方向完全取决于电流的极性。电流流出去和流进来,死区造成的偏差正好相反。

基本原理:

  • 当相电流 > 0(定义为流出桥臂),死区导致实际电压 < 指令电压,需要正向补偿。
  • 当相电流 < 0(定义为流入桥臂),死区导致实际电压 > 指令电压,需要负向补偿。

补偿量的大小,就是死区时间乘以直流母线电压,再除以开关周期。公式很简单:

ΔV = (T_dead × V_dc) / T_sw

其中 T_dead 是死区时间,V_dc 是母线电压,T_sw 是开关周期。

实现步骤:

  1. 采样三相电流 i_a, i_b, i_c。
  2. 判断每相电流的极性(正或负)。
  3. 根据极性,在每相占空比指令上加上或减去补偿量 ΔV。
  4. 限幅处理,防止占空比超出 0~1 范围。

我的经验:电流极性检测最怕的就是“过零”附近。电流很小的时候,采样噪声和零点漂移会让极性判断来回跳变,补偿量也跟着乱跳。我早期一个项目就吃过这个亏,电机低速运行时嗡嗡响,查了半天才发现是过零判断不稳。

过零问题的处理:

  • 设置滞环区间:比如电流绝对值小于某个阈值(如 0.1A)时,不进行补偿。
  • 或者用低通滤波后的电流来判断极性,滤掉高频噪声。
  • 更高级的做法:用电流的参考值(指令值)代替实际采样值来判断极性,因为参考值没有噪声。

注意:基于电流极性检测的方法,对电流传感器的精度和带宽要求较高。如果传感器有较大的偏置或延迟,补偿效果会大打折扣,甚至越补越差。

3.2 脉冲宽度补偿法

这个方法更直接——我不去算电压误差,我直接调整 PWM 脉冲的宽度。死区不是让脉冲变窄或变宽了吗?我就在发脉冲的时候,手动把窄的补宽,宽的补窄。

工作原理:

在 PWM 生成阶段,根据电流极性,直接修改比较寄存器的值。比如:

  • 电流为正时,开通时刻提前 T_dead,关断时刻不变,等效于脉冲宽度增加 T_dead。
  • 电流为负时,开通时刻不变,关断时刻延后 T_dead,等效于脉冲宽度减少 T_dead。

这样做的好处是:补偿在 PWM 层面完成,不涉及电压指令的修改,响应非常快。

// 伪代码示例:脉冲宽度补偿
if (i_a > 0) {
    // 电流为正,增加脉冲宽度
    CMPA = CMPA_original - T_dead;  // 提前开通
    CMPB = CMPB_original;           // 关断不变
} else if (i_a < 0) {
    // 电流为负,减少脉冲宽度
    CMPA = CMPA_original;           // 开通不变
    CMPB = CMPB_original + T_dead;  // 延迟关断
} else {
    // 过零区间,不补偿
    CMPA = CMPA_original;
    CMPB = CMPB_original;
}

我建议:脉冲宽度补偿法特别适合用 DSP 或 FPGA 实现。因为修改比较寄存器只需要一个指令周期,延迟极小。我在一个高速电机项目(20kHz 开关频率)上用过,效果比电压补偿法好,因为电压补偿法经过电流环计算会有延迟。

优缺点对比:

方法 优点 缺点
电流极性检测法 实现简单,计算量小 过零判断困难,受传感器噪声影响大
脉冲宽度补偿法 响应快,直接作用于 PWM 层 需要底层寄存器操作,移植性差

3.3 电压矢量补偿法

前面两种方法都是在每一相上单独补偿。电压矢量补偿法换个思路——我把死区造成的电压误差,看作一个固定的误差矢量,然后在整个电压矢量上做补偿。

核心思想:

死区效应产生的误差电压,在 αβ 坐标系下是一个与电流矢量方向相反的矢量。也就是说,误差矢量的方向始终指向电流矢量的反方向,大小基本恒定。

所以补偿方法就是:在电压指令矢量上,叠加一个与电流方向相反、大小等于死区误差电压的矢量。

V_comp = -sign(I) × ΔV

其中 sign(I) 是电流矢量的方向单位矢量,ΔV 是死区误差电压幅值。

实现流程:

  1. 采样三相电流,变换到 αβ 坐标系。
  2. 计算电流矢量的角度 θ_i = atan2(i_β, i_α)。
  3. 构造补偿矢量:V_comp_α = -ΔV × cos(θ_i),V_comp_β = -ΔV × sin(θ_i)。
  4. 将补偿矢量加到电压指令上。

关键点:电压矢量补偿法天然解决了过零问题。因为电流矢量在过零时是连续旋转的,不会像单相极性判断那样出现跳变。补偿量是平滑变化的,不会引入额外谐波。

我个人比较喜欢这种方法。它把三相的补偿统一到一个矢量里处理,思路清晰,而且配合 SVPWM 的矢量合成非常自然。我在一个伺服驱动器项目里用过,电流波形明显比单相补偿法更干净。

曾经踩过的坑:电压矢量补偿法对电流采样精度要求高。如果电流有偏置,算出来的角度就不准,补偿方向会偏。我遇到过因为电流传感器温漂导致补偿方向偏了十几度,结果谐波不但没减少反而增加了。后来加了偏置校准才解决。

三种方法对比总结

对比项 电流极性检测法 脉冲宽度补偿法 电压矢量补偿法
实现难度 低 中 中高
过零处理 困难 困难 自然平滑
响应速度 中 快 中
谐波抑制效果 一般 较好 好
适用场景 低成本、低要求 高速、高开关频率 高性能伺服、矢量控制
死区补偿基础方法框架 死区补偿基础方法 电流极性检测法 脉冲宽度补偿法 电压矢量补偿法 采样三相电流 判断每相极性 叠加补偿量 ΔV 获取电流极性 修改比较寄存器 调整脉冲宽度 电流 αβ 变换 计算补偿矢量 叠加到电压指令 选择建议 低速/低成本 → 电流极性检测法 高速/高开关频率 → 脉冲宽度补偿法

这三种方法各有各的适用场景。我个人建议,如果你刚开始做死区补偿,先从电流极性检测法入手,它简单直观,能帮你理解死区补偿的本质。等吃透了,再尝试脉冲宽度补偿法或电压矢量补偿法,效果会更好。