4. SVPWM调制技术:空间矢量调制原理、扇区判断、作用时间计算、七段式SVPWM实现

各位同学,欢迎来到第四讲。今天我们要啃的这块骨头,是FOC算法里最硬核、也最有趣的部分——SVPWM调制技术。

说实话,我当年刚接触FOC时,看到SVPWM那一堆矢量图和三角函数,头都大了。但后来在项目里调了无数次电机,才真正体会到:SVPWM不是数学游戏,它是让电机转得又稳又安静的秘诀

4.1 空间矢量调制原理

先问大家一个问题:为什么不用传统的SPWM(正弦脉宽调制),非要搞个SVPWM?

我举个例子你就明白了。SPWM就像让电机吃“粗粮”——电压利用率低,谐波大。而SVPWM呢?它直接给电机喂“精粮”——电压利用率能提高15%,谐波还小。

空间矢量调制的核心思想:把三相逆变器的8种开关状态,映射到复平面上的8个基本电压矢量。其中6个是非零矢量(V1~V6),2个是零矢量(V0和V7)。

关键点:任意一个期望电压矢量,都可以由相邻的两个基本矢量合成。这就是“伏秒平衡”原理——用时间加权平均来等效目标矢量。

我在做第一个无人机项目时,就犯了个低级错误:以为SVPWM只是把三相正弦波改成了马鞍波。后来才发现,SVPWM的本质是让磁链轨迹更接近圆形,这才是电机安静运转的根本原因。

4.2 扇区判断

好,现在我们要把目标电压矢量Uref分解到基本矢量上。第一步就是:判断Uref落在哪个扇区

扇区判断其实很简单。我们把复平面分成6个60°的扇区,每个扇区对应一对基本矢量。判断方法有两种:

  1. 角度法:直接算Uref的相位角,看落在哪个区间。比如0°~60°是扇区I,60°~120°是扇区II……
  2. 分量法:用Uα和Uβ的正负和大小关系来判断。我个人更推荐这种方法,因为它不需要算反正切,计算量小。

这里我给出一个常用的扇区判断公式:

// 扇区判断伪代码
U1 = Ubeta
U2 = (sqrt(3)/2)*Ualpha - 0.5*Ubeta
U3 = -(sqrt(3)/2)*Ualpha - 0.5*Ubeta

if (U1 > 0) sector = 1 else sector = 0
if (U2 > 0) sector += 2
if (U3 > 0) sector += 4

// 最终sector值对应扇区编号
// sector=1 → 扇区II, sector=2 → 扇区VI, sector=3 → 扇区I
// sector=4 → 扇区IV, sector=5 → 扇区III, sector=6 → 扇区V

小技巧:实际代码里,我习惯把扇区编号和基本矢量的顺序对应好。比如扇区I对应V1和V2,扇区II对应V2和V3……这样后面算作用时间时不容易搞混。

4.3 作用时间计算

扇区判断完了,接下来就是算每个基本矢量的作用时间。说白了,就是解一个二元一次方程组。

假设Uref落在扇区I,相邻矢量是V1(100)和V2(110)。根据伏秒平衡:

Uref * Ts = V1 * T1 + V2 * T2 + V0 * T0

其中:
T1 = (sqrt(3)*Ts/Udc) * (sqrt(3)/2*Ualpha - 0.5*Ubeta)
T2 = (sqrt(3)*Ts/Udc) * Ubeta
T0 = Ts - T1 - T2

嗯,这里要注意:T1和T2不能为负,也不能超过Ts。如果算出来T1+T2 > Ts,说明Uref已经超出了逆变器能输出的最大电压,这时候就要做“过调制处理”。

我记得有一次调试,电机在高转速时突然抖动。查了半天,发现就是过调制没处理好,T1+T2超过了Ts,导致波形畸变。后来加了个限幅处理,问题就解决了。

其他扇区的公式类似,只是Uα和Uβ的系数不同。我建议你把6个扇区的公式都推导一遍,然后总结成一个通用公式。这样代码写起来会非常简洁。

4.4 七段式SVPWM实现

作用时间算完了,最后一步就是生成实际的PWM波形。这里有两种方式:五段式和七段式。我重点讲七段式,因为它是工程中最常用的。

七段式SVPWM的特点:每个PWM周期内,开关状态变化7次。这样做的优点是谐波小,电机运行更平稳。

实现步骤:

  1. 根据扇区,确定三个比较值Ta、Tb、Tc
  2. 用这三个比较值去更新定时器的比较寄存器
  3. 定时器输出对称的PWM波形

我给出一个通用的比较值计算代码:

// 七段式SVPWM比较值计算
// 先计算基础时间
T1 = ... // 根据扇区计算
T2 = ...
T0 = Ts - T1 - T2

// 计算三相占空比
Ta = T0 / 4
Tb = Ta + T1 / 2
Tc = Tb + T2 / 2

// 根据扇区分配ABC三相
switch(sector) {
    case 1: // 扇区I
        cmpA = Tb; cmpB = Ta; cmpC = Tc;
        break;
    case 2: // 扇区II
        cmpA = Ta; cmpB = Tc; cmpC = Tb;
        break;
    // ... 其他扇区类似
}

避坑指南:我曾经在STM32上实现SVPWM时,发现电机低速时噪音特别大。排查后发现是PWM死区时间设置不合理。七段式SVPWM对死区时间很敏感,建议死区时间不要超过PWM周期的1%。

另外,七段式SVPWM的载波频率选择也很关键。频率太高,开关损耗大;频率太低,电流纹波大。我一般建议:对于无人机电机,PWM频率选在10kHz~20kHz之间。太低会听到人耳可闻的噪音,太高MOS管发热严重。

4.5 总结与经验分享

好了,SVPWM的核心内容就这些。最后分享几点我的实战经验:

  • 调试顺序:先开环验证SVPWM波形,再闭环调电流环。别一上来就闭环,出了问题都不知道是SVPWM的锅还是PI参数的锅。
  • 波形观察:用示波器看电机相电压波形,应该是漂亮的正弦波。如果看到明显的阶梯状,说明SVPWM实现有问题。
  • 效率优化:在轻载时,可以适当降低PWM频率来减少开关损耗。这个技巧我在一个续航要求很高的无人机项目里用过,效果不错。

你想想看,SVPWM其实没那么神秘。它就是一套把“想要什么电压”翻译成“开关怎么动作”的翻译规则。掌握了这个翻译规则,FOC算法就打通了最关键的一环。

下一讲,我们会把SVPWM和前面的电流环、速度环串起来,形成一个完整的FOC控制链路。到时候你会发现,原来让电机转得又稳又安静,真的没那么难。