4. 七段式SVPWM:经典的七段式调制波形生成方法,包括零矢量的插入与对称分配

七段式SVPWM,说白了就是让三相逆变器的开关动作次数固定为七段。你想想看,六拍阶梯波虽然简单,但谐波太大;五段式虽然效率高,但波形对称性差一点。七段式正好在两者之间找到了平衡点——谐波性能好,开关损耗也能接受。

我个人习惯把七段式叫做“强迫症式调制”。为什么?因为它把每个开关周期都切成了七段,零矢量被对称地放在开头、中间和结尾。这种对称结构,让电流波形漂亮很多。

4.1 七段式的基本结构

先看一个完整的七段式序列长什么样。假设我们要合成一个位于扇区I的参考电压矢量,开关序列是这样的:

000 → 100 → 110 → 111 → 110 → 100 → 000

看到了吗?从全零矢量(000)开始,经过两个非零矢量(100、110),到达全一矢量(111),然后再原路返回。这就是“七段”的由来——七种不同的开关状态。

我刚开始做这个的时候,总觉得为什么要这么麻烦?直接000→111→000不就行了?后来才明白,零矢量的分配方式直接影响电流纹波和THD。对称分配能让电流在一个周期内“来回走”,纹波互相抵消一部分。

核心要点:七段式SVPWM的开关序列总是从零矢量开始,到零矢量结束。中间插入两个相邻的非零矢量,最后用另一个零矢量收尾。这种对称结构保证了PWM波形的奇对称性,有利于降低谐波。

4.2 零矢量的插入策略

零矢量有两个:000和111。怎么分配它们的时间?这里有个关键点——零矢量分配系数。

定义分配系数k:

  • k = 0.5:两个零矢量时间相等,这是最常用的方式
  • k = 0:只用000,不用111
  • k = 1:只用111,不用000

我建议新手先固定k=0.5。为什么?因为对称性最好,电流纹波最小。我在一个水泵项目里试过k=0.3,结果电流波形明显变差,电机噪音也大了。后来老老实实改回0.5,问题就解决了。

分配系数k 零矢量分配 特点 适用场景
0.5 T0/2 = T7/2 对称性最好,THD最低 通用场合,推荐默认
0 只用000 开关次数少,但波形不对称 对THD要求不高的场合
1 只用111 同上,但电流方向相反 特殊调制需求

实战技巧:如果你用DSP或者STM32的HRTIM,零矢量分配通常由硬件自动完成。但如果你用纯软件实现PWM,记得在定时器中断里手动调整比较值。我曾经踩过这个坑——忘了更新比较值,结果波形乱成一团。

4.3 七段式的时序计算

现在我们来算每个段的时间。假设一个PWM周期为Ts,非零矢量作用时间分别为T1和T2,零矢量总时间为T0。

基本公式:

T1 + T2 + T0 = Ts
T0 = Ts - T1 - T2

当k=0.5时,两个零矢量的时间各占一半:

T0/2 = T7/2 = (Ts - T1 - T2) / 2

那么七段的时间分配就是:

段1:000,时间 = T0/2
段2:100,时间 = T1/2
段3:110,时间 = T2/2
段4:111,时间 = T0/2
段5:110,时间 = T2/2
段6:100,时间 = T1/2
段7:000,时间 = T0/2

你发现规律了吗?前三个段和后三个段是对称的。这就是“对称PWM”名字的由来。

注意:实际计算时,T1和T2是从SVPWM的扇区判断和矢量合成步骤得到的。如果T1+T2 > Ts,说明进入了过调制区。这时候需要做等比例缩放,否则波形会失真。我见过有人忘了处理过调制,结果电机在高速时剧烈抖动。

4.4 七段式波形的生成流程

整个生成流程可以总结为以下几步:

  1. 判断扇区:根据Uα、Uβ确定参考矢量在哪个扇区
  2. 计算T1、T2:用扇区对应的公式算出两个非零矢量的作用时间
  3. 计算零矢量时间:T0 = Ts - T1 - T2
  4. 分配零矢量:按分配系数k拆分成T0和T7
  5. 生成比较值:根据七段序列,计算每个桥臂的占空比
  6. 更新PWM寄存器:把比较值写入定时器

嗯,这里要注意:第5步生成比较值时,不同扇区的开关序列不一样。比如扇区I是000→100→110→111,扇区II就变成了000→010→110→111。你得为每个扇区单独写一套比较值计算逻辑。

我早期犯过一个低级错误:六个扇区用了同一套比较值公式,结果电机转起来嗡嗡响,电流波形像锯齿。后来逐扇区调试才发现问题。

七段式SVPWM生成流程图 输入Uα, Uβ 扇区判断 计算T1, T2(查表/公式) 零矢量分配(k=0.5) 生成三相比较值 更新PWM寄存器 关键点 每个扇区的开关序列不同 过调制时需等比例缩放 零矢量分配影响THD

4.5 代码实现示例

下面是一个简化的七段式SVPWM实现片段。我用的是C语言风格,方便移植到各种MCU上。

// 七段式SVPWM - 扇区I的比较值计算
// 输入:T1, T2(非零矢量作用时间),Ts(PWM周期)
// 输出:Ta, Tb, Tc(三相比较值)

void svpwm_sector1(float T1, float T2, float Ts, float *Ta, float *Tb, float *Tc) {
    float T0 = Ts - T1 - T2;      // 零矢量总时间
    float T0_half = T0 * 0.5f;    // 对称分配,k=0.5
    
    // 七段序列:000 → 100 → 110 → 111 → 110 → 100 → 000
    // 计算各相的比较值(中心对齐PWM)
    *Ta = T0_half;                 // A相:000段结束时刻
    *Tb = T0_half + T1 * 0.5f;    // B相:100段结束时刻
    *Tc = T0_half + T1 * 0.5f + T2 * 0.5f;  // C相:110段结束时刻
    
    // 注意:实际写入定时器时,需要根据PWM模式做调整
    // 如果是递增-递减模式,比较值就是上面算的值
    // 如果是单边模式,需要做映射
}

经验之谈:实际项目中,我建议把六个扇区的比较值计算写成查表形式。用扇区号做索引,直接查表得到计算公式。这样代码更简洁,也更容易调试。我曾经在一个项目中用switch-case写了六个分支,结果代码长了三倍,还容易漏掉某个扇区。

4.6 七段式 vs 五段式

你可能要问:既然七段式这么好,为什么还有人用五段式?

我简单对比一下:

对比项 七段式 五段式
每周期开关次数 7次 5次
开关损耗 较高 较低(约低30%)
电流THD 较低 较高
零矢量分配 对称(000和111) 只用一种零矢量
适用场景 对谐波要求高的场合 对效率要求高的场合

说白了,七段式是用开关次数换波形质量。如果你的电机对噪音和振动敏感,比如用在精密仪器上,我建议用七段式。如果电池供电、对续航有要求,五段式可能更合适。

我的建议:初学者先掌握七段式。因为它的对称性好,调试起来更容易。等把七段式吃透了,再去看五段式、不连续PWM这些变种。我在带新人时,都是让他们先写七段式,跑通了再优化。

4.7 常见问题与避坑

最后分享几个我踩过的坑:

  • 死区时间的影响:七段式在零矢量切换时,如果死区时间设置不当,会出现电流畸变。我建议死区时间不要超过PWM周期的2%。
  • 比较值溢出:当T1+T2接近Ts时,比较值可能超过定时器的最大值。记得做饱和处理。
  • 扇区切换时的毛刺:从一个扇区切换到另一个扇区时,如果比较值更新不及时,会出现电压跳变。最好用影子寄存器或者双缓冲机制。

曾经踩过的坑:有一次我在调试一个2kW的伺服驱动器,七段式SVPWM在低速时一切正常,但转速一高就出现电流震荡。查了两天才发现,原来是扇区切换时比较值更新有延迟,导致电压矢量跳到了错误的扇区。后来加了影子寄存器同步,问题就解决了。

嗯,七段式SVPWM的内容就这些。核心就是零矢量的对称分配,以及每个扇区对应的开关序列。你只要把扇区判断和比较值计算写对,剩下的就是调试和优化了。