3、Clark变换:三相到两相静止坐标系的变换原理与数学推导
好,咱们进入FOC算法的第一个核心数学变换——Clark变换。
说实话,我刚接触FOC那会儿,看到一堆矩阵和坐标变换,头都大了。后来在项目里调了几次电机,才真正理解这东西到底在干嘛。说白了,Clark变换就是帮我们把三个缠在一起的信号,拆成两个好处理的信号。
3.1 为什么要做Clark变换?
你想想看,BLDC电机有三相绕组,电流分别是Ia、Ib、Ic。这三相电流在时间上相差120度,空间上也相差120度。三个变量互相耦合,控制起来很麻烦。
我习惯把问题简化。能不能用两个变量来描述这三个电流?
答案是可以的。因为三相电流满足一个基本约束:
这个公式在电机星形接法下严格成立。三个变量,一个约束,自由度就变成了2。所以理论上,两个变量就够了。
Clark变换就是干这个的。它把三相静止坐标系(a-b-c)映射到两相静止坐标系(α-β)。
3.2 变换的几何理解
咱们先别急着看公式。我用一个直观的方式解释。
想象一下,三相坐标系就像三个轴,互成120度。两相坐标系呢,就是两个互相垂直的轴——α轴和β轴。
Clark变换要做的事,就是把三个轴上的投影,换算成两个轴上的投影。嗯,这里要注意,这个变换是线性的,所以可以用矩阵表示。
我在项目中遇到过一个问题:如果直接用等幅值变换,算出来的α-β电流幅值和三相电流幅值不一样。后来查资料才发现,Clark变换有两种主流形式——等幅值变换和等功率变换。这个后面会细说。
3.3 数学推导
好,咱们上公式。
设三相电流为:
Ia = Im · cos(ωt)
Ib = Im · cos(ωt - 120°)
Ic = Im · cos(ωt + 120°)
其中Im是电流幅值,ω是电角频率。
Clark变换的数学表达式为:
Iα = Ia
Iβ = (Ia + 2·Ib) / √3
等等,这个公式看着有点奇怪?别急,这是简化后的结果。完整的矩阵形式是这样的:
[ Iα ] [ 1 -1/2 -1/2 ] [ Ia ]
[ Iβ ] = [ 0 √3/2 -√3/2 ] [ Ib ]
[ Ic ]
这个矩阵就是Clark变换矩阵(等幅值版本)。
为什么是这个矩阵?我来拆解一下:
- α轴:直接取Ia的方向。因为α轴和a轴重合。
- β轴:垂直于α轴。b相和c相在β轴上的投影分别是√3/2和-√3/2。
你想想看,如果三相电流平衡,代入上面的公式,会得到什么?
Iα = Im · cos(ωt)
Iβ = Im · sin(ωt)
完美!变成了一个旋转的矢量。幅值还是Im,相位和原来一致。这就是Clark变换的妙处——把三个交流量变成了两个正交的交流量。
3.4 等幅值 vs 等功率变换
刚才提到,Clark变换有两种常见形式。我整理了一个表格,方便对比:
| 特性 | 等幅值变换 | 等功率变换 |
|---|---|---|
| 变换矩阵系数 | 2/3 | √(2/3) |
| α-β电流幅值 | 等于三相幅值 | 等于三相幅值的√(3/2)倍 |
| 功率计算 | 需要乘以3/2 | 直接相等 |
| 常用场景 | 电流环控制 | 功率计算、仿真 |
3.5 逆Clark变换
有正变换就有逆变换。逆Clark变换把α-β电流变回三相电流:
[ Ia ] [ 1 0 ] [ Iα ]
[ Ib ] = [ -1/2 √3/2 ] [ Iβ ]
[ Ic ] [ -1/2 -√3/2 ]
这个在SVPWM生成时会用到。到时候你会看到,我们先把电压指令从d-q变到α-β,再用逆Clark变回三相占空比。
3.6 代码实现
讲完理论,咱们看看代码怎么写。我习惯用C语言实现,定点或浮点都可以。
// Clark变换 - 等幅值版本
// 输入: Ia, Ib, Ic (三相电流)
// 输出: Ialpha, Ibeta (两相静止坐标系电流)
void clark_transform(float Ia, float Ib, float Ic,
float *Ialpha, float *Ibeta)
{
// 利用 Ia + Ib + Ic = 0 简化计算
// 实际只需要两相采样即可
*Ialpha = Ia;
*Ibeta = (Ia + 2.0f * Ib) / 1.7320508f; // 1/√3 ≈ 0.57735
}
// 逆Clark变换
// 输入: Ialpha, Ibeta
// 输出: Ia, Ib, Ic
void inv_clark_transform(float Ialpha, float Ibeta,
float *Ia, float *Ib, float *Ic)
{
*Ia = Ialpha;
*Ib = -0.5f * Ialpha + 0.8660254f * Ibeta; // √3/2 ≈ 0.866
*Ic = -0.5f * Ialpha - 0.8660254f * Ibeta;
}
3.7 实际应用中的坑
最后分享几个我在项目中踩过的坑:
- 采样时序:Clark变换的输入是瞬时值。三相电流必须同时采样,或者至少在一个PWM周期内采样。我用过逐次采样的方法,结果引入了一个载波周期的延迟,低速性能变差。
- 直流偏置:电流传感器有零漂。如果不做偏置校准,Clark变换后的α-β电流会有一个直流分量。这个直流分量在Park变换后会变成基频分量,导致转矩波动。
- 数值精度:√3/2 ≈ 0.8660254,这个系数在定点实现时要注意。我一般用Q15格式,把系数放大到32768以内,避免溢出。
Clark变换看起来简单,但它是整个FOC算法的基础。基础打牢了,后面的Park变换和SVPWM才能跑得稳。下一章咱们讲Park变换,把静止的α-β坐标系转到旋转的d-q坐标系,那才是真正解耦的关键一步。