第三节 死区补偿基础

死区补偿,说白了就是要把死区时间吃掉的那部分电压给补回来。我刚开始接触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负担轻。

具体实现步骤:

  1. 采样三相电流,判断每相电流的极性
  2. 根据死区时间和开关周期,计算每相的平均电压误差
  3. 在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资源紧张,平均电压误差补偿法也是个不错的选择,性价比很高。

嗯,死区补偿的基础就讲到这里。下一节我们会聊更高级的非线性校正方法,包括管压降补偿和开关延迟补偿。这些内容在实际项目中同样重要,到时候我会结合具体案例来讲。