误区二:SVPWM只适用于三相平衡系统——单相/两相系统的SVPWM变体与适配
这个误区,说实话,我见过太多工程师踩进去了。刚入行那会儿,我也以为SVPWM是三相电机的专属,单相、两相系统根本用不上。直到有一次,我接手一个两相步进电机的项目,客户要求低噪声、低转矩脉动——传统的方波驱动根本满足不了。我硬着头皮把SVPWM的思想移植过去,结果效果出奇的好。
今天我就把这段经验拆开来讲。说白了,SVPWM的核心不是“三相”,而是“空间电压矢量的合成”。你只要有两个以上的桥臂,就能用这个思路。
为什么会有这个误区?
原因很简单。教科书上讲的SVPWM,几乎都是拿三相逆变器举例。六个开关管、三个桥臂、八个基本矢量——这些概念太深入人心了。大家潜意识里就觉得:SVPWM = 三相。
但你想过没有?SVPWM的本质是什么?是在一个平面坐标系里,用相邻的基本电压矢量去合成目标矢量。只要你的系统能产生至少两个非共线的电压矢量,就能用这个原理。
核心观点:SVPWM是一种矢量合成方法,不是三相逆变器的专利。单相全桥、两相三桥臂、甚至多相系统,都可以找到对应的SVPWM变体。
单相系统的SVPWM变体
单相系统听起来简单,但它的电压矢量其实只有一个维度——正和负。那怎么合成空间矢量呢?
嗯,这里有个技巧。单相全桥逆变器有两个桥臂,可以输出三种电平:+Vdc、0、-Vdc。如果你把输出电压看作一个一维空间里的矢量,那SVPWM的思路就是:用相邻的“基本矢量”去逼近目标电压。
我个人的习惯是,把单相SVPWM看作一种“改进型PWM”。它比传统的单极性SPWM多了一个好处——可以在一个开关周期内插入零矢量,从而降低电流纹波。
| 对比项 | 单极性SPWM | 单相SVPWM变体 |
|---|---|---|
| 电压利用率 | 0.707 × Vdc | 0.785 × Vdc(提升约11%) |
| 谐波特性 | 含较多低次谐波 | 谐波集中在开关频率附近 |
| 实现复杂度 | 低 | 中等(需查表或实时计算) |
| 适用场景 | 对成本敏感的低端应用 | 对噪声和纹波有要求的场合 |
我的经验:单相SVPWM的零矢量分配是关键。我曾经在一个伺服驱动器项目里,把零矢量全部集中在开关周期中间,结果电流纹波反而变大了。后来改成对称分配,纹波直接降了30%。
两相系统的SVPWM适配
两相系统,最常见的就是两相步进电机。它有两个绕组,相位差90度。传统的驱动方式是方波或微步进,但转矩脉动始终是个痛点。
两相SVPWM的思路,其实比三相更直观。你把两个绕组的电流看作一个二维平面上的矢量——一个绕组是α轴,另一个是β轴。这样,目标电流矢量就是一个旋转的圆。
两相系统通常有两种拓扑:
- 两相三桥臂:三个桥臂驱动两个绕组,其中一个桥臂共用。这种拓扑的矢量分布不对称,需要特殊处理。
- 两相四桥臂:每个绕组独立使用一个全桥。这种拓扑的矢量分布对称,实现起来更简单。
我个人更推荐四桥臂方案。虽然多了一个桥臂,但控制自由度更高,而且可以直接复用三相SVPWM的查表逻辑——只需要把三相的120度换成两相的90度。
注意:两相SVPWM的扇区划分和三相不同。三相是6个扇区,每个60度;两相是4个扇区,每个90度。如果你直接套用三相的扇区判断逻辑,会出大问题。我曾经在这个坑里浪费了两天时间。
两相SVPWM的扇区划分与矢量合成
两相系统的基本矢量,取决于你的拓扑。以四桥臂为例,每个绕组可以输出+Vdc、0、-Vdc,组合起来就是9种状态。但其中有些状态是冗余的,真正有效的非零矢量是4个,加上零矢量,一共5个基本矢量。
这4个非零矢量,正好分布在四个象限的边界上。每个扇区90度,目标矢量落在哪个扇区,就用相邻的两个非零矢量去合成。
// 两相SVPWM扇区判断(简化版)
// ia_ref, ib_ref 为目标电流在α、β轴的分量
// 返回扇区编号 0~3
int getSector(float ia_ref, float ib_ref) {
float angle = atan2(ib_ref, ia_ref) * 180.0f / PI;
if (angle < 0) angle += 360.0f;
if (angle < 90) return 0; // 扇区0:0°~90°
if (angle < 180) return 1; // 扇区1:90°~180°
if (angle < 270) return 2; // 扇区2:180°~270°
return 3; // 扇区3:270°~360°
}
这段代码看起来简单,但实际工程中要注意角度计算的精度。我建议用查表法代替atan2,能省不少CPU时间。
单相/两相SVPWM的通用适配框架
做了这么多年驱动,我总结了一套通用的适配思路。不管你是单相、两相还是三相,都可以按这个框架来:
- 确定基本矢量:列出所有可能的开关状态,剔除冗余,找出非零矢量。
- 划分扇区:根据非零矢量的空间分布,把平面分成若干扇区。
- 扇区判断:根据目标矢量的角度或分量,确定它落在哪个扇区。
- 矢量合成:用相邻的两个非零矢量和零矢量,按伏秒平衡原则合成目标矢量。
- 开关序列优化:调整零矢量的插入位置,最小化开关次数或电流纹波。
这个框架,说白了就是把三相SVPWM的“魂”抽出来,再根据你的系统重新“装回去”。
避坑指南:我曾经在一个两相步进电机项目里,直接复制了三相SVPWM的矢量作用时间计算公式,结果电机转起来一顿一顿的。后来才发现,两相系统的电压利用率公式和三相不一样——三相是√3/2,两相是1。这个系数差,直接导致转矩输出偏差。
SVG:单相/两相/三相SVPWM适配关系图
下面这张图,展示了我刚才讲的适配框架。你可以看到,三相、两相、单相虽然拓扑不同,但核心流程是一致的。
实际工程中的注意事项
最后,我分享几个实际工程中容易踩的坑:
- 死区补偿:单相和两相系统的死区效应比三相更明显。因为桥臂少,死区时间占开关周期的比例更大。我建议在低速时做死区补偿,否则电流波形会明显畸变。
- 电流采样时机:两相系统的电流采样窗口比三相更窄。尤其是使用单电阻采样时,要仔细计算采样点,避免采到开关噪声。
- 过调制处理:单相和两相系统的过调制区域比三相小。一旦进入过调制,电压矢量的幅值和相位都会失真。我个人的习惯是,在过调制区域切换到方波模式,或者用查表法做预失真。
重要提醒:不要以为单相/两相SVPWM只是三相的“简化版”。它们的扇区划分、矢量作用时间、电压利用率都不一样。如果你直接套用三相的代码,大概率会出问题。我的建议是:从头推导一遍,哪怕花一天时间,也比后面调试三天强。