3. 基本矢量作用时间:T1和T2的计算

好,咱们接着聊。上一节我们把扇区判断搞定了,知道了当前参考电压矢量落在哪个扇区。但光知道扇区没用,你得告诉逆变器:在这个PWM周期里,两个相邻的非零矢量各导通多久,零矢量又导通多久。说白了,就是算T1和T2。

我个人习惯把这一步叫做“时间分配”。你想想看,我们有一个参考电压矢量Vref,它是由两个相邻的基本电压矢量合成的。比如在第一扇区,就是V1(100)和V2(110)来合成。那问题就变成了:在一个PWM周期Ts里,V1作用T1时间,V2作用T2时间,剩下的时间给零矢量V0和V7。这个分配比例,决定了合成矢量的方向和大小。

核心思想:伏秒平衡原理。在一个开关周期内,基本矢量作用的时间与其电压值的乘积之和,等于参考矢量与周期的乘积。

3.1 从几何关系推导T1和T2

这里我不喜欢直接甩公式,咱们从几何角度走一遍。以第一扇区为例,Vref在αβ坐标系下的分量是Vα和Vβ。V1(100)的方向是α轴,幅值是2/3·Vdc。V2(110)的方向是60度,幅值也是2/3·Vdc。

把Vref分解到V1和V2的方向上,利用正弦定理或者直接投影,就能得到T1和T2的表达式。我在项目中第一次手推这个公式时,还犯了个低级错误——把角度搞反了,结果电机转起来抖得厉害。后来我养成了一个习惯:每次算完,先检查T1+T2是否小于Ts,如果大于,那就进入过调制区了。

好,直接上结论。对于任意扇区,T1和T2的通用计算公式可以写成:

// 先定义一些中间变量
X = sqrt(3) * Vβ * Ts / Vdc
Y = (sqrt(3)/2 * Vβ + 3/2 * Vα) * Ts / Vdc
Z = (sqrt(3)/2 * Vβ - 3/2 * Vα) * Ts / Vdc

// 然后根据扇区查表
switch(Sector)
{
    case 1: T1 = -Z; T2 =  X; break;
    case 2: T1 =  Z; T2 =  Y; break;
    case 3: T1 =  X; T2 = -Y; break;
    case 4: T1 = -X; T2 =  Z; break;
    case 5: T1 = -Y; T2 = -Z; break;
    case 6: T1 =  Y; T2 = -X; break;
}

嗯,这里要注意:公式里的Vα和Vβ,是经过反Park变换后的值,也就是你上一章算出来的那个。千万别拿原始电流值往里套,我见过有人这么干过,结果算出来的T1、T2完全不对。

3.2 过调制处理:T1+T2 > Ts怎么办?

在实际系统中,Vref的幅值不能超过六边形的内切圆半径,否则T1+T2会大于Ts。这时候如果不做处理,逆变器输出波形会畸变,电流谐波增大,电机噪音也会变大。

我曾经在一个风机项目里遇到过这个问题。当时电机在高速区运行时,突然电流失控,查了半天发现是过调制没处理好。后来加了一段简单的限幅逻辑,问题就解决了。

避坑指南:当T1+T2 > Ts时,必须对T1和T2进行等比例缩放。我曾经直接截断T1和T2到最大值,结果导致电压矢量方向偏移,电机转矩脉动很大。正确的做法是:

if(T1 + T2 > Ts)
{
    T1 = T1 * Ts / (T1 + T2);
    T2 = T2 * Ts / (T1 + T2);
}
// 这样既保持了矢量方向不变,又保证了总时间不超过Ts

3.3 零矢量时间的分配

算完T1和T2,剩下的时间就是零矢量的作用时间:T0 = Ts - T1 - T2。零矢量有两个:V0(000)和V7(111)。怎么分配它们的时间,会影响开关损耗和电流纹波。

我个人习惯采用七段式SVPWM,也就是把零矢量时间平均分配给V0和V7,并且把它们放在矢量的首尾和中间。这样做的好处是:每个开关周期内,每个桥臂只开关一次,开关损耗最小。而且电流纹波也相对较小。

分配方式 V0时间 V7时间 特点
七段式(推荐) T0/2 T0/2 开关损耗小,谐波小
五段式 T0 0 开关次数少,但谐波大
不对称分配 自定义 自定义 用于特定优化场景

小技巧:在低调制比(比如电机启动时)情况下,T1和T2都很小,T0很大。这时候七段式SVPWM的零矢量时间很长,电流纹波反而会变大。我一般会在调制比低于0.1时,切换到五段式,减少零矢量时间,改善电流波形。

3.4 本章知识体系图

下面这张图把T1、T2计算的整个流程串起来了,从输入到输出,每一步都很清楚。

T1、T2计算流程 T1、T2计算流程 Vα, Vβ, Ts, Vdc 计算中间变量 X, Y, Z 扇区判断结果 查表得T1, T2 T1+T2 > Ts ? 等比例缩放 输出T1, T2, T0 T0 = Ts - T1 - T2 零矢量时间分配

3.5 实战中的几个坑

最后,我把自己踩过的几个坑列出来,你写代码的时候可以留意一下:

  • 浮点数精度问题:在MCU里做SVPWM,如果直接用float算T1、T2,累积误差会导致电流波形有毛刺。我建议把所有中间变量都转成Q15或Q24格式的定点数,尤其是那些低成本的MCU。
  • 扇区边界处理:当Vref正好落在扇区边界上时,T1或T2可能会算出负值。这时候要做限幅处理,把负值钳位到0。我曾经没做这个处理,结果电机在过扇区时电流突变,差点触发过流保护。
  • 死区补偿:T1和T2算出来之后,还要考虑死区时间的影响。死区会导致实际输出电压比理论值偏低,尤其是在低速轻载时。我一般会在T1和T2上加上一个死区补偿量,具体补偿值跟电流方向有关。