3. 坐标变换基础:Clark变换、Park变换与反Park变换
好,咱们进入FOC算法里最核心的数学基础——坐标变换。说实话,我刚接触FOC那会儿,看到一堆αβ、dq坐标系,头都是大的。但后来我发现,这东西说白了就是把一个复杂问题拆成几个简单问题来处理。
你想想看,电机里三相电流是相互耦合的,控制起来很麻烦。坐标变换的目的,就是把这些耦合量解耦,变成我们熟悉的直流控制方式。嗯,就像把一团乱麻理成几根独立的线。
3.1 为什么需要坐标变换?
三相电机里,A、B、C三相电流是120度相位差的交流量。你直接去控制它们,得用三个PID调节器,而且相互影响。我个人习惯是先做变换,把交流量变成直流量,这样控制起来就跟控制直流电机一样简单。
我在项目中遇到过一个问题:客户要求电机在低速时扭矩平稳。如果不做坐标变换,直接控制三相电流,低速时扭矩波动特别大。后来用了Clark+Park变换,问题就解决了。
核心思想: 三相静止坐标系(ABC)→ 两相静止坐标系(αβ)→ 两相旋转坐标系(dq)
最终目标:把时变的交流量变成时不变的直流量
3.2 Clark变换:从ABC到αβ
Clark变换,也叫3/2变换。它把三相120度分布的电流,投影到两相90度正交的坐标系上。
公式其实很简单:
Iα = Ia
Iβ = (Ia + 2*Ib) / √3
等等,这里有个细节。上面是等幅值变换的公式。还有一种是等功率变换,系数会不一样。我个人习惯用等幅值变换,因为调试时看电流值更直观。
完整的Clark变换矩阵是这样的:
[ Iα ] [ 1 -1/2 -1/2 ] [ Ia ]
[ Iβ ] = [ 0 √3/2 -√3/2 ] [ Ib ]
[ Ic ]
注意,三相电流满足 Ia + Ib + Ic = 0,所以实际计算时可以简化。我在代码里通常只采样两相电流,第三相用公式算出来。
小技巧: 实际工程中,很多MCU的ADC只有两路采样通道。这时候就只采Ia和Ib,Ic = -Ia - Ib。省一路ADC,还省成本。
3.3 Park变换:从αβ到dq
Clark变换做完,我们得到了αβ坐标系下的两相交流量。但这两个量还是随时间变化的。Park变换就是再转一下,让坐标系跟着转子一起转。
Park变换的公式:
Id = Iα * cos(θ) + Iβ * sin(θ)
Iq = -Iα * sin(θ) + Iβ * cos(θ)
这里的θ是转子电角度,由编码器或霍尔传感器提供。你看,一旦坐标系跟着转子转,Id和Iq就变成了直流量。
我曾经犯过一个低级错误:把电角度和机械角度搞混了。电机转一圈,电角度可能转了好几圈(取决于极对数)。那次调试,电机死活转不起来,查了半天才发现是角度没乘以极对数。
避坑指南: 电角度 = 机械角度 × 极对数。如果你的电机是4对极,机械角度转90度,电角度已经转了360度。这个乘关系千万别搞错。
3.4 反Park变换:从dq回到αβ
FOC控制里,我们是在dq坐标系下算PID的。算完之后,得到的是Vd和Vq(电压指令)。但最终要给电机的是三相电压,所以得变回去。
反Park变换就是把dq电压变回αβ电压:
Vα = Vd * cos(θ) - Vq * sin(θ)
Vβ = Vd * sin(θ) + Vq * cos(θ)
你看,其实就是Park变换的逆运算。数学上就是矩阵求逆,因为Park变换矩阵是正交矩阵,逆矩阵等于转置矩阵。
得到Vα、Vβ之后,再经过反Clark变换(或者直接用SVPWM模块),就能生成三相PWM波了。
3.5 代码实现示例
下面是我常用的C语言实现,简洁高效:
// Clark变换
void clark_transform(float ia, float ib, float *i_alpha, float *i_beta) {
*i_alpha = ia;
*i_beta = (ia + 2.0f * ib) * 0.577350269f; // 1/√3
}
// Park变换
void park_transform(float i_alpha, float i_beta, float theta,
float *i_d, float *i_q) {
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
*i_d = i_alpha * cos_theta + i_beta * sin_theta;
*i_q = -i_alpha * sin_theta + i_beta * cos_theta;
}
// 反Park变换
void inv_park_transform(float v_d, float v_q, float theta,
float *v_alpha, float *v_beta) {
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
*v_alpha = v_d * cos_theta - v_q * sin_theta;
*v_beta = v_d * sin_theta + v_q * cos_theta;
}
性能优化: 如果MCU没有硬件三角函数计算单元,建议用查表法或者CORDIC算法。我有个项目用STM32F103,算一次sin/cos要几十微秒,换成查表后降到几微秒。
3.6 三种变换的关系总结
| 变换名称 | 变换方向 | 输入 | 输出 | 关键参数 |
|---|---|---|---|---|
| Clark变换 | ABC → αβ | Ia, Ib, Ic | Iα, Iβ | 无(固定系数) |
| Park变换 | αβ → dq | Iα, Iβ | Id, Iq | 电角度θ |
| 反Park变换 | dq → αβ | Vd, Vq | Vα, Vβ | 电角度θ |
你看,整个FOC的电流环流程就是:采样三相电流 → Clark变换 → Park变换 → PID调节(在dq域) → 反Park变换 → SVPWM调制。每一步都很清晰。
嗯,这里要注意一点:Park变换和反Park变换用的角度是同一个θ。这个角度必须实时更新,否则控制就会出问题。我见过有人把角度更新放在主循环里,结果电机高速时角度滞后严重,扭矩直接掉没了。
好了,坐标变换这块就讲到这里。下一章咱们聊聊SVPWM,看看怎么把Vα、Vβ变成实实在在的PWM波。