3. 空间矢量调制(SVPWM)

好,咱们今天聊聊SVPWM。说实话,我刚入行那会儿,看到这个缩写就头大。什么空间矢量、扇区判断、作用时间……感觉像在看天书。但后来真正做项目了才发现,这东西其实就是个“如何用开关管拼出正弦波”的数学游戏。

你想想看,我们想要的是三相正弦电流,但逆变器只能输出六个开关管组合。怎么用这有限的组合去逼近一个连续旋转的电压矢量?这就是SVPWM要干的事。

3.1 SVPWM基本原理

SVPWM的核心思想,说白了就是“等效”。我们没法直接输出任意角度的电压矢量,但可以用相邻的两个基本矢量去合成它。就像调色一样,用红黄蓝三原色调出各种颜色。

三相逆变器有六个开关管,上下桥臂互补导通。一共就8种开关状态:6个非零矢量和2个零矢量(000和111)。这6个非零矢量把平面分成了6个扇区,每个扇区60度。

关键点: 任意目标电压矢量Vref,都可以用所在扇区相邻的两个基本矢量Vx、Vy以及零矢量V0来合成。这就是“伏秒平衡”原理。

数学表达很简单:

Vref * Ts = Vx * Tx + Vy * Ty + V0 * T0

其中Ts是PWM周期,Tx、Ty、T0分别是三个矢量的作用时间。

我个人习惯把SVPWM理解成一个“时间分配器”。你给每个矢量分配多少时间,决定了最终合成的电压矢量长什么样。

SVPWM 基本原理 伏秒平衡 扇区判断 Clark变换 + 三值判断 作用时间计算 Tx, Ty, T0 调制策略 七段式 vs 五段式 6个扇区 8种开关状态 X/Y/Z中间变量 过调制处理

3.2 扇区判断

怎么判断目标电压矢量落在哪个扇区?我见过有人用查表法,也有人用角度判断。但最常用的还是基于Clark变换后的αβ分量来判断。

具体做法是这样的:

  1. 先算出三个中间变量:Vref1 = VβVref2 = (√3/2)*Vα - 0.5*VβVref3 = -(√3/2)*Vα - 0.5*Vβ
  2. 然后根据这三个值的正负,组合出一个扇区号

代码实现起来很简洁:

// 扇区判断
float Vref1 = Vbeta;
float Vref2 = 0.866025f * Valpha - 0.5f * Vbeta;
float Vref3 = -0.866025f * Valpha - 0.5f * Vbeta;

uint8_t sector = 0;
if (Vref1 > 0) sector |= 0x01;
if (Vref2 > 0) sector |= 0x02;
if (Vref3 > 0) sector |= 0x04;

// 查表得到实际扇区号(1-6)
const uint8_t sectorTable[] = {0, 1, 5, 0, 3, 2, 4, 0};
sector = sectorTable[sector];

小技巧: 我在项目里习惯把扇区判断和后面的时间计算写在一起,省掉一次查表。但初学者建议分开写,逻辑更清晰。

3.3 作用时间计算

确定了扇区之后,就该算每个矢量的作用时间了。这里有个通用公式,但不同扇区里Vx和Vy对应的基本矢量不一样。

先算三个中间变量X、Y、Z:

float X = (√3 * Vbeta * Ts) / Vdc;
float Y = ( (√3/2 * Vbeta + 3/2 * Valpha) * Ts ) / Vdc;
float Z = ( (√3/2 * Vbeta - 3/2 * Valpha) * Ts ) / Vdc;

然后根据扇区查表得到Tx和Ty:

扇区 Tx Ty
1ZY
2Y-X
3-ZX
4-XZ
5X-Y
6-Y-Z

算出来Tx和Ty之后,别忘了检查一下有没有过调制。如果Tx + Ty > Ts,就需要做等比例缩放:

if (Tx + Ty > Ts) {
    float scale = Ts / (Tx + Ty);
    Tx *= scale;
    Ty *= scale;
}
float T0 = Ts - Tx - Ty;

注意: 过调制处理一定要做!我曾经在一个项目里忘了这步,结果电机在高速时剧烈抖动,查了半天才发现是时间溢出导致的。

3.4 七段式与五段式调制策略

好,时间算出来了,接下来怎么分配?这就涉及到调制策略的选择了。

七段式SVPWM: 每个PWM周期内,矢量顺序是:零矢量(000) → Vx → Vy → 零矢量(111) → Vy → Vx → 零矢量(000)。一共七段,所以叫七段式。

特点:

  • 每个周期开关管动作6次,开关损耗相对较高
  • 谐波含量低,电流波形更平滑
  • 适合对电流质量要求高的场合

五段式SVPWM: 去掉一个零矢量,只保留一个。顺序变成:Vx → Vy → 零矢量 → Vy → Vx。一共五段。

特点:

  • 每个周期开关管动作4次,开关损耗降低约33%
  • 谐波含量略高,但很多场合可以接受
  • 适合对效率要求高、散热条件有限的场合

我的建议: 如果做消费级产品(比如风机、水泵),五段式就够了,省电又省散热。但如果是伺服驱动器或者对噪音敏感的设备,还是老老实实用七段式吧。

两种策略的对比表格:

对比项 七段式 五段式
每周期开关次数 6次 4次
开关损耗 低(降低约33%)
电流谐波 略高
实现复杂度 简单 稍复杂(需调整零矢量分配)
适用场景 伺服、高精度控制 风机、水泵、低成本方案

嗯,说到五段式,我记得有一次做车载水泵项目,客户要求效率必须达到92%以上。七段式死活差0.5%,换成五段式之后,开关损耗降下来了,效率刚好达标。所以说,有时候不是技术越复杂越好,合适才是王道。

最后提一句,不管用哪种策略,PWM的更新频率一定要和电流采样同步。我见过有人把PWM频率设成20kHz,电流采样却在10kHz做,结果出来的电流波形跟锯齿似的……

专注资料整理