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核心流程。从三相电压到旋转矢量,每一步都很清楚。
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