3、坐标变换理论:Clark变换、Park变换、反Park变换
坐标变换,说白了就是换个角度看问题。
我刚开始接触FOC时,最头疼的就是这一块。三相电流明明在电机里转得好好的,为什么非要折腾成两相?还要再转来转去?后来踩过几次坑才明白——坐标变换不是炫技,而是把复杂问题变简单的利器。
3.1 为什么需要坐标变换?
你想想看,三相电机里电流是正弦波,磁场在旋转,转矩在波动。直接控制这些交流量,PID调参能调到怀疑人生。
但如果我们换个坐标系呢?
- Clark变换:把三相(A、B、C)变成两相(α、β),减少变量
- Park变换:把静止的两相(α、β)变成旋转的两相(d、q),让交流变直流
一旦变成直流,PID控制就简单了——调个P、I参数,跟控制直流电机一样顺手。
核心思想:坐标变换不改变物理本质,只改变观察角度。就像你站在地上看旋转木马,和坐在木马上的感觉完全不同。
3.2 Clark变换(3相→2相静止坐标系)
Clark变换,也叫3s/2s变换。它的任务是把三相电流(iA、iB、iC)投影到两相静止坐标系(α、β)上。
数学表达式很简单:
iα = iA
iβ = (iA + 2*iB) / √3
等等,你是不是觉得少了点什么?iC去哪了?
嗯,这里有个小秘密——三相电流之和为零(星形接法)。所以iC = -(iA + iB),不需要单独计算。
写成矩阵形式更直观:
[ iα ] [ 1 -1/2 -1/2 ] [ iA ]
[ iβ ] = [ 0 √3/2 -√3/2 ] [ iB ]
[ iC ]
我的经验:实际项目中,Clark变换很少单独用。它通常是Park变换的前置步骤。但我建议你单独测试一下Clark变换的输出——用示波器看iα和iβ,它们应该是相位差90°的正弦波。如果不是,说明采样或计算有问题。
3.3 Park变换(静止→旋转坐标系)
Clark变换后,我们有了α、β两相。但它们还是交流量,控制起来依然麻烦。
Park变换就是来解决这个问题的——把静止的α、β,投影到旋转的d、q轴上。
公式:
id = iα * cos(θ) + iβ * sin(θ)
iq = -iα * sin(θ) + iβ * cos(θ)
这里的θ是转子位置角,也就是编码器或霍尔传感器读到的角度。
变换之后,id和iq就变成了直流量。其中:
- id:励磁分量,控制磁场强度
- iq:转矩分量,控制电机出力
你看,这样一来,控制电机就变成了控制两个直流分量——调id让磁场稳定,调iq让转矩跟上。是不是清晰多了?
我曾经踩过的坑:Park变换的角度θ必须是电角度,不是机械角度。电机极对数不同,电角度和机械角度的关系也不同。我有一回忘了乘以极对数,结果电机抖得像筛子一样……嗯,从那以后我再也没犯过这个错。
3.4 反Park变换
控制完id和iq,我们得到了想要的电压值Vd和Vq。但问题来了——电机需要的是三相电压,不是两相。
所以需要反Park变换:
Vα = Vd * cos(θ) - Vq * sin(θ)
Vβ = Vd * sin(θ) + Vq * cos(θ)
然后再用反Clark变换(或者直接SVPWM)得到三相电压。
说白了,反Park变换就是Park变换的逆过程。你从α、β变到d、q,现在再变回去。
注意:反Park变换的公式和Park变换很像,但符号不同。我建议你写代码时,把Park和反Park放在一起对比着写,不容易搞混。
3.5 变换的物理意义
聊完了公式,咱们说说物理意义。这部分我当年学的时候觉得最抽象,但也是最有意思的。
Clark变换的物理意义:
- 把三相绕组的磁场,等效成两相正交绕组的磁场
- 说白了就是降维——从3个变量变成2个变量,计算量减半
Park变换的物理意义:
- 把观察者从静止的定子,搬到旋转的转子上
- 你跟着转子一起转,看到的电流就是直流
反Park变换的物理意义:
- 把转子上的控制量,翻译回定子能理解的语言
- 就像你坐在旋转木马上指挥地面的人——你说「向前」,但地面的人需要知道你的「向前」对应哪个方向
3.6 知识体系总览
下面这张图,是我自己总结的坐标变换全流程。你看一遍就能串起来:
3.7 代码实现要点
最后,分享一段我常用的C代码框架。实际项目中,坐标变换通常用浮点或定点实现:
// 坐标变换结构体
typedef struct {
float alpha;
float beta;
} Clarke_t;
typedef struct {
float d;
float q;
} Park_t;
// Clark变换
Clarke_t clarke_transform(float ia, float ib, float ic) {
Clarke_t out;
out.alpha = ia;
out.beta = (ia + 2.0f * ib) / 1.7320508f; // 1/√3
return out;
}
// Park变换
Park_t park_transform(float alpha, float beta, float theta) {
Park_t out;
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
out.d = alpha * cos_theta + beta * sin_theta;
out.q = -alpha * sin_theta + beta * cos_theta;
return out;
}
// 反Park变换
Clarke_t inv_park_transform(float vd, float vq, float theta) {
Clarke_t out;
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
out.alpha = vd * cos_theta - vq * sin_theta;
out.beta = vd * sin_theta + vq * cos_theta;
return out;
}
我的建议:调试时,先让电机空转,用DAC或串口把id、iq的值打印出来。如果id和iq是稳定的直流量(而不是正弦波),说明你的坐标变换写对了。如果id、iq还在波动,检查角度θ是否准确,或者采样时序是否有延迟。
好了,坐标变换就聊到这儿。记住一句话:变换的是坐标系,不变的是物理本质。下一节咱们聊聊SVPWM——怎么把算好的电压真正送到电机上。
公众号:蓝海资料掘金营,微信deep3321