4. SVPWM调制技术:空间矢量原理、扇区判断、作用时间计算、七段式与五段式SVPWM、死区补偿

各位同学,咱们今天聊SVPWM。说实话,这是整个矢量控制里最“硬核”的部分之一。我当年刚接触这个的时候,看着那一堆电压矢量和扇区图,脑子里全是问号。但等你真正搞懂了,你会发现——这东西其实很巧妙。

4.1 空间矢量原理:从三相到两相,再到旋转

先说说为什么要有SVPWM。咱们电机里通的是三相正弦交流电,对吧?但控制器里处理的是数字量,是0和1。怎么用开关管的通断,去模拟出一个连续旋转的磁场?这就是SVPWM要干的事。

说白了,SVPWM的核心思想是:用八个基本电压矢量,去合成任意方向、任意大小的目标电压矢量

哪八个?三相逆变器有六个开关管,上管导通为1,下管导通为0。三个桥臂的组合,一共2³=8种状态。其中两个是零矢量(000和111),剩下六个是非零矢量,它们把空间分成了六个扇区。

关键点:这六个非零矢量,幅值都是(2/3)*Vdc,方向互差60度。它们围成一个正六边形。而咱们想要的,是六边形内切圆里的任意矢量——也就是能输出最大不失真正弦波的区域。

我在项目里遇到过一个问题:一开始没注意这个内切圆半径,结果调制度设高了,输出波形直接畸变。嗯,后来才意识到,最大不失真电压幅值只有Vdc/√3。

4.2 扇区判断:目标电压落在哪?

好,现在咱们有了目标电压矢量Uref(从电流环算出来的)。第一步,得知道它落在哪个扇区。怎么判断?看它在αβ坐标系下的分量。

我习惯用下面这个方法,简单粗暴:

// 扇区判断,输入Ualpha, Ubeta
// 定义三个中间变量
B1 = Ubeta;
B2 = (sqrt(3)/2)*Ualpha - 0.5*Ubeta;
B3 = -(sqrt(3)/2)*Ualpha - 0.5*Ubeta;

// 根据正负号得到扇区号
Sector = 0;
if(B1 > 0) Sector += 1;
if(B2 > 0) Sector += 2;
if(B3 > 0) Sector += 4;

// 查表得到实际扇区(1~6)
// 这个映射关系跟你的坐标系定义有关,我一般用:
// Sector值: 1->扇区II, 2->扇区VI, 3->扇区I, 4->扇区IV, 5->扇区III, 6->扇区V

你想想看,为什么用这三个式子?其实就是在判断Uref相对于六个边界矢量的位置。正负号一组合,六个扇区就分出来了。

我的小技巧:实际代码里,我会把sqrt(3)/2预计算成常数0.8660254,避免每次计算开方。嵌入式上能省一点是一点。

4.3 作用时间计算:T1、T2怎么来?

知道扇区之后,就要算两个相邻非零矢量的作用时间了。原理很简单——伏秒平衡。目标矢量乘以PWM周期,等于两个相邻矢量分别乘以各自作用时间,再相加。

以扇区I为例(Uref在U4(100)和U6(110)之间):

// 先算中间变量X, Y, Z
X = Ubeta * Tpwm / Vdc;
Y = (sqrt(3)/2*Ualpha + 0.5*Ubeta) * Tpwm / Vdc;
Z = (-sqrt(3)/2*Ualpha + 0.5*Ubeta) * Tpwm / Vdc;

// 根据扇区查T1, T2
switch(Sector) {
    case 1: T1 = Z; T2 = Y; break;  // 扇区I
    case 2: T1 = Y; T2 = -X; break; // 扇区II
    case 3: T1 = -Z; T2 = X; break; // 扇区III
    case 4: T1 = -X; T2 = Z; break; // 扇区IV
    case 5: T1 = X; T2 = -Y; break; // 扇区V
    case 6: T1 = -Y; T2 = -Z; break;// 扇区VI
}

// 过调制处理
if(T1 + T2 > Tpwm) {
    T1 = T1 * Tpwm / (T1 + T2);
    T2 = T2 * Tpwm / (T1 + T2);
}

这里有个坑,我踩过——过调制处理。当T1+T2超过PWM周期时,必须等比例缩小。否则算出来的占空比会超过100%,逆变器直接炸给你看。我曾经在调试台上就遇到过,MOS管瞬间冒烟...从那以后,过调制判断我写得比谁都认真。

4.4 七段式与五段式SVPWM

算完T1、T2,剩下的时间就是零矢量(T0 = Tpwm - T1 - T2)。怎么分配零矢量?这就引出了两种经典模式。

七段式SVPWM

每个PWM周期内,矢量顺序是:零矢量 → 非零1 → 非零2 → 零矢量 → 非零2 → 非零1 → 零矢量。一共七段。

优点:谐波含量低,电流波形好。
缺点:开关次数多,损耗大。

以扇区I为例,七段式的开关顺序是:000 → 100 → 110 → 111 → 110 → 100 → 000。

五段式SVPWM

只插入一次零矢量,顺序是:非零1 → 非零2 → 零矢量 → 非零2 → 非零1。一共五段。

优点:开关次数减少1/3,损耗低。
缺点:谐波含量高,电流纹波大。

我个人习惯:对电流环性能要求高的场合,用七段式;对效率要求高的场合,用五段式。比如做电动工具,电池供电,我肯定选五段式,省电才是王道。

对比项 七段式SVPWM 五段式SVPWM
每周期开关次数 6次 4次
开关损耗 低(降低约33%)
电流谐波
适用场景 高性能伺服、精密控制 电动工具、家电、低功耗设备

4.5 死区补偿:不得不面对的现实

理论讲完了,咱们聊聊现实。实际逆变器里,上下管不能同时导通,否则就是直通短路。所以要在开关信号里插入一段“死区时间”——上下管都关断。

但死区会带来问题:输出电压失真、电流波形畸变、低频时尤其明显。你想想看,本来该输出的电压,因为死区被“吃掉”了一部分,能不歪吗?

怎么补偿?我常用的方法是基于电流极性的死区补偿

// 死区补偿,根据电流方向调整占空比
// Tdead: 死区时间,单位us
// Tpwm: PWM周期,单位us

if(Ia > 0) {
    Ta_comp = Ta + Tdead/Tpwm;  // 正电流,补偿增加
} else {
    Ta_comp = Ta - Tdead/Tpwm;  // 负电流,补偿减少
}
// 同理处理B相、C相

注意:电流极性检测在过零点附近容易出错。因为电流很小,噪声干扰大。我曾经在这个问题上吃过亏——过零点附近补偿方向搞反了,结果电流波形反而更差。后来加了滞环判断,才稳定下来。

还有一种更高级的方法——脉冲宽度补偿。不直接改占空比,而是精确调整每个开关沿的时刻。但实现起来复杂一些,一般用在要求很高的场合。

小结

好了,这一章的内容就到这。SVPWM这东西,说难不难,说简单也不简单。关键是要理解它的物理意义——用离散的开关状态,去逼近连续的旋转磁场。扇区判断、时间计算、七段五段、死区补偿,每一步都有它的道理。

下一章咱们聊电流采样和坐标变换的工程实现,到时候我会分享一些ADC触发时序的坑,保证有用。