3. 死区补偿基础原理:基于电流极性的补偿方法、平均电压补偿法、脉冲宽度补偿法
死区补偿这个话题,说实话,我当年刚入行时也踩过不少坑。那时候做一款伺服驱动器,电机低速运行时噪音大得离谱,波形一塌糊涂。折腾了两周,最后发现是死区效应在作怪。嗯,从那以后我就把死区补偿这块啃得透透的。
今天咱们就来聊聊死区补偿的三种经典方法。每种方法都有它的脾气,选对了,事半功倍;选错了,调试到怀疑人生。
3.1 死区效应是怎么来的?
先说说死区时间。为了防止上下桥臂直通,我们在PWM信号里插入了一段"同时关断"的时间,这就是死区。典型值在几百纳秒到几微秒之间。
但问题来了——死区时间内,电流不是零。它通过续流二极管继续流动。这就导致实际输出电压和理想电压之间产生了偏差。你想想看,本来想让电机转得顺顺当当,结果每个开关周期都多了一个"小扰动",能不抖吗?
核心影响:
- 输出电压基波幅值降低
- 产生5、7、11次等低次谐波
- 低速时转矩脉动明显
- 严重时导致电流波形畸变
我在项目中遇到过一台设备,空载运行没问题,一带负载就嗡嗡响。用示波器一看,电流波形上全是毛刺。这就是典型的死区效应在作祟。
3.2 基于电流极性的补偿方法
这个方法最直观。说白了就是:根据电流的方向,决定要不要补偿、补偿多少。
原理其实很简单。当电流从桥臂流出(正方向)时,死区导致输出电压偏低;当电流流入桥臂(负方向)时,死区导致输出电压偏高。那我们反向补偿回去不就行了?
具体做法:
// 伪代码示例
if (current_direction == POSITIVE) {
compensate_value = +Vdc * Tdead / Tpwm;
} else if (current_direction == NEGATIVE) {
compensate_value = -Vdc * Tdead / Tpwm;
} else {
// 过零点附近,不补偿或特殊处理
compensate_value = 0;
}
看着简单吧?但坑就在这里。
避坑指南:
我曾经在过零点附近吃过亏。电流极性判断不准,补偿方向搞反了,结果越补越乱。后来我加了一个滞环比较器,在过零点附近设置一个死区区间(比如±0.1A),这个区间内不补偿或者线性过渡,问题才解决。
这个方法的好处是实时性好,计算量小。缺点是对电流采样精度要求高,尤其是过零点附近。你想想看,如果采样噪声大,极性判断频繁翻转,补偿值也跟着乱跳,那还不如不补。
3.3 平均电压补偿法
这个方法我比较喜欢用,因为它不依赖瞬时的电流极性判断,而是基于一个开关周期内的平均效果。
核心思想:在一个PWM周期内,死区造成的电压损失是确定的。我们把这个损失算出来,然后加到参考电压上。
平均电压损失的计算公式:
ΔV = sign(I) * Vdc * Tdead / Tpwm
其中sign(I)是电流的符号函数。但这里有个关键点——我们用的是平均电流,不是瞬时电流。这样抗噪能力就强多了。
实际实现时,我一般这样做:
- 采样一个PWM周期内的平均电流
- 判断电流极性
- 计算补偿电压ΔV
- 将ΔV叠加到d轴或q轴电压指令上
我的经验:
平均电压补偿法在电流环带宽不高的情况下效果很好。但如果你的电流环带宽很高(比如超过2kHz),建议改用脉冲宽度补偿法。为什么?因为平均法有滞后,带宽高了会引入相位延迟。
这个方法还有个变种——查表法。把不同电流幅值下的补偿量预先算好,存成一张表。运行时直接查表,省去实时计算。我在一个量产项目中就这么干的,效果稳定,代码也简洁。
3.4 脉冲宽度补偿法
这个方法最精细,也最考验功底。它不改变电压幅值,而是直接调整PWM的脉冲宽度。
原理:死区导致实际导通时间比理想时间短了Tdead。那我们就把PWM的占空比增加一个修正量,让实际导通时间回到理想值。
具体来说:
// 脉冲宽度补偿
if (current_direction == POSITIVE) {
// 电流流出,需要增加导通时间
pwm_duty_compensated = pwm_duty_reference + Tdead / Tpwm;
} else {
// 电流流入,需要减少导通时间
pwm_duty_compensated = pwm_duty_reference - Tdead / Tpwm;
}
你可能会问:这和电流极性法有什么区别?
区别大了。电流极性法补偿的是电压,脉冲宽度法补偿的是时间。在数字控制中,时间补偿更直接,因为PWM模块本身就是用定时器实现的。
三种方法对比:
| 方法 | 精度 | 实时性 | 实现难度 | 适用场景 |
|---|---|---|---|---|
| 电流极性法 | 中等 | 高 | 低 | 低速、轻载 |
| 平均电压法 | 较高 | 中等 | 低 | 中高速、通用 |
| 脉冲宽度法 | 高 | 高 | 中 | 高性能、宽速域 |
我个人习惯在量产项目中用脉冲宽度补偿法。虽然实现起来稍微复杂一点,但效果最稳定。尤其是电机在零速附近运行时,其他方法容易出问题,脉冲宽度法反而表现不错。
3.5 三种方法的本质联系
说了这么多,其实这三种方法本质上是相通的。它们都在做同一件事——补偿死区造成的电压损失。只是补偿的"位置"不同:
- 电流极性法:在电压指令上补偿
- 平均电压法:在电流环输出上补偿
- 脉冲宽度法:在PWM生成上补偿
打个比方。电流极性法像是"事后补救"——发现电压不对了,赶紧补一点。平均电压法像是"按经验补偿"——知道大概会损失多少,提前补上。脉冲宽度法像是"源头治理"——直接从时间上修正,不让损失发生。
选型建议:
如果你刚开始做FOC,建议先从平均电压补偿法入手。实现简单,效果明显。等把基础打牢了,再尝试脉冲宽度补偿法。至于电流极性法,嗯,除非你的电流采样精度特别高,否则我不太推荐。
最后说一句。死区补偿不是万能的。它只能补偿死区造成的电压偏差,但无法消除死区引入的谐波。要真正抑制谐波,还得结合后面要讲的谐波抑制策略。不过那是后话了。
本章小结:
死区补偿是FOC控制中绕不开的一环。三种方法各有千秋,没有绝对的好坏。关键是根据你的应用场景、硬件条件和性能要求来选。我个人建议:先跑起来用平均电压法,优化性能用脉冲宽度法。至于电流极性法,嗯,除非你特别有把握,否则慎用。