2. SVPWM 基本原理:从空间电压矢量到七段式实现

好,咱们进入正题。SVPWM 这名字听起来挺唬人,什么「空间电压矢量」、「扇区判断」、「七段式」…… 说白了,它就是一种让电机转得又稳又高效的 PWM 调制方法。我当年刚接触这玩意儿时,也觉得公式一堆,头大。但后来发现,只要把几个核心概念拆开看,其实挺直观的。

这一章,我就带你把这几个核心点一个一个啃下来。嗯,咱们不搞虚的,直接上干货。

2.1 空间电压矢量:电机旋转的「方向盘」

先问个问题:三相逆变器,六个开关管,能输出几种电压状态?

答案是 8 种。其中 6 种是「非零」状态,2 种是「零」状态(上桥全通或下桥全通)。这 6 种非零状态,在空间里一画,正好是一个正六边形的顶点。这就是所谓的「基本电压矢量」。

核心理解: 空间电压矢量不是真的「矢量」,而是一种数学映射。它把三相静止坐标系下的电压 (Ua, Ub, Uc),映射到一个两相旋转的复平面上。这样,电机的定子磁链轨迹,就变成了这个复平面上一个圆形的旋转矢量。

我个人的习惯是,把基本矢量想象成「方向盘」的 6 个固定方向。你没法直接打出一个任意角度的方向,但你可以通过快速切换这 6 个方向,合成出任意方向的「平均效果」。这就是 SVPWM 的精髓。

下面这张图,把整个 SVPWM 的知识体系串了起来,你可以先扫一眼,有个整体印象。

SVPWM 核心知识体系 目标:合成任意方向电压矢量 ① 扇区判断 ② 作用时间计算 ③ 七段式合成 扇区判断方法 根据 Uα, Uβ 符号与大小 查表或公式计算扇区号 N 作用时间计算 T1, T2 基于伏秒平衡 引入 T0 填充零矢量 七段式实现 开关序列:000-100-110-111-... 对称波形,谐波小 输出:三相对称 PWM 波形

2.2 扇区判断:先搞清楚你在哪

有了目标电压矢量,第一步就是判断它落在六边形的哪个扇区里。这就像导航,得先知道你在哪条路上,才能规划怎么走。

判断方法不复杂。我们通常把两相静止坐标系下的 Uα 和 Uβ 拿来做判断。具体规则如下:

扇区号 判断条件(基于 Uα, Uβ) 包含的基本矢量
I Uα > 0, Uβ > 0, 且 Uβ / Uα < √3 U4(100), U6(110)
II Uα > 0, 且 Uβ / |Uα| > √3 U6(110), U2(010)
III Uα < 0, Uβ > 0, 且 -Uβ / Uα < √3 U2(010), U3(011)
IV Uα < 0, Uβ < 0, 且 Uβ / Uα < √3 U3(011), U1(001)
V Uα < 0, 且 Uβ / |Uα| > √3 U1(001), U5(101)
VI Uα > 0, Uβ < 0, 且 -Uβ / Uα < √3 U5(101), U4(100)

工程小技巧: 实际代码里,没人用这么多 if-else 去判断。更常见的做法是定义三个中间变量:Uref1 = Uβ, Uref2 = (√3/2)*Uα - (1/2)*Uβ, Uref3 = -(√3/2)*Uα - (1/2)*Uβ。然后根据这三个变量的符号,直接算出一个扇区号 N。查表就行,效率高得多。

2.3 基本矢量作用时间计算:伏秒平衡的数学

扇区定下来了,接下来就是算时间。假设目标矢量在扇区 I,它由 U4(100) 和 U6(110) 合成。我们需要算出 U4 作用多久(T1),U6 作用多久(T2),剩下的时间(T0)给零矢量。

这个计算基于「伏秒平衡」原理:

Uref * Ts = U4 * T1 + U6 * T2 + U0 * T0

其中 Ts 是 PWM 周期。把 U4、U6 的幅值(2/3 * Udc)和方向代入,解方程,得到:

T1 = (√3 * Ts / Udc) * ( (√3/2)*Uα - (1/2)*Uβ )
T2 = (√3 * Ts / Udc) * Uβ
T0 = Ts - T1 - T2

嗯,公式看着有点烦,但别怕。实际代码里,我们通常会把 (√3 * Ts / Udc) 这个系数提前算好,存成常量。然后每个周期就是几次乘法和加法,快得很。

注意过调制: 如果 T1 + T2 > Ts,说明目标矢量超出了六边形边界,进入了过调制区。这时候必须等比例缩小 T1 和 T2,让 T1' = T1 * Ts / (T1+T2),T2' = T2 * Ts / (T1+T2)。我曾经在一个项目里忘了处理这个,结果电机在高速时电流波形畸变严重,找了半天才发现是过调制没处理。

2.4 七段式 SVPWM 实现:对称波形的艺术

时间算好了,怎么把它变成开关管的通断信号?这就是「七段式」的由来。

所谓七段式,是指在一个 PWM 周期内,开关状态切换 7 次,形成对称的波形。这样做的好处是谐波含量低,电机运行更平稳。

以扇区 I 为例,七段式的开关序列是:

  1. 000 (零矢量 U0) — 所有下桥导通
  2. 100 (U4) — A 相上桥导通
  3. 110 (U6) — A、B 相上桥导通
  4. 111 (零矢量 U7) — 所有上桥导通
  5. 110 (U6) — 对称返回
  6. 100 (U4) — 对称返回
  7. 000 (U0) — 回到起点

每个状态的时间分配是:T0/4, T1/2, T2/2, T0/2, T2/2, T1/2, T0/4。你看,波形关于中心对称,这就是「七段式」名字的由来。

为什么用七段而不是五段? 五段式(也叫不连续调制)开关次数少,损耗低,但谐波大。七段式虽然开关次数多一点点,但波形对称性好,谐波小,电机噪音也小。我个人的经验是:对噪音敏感的应用(比如家电、伺服),优先用七段式;对效率要求极高的场合(比如电动车),可以考虑五段式。

下面是一个简化的 C 语言实现片段,展示了扇区 I 的七段式比较值计算:

// 假设已经计算出 T1, T2, T0
// PWM 周期为 Ts,使用中心对齐模式
// 计算三个比较值 Ta, Tb, Tc

float Ta = T0 / 4.0f;
float Tb = Ta + T1 / 2.0f;
float Tc = Tb + T2 / 2.0f;

// 根据扇区,将 Ta, Tb, Tc 分配给三相
// 扇区 I: A 相 -> Ta, B 相 -> Tb, C 相 -> Tc
// 扇区 II: A 相 -> Tb, B 相 -> Ta, C 相 -> Tc
// ... 其他扇区类似,查表分配

// 将比较值写入 PWM 比较寄存器
PWM_CompareSet(1, Ta);
PWM_CompareSet(2, Tb);
PWM_CompareSet(3, Tc);

代码很简单,核心就是那个查表分配。不同扇区,三相的导通顺序不一样,但计算逻辑完全一致。

避坑指南: 我曾经在移植代码时,忘了考虑不同 MCU 的 PWM 计数器模式。有的芯片是向上计数,有的是向上-向下计数。七段式要求中心对齐模式(向上-向下计数),如果用错了,波形就全乱了。所以,拿到一个新平台,第一件事就是确认 PWM 计数模式。

好了,这一章的内容就到这。SVPWM 的基本原理,说白了就是:定扇区、算时间、排序列。这三步走通了,剩下的就是代码实现了。