4. 七段式SVPWM:经典的七段式发波模式,降低开关损耗与谐波

说到SVPWM,很多朋友第一反应就是那个六边形和圆形内切的关系。但真正落到代码里、跑到示波器上的,其实是“怎么发波”的问题。七段式发波,说白了就是在一个开关周期里,把零矢量拆成两半,分别放在开头和结尾,中间插上两个非零矢量。这样做的好处很明显——开关次数少了,谐波也干净了。

我个人习惯把七段式叫做“对称发波”。为什么对称?你想想看,每个周期都是从零矢量开始,经过两个非零矢量,最后再回到零矢量。波形是对称的,电流纹波也就小了。我在项目里遇到过好几次,同样的电机、同样的母线电压,用五段式发波噪声就大一些,换成七段式立马安静下来。

4.1 七段式的开关序列

先看一个具体的例子。假设我们在第一扇区,目标电压矢量Vref落在V1(100)和V2(110)之间。七段式的开关序列是这样的:

时段 T₀/2 T₁/2 T₂/2 T₀ T₂/2 T₁/2 T₀/2
U相 0 1 1 1 1 1 0
V相 0 0 1 1 1 0 0
W相 0 0 0 1 0 0 0
矢量 V₀(000) V₁(100) V₂(110) V₇(111) V₂(110) V₁(100) V₀(000)

看到没?每个开关周期里,每个桥臂只开关一次。这就是七段式最核心的优势——开关损耗低。我曾经调试一个伺服驱动器,散热条件有限,用五段式发波,MOS管温度飙到85度,换成七段式直接降到62度。效果立竿见影。

4.2 作用时间的计算

七段式的核心就是算好T₁、T₂和T₀。T₁和T₂是两个非零矢量的作用时间,T₀是零矢量的总时间。公式其实不复杂:

T₁ = √3 · Tₛ · |Vref| / Vdc · sin(60° - θ)
T₂ = √3 · Tₛ · |Vref| / Vdc · sin(θ)
T₀ = Tₛ - T₁ - T₂

其中Tₛ是开关周期,Vdc是母线电压,θ是Vref在扇区内的角度。嗯,这里要注意:T₀要平分到开头和结尾,各占T₀/2。中间那个零矢量V₇占T₀,但实际是T₀/2 + T₀/2合并成一段。

关键点:七段式发波时,零矢量V₀(000)和V₇(111)都会用到。V₀放在首尾,V₇放在中间。这样做的目的是让三相电压在切换时只变化一相,减少共模电压的跳变。

4.3 七段式 vs 五段式

很多初学者会问:既然五段式少了一段零矢量,开关次数更少,为什么不一直用五段式?我刚开始也有这个疑问。后来在项目里对比过,发现两者各有适用场景。

对比项 七段式 五段式
每周期开关次数 6次 4次
开关损耗 较低 更低
电流谐波 低(对称性好) 较高(不对称)
共模电压 较小跳变 较大跳变
适用场景 通用伺服、高精度 大功率、散热受限

说白了,七段式是“均衡派”,五段式是“激进派”。我在做通用伺服驱动器时,默认都用七段式。只有在客户要求极限功率密度、散热实在压不住的时候,才会考虑切到五段式。

4.4 代码实现要点

七段式的代码实现,核心就是算好三个比较值。以TI的DSP为例,通常用ePWM模块的CMPA、CMPB、CMPC寄存器。我贴一段伪代码,大家感受一下:

// 假设已经算好了T1, T2, T0
// 扇区判断结果在 sector 变量中

float Ta, Tb, Tc;

// 计算三相占空比基准值
Ta = T0 / 4.0f;           // 第一段零矢量的一半
Tb = Ta + T1 / 2.0f;      // 加上第一个非零矢量的一半
Tc = Tb + T2 / 2.0f;      // 加上第二个非零矢量的一半

// 根据扇区分配三相比较值
switch(sector) {
    case 1:  // 扇区I: V1(100), V2(110)
        CMPA = Ta;  // U相
        CMPB = Tb;  // V相
        CMPC = Tc;  // W相
        break;
    case 2:  // 扇区II: V3(010), V2(110)
        CMPA = Tb;  // U相
        CMPB = Ta;  // V相
        CMPC = Tc;  // W相
        break;
    // ... 其他扇区类似
}

我的经验:实际工程中,T₀/4可能会因为浮点精度问题导致微小的占空比误差。我习惯在最后做一次饱和处理,确保CMP值在[0, TBPRD]范围内。曾经有一次忘记做饱和,电机在低速时抖动得厉害,查了半天才发现是占空比溢出导致的。

4.5 谐波特性分析

七段式发波的谐波主要集中在开关频率的整数倍附近。因为波形是对称的,偶次谐波被抑制得很好。我实测过,七段式的电流THD通常比五段式低3%~5%。

为什么会这样?你想想看,五段式把一段零矢量完全去掉了,波形不再对称,自然会产生更多的低次谐波。这些谐波会带来额外的铜损和铁损,电机温度也会升高。

避坑指南:我曾经在一个项目里,为了追求极致的开关损耗,用了五段式发波。结果电机在低速运行时噪声很大,客户投诉。后来换成七段式,噪声问题迎刃而解。所以我的建议是:除非散热真的扛不住,否则优先用七段式。

4.6 七段式SVPWM核心流程

下面这张图是我自己总结的七段式发波流程,从扇区判断到最终输出PWM波,每一步都标清楚了。你可以把它贴在工位上,写代码时对照着看。

七段式SVPWM发波流程 输入 Vα, Vβ 扇区判断 计算 T₁, T₂, T₀ 计算 Ta, Tb, Tc 扇区映射 → CMP值 输出PWM波 关键公式 T₁ = √3·Tₛ·|Vref|/Vdc·sin(60°-θ) T₂ = √3·Tₛ·|Vref|/Vdc·sin(θ) T₀ = Tₛ - T₁ - T₂ 七段式序列 V₀ → V₁ → V₂ → V₇ → V₂ → V₁ → V₀ 每相每周期开关1次

这张图把整个流程串起来了。从Clark变换得到Vα、Vβ开始,到扇区判断,再到时间计算和映射,最后输出PWM。每一步都有明确的输入输出,调试时按图索骥就行。

4.7 实际调试中的注意事项

最后聊几个我在现场调试时踩过的坑:

  • 死区补偿:七段式发波虽然开关次数少,但死区时间依然会影响电压精度。我一般在低速段做死区补偿,高速段影响不大可以忽略。
  • 最小脉宽限制:当T₁或T₂非常小时,PWM脉冲可能窄到无法被功率管响应。我习惯设置一个最小脉宽阈值,比如1μs,小于这个值就做合并处理。
  • 过调制处理:当|Vref|超过六边形内切圆时,T₁+T₂会大于Tₛ。这时候需要做等比例缩放,保证总时间不超过开关周期。我常用的方法是:T₁' = T₁·Tₛ/(T₁+T₂),T₂'同理。

一个小技巧:在代码里加一个调试变量,实时打印T₀的值。如果T₀长期接近0,说明你已经在过调制区了。这时候电机会出现明显的转矩脉动,需要限制Vref的幅值。