3、电压空间矢量:Clark变换(abc→αβ)、电压矢量的合成、参考电压矢量的旋转

好,咱们接着聊SVPWM的核心。前面我们讲了逆变器的基本结构,也知道了六个开关管能组合出八种状态。但那些都是“开关视角”的东西。真正要让电机转起来,我们得从“磁场视角”看问题。

说白了,电机要的是旋转磁场。而旋转磁场,需要的是空间上旋转的电压矢量。这一节,我们就来搞定三件事:怎么把三相电压变成两相坐标(Clark变换)、怎么用基本矢量合成任意矢量、以及怎么让这个矢量转起来

3.1 为什么非要做Clark变换?

你想想看,电机三相绕组在空间上差120度。我们控制的时候,如果直接盯着A、B、C三相的电压值去算,那太麻烦了。而且三相之间还有耦合,不好处理。

我个人的习惯是,先把三相系统投影到一个两相的静止坐标系上。这个坐标系叫αβ坐标系。α轴和A相重合,β轴超前α轴90度。这样一来,原来三个变量(Ua、Ub、Uc)就变成了两个变量(Uα、Uβ)。

嗯,这里要注意:Clark变换是等幅值变换。也就是说,变换前后,电压矢量的幅值不变。这一点和等功率变换不同,但做电机控制时,等幅值变换用起来更直观。

3.2 Clark变换公式与实现

公式其实很简单。假设三相电压分别为Ua、Ub、Uc,那么:

Uα = Ua - 0.5 * Ub - 0.5 * Uc
Uβ = (√3/2) * (Ub - Uc)

注意,这里我假设三相平衡,也就是Ua + Ub + Uc = 0。如果不平衡,需要先做零序分量处理。不过大多数电机控制场景下,三相是平衡的。

我在项目中遇到过一个问题:Clark变换的系数搞反了。当时调试电机,发现电流波形总是有畸变,查了半天,原来是√3/2写成了2/√3。嗯,这种低级错误,犯过一次就再也不会忘了。

重要提示:Clark变换的输入是三相电压或电流,输出是αβ轴分量。这个变换是线性且可逆的。逆变换同样重要,后面讲PWM生成时会用到。

3.3 电压矢量的合成——从六个矢量到任意方向

好,现在我们有αβ坐标系了。在这个坐标系里,六个基本电压矢量(V1~V6)分别指向六个方向,幅值都是2/3 * Udc。零矢量V0和V7在原点。

问题来了:我们想要一个任意方向的矢量,怎么办?

答案是用相邻的两个基本矢量去合成。比如,你想要一个在扇区I(0°~60°)内的矢量Vref,那就用V1和V2来合成。具体来说:

Vref = T1/Ts * V1 + T2/Ts * V2

其中,Ts是PWM周期,T1和T2分别是V1和V2的作用时间。剩下的时间用零矢量填充。

这个公式看着简单,但实际计算时,需要先判断Vref在哪个扇区,然后根据扇区查表得到T1和T2的计算公式。我建议你把这个判断逻辑做成一个函数,输入Uα和Uβ,输出扇区号。

我的小技巧:扇区判断可以用Uα、Uβ以及它们的组合(比如Uα + √3*Uβ)的正负号来快速判断。不需要用反正切函数,那样太慢了。

3.4 参考电压矢量的旋转——让磁场转起来

现在,我们已经能合成任意方向的电压矢量了。但要让电机转起来,这个矢量必须匀速旋转

怎么实现旋转?很简单:让Vref的幅值不变,角度随时间线性增加。

θ(t) = ω * t + θ0

其中ω是电角速度,θ0是初始角度。然后:

Uα = |Vref| * cos(θ)
Uβ = |Vref| * sin(θ)

这样,每个PWM周期,我们计算一次Uα和Uβ,然后通过SVPWM算法生成对应的开关信号。电机就能平稳旋转了。

我曾经在调试一个高速电机时,发现转速一高,电机就开始抖动。后来发现是角度更新的频率不够快,导致矢量旋转不连续。嗯,PWM频率和角度更新频率要匹配,这个坑我替你们踩过了。

注意:参考电压矢量的幅值不能超过六边形的内切圆半径,否则会进入过调制区。过调制虽然能提高电压利用率,但会引入谐波。初学者建议先工作在线性调制区

3.5 本章知识体系图

下面这张图,是我自己总结的SVPWM核心流程。从三相电压到旋转矢量,每一步都很清楚。

SVPWM核心流程:从三相到旋转矢量 三相电压 Ua, Ub, Uc Clark变换 abc → αβ αβ分量 Uα, Uβ 扇区判断 扇区I~VI 作用时间计算 T1, T2, T0 PWM生成 开关信号 旋转矢量 θ = ωt + θ0 每个PWM周期,重复以上流程,即可实现电压矢量的连续旋转 关键参数:Udc(母线电压)、Ts(PWM周期)、ω(电角速度)

3.6 代码实现要点

最后,我贴一段伪代码,帮你理清思路。实际项目中,你可以用C语言或者Verilog实现。

// 每个PWM周期调用一次
void svpwm_calc(float Ualpha, float Ubeta, float Udc, float Ts) {
    // 1. 扇区判断
    int sector = calc_sector(Ualpha, Ubeta);
    
    // 2. 根据扇区计算T1, T2
    float T1, T2;
    calc_time(sector, Ualpha, Ubeta, Udc, Ts, &T1, &T2);
    
    // 3. 计算占空比
    float Ta, Tb, Tc;
    calc_duty(sector, T1, T2, Ts, &Ta, &Tb, &Tc);
    
    // 4. 更新PWM寄存器
    set_pwm_duty(Ta, Tb, Tc);
}

嗯,这里要注意:T1和T2不能超过Ts。如果算出来T1+T2 > Ts,说明进入了过调制区,需要做限幅处理。我一般会做等比例缩放,保证T1+T2 = Ts。

总结一下:Clark变换是基础,矢量合成是核心,旋转是目标。这三步搞定了,SVPWM你就掌握了80%。剩下的20%是细节优化,比如死区补偿、过调制处理、电流采样同步等。那些我们后面再聊。


公众号:蓝海资料掘金营,微信deep3321