4. SVPWM原理:空间电压矢量合成、扇区判断、作用时间计算、七段式与五段式SVPWM
SVPWM,全称是空间矢量脉宽调制。说白了,它跟传统的SPWM不一样。SPWM是让三相正弦波去跟三角波比,生成PWM波。而SVPWM的思路更直接——它把电机定子看成一个整体,直接去控制那个旋转的磁链矢量。
我刚开始接触这个的时候,也觉得公式挺多。但后来在项目里调了几次电机,发现SVPWM其实就四个步骤:扇区判断 → 时间计算 → 矢量合成 → 发波。今天咱们就把这四步拆开,一个一个讲透。
核心思想:用8个基本电压矢量(6个非零矢量 + 2个零矢量),在时间上平均合成任意方向、任意大小的目标电压矢量。这就是“伏秒平衡”原则。
4.1 空间电压矢量与基本矢量
三相逆变器有6个开关管,上下桥臂互补。一共就8种开关状态。我们把每种状态对应的电压矢量画在复平面上,就得到了6个相隔60°的基本矢量和2个零矢量。
这6个非零矢量把平面分成了6个扇区。每个扇区60°。目标矢量落在哪个扇区,就用这个扇区边上的两个基本矢量去合成它。
我的习惯:在代码里,我一般把扇区编号为1~6,从0°开始逆时针编号。这样后面查表方便。有些资料从0开始编号,也行,但你自己心里要清楚。
4.2 扇区判断
拿到目标电压矢量Vref(α, β)之后,第一件事就是判断它在哪个扇区。怎么判断?看它的角度。
实际工程里,我们不用去算atan2这种费时间的函数。我一般用三个中间变量来判断:
// 扇区判断 —— 我常用的方法
B1 = Ubeta; // β轴分量
B2 = 0.866 * Ualpha - 0.5 * Ubeta; // 旋转120°后的分量
B3 = -0.866 * Ualpha - 0.5 * Ubeta; // 旋转240°后的分量
// 根据三个值的符号,组合出扇区号
N = 0;
if (B1 > 0) N += 1;
if (B2 > 0) N += 2;
if (B3 > 0) N += 4;
// 查表得到扇区
sector = lookup_table[N];
我曾经踩过的坑:一开始我用atan2算角度,再除以60°取整。结果在扇区边界上,因为浮点精度问题,角度来回跳变,导致扇区误判,电机电流出现毛刺。后来换成这种查表法,稳得很。记住,嵌入式里能查表就别算。
4.3 作用时间计算
确定了扇区之后,就要算两个基本矢量和零矢量的作用时间。这里用的是“伏秒平衡”原理——目标矢量乘以周期T,等于两个基本矢量分别乘以各自作用时间的矢量和。
公式推导我就不展开了,直接给结论。假设目标矢量在扇区Ⅰ,由V1和V2合成:
// 扇区Ⅰ的时间计算
T1 = sqrt(3) * T * (Ualpha * sin(60° - θ) + Ubeta * cos(60° - θ)) / Udc;
T2 = sqrt(3) * T * (-Ualpha * sin(θ) + Ubeta * cos(θ)) / Udc;
T0 = T - T1 - T2;
实际代码里,我会先算三个通用变量X、Y、Z,然后根据扇区查表得到T1和T2。这样代码更紧凑,也更快。
| 扇区 | T1 | T2 |
|---|---|---|
| Ⅰ | Z | Y |
| Ⅱ | Y | -X |
| Ⅲ | -Z | X |
| Ⅳ | -X | Z |
| Ⅴ | X | -Y |
| Ⅵ | -Y | -Z |
注意:如果T1 + T2 > T,说明目标矢量超出了六边形的内切圆,进入了过调制区。这时候需要做等比例缩小处理:T1 = T1 * T / (T1 + T2),T2 = T2 * T / (T1 + T2),T0 = 0。我在做伺服驱动器时,过调制区处理不好,母线电压利用率就上不去。
4.4 七段式SVPWM
时间算完了,怎么发波?七段式是最常用的方式。它的原则是:每次只切换一个桥臂的开关状态,这样开关损耗最小,谐波也小。
以扇区Ⅰ为例,矢量顺序是:V0(000) → V1(100) → V2(110) → V7(111) → V2(110) → V1(100) → V0(000)。
你看,从V0到V1,只切换了A相;从V1到V2,只切换了B相。每次只动一个开关管。这就是七段式的精髓。
// 七段式 —— 比较值计算(扇区Ⅰ为例)
Ta = (T - T1 - T2) / 4; // 零矢量V0的1/4时间
Tb = Ta + T1 / 2; // 加上V1的一半时间
Tc = Tb + T2 / 2; // 再加上V2的一半时间
// 三相比较值
CMPA = Ta; // A相
CMPB = Tb; // B相
CMPC = Tc; // C相
把这三个比较值喂给定时器的三个通道,跟三角载波比较,就能生成对称的PWM波。波形中心对称,谐波特性好。
4.5 五段式SVPWM
七段式虽然好,但开关次数多。每个周期开关管要动作6次。如果开关频率高,开关损耗就大。
五段式就是来省开关次数的。它只插入一个零矢量(要么V0,要么V7),而不是两个都用。这样每个周期开关次数从6次降到4次,能省约1/3的开关损耗。
代价是什么?谐波会大一些,电流纹波也大。所以五段式一般用在大功率、低开关频率的场合,比如变频空调、大功率电机驱动。
| 对比项 | 七段式SVPWM | 五段式SVPWM |
|---|---|---|
| 开关次数/周期 | 6次 | 4次 |
| 开关损耗 | 高 | 低(约降1/3) |
| 谐波特性 | 好 | 较差 |
| 电流纹波 | 小 | 大 |
| 适用场景 | 通用伺服、中小功率 | 大功率、低开关频率 |
我的建议:刚开始做电机控制,先用七段式。等系统跑稳了,再去尝试五段式。我在一个风机项目里用过五段式,开关频率降到2kHz,效率提升了3%左右,但电流谐波确实大了,需要加额外的滤波。
4.6 七段式与五段式的矢量顺序对比
为了让你看得更清楚,我把两种方式的矢量顺序列出来。以扇区Ⅰ为例:
- 七段式:V0 → V1 → V2 → V7 → V2 → V1 → V0
- 五段式(只插V0):V0 → V1 → V2 → V1 → V0
- 五段式(只插V7):V1 → V2 → V7 → V2 → V1
五段式有两种变体,取决于你插哪个零矢量。实际使用中,可以交替使用V0和V7,来平衡上下桥臂的发热。嗯,这个细节很多资料不会讲,但我在做热设计时发现,如果一直用V0,下桥臂的开关次数多,温度会比上桥臂高好几度。
注意:五段式的比较值计算跟七段式不一样。因为少了一段零矢量,时间分配要重新算。别直接把七段式的代码改成五段式,那样波形会不对称,电流会畸变。