3、Clark变换:从三相静止坐标系到两相静止坐标系的变换原理与公式

好,咱们继续往前走。

上一章我们把电机里那三个绕组的电流摸清楚了——Iu、Iv、Iw,三相正弦波,相位差120度。理论上,有了这三个电流,我们就能控制电机。但问题来了:三个变量,控制起来太麻烦。你想想看,一个控制环路里同时调三个正弦量,光是算相位就够你喝一壶的。

所以,我们需要一个“降维”操作。

Clark变换,就是干这个的。它把三相静止坐标系(UVW)下的电流,变换到两相静止坐标系(αβ)下。说白了,就是把三个变量变成两个变量,而且这两个变量还是正交的——互相垂直,控制起来舒服多了。

核心思想:三相系统在空间上是对称的,其实信息是冗余的。Clark变换就是去掉这个冗余,用两个正交分量等效描述同一个空间矢量。

3.1 为什么要从三相变两相?

我刚开始学FOC的时候,也有这个疑问:电机本来就是三相的,你硬把它变成两相,这不是脱裤子放屁吗?

后来做项目才明白,这里有两个关键原因:

  1. 控制维度降低:三个变量互相耦合,调一个另外两个也跟着变。两相正交坐标系下,α轴和β轴完全解耦,你可以独立控制。
  2. 为下一步Park变换铺路:两相静止坐标系还不是终点。后面我们要做Park变换,把αβ旋转到dq旋转坐标系,变成直流分量。而Park变换的前提,就是输入必须是两相正交信号。

嗯,说白了,Clark变换就是一个“翻译官”。它把电机本体的三相语言,翻译成控制器能轻松处理的两相语言。

3.2 变换的数学原理

咱们先看一个简单的示意图。想象一下,三相绕组在空间上互差120度,它们的磁动势矢量合成一个旋转的磁动势。现在,我们想用两个互相垂直的绕组(α轴和β轴)来产生完全相同的合成磁动势。

我的理解方式:你可以把三相电流想象成三个壮汉拉一个绳子,方向各差120度。Clark变换就是找两个壮汉,站在互相垂直的方向上,拉出完全相同的合力。只要合力一样,电机才不管你是三个人拉的还是两个人拉的。

数学上,这个变换关系可以用一个矩阵来表示。设三相电流为 Iu、Iv、Iw,变换后的两相电流为 Iα 和 Iβ,那么:

┌     ┐   ┌                        ┐ ┌     ┐
│ Iα  │   │ 1    -1/2      -1/2    │ │ Iu  │
│     │ = │                        │ │     │
│ Iβ  │   │ 0    √3/2     -√3/2    │ │ Iv  │
└     ┘   └                        ┘ │     │
                                     │ Iw  │
                                     └     ┘

等等,这个系数看着有点眼熟?没错,就是三角函数值。α轴与U轴对齐,β轴与U轴垂直。所以U相在α轴上的投影是1,在β轴上是0;V相在α轴上是cos(120°) = -1/2,在β轴上是sin(120°) = √3/2;W相类似。

这个变换叫做等幅值变换。为什么叫等幅值?因为变换前后,合成矢量的幅值不变。我在项目中遇到过一个问题,就是用了等功率变换的系数,结果电流环PI参数怎么调都不对——后来才发现是变换系数没统一。

注意:Clark变换有两种常见形式——等幅值变换和等功率变换。两者差一个系数√(2/3)。FOC中绝大多数实现都采用等幅值变换,因为电流环PI参数可以直接沿用。如果你用等功率变换,PI参数需要重新整定。

3.3 变换的几何意义

咱们用SVG画一张图,把这件事看清楚。

Clark变换:三相→两相坐标系映射 U轴 V轴 W轴 α轴 β轴 合成矢量 Is θ 三相电流 Iu、Iv、Iw 合成一个旋转矢量 Is Clark变换后,用 Iα、Iβ 两个正交分量等效描述同一个 Is

从图上可以看得很清楚:三相的U、V、W轴在空间上互差120度,而两相的α轴与U轴重合,β轴与α轴垂直。合成矢量 Is 在两种坐标系下是同一个东西,只是描述方式不同。

3.4 代码实现

理论说完了,咱们看看代码怎么写。我个人习惯在MCU上用定点数或者浮点数直接实现,这里给一个标准的C语言版本:

/**
 * Clark变换:三相电流 → 两相静止坐标系电流
 * @param Iu   U相电流
 * @param Iv   V相电流
 * @param Iw   W相电流
 * @param Iα   输出:α轴电流
 * @param Iβ   输出:β轴电流
 */
void clark_transform(float Iu, float Iv, float Iw, float *Iα, float *Iβ)
{
    // 等幅值Clark变换
    *Iα = Iu - 0.5f * Iv - 0.5f * Iw;
    *Iβ = 0.8660254f * Iv - 0.8660254f * Iw;  // √3/2 ≈ 0.8660254
}

你看,就这么几行。但有几个细节我得提醒你:

  • 输入电流的符号:一般ADC采集到的电流值,需要先减去偏置,再乘以标定系数,得到真实的安培值。我见过有人直接拿ADC原始值做变换,结果出来的Iα、Iβ全是正的——那肯定不对。
  • 三相电流的约束:理论上 Iu + Iv + Iw = 0(星形连接,中性点不引出)。所以实际实现中,有时只采集两相电流,第三相用 Iw = -Iu - Iv 算出来。这样可以省一个ADC通道。
  • 浮点精度:0.8660254这个系数,如果MCU没有FPU,建议预先算好存成常量,避免每次计算都做除法。

避坑指南:我曾经在一个项目里,直接用sqrt(3)/2的宏定义,结果编译器在每次循环里都重新算一遍,导致Clark变换耗时翻了一倍。后来改成预计算常量,问题解决。嗯,细节决定成败。

3.5 变换前后的波形对比

咱们用表格对比一下,三相电流和两相电流的波形特征:

参数 三相电流 (Iu/Iv/Iw) 两相电流 (Iα/Iβ)
变量数量 3个 2个
相位关系 互差120° 互差90°(正交)
波形形状 正弦波 正弦波
幅值关系 各相幅值相等 Iα与Iβ幅值相等
耦合程度 强耦合 解耦
控制难度 高(需同时调3个正弦量) 低(可独立控制)

从表格可以看出来,Clark变换之后,虽然波形还是正弦波,但变量从3个减到2个,而且变成了正交关系。这为下一步的Park变换打下了基础。

3.6 常见问题与避坑

最后,我总结几个实际项目中容易踩的坑:

  • 变换系数不一致:不同文献用的Clark变换系数可能不同。有的用2/3,有的用√(2/3)。你在移植代码时,一定要确认前后级用的系数是否匹配。我吃过这个亏——从某开源项目移植代码,没注意系数,结果电流环震荡了三天。
  • ADC采样时序:Clark变换的输入是瞬时值,要求Iu、Iv、Iw在同一时刻采样。如果ADC是轮询采样,三个通道之间有延时,会导致变换结果有相位误差。解决办法是用同步采样或者插值补偿。
  • 饱和处理:变换后的Iα、Iβ幅值可能超过ADC量程。建议在变换前做限幅,或者在变换后做饱和判断,防止后续计算溢出。

重要提醒:Clark变换本身不产生任何物理意义的变化——它只是换了一种数学描述方式。电机转不转、转得快不快,跟Clark变换没有直接关系。它只是一个工具,帮我们把问题简化。