2. 空间矢量基础:三相坐标系与两相静止坐标系(Clark变换)、两相静止坐标系与两相旋转坐标系(Park变换)、电压空间矢量的概念。
好,咱们正式开始啃SVPWM的第一块硬骨头——空间矢量基础。
说实话,很多做FOC的朋友一开始就被这些变换绕晕了。什么Clark、Park,听起来像两个人名,其实就是两套坐标变换工具。我个人习惯把这三部分串起来理解:先有物理世界(三相),再映射到数学平面(两相静止),最后跟着转子转起来(两相旋转)。
2.1 为什么非要从三相变到两相?
你想想看,电机里三个绕组,通上三相对称电流,产生的是一个旋转磁场。但三个变量(Ia, Ib, Ic)控制起来太麻烦了。能不能用两个变量来描述同一个磁场?
能。这就是Clark变换的初衷——降维。
我在项目中遇到过一位同事,死活不肯做变换,直接用三个PID去调三相电流。结果呢?电流环带宽上不去,电机嗡嗡响。后来我帮他改成Clark+Park,问题立马解决。说白了,控制两相永远比控制三相简单。
核心思想: 三相电流 Ia + Ib + Ic = 0(星形连接,无中线),所以实际上只有两个自由度。Clark变换就是把这个约束条件显式地利用起来。
2.2 Clark变换:从ABC到αβ
Clark变换,也叫3s/2s变换(三相静止→两相静止)。它把三相坐标系(A, B, C,互差120°)映射到两相直角坐标系(α, β,互差90°)。
公式其实很简单,就是投影。我习惯用等幅值变换,因为这样变换后的电流幅值跟实际相电流幅值一样,调试时心里有数。
// 等幅值Clark变换(C语言实现)
void clark_transform(float Ia, float Ib, float Ic, float *Ialpha, float *Ibeta) {
*Ialpha = Ia; // α轴 = A相
*Ibeta = (Ia + 2.0f * Ib) / 1.732f; // β轴 = (Ia + 2*Ib) / √3
// 注意:这里利用了 Ia + Ib + Ic = 0,所以 Ic = -Ia - Ib
}
嗯,这里要注意:等幅值变换和等功率变换的系数不同。等幅值变换的系数是2/3,等功率变换的系数是√(2/3)。我建议初学者先用等幅值,因为调试时看电流波形更直观。
| 变换类型 | α轴公式 | β轴公式 | 特点 |
|---|---|---|---|
| 等幅值 | Iα = Ia | Iβ = (Ia + 2Ib)/√3 | 变换后幅值不变,调试直观 |
| 等功率 | Iα = √(2/3)·Ia | Iβ = (Ia + 2Ib)/√2 | 变换前后功率守恒,理论分析常用 |
避坑指南: 我曾经在代码里把Clark变换的系数写错了,结果电流环怎么调都震荡。后来用示波器抓了αβ轴的波形,发现幅值不对。记住:等幅值变换的逆变换系数是1,不是2/3。很多教材只给正变换,逆变换要自己推,容易出错。
2.3 Park变换:从αβ到dq
Clark变换之后,我们得到了两个正交的正弦波(Iα, Iβ)。但正弦波还是交流量,PID跟踪交流量会有静差。怎么办?
让坐标系跟着转子转起来!
Park变换(2s/2r变换)就是把静止的αβ坐标系,旋转到与转子磁场同步的dq坐标系。旋转角度就是转子位置角θ。
变换之后,Id和Iq就变成了直流量。PID控制直流量,那叫一个稳。
// Park变换(C语言实现)
void park_transform(float Ialpha, float Ibeta, float theta, float *Id, float *Iq) {
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
*Id = Ialpha * cos_theta + Ibeta * sin_theta;
*Iq = -Ialpha * sin_theta + Ibeta * cos_theta;
}
这里有个关键点:θ从哪里来? 有传感器(编码器、霍尔)就直接读,无传感器就用观测器估算。我早期做无感FOC时,θ估算不准,Park变换出来的Id/Iq全是噪声。后来换了滑模观测器,才算搞定。
警告: Park变换的θ必须与转子磁极位置严格对齐。如果θ偏差超过90°,Id和Iq会完全反号,电机不但不转,还会剧烈抖动。我见过有人把编码器AB相接反了,结果电机像抽风一样。排查了半天才发现是θ符号反了。
2.4 电压空间矢量:SVPWM的“原材料”
好,Clark和Park都是对电流做的变换。那电压呢?
SVPWM的核心,就是用六个功率管(三相全桥)的开关状态,合成一个任意方向的电压矢量。这个矢量在αβ平面上旋转,就产生了旋转磁场。
电压空间矢量的概念其实很直观:
- 六个基本矢量:V1(100)到V6(101),对应六个非零开关状态,互差60°。
- 两个零矢量:V0(000)和V7(111),对应上桥全关或全开,输出电压为0。
- 合成矢量:通过控制基本矢量的作用时间,可以合成任意方向和幅值的电压矢量。
我个人习惯把电压空间矢量想象成一个“六边形蛋糕”。每个基本矢量是一块,通过切分和组合,就能得到任意角度的“蛋糕片”。
2.5 三个变换的完整链路
把上面三个变换串起来,就是FOC的完整电流采样链路:
- ADC采样:得到三相电流 Ia, Ib, Ic(Ic = -Ia - Ib,可省一路ADC)
- Clark变换:Ia, Ib, Ic → Iα, Iβ
- Park变换:Iα, Iβ, θ → Id, Iq
- PI调节器:对Id, Iq分别做闭环控制,输出Vd_ref, Vq_ref
- 逆Park变换:Vd_ref, Vq_ref, θ → Vα_ref, Vβ_ref
- SVPWM:Vα_ref, Vβ_ref → 三相占空比 → 驱动功率管
你看,Clark和Park是正向链路,逆Park和SVPWM是反向链路。整个环路的精度,取决于每一步的计算精度和θ的准确性。
我的经验: 在嵌入式MCU上实现时,建议把所有变换写成定点数或Q格式,避免浮点运算拖慢中断。我曾在STM32F103上跑浮点Clark+Park,中断周期只能做到100μs。改成定点后,直接压到50μs,电流环带宽翻了一倍。
2.6 本章小结
这一章我们搞清楚了三个核心问题:
- Clark变换:把三相交流量变成两相交流量,降维打击。
- Park变换:把两相交流量变成两相直流量,方便PID控制。
- 电压空间矢量:六个基本矢量+两个零矢量,通过时间合成任意电压。