在电机磁场定向控制(FOC)系统中,空间矢量脉宽调制(SVPWM)是实现电压矢量精确控制的核心技术。相比传统的SPWM调制方式,SVPWM具有直流母线电压利用率高(提升15%)、谐波含量低、转矩脉动小等显著优势。我在工业伺服驱动器开发中发现,采用优化的SVPWM算法可使电机效率提升3-5%,这在实际工程中意义重大。
SVPWM的本质是通过逆变器的开关状态组合,用离散的电压矢量来合成连续旋转的参考电压矢量。理解这个技术需要掌握三个关键点:空间矢量表示、电压矢量分布规律以及实时合成算法。下面我将结合具体工程案例,详细拆解每个环节的实现细节。
提示:实际工程中,SVPWM算法通常运行在20kHz以上的PWM频率下,要求计算必须在数微秒内完成,这对MCU的运算能力提出了挑战。
三相电压的瞬时值可以通过Clarke变换映射到静止的αβ坐标系:
$$
\begin{aligned}
V_\alpha &= \frac{2}{3}\left(v_a - \frac{1}{2}v_b - \frac{1}{2}v_c\right) \
V_\beta &= \frac{\sqrt{3}}{3}(v_b - v_c)
\end{aligned}
$$
这个变换的物理意义在于:将三相120°分布的绕组等效为两个正交的绕组。我在调试ABB驱动器时曾用示波器捕获过这个变换过程,当电机匀速旋转时,αβ电压呈现完美的正弦波形,幅值相等且相位差90°。
更直观的理解是:想象三个互成120°的线圈,它们的合成磁场可以用一个旋转矢量表示。例如当三相电压为(1, -0.5, -0.5)时,合成矢量就指向α轴正方向。
对于典型的三相两电平逆变器,每相桥臂有开/关两种状态,共产生8种开关组合。除去两个零矢量(V0, V7),其余6个非零矢量将空间划分为6个扇区:
| 矢量 | 开关状态 | α分量 | β分量 |
|---|---|---|---|
| V0 | 000 | 0 | 0 |
| V1 | 100 | 2Udc/3 | 0 |
| V2 | 110 | Udc/3 | √3Udc/3 |
| ... | ... | ... | ... |
| V7 | 111 | 0 | 0 |
这些矢量在αβ平面构成正六边形,相邻矢量间隔60°。实际测试发现,当电机低速运行时,参考矢量常位于六边形内部;而在过调制区域,矢量则会超出六边形范围。
扇区判断是SVPWM的第一步,其计算效率直接影响算法性能。经过多次优化,我总结出以下高效判定流程:
计算中间变量:
$$U_1 = V_\beta$$
$$U_2 = \frac{\sqrt{3}}{2}V_\alpha - \frac{1}{2}V_\beta$$
$$U_3 = -U_2 - U_1$$
通过符号函数获取特征值:
c复制A = (U1 > 0) ? 1 : 0;
B = (U2 > 0) ? 1 : 0;
C = (U3 > 0) ? 1 : 0;
计算扇区号N = A + 2B + 4C,对应关系如下:
| N | 扇区 |
|---|---|
| 3 | I |
| 1 | II |
| 5 | III |
| 4 | IV |
| 6 | V |
| 2 | VI |
在STM32F4系列MCU上,这个算法仅需12个CPU周期即可完成,非常适合实时控制。
以扇区I为例,电压矢量合成遵循平行四边形法则:
$$
\begin{aligned}
T_1 &= \frac{\sqrt{3}T_s}{U_{dc}} \left( V_\alpha - \frac{V_\beta}{\sqrt{3}} \right) \
T_2 &= \frac{\sqrt{3}T_s}{U_{dc}} \cdot V_\beta \
T_0 &= T_s - T_1 - T_2
\end{aligned}
$$
这里有个工程经验:当T1+T2>Ts时,需要进行过调制处理,此时应对T1、T2进行等比例缩放:
c复制if(T1 + T2 > Ts) {
float factor = Ts / (T1 + T2);
T1 *= factor;
T2 *= factor;
T0 = 0;
}
为降低开关损耗,通常采用中心对称的七段式调制。以扇区I为例,其开关序列为:V0→V1→V2→V7→V2→V1→V0。对应的比较值计算如下:
c复制float Ta = (Ts - T1 - T2) / 4;
float Tb = Ta + T1/2;
float Tc = Tb + T2/2;
TIM1->CCR1 = (uint16_t)(Ta * PWM_PERIOD);
TIM1->CCR2 = (uint16_t)(Tb * PWM_PERIOD);
TIM1->CCR3 = (uint16_t)(Tc * PWM_PERIOD);
实际调试中发现,死区时间的插入会影响矢量作用时间。建议在计算完成后,从T0时间中扣除死区补偿量:
c复制T0 -= 2 * DeadTime; // 每个切换沿都需要补偿
常规SVPWM的线性调制区只能达到86.6%的直流利用率。通过以下方法可进一步提升:
实测数据显示,过调制策略可使输出电压提升约15%,但会引入约5%的THD增加。
在50kW伺服驱动器中,我们做过对比测试:
| 开关频率 | 电流THD | 开关损耗 | 温升 |
|---|---|---|---|
| 10kHz | 8.2% | 120W | 25K |
| 15kHz | 5.7% | 180W | 38K |
| 20kHz | 4.3% | 240W | 52K |
最终选择15kHz作为最佳平衡点,既保证了波形质量,又控制了散热设计难度。
矢量跳变问题:
计算溢出问题:
死区补偿不足:
对于批量生产的产品,建议采用预计算查表法。将不同幅值/角度的矢量参数预先存储在Flash中,实时控制时只需索引读取。在TI C2000系列DSP上,这种方法可将计算时间从50μs缩短到5μs。
对于超高动态要求的场合(如航空航天),可采用FPGA实现并行计算。我们开发的IP核包含:
实测延迟仅0.5μs,比软件方案快两个数量级。
结合SVPWM与高频注入法,可实现无位置传感器控制。关键点在于:
这套方案在风机应用中已稳定运行超过2万小时,位置估算精度达±5电角度。