4、SVPWM基本原理:空间矢量概念、扇区判断、作用时间计算、七段式与五段式SVPWM

好,咱们进入SVPWM的世界。说实话,我刚接触电机控制那会儿,看到SVPWM的公式推导,头都大了。后来在项目里调了几次,才真正理解它到底在干什么。说白了,SVPWM不是玄学,它就是用有限的开关状态,去模拟一个旋转的电压矢量。

4.1 空间矢量概念:从三相到一相

你想想看,电机里三相电压是三个正弦波,相位差120度。但电机转子只关心合成磁场的方向和大小。所以,我们干脆把三相电压合成一个空间矢量——这就是Clark变换干的事。

定义一下:

  • 三相电压 \( V_a, V_b, V_c \) 合成空间矢量 \( \vec{V_s} = \frac{2}{3}(V_a + V_b e^{j\frac{2\pi}{3}} + V_c e^{j\frac{4\pi}{3}}) \)
  • 这个矢量在复平面上旋转,幅值代表电压大小,角度代表磁场方向。

逆变器有6个开关管,上下桥臂不能直通。所以一共只有8种开关状态:6个非零矢量和2个零矢量(000和111)。

核心思想: 用相邻两个非零矢量 + 零矢量,通过时间平均,合成任意方向和大小的电压矢量。

我在项目里遇到过一个问题:一开始用SPWM,电机在高速区转矩波动大。换成SVPWM后,电压利用率高了15%,波形也干净多了。这就是空间矢量的威力。

4.2 扇区判断:矢量落在哪个区?

拿到 \( V_\alpha, V_\beta \) 后,第一件事就是判断它在哪个扇区。扇区编号从I到VI,每个60度。

判断方法很简单,看三个中间变量:

B1 = V_beta
B2 = (sqrt(3)/2)*V_alpha - 0.5*V_beta
B3 = -(sqrt(3)/2)*V_alpha - 0.5*V_beta

N = 4*sign(B3) + 2*sign(B2) + sign(B1)
// 然后查表:N=1→扇区II, N=2→扇区VI, N=3→扇区I, N=4→扇区IV, N=5→扇区III, N=6→扇区V

嗯,这里要注意:sign函数返回0或1(正数为1,负数为0)。我刚开始写代码时,直接用浮点数比较,结果在边界附近来回跳。后来加了滞环,才稳定下来。

避坑指南: 扇区边界处,电压矢量可能来回抖动。建议在扇区切换时加0.5度左右的滞环,或者用查表法代替实时计算。

4.3 作用时间计算:T1、T2怎么算?

知道扇区后,就用相邻两个矢量来合成。假设扇区I,用 \( V_1(100) \) 和 \( V_2(110) \)。

公式长这样:

T1 = (sqrt(3)*Ts/Vdc) * (sqrt(3)/2 * V_alpha - 0.5 * V_beta)
T2 = (sqrt(3)*Ts/Vdc) * V_beta
T0 = Ts - T1 - T2

其中 \( T_s \) 是PWM周期,\( V_{dc} \) 是母线电压。其他扇区类似,只是把 \( V_\alpha, V_\beta \) 投影到对应坐标系。

我记得第一次调这个参数时,忘记考虑母线电压波动,结果电机在负载突变时直接过流保护。后来加了母线电压前馈,才搞定。

重要: 如果 T1 + T2 > Ts,说明矢量超出六边形边界,必须等比例缩小(过调制处理)。否则输出波形会畸变。

4.4 七段式SVPWM:对称波形,谐波小

七段式是最常用的。每个周期内,矢量顺序是:零矢量 → 非零1 → 非零2 → 零矢量 → 非零2 → 非零1 → 零矢量。这样波形对称,谐波含量低。

以扇区I为例:

000 → 100 → 110 → 111 → 110 → 100 → 000
时间分配:T0/4 → T1/2 → T2/2 → T0/2 → T2/2 → T1/2 → T0/4

实际代码里,我习惯先算好三个比较值:

Ta = (T0/2)
Tb = (T0/2 + T1/2)
Tc = (T0/2 + T1/2 + T2/2)

// 然后根据扇区,把Ta,Tb,Tc分配给三个桥臂的比较寄存器

这样做的好处是,CPU计算量小,中断里几微秒就能跑完。

4.5 五段式SVPWM:开关次数少,效率高

五段式只插入一次零矢量,开关次数减少1/3,开关损耗降低。但谐波会大一些。

扇区I的五段式顺序:

000 → 100 → 110 → 111 → 110 → 100 → 000  // 其实和七段一样?不对,五段式只用一个零矢量
// 正确顺序:000 → 100 → 110 → 100 → 000
// 或者:111 → 110 → 100 → 110 → 111

五段式的比较值计算也简单,只是把T0全部放在中间或两边。

对比总结:

特性 七段式SVPWM 五段式SVPWM
开关次数/周期 6次 4次
开关损耗 高 低(降低约33%)
谐波含量 低 高(尤其低次谐波)
电流纹波 小 大
适用场景 对噪声/谐波敏感 高效率、低成本应用

我个人习惯:在伺服驱动里用七段式,因为电流环带宽要求高;在风机、水泵等对谐波不敏感的场合,用五段式省电。

4.6 整体流程:一张图看懂

下面这张SVG图,把SVPWM的完整流程画出来了。从Clark变换到扇区判断,再到时间计算和PWM生成,一步到位。

SVPWM完整流程图 SVPWM完整流程图 三相电压 Va, Vb, Vc Clark变换 → Vα, Vβ 扇区判断 (N=1~6) 计算 T1, T2, T0 (查表/公式) T1+T2 > Ts ? 等比例缩小 生成七段式/五段式PWM波形 注意 扇区边界加滞环 过调制后波形会畸变

这张图我画了好几次才满意。实际项目中,你可以在中断服务函数里按这个流程跑,周期一般50-100μs。嗯,代码写完后,记得用示波器看相电压波形——如果出现马鞍波,说明SVPWM跑对了。