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 七段式波形的生成流程
整个生成流程可以总结为以下几步:
- 判断扇区:根据Uα、Uβ确定参考矢量在哪个扇区
- 计算T1、T2:用扇区对应的公式算出两个非零矢量的作用时间
- 计算零矢量时间:T0 = Ts - T1 - T2
- 分配零矢量:按分配系数k拆分成T0和T7
- 生成比较值:根据七段序列,计算每个桥臂的占空比
- 更新PWM寄存器:把比较值写入定时器
嗯,这里要注意:第5步生成比较值时,不同扇区的开关序列不一样。比如扇区I是000→100→110→111,扇区II就变成了000→010→110→111。你得为每个扇区单独写一套比较值计算逻辑。
我早期犯过一个低级错误:六个扇区用了同一套比较值公式,结果电机转起来嗡嗡响,电流波形像锯齿。后来逐扇区调试才发现问题。
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的内容就这些。核心就是零矢量的对称分配,以及每个扇区对应的开关序列。你只要把扇区判断和比较值计算写对,剩下的就是调试和优化了。