3. SVPWM基础:空间矢量调制原理、扇区判断、基本电压矢量合成、死区时间配置

好,咱们进入SVPWM的世界。说实话,我刚接触电机控制那会儿,看到SVPWM的矢量图和各种公式,头都是大的。但后来我发现,这东西说白了就是一种让电机转得更顺、电压利用率更高的调制方式。比传统的SPWM(正弦脉宽调制)强在哪?电压利用率能提高15%左右,谐波也更小。

今天这一章,我带你把这几个核心问题啃下来:空间矢量到底是个啥?怎么判断扇区?怎么合成想要的电压?还有那个让人头疼的死区时间,到底该怎么配。

3.1 空间矢量调制原理

先说说空间矢量的概念。你想想看,三相电机里,A、B、C三相电压是随时间正弦变化的。但如果我们把这三相电压看作一个在复平面上旋转的矢量,事情就简单多了。

这个旋转矢量的长度,就是相电压的幅值,它的旋转速度就是电角频率。SVPWM的核心思想,就是用逆变器能产生的有限个开关状态,去逼近这个旋转的参考电压矢量。

逆变器有6个开关管,上桥臂3个,下桥臂3个。同一桥臂上下不能同时导通,所以一共有2³ = 8种开关状态。其中6种是有效矢量,2种是零矢量(全部上通或全部下通)。

关键点:SVPWM不是直接控制每相电压的大小,而是控制一个合成矢量在空间中的位置和长度。这个合成矢量在复平面上转一圈,电机就转一个电周期。

我在项目里调试第一版SVPWM时,发现电机噪音特别大。后来查了半天,发现是扇区判断的边界条件写错了,导致矢量跳变。嗯,这种坑踩过一次就记住了。

3.2 扇区判断

参考电压矢量在复平面上旋转,我们需要知道它当前落在哪个扇区。六个扇区,每个60度,怎么判断?

我习惯用三值法。先根据α-β坐标系下的分量Uα和Uβ,计算三个中间变量:

// 计算三个参考值
Vref1 = Uβ
Vref2 = (√3/2)*Uα - (1/2)*Uβ
Vref3 = -(√3/2)*Uα - (1/2)*Uβ

然后根据这三个值的符号,查表得到扇区号:

Vref1 Vref2 Vref3 扇区
>0 >0 <0 I
>0 <0 <0 II
>0 <0 >0 III
<0 <0 >0 IV
<0 >0 >0 V
<0 >0 <0 VI

其实还有一种更直接的方法,用Uα和Uβ的反正切算角度,然后除以60度取整。但反正切计算在MCU上比较慢,我一般用上面的查表法,快得很。

小技巧:扇区判断的边界条件要注意处理等于0的情况。我曾经因为没处理Uβ=0时的边界,导致扇区在边界处来回跳,电机一顿一顿的。建议把大于0和大于等于0统一处理,或者加个死区。

3.3 基本电压矢量合成

知道扇区之后,就要用这个扇区相邻的两个基本电压矢量来合成参考矢量了。比如参考矢量在扇区I,就用U₀(100)和U₆₀(110)来合成。

合成公式其实很简单,就是伏秒平衡原理:

T = Ts * (Uref / Udc) * sin(60° - θ) / sin(60°)
T1 = Ts * (Uref / Udc) * sin(θ) / sin(60°)
T0 = Ts - T - T1

其中:

  • Ts:PWM周期
  • Uref:参考电压矢量幅值
  • Udc:母线电压
  • θ:参考矢量在扇区内的角度(0~60°)
  • T、T1:两个基本矢量的作用时间
  • T0:零矢量作用时间

实际代码里,我一般会把sin(60°)和1/sin(60°)提前算好存成常量,省得每次算。另外,Uref/Udc这个比值不能超过1/√3,否则就过调制了。过调制时电机电流会畸变,我遇到过一回,电机啸叫得厉害。

注意:当Uref/Udc > 1/√3时,进入过调制区。此时需要对T和T1进行等比例缩放,保证T + T1 ≤ Ts。否则PWM周期会溢出,导致开关管异常导通。

零矢量的分配也有讲究。我习惯用七段式SVPWM,就是把零矢量拆成两段,分别放在周期开头和结尾。这样开关次数均匀,谐波小。五段式虽然开关次数少,但谐波大一些,对电机轴承不好。

3.4 死区时间配置

死区时间,说白了就是防止同一桥臂上下管直通的那段空白时间。IGBT或MOSFET关断需要时间,如果上管还没完全关断,下管就导通了,那就炸管了。

死区时间怎么设?我一般按这个流程来:

  1. 查器件手册:找到开关管的关断延迟时间(toff)和开通延迟时间(ton)。死区时间至少要大于toff - ton。
  2. 留余量:在理论值基础上加50%~100%的余量。比如理论需要1μs,我设2μs。
  3. 实测验证:用示波器看桥臂中点电压,确保没有直通尖峰。

我常用的死区时间范围:

开关管类型 典型死区时间 说明
MOSFET(低压) 200ns ~ 500ns 开关速度快,死区可以小
IGBT(中压) 1μs ~ 3μs 关断拖尾电流,死区要大
SiC MOSFET 100ns ~ 300ns 开关极快,但要注意振铃

警告:死区时间不是越大越好。死区太大,会导致输出电压畸变,电流波形变差,电机噪音增大,甚至引起转矩脉动。我曾经为了保险把死区设到5μs,结果电机低速时抖得跟筛糠似的。

死区补偿也是个话题。简单说,就是根据电流方向,在PWM占空比里加一个修正量,抵消死区造成的电压误差。我一般用软件补偿法,在电流过零点附近做个查表修正。这个后面章节会细讲。

3.5 SVPWM核心流程总览

我把整个SVPWM的流程画了张图,你看一眼就明白了:

SVPWM核心流程 SVPWM核心流程 输入 Uα, Uβ 扇区判断(三值法) 计算 T、T1、T0 过调制判断与处理 分配开关序列(七段式) 输出PWM(含死区) 说明 • 扇区判断用三值法,避免反正切 • 过调制时等比例缩放T、T1 • 死区在PWM输出时插入

这张图把SVPWM的六个步骤串起来了。从输入Uα、Uβ开始,到最终输出带死区的PWM波形,每一步都有讲究。我个人觉得,最容易出问题的是第三步和第四步——作用时间计算和过调制处理。很多新手在这里栽跟头。

3.6 实战中的几个坑

最后,我把自己踩过的坑总结一下,你写代码时注意:

  • 扇区边界抖动:参考矢量刚好落在扇区边界时,扇区号来回跳。加个滞环或者滤波能解决。
  • 过调制处理不当:T + T1 > Ts时,如果不做等比例缩放,PWM周期会乱,严重时烧管子。
  • 死区补偿方向搞反:电流方向判断错了,补偿反而让波形更差。我建议用三相电流采样值直接判断方向,别用估算的。
  • PWM更新时机:一定要在PWM周期溢出中断里更新比较值,别在主循环里随时写。否则会出现半周期更新,波形不对称。

我的习惯:每次写完SVPWM代码,先用开环测试——给一个固定的Uα、Uβ,看三相PWM波形对不对。没问题了再上闭环。这样能快速定位是算法问题还是硬件问题。