死区补偿说的人很多,文章一大把。但是 igbt 的导通压降补偿似乎没什么人提。
今天我就来一起说了。
电压误差的由来
变频器需要输出三相正弦波电流驱动电机平稳运行。要保证电流的正弦,首先需要保证电压的正弦。 除非用的是我前两天说的电流型控制器。
但是,功率器件有各种办法让电机看到的电压不遵循正弦波。最大的2个,就是死区和 IGBT 的导通压降。
死区时间
电压误差的第一大来源,就是死区时间。 为了防止上下2个管子同时打开,中间必须插入一个死区时间。类似十字路口的红绿灯,必须要插入一段4个路口都是红灯的时间来清空路口的车辆。
插入多少死区时间,完全取决于器件的关断速度。确保一个管子已经彻底关闭后,才打开另一个管子。在使用 IGBT 的时候,绝大多数场景下,死区时间都是高达 1us ~ 2us。
微秒?看起来很短啊!错错错,很长!在 20khz 的开关周期下,一个周期一共也就 50us。 这死区时间一下子就占了 4% 的占空比!
也就是说,软件给出的占空比指令,会被无端端的少掉 4个百分点。这不是损失 4%,是损失4个点。比如软件给出 10% 的占空比,结果实际硬件发的占空比只有 6% ! 这是产生了高达 40% 的误差了。
所以,这死区时间是必须得补,不补不行!否则占空比丢失非常严重,产生极大的误差。
1. 死区时间内的物理过程(以正电流为例)
假设 ( I > 0 )(电流从母线流向负载),桥臂工作在互补PWM模式:
- 理想情况:上管导通 ($D \times T_s$ ),下管导通 ( $(1-D) \times T_s$ )。
- 实际开关过程:
- 上管关断:进入死区 ( $T_d$ )。
- 死区内:上管、下管都处于关断状态。由于电感电流不能突变,负载电流必须通过下桥臂的反并联二极管续流。
- 续流路径:电流从负载 → 下管二极管 → 直流母线负极(或中点)。
- 输出电压:在这个死区时间内,桥臂中点电压被钳位在 ( $-V_{dc}$ )(或0V,取决于母线拓扑,对于两电平逆变器,被钳位到负极母线,即 ( 0V ) 或 ( $-V_{dc}$ );对于正负母线,被钳位到 ( $\frac{-V_{dc}}{2}$ ) 或 ( $-V_{dc}$ ))。
- 结果:理想情况下,这段时间本应输出一个高电平(如果这是有效导通时间的一部分)或低电平,但由于死区强制插入,实际输出在一个短暂区间内被拉到了与理想指令相反的极性。
2. 死区造成的电压误差表达式
由于死区导致输出在 ( T_d ) 时间内偏离了理想值,因此造成的 “有效占空比损失” 如下:
- 当 ( $I > 0$ )(正电流):
- 死区导致有效导通时间 缩短,相当于有效的占空比减少了 ( $\Delta D = \frac{T_d}{T_s}$ )。
- 平均电压损失:( $V_{loss} = V_{dc} \times \frac{T_d}{T_s}$ )(或 ( $V_{dc}/2 \times \frac{T_d}{T_s}$ ) 取决于母线拓扑)。
- 当 ( $I < 0$ )(负电流):
- 电流方向相反,死区期间电流通过上桥臂的反并联二极管续流,将桥臂中点电压拉高。
- 死区导致有效导通时间 增加,相当于有效的占空比增加了 ( $\Delta D = \frac{T_d}{T_s}$ )。
- 平均电压增益:( $V_{gain} = V_{dc} \times \frac{T_d}{T_s}$ )。
统一写成矢量形式: [ $ \Delta V_{dead} = -\text{sign}(I) \times V_{dc} \times \frac{T_d}{T_s} $ ] (注意:这里的符号取决于电压参考方向,但幅值固定为 ( $V_{dc} \times T_d/T_s$ ))
3. 补偿和电流方向有关
看起来,死区时间的存在,丢了4个点的占空比。那直接在计算出来的占空比上+4个点可行否? 比如计算出来 10% 占空比的,就给硬件发 14% 占空比。
可以吗?
不可以。
因为,死区时间导致的电压误差,是随着电流方向不同而有 正4个点偏差和负4个点偏差的区别的。
结论非常清晰:死区造成的电压误差是一个“固定幅值”的方波脉冲,其极性完全由电流方向决定,与占空比 ( D ) 的大小无关。
IGBT 导通压降
IGBT 不同于 MOS。 MOS 在导通的时候表现为一个电阻。 但是 IGBT 在导通的时候更像一个二极管。流过电流的时候会有一个固定的电压损失。
而且这个电压损失是对抗电流方向的。于是在电流过零的时候,电流就会被钳位在 0。
因此,如果只补偿死区时间,不补偿 IGBT 导通压降,最终电流波形依然会有一个过零钳位。
更糟糕的是,IGBT 导通压降损失,和当前的占空比有关。而电机作为一个感性负载,他的电流是滞后电压的。于是在电流的上升期和下降期,所经历的占空比是非对称的。也就是说,电压损失是不同的。
这会导致,电流上升期和下降期,承受的电压误差是不同的。于是会导致波形非对称。
死区时间造成的电流畸变,通常只表现在过零钳位,电流的上升下降还是对称的。 但是 IGBT 导通压降导致的损失,电流都不对称了。
这会引入更严重的问题。
必须补偿。不能直接忽略。
那么, IGBT 的导通损失呢,和电流方向关吗?
一样有关!
死区时间导致的损失,补偿方向和电流方向有关,补偿大小和电流方向无关。
而 IGBT 的导通损失,补偿方向和电流方向有关,补偿大小和电流方向有关!
电流的方向不同,补偿量的计算也是不同的。
1. 完整的PWM周期损耗模型(以正电流为例)
在一个PWM周期 ( T_s ) 内,对于“正电流”(定义为从桥臂流向负载):
- 上管IGBT导通期间(时间占比 = $( D )$ ):
- 电流路径:母线正极 → 上管IGBT → 负载。
- 压降来源:上管IGBT的 $( V_{CE(sat)} )$。
- 导通损耗贡献:$( V_{CE(sat)} \times D)$。
- 上管IGBT关断期间(时间占比 = $( 1-D )$ ):
- 由于电感电流不能突变,电流必须维持流向负载,只能通过下桥臂的续流二极管形成续流回路。
- 即使下管IGBT没有被触发导通,二极管也会正向导通。
- 压降来源:下管二极管的 $( V_F )$(正向压降)。
- 导通损耗贡献:$( V_F \times (1-D) )$。
因此,正电流情况下,PWM周期内的平均导通压降是: $ V_{loss, avg} = D \times V_{CE(sat)} + (1-D) \times V_F $
2. 对称地看“负电流”的情况
当平均电流为负(从负载流向母线)时:
- 下管IGBT导通期间(时间占比 = $( 1-D )$):压降为 $( V_{CE(sat)} )$。
- 下管IGBT关断期间(时间占比 = $( D )$):电流通过上桥臂续流二极管,压降为 $( V_F )$。
此时平均压降为:
\[V_{loss, avg} = (1-D) \times V_{CE(sat)} + D \times V_F\]3. 补偿同样和电流方向有关
补偿的目的是抵消这个平均压降,因此补偿量必须是一个组合项:
\[\Delta V_{comp} = \begin{cases} D \times V_{CE(sat)} + (1-D) \times V_F & \text{(正电流)} \\ (1-D) \times V_{CE(sat)} + D \times V_F & \text{(负电流)} \end{cases}\]关键:无论是正电流还是负电流,IGBT和二极管的压降都会在同一个PWM周期内先后出现。不能只补偿 IGBT 那一半,必须把二极管的续流压降也补上。
电流方向的获取
前面我们已经知道了,补偿量的计算了。死区时间电压损失 和 igbt 导通压降,这两个计算后,合并获得了一个补偿量。 然后,这个补偿量,根据电流的方向,叠加在原来计算的占空比上就可以了。
问题是,电流的方向如何获取呢?
ADC 直接获取?
这是最显而易见的,但是基本上也是不能用的。因为 ADC 存在 零点漂移与小电流采样不可信。
- ADC不能采集双向电流。因此 ADC 需要使用带偏置的运放,将采样结果抬高 $\frac{VCC}{2}$ 。 以 $3.3V$ 供电的单片机为例,运放对 0A 电流会输出 $1.65V$。这个电压经过 ADC 采样后,几乎很难变成 2048。
- 在小电流(或过零点附近)时,电流引起的电压变化极小。此时,运放的温漂、电阻的精度误差、电源噪声,其量级可能远远超过真实的电流信号。软件根本分不清采出来的是“真电流”还是“噪声”。
如何破局 ?
- 对电流采样,首先进行 DQ 变换,将他们变到 DQ 坐标系。 这步骤,实际上早就做了。这个是电流环必备的一部分。
- 接下来要增加一个操作,就是对 Iq Id 进行滤波。这大概也是 电流环的一部分。
- 对滤波后的 Iq Id , 进行逆向 DQ 变换。重新变成 Ia Ib Ic。
- 使用这个 Ia Ib Ic 进行补偿。
为何要多此一举呢?
因为 DQ 变换的时候,会用到一个角度:D轴角度。 这个角度是一个机械角度,他有机械惯性,天然的变化缓慢,没有高频成分。
ADC 采样的噪音,DQ 变化后,会变成 Iq Id 上的波动,经过 滤波后,Iq Id 是非常干净的一条直线,几乎只有直流分量。
因此,经过逆DQ后的 Ia Ib Ic,就非常干净,只包含干净的基波信号。
顺带一提,在 Iq Id 上进行滤波,不会在 Ia Ib Ic 上引入相位延迟!
这个是直接对采样到的 Ia Ib Ic 进行滤波所做不到的!
有了这个干净的 三相电流,剩下的事情就好办了,补偿算法如下:
- 根据电压环给出的指令,进行 SVPWM 调制运算,生成归一化的 Ta Tb Tc。
- 根据硬件配置,得出归一化的 $T_{dead-time-drop}$。计算方式很简单,$T_{dead-time-drop}=0.000002s*1000000Hz$,
- 根据每相电流的大小, 结合温度补偿,通过 查表或者 IGBT 的物理模型公式,计算得出 $V_{ce} 和 V_{f}$
-
根据归一化的 Ta Tb Tc 计算每相的 $U_{igbt-drop}$ 并结合母校电压进行归一化。$T_{igbt-drop}=\frac{U_{igbt-drop}}{U_{dc}}$ 计算的时候需要参考电流方向,每相独立计算。最终获得 $ T_{igbt-drop-a}, T_{igbt-drop-b}, T_{igbt-drop-c} $
- 根据电流方向,在 Ta Tb Tc 上叠加 $T_{dead-time-drop}+T_{igbt-drop}$ 例如 $Ta += sign(Ia)*(T_{dead-time-drop}+T_{igbt-drop-a})$
- 将 Ta Tb Tc 钳位到 $[0,1]$ 范围。(如果是2电阻采样,需要 钳位到 $[0,0.95]$ 避免下管导通时间不足没有时间采样。)
- 将 Ta Tb Tc 乘上 TIM1->ARR 配置到 TIM1->CC1,CC2,CC3