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波,每一步都标清楚了。你可以把它贴在工位上,写代码时对照着看。
这张图把整个流程串起来了。从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的幅值。