3、SVPWM调制:空间矢量调制原理、扇区判断、作用时间计算
好,咱们接着聊SVPWM。说实话,在电机控制里,SVPWM这块儿是真正体现“功力”的地方。很多初学者一开始接触SVPWM,看到那一堆矢量图和公式,头都大了。我当年也一样,记得第一次在DSP上写SVPWM程序,折腾了整整一周才跑出正确的波形。
但说白了,SVPWM没那么神秘。它就是一套“怎么用六个开关管,合成出任意方向、任意大小的电压矢量”的方法。你想想看,逆变器只有六个开关管,只能输出六个基本电压方向(加上两个零矢量)。但我们要的是连续旋转的磁场,怎么办?——用相邻的两个基本矢量去“拼”出来。
3.1 空间矢量调制的基本原理
先说说为什么叫“空间矢量”。三相电压 Ua、Ub、Uc 在时间上是正弦波,但在空间上,它们合成的是一个旋转的矢量。这个矢量的幅值恒定,转速由频率决定。这就是我们常说的“磁链圆”。
逆变器有六个开关管,上桥和下桥互补导通。我们定义三个桥臂的开关状态为 (Sa, Sb, Sc),1表示上桥导通,0表示下桥导通。这样一共有8种状态:6个非零矢量(V1~V6)和2个零矢量(V0、V7)。
关键点:六个非零矢量把平面分成6个扇区,每个扇区60度。我们要合成的目标矢量 Vref,落在哪个扇区,就用该扇区边界的两个基本矢量去合成。
举个例子,如果 Vref 落在扇区I(0°~60°),那就用V1(100)和V2(110)来合成。怎么合成?——用“伏秒平衡”原理:在一个PWM周期内,让V1和V2的作用时间加起来,平均效果等于 Vref。
公式很简单:
T1 * V1 + T2 * V2 + T0 * V0 = Ts * Vref
其中 T1、T2 是两个基本矢量的作用时间,T0 是零矢量作用时间,Ts 是PWM周期。
我的经验:刚开始做SVPWM时,我总纠结于“为什么非要两个矢量合成,不能用一个矢量直接转?”后来想明白了——逆变器是离散的,每个周期只能输出一个固定的电压矢量。要想让电机平滑旋转,就得靠“平均”效果。说白了,就是“用时间换空间”。
3.2 扇区判断
扇区判断是SVPWM的第一步。你得先知道目标矢量落在哪个扇区,才能决定用哪两个基本矢量。
怎么判断?——看 Vα 和 Vβ 的符号和大小关系。这里我习惯用“三值法”,简单粗暴:
定义三个中间变量:
B0 = Vβ
B1 = (√3/2) * Vα - (1/2) * Vβ
B2 = -(√3/2) * Vα - (1/2) * Vβ
然后根据这三个值的符号,查表得到扇区号:
N = sign(B0) + 2 * sign(B1) + 4 * sign(B2)
其中 sign(x) 在 x>0 时返回1,否则返回0。
得到N值后,对照下表:
| N | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| 扇区 | II | VI | I | IV | III | V |
注意:这个映射关系跟你的坐标系定义有关。我见过有人把αβ轴定义反了,结果扇区判断全错,电机嗡嗡响就是不转。嗯,这里一定要跟你的Clark变换保持一致。
3.3 作用时间计算
扇区判断完了,接下来就是算时间。每个扇区的基本矢量不同,但计算方法是一样的——解“伏秒平衡”方程组。
以扇区I为例,目标矢量 Vref 由V1(100)和V2(110)合成。设V1的作用时间为 T1,V2的作用时间为 T2,零矢量时间为 T0。
在αβ坐标系下,V1和V2的投影是固定的:
V1: (2/3)*Vdc, 0
V2: (1/3)*Vdc, (√3/3)*Vdc
代入伏秒平衡方程:
T1 * (2/3)*Vdc + T2 * (1/3)*Vdc = Vα * Ts
T2 * (√3/3)*Vdc = Vβ * Ts
解出来:
T1 = ( (3/2)*Vα - (√3/2)*Vβ ) * Ts / Vdc
T2 = ( √3 * Vβ ) * Ts / Vdc
其他扇区类似,只是Vα和Vβ的系数不同。实际工程中,我们一般用“通用公式”来算,避免每个扇区都写一遍:
X = (√3 * Vβ) * Ts / Vdc
Y = ( (3/2)*Vα + (√3/2)*Vβ ) * Ts / Vdc
Z = ( -(3/2)*Vα + (√3/2)*Vβ ) * Ts / Vdc
然后根据扇区查表得到T1和T2:
| 扇区 | I | II | III | IV | V | VI |
|---|---|---|---|---|---|---|
| T1 | -Z | Z | X | -X | -Y | Y |
| T2 | X | Y | -Y | Z | -Z | -X |
避坑指南:我曾经在算T1、T2时忘了做“过调制处理”。当 T1 + T2 > Ts 时,说明目标矢量超出了六边形边界,必须等比例缩小。否则PWM会饱和,电流波形畸变。处理方法是:
if (T1 + T2 > Ts) {
T1 = T1 * Ts / (T1 + T2);
T2 = T2 * Ts / (T1 + T2);
T0 = 0;
} else {
T0 = Ts - T1 - T2;
}
3.4 实际工程中的几点建议
最后,分享几个我在项目中踩过的坑:
- 死区时间补偿:开关管不是理想的,上下桥切换时必须插入死区。死区会导致电压误差,尤其在低速时影响很大。我一般用“电流极性法”做死区补偿,效果还不错。
- PWM载波频率选择:不是越高越好。频率高了,开关损耗大;频率低了,电流谐波大。我常用的范围是8kHz~16kHz,具体看IGBT的规格。
- 浮点数运算:在MCU里做SVPWM,尽量用定点数或Q格式,避免浮点运算拖慢速度。我习惯把所有系数都提前算好,存成整数。
- 零矢量分配:零矢量可以全部分配给V0或V7,也可以均分。均分能降低谐波,但切换次数多。我一般用“七段式”SVPWM,谐波性能更好。
好了,SVPWM的核心内容就这些。说白了,它就是一套“用离散的开关状态,模拟连续旋转磁场”的方法。扇区判断是“定位”,时间计算是“定量”,两者配合好了,电机就能转得又稳又顺。
下一节我们讲电流环和速度环的PI参数整定,那又是另一门学问了。