3. 死区补偿基础方法
死区补偿,说白了就是跟死区效应对着干。你加了死区时间,它带来了电压误差和电流畸变,那我们就想办法把这部分误差补回去。我做了这么多年电机控制,死区补偿的方法见过不下十种,但最基础、最常用的,就是下面这三种。
核心思路:死区补偿的本质是“反向注入”。死区让实际输出电压偏离了指令值,我们就主动调整开关时刻或电压指令,让实际输出重新逼近理想值。
3.1 基于电流极性检测的补偿法
这是最直观的方法。你想想看,死区效应导致的电压误差,方向完全取决于电流的极性。电流流出去和流进来,死区造成的偏差正好相反。
基本原理:
- 当相电流 > 0(定义为流出桥臂),死区导致实际电压 < 指令电压,需要正向补偿。
- 当相电流 < 0(定义为流入桥臂),死区导致实际电压 > 指令电压,需要负向补偿。
补偿量的大小,就是死区时间乘以直流母线电压,再除以开关周期。公式很简单:
ΔV = (T_dead × V_dc) / T_sw
其中 T_dead 是死区时间,V_dc 是母线电压,T_sw 是开关周期。
实现步骤:
- 采样三相电流 i_a, i_b, i_c。
- 判断每相电流的极性(正或负)。
- 根据极性,在每相占空比指令上加上或减去补偿量 ΔV。
- 限幅处理,防止占空比超出 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 是死区误差电压幅值。
实现流程:
- 采样三相电流,变换到 αβ 坐标系。
- 计算电流矢量的角度 θ_i = atan2(i_β, i_α)。
- 构造补偿矢量:V_comp_α = -ΔV × cos(θ_i),V_comp_β = -ΔV × sin(θ_i)。
- 将补偿矢量加到电压指令上。
关键点:电压矢量补偿法天然解决了过零问题。因为电流矢量在过零时是连续旋转的,不会像单相极性判断那样出现跳变。补偿量是平滑变化的,不会引入额外谐波。
我个人比较喜欢这种方法。它把三相的补偿统一到一个矢量里处理,思路清晰,而且配合 SVPWM 的矢量合成非常自然。我在一个伺服驱动器项目里用过,电流波形明显比单相补偿法更干净。
曾经踩过的坑:电压矢量补偿法对电流采样精度要求高。如果电流有偏置,算出来的角度就不准,补偿方向会偏。我遇到过因为电流传感器温漂导致补偿方向偏了十几度,结果谐波不但没减少反而增加了。后来加了偏置校准才解决。
三种方法对比总结
| 对比项 | 电流极性检测法 | 脉冲宽度补偿法 | 电压矢量补偿法 |
|---|---|---|---|
| 实现难度 | 低 | 中 | 中高 |
| 过零处理 | 困难 | 困难 | 自然平滑 |
| 响应速度 | 中 | 快 | 中 |
| 谐波抑制效果 | 一般 | 较好 | 好 |
| 适用场景 | 低成本、低要求 | 高速、高开关频率 | 高性能伺服、矢量控制 |
这三种方法各有各的适用场景。我个人建议,如果你刚开始做死区补偿,先从电流极性检测法入手,它简单直观,能帮你理解死区补偿的本质。等吃透了,再尝试脉冲宽度补偿法或电压矢量补偿法,效果会更好。