第三节 死区补偿基础
死区补偿,说白了就是要把死区时间吃掉的那部分电压给补回来。我刚开始接触FOC时,总觉得死区就那么几微秒,能有多大影响?结果第一次调电机,电流波形上全是毛刺,转速一高就嗡嗡响。嗯,从那以后我再也不敢小看死区补偿了。
3.1 补偿的基本思想
死区补偿的核心思路其实很简单:死区导致实际输出电压与理想电压之间出现了偏差,我们想办法把这个偏差抵消掉。
你想想看,死区时间内两个管子都关断,电流靠续流二极管走。这时候输出电压不是由PWM决定的,而是由电流方向决定的。所以实际输出电压和理想PWM指令之间,就差了那么一小块。
补偿的基本思想就是:根据电流方向,在PWM指令上做修正。电流流出去和流进来,补偿的方向正好相反。我在项目中遇到过一种情况,补偿方向搞反了,结果电流波形比不补偿还难看,电机抖得像筛子一样。
核心公式:
实际输出电压 = 理想输出电压 + 死区引起的电压误差
补偿目标:在PWM指令中预先加入一个修正量,使得实际输出等于理想输出
补偿的精度取决于两个因素:一是电流极性判断的准确性,二是死区时间的精确测量。我建议你在做补偿之前,先用示波器把死区时间量一下,别信数据手册上的标称值,实际值和标称值经常差个20%。
3.2 基于电流极性的补偿方法
这是最直观的补偿方法。说白了就是:电流往哪边流,就往哪边补。
具体做法是这样的:
- 当电流从桥臂流出(正向电流),死区时间内输出电压被拉低,需要把PWM脉宽加宽
- 当电流流入桥臂(反向电流),死区时间内输出电压被抬高,需要把PWM脉宽收窄
补偿量的大小就是死区时间。比如死区是2μs,PWM周期是100μs,那补偿量就是2%的占空比。
这里有个坑——电流过零点附近怎么办? 电流接近零的时候,极性判断很容易出错。我曾经在这个问题上栽过跟头,电流过零时补偿方向来回跳,导致电压波形上出现毛刺,电机低速运行时能听到明显的噪声。
避坑指南:
我曾经在电流过零点附近加了一个滞环区,电流绝对值小于某个阈值(比如额定电流的5%)时,不做补偿或者做线性过渡。效果还不错,噪声明显降下来了。
电流极性的获取方式有两种:
- 直接采样:用电流传感器实时读取电流值,判断正负。优点是准确,缺点是采样噪声会影响判断
- 间接推断:根据电压指令和反电动势来估算电流方向。优点是省成本,缺点是低速时不准
我个人习惯用直接采样加滤波的方式。虽然多花点计算时间,但可靠性高。你想想看,补偿方向搞错了还不如不补,对吧?
3.3 平均电压误差补偿法
这个方法不纠结于每个PWM周期的细节,而是从平均效果上做补偿。说白了就是:算出一个周期内死区造成的平均电压损失,然后整体补回来。
平均电压误差的计算公式:
ΔV = (T_dead / T_sw) × V_dc × sign(i)
其中:
ΔV = 平均电压误差
T_dead = 死区时间
T_sw = PWM开关周期
V_dc = 母线电压
sign(i)= 电流方向符号(+1或-1)
这个方法的优点是实现简单,不需要修改PWM的边沿位置,只需要在电压指令上做一个偏移就行。我在做低成本的MCU方案时经常用这个方法,因为计算量小,对CPU负担轻。
具体实现步骤:
- 采样三相电流,判断每相电流的极性
- 根据死区时间和开关周期,计算每相的平均电压误差
- 在Park逆变换输出的电压指令上,减去这个误差值
小技巧:
我建议把死区时间、开关周期、母线电压这些参数做成可配置的。不同工况下这些参数可能会变,比如母线电压波动时,补偿量也要跟着调。我一般会在初始化时算好一个基准值,运行时根据母线电压做线性缩放。
不过这个方法有个局限——它假设电流在一个开关周期内方向不变。如果电流在过零点附近来回跳,平均补偿的效果就会打折扣。这时候需要结合前面说的滞环处理。
3.4 脉冲宽度补偿法
这个方法更精细,直接修改PWM的脉宽。说白了就是:在PWM的边沿上做手脚,把死区吃掉的时间补回来。
具体做法:
- 对于上管导通、下管关断的情况,如果电流正向,就把上管的导通时间延长T_dead
- 如果电流反向,就把上管的导通时间缩短T_dead
- 下管同理,方向相反
我举个例子你就明白了。假设死区2μs,PWM周期100μs,理想占空比50%。
- 电流正向:上管导通时间从50μs变成52μs,下管导通时间从50μs变成48μs
- 电流反向:上管导通时间从50μs变成48μs,下管导通时间从50μs变成52μs
这样补偿后,实际输出电压就和理想值一致了。
实现要点:
脉冲宽度补偿法需要在PWM定时器的比较值上做调整。我建议用定时器的影子寄存器功能,在PWM周期开始时一次性更新所有通道的比较值,避免在周期中间修改导致波形异常。
这个方法精度高,但实现起来也麻烦一些。你需要精确控制PWM边沿的位置,而且每个开关周期都要重新计算比较值。我在用高性能DSP做伺服驱动时喜欢用这个方法,因为CPU算力够,定时器资源也丰富。
三种方法的对比:
| 方法 | 精度 | 计算量 | 实现难度 | 适用场景 |
|---|---|---|---|---|
| 电流极性补偿 | 中等 | 低 | 低 | 低成本MCU |
| 平均电压误差补偿 | 中等 | 低 | 低 | 通用场合 |
| 脉冲宽度补偿 | 高 | 中 | 中 | 高性能伺服 |
我个人建议,如果条件允许,优先用脉冲宽度补偿法。虽然实现起来稍微复杂一点,但补偿效果最好。如果CPU资源紧张,平均电压误差补偿法也是个不错的选择,性价比很高。
嗯,死区补偿的基础就讲到这里。下一节我们会聊更高级的非线性校正方法,包括管压降补偿和开关延迟补偿。这些内容在实际项目中同样重要,到时候我会结合具体案例来讲。