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理解成一个“时间分配器”。你给每个矢量分配多少时间,决定了最终合成的电压矢量长什么样。
3.2 扇区判断
怎么判断目标电压矢量落在哪个扇区?我见过有人用查表法,也有人用角度判断。但最常用的还是基于Clark变换后的αβ分量来判断。
具体做法是这样的:
- 先算出三个中间变量:
Vref1 = Vβ、Vref2 = (√3/2)*Vα - 0.5*Vβ、Vref3 = -(√3/2)*Vα - 0.5*Vβ - 然后根据这三个值的正负,组合出一个扇区号
代码实现起来很简洁:
// 扇区判断
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 |
|---|---|---|
| 1 | Z | Y |
| 2 | Y | -X |
| 3 | -Z | X |
| 4 | -X | Z |
| 5 | X | -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做,结果出来的电流波形跟锯齿似的……