3. 空间矢量基础:Clark变换与Park变换、静止坐标系与旋转坐标系

好,咱们进入SVPWM的核心基础——坐标变换。说实话,很多初学者一上来就被Clark和Park这两个名字吓住了。其实没那么玄乎。你想想看,我们控制电机,最终要控制的是三相电压,但直接在三相(UVW)坐标系里算东西,那叫一个麻烦。所以,聪明的前辈们就想了个办法:换个坐标系来看问题。

我个人习惯把坐标变换理解成「换视角」。就像你站在不同角度看同一座山,山的形状在你眼里是不一样的,但山还是那座山。电机的电压、电流矢量也是同一个物理量,在不同坐标系下有不同的数学表达。今天我们就来把这几个「视角」彻底捋清楚。

3.1 为什么要变换坐标系?

先问个问题:三相交流电机里,电压、电流都是随时间正弦变化的。如果你直接在UVW三相坐标系下算控制量,需要处理三个互相差120°的正弦量,耦合还特别严重。我在项目中遇到过,早期用纯标量控制(就是直接调三相电压幅值和频率),电机在低速时抖得厉害,力矩也不稳。

后来换了矢量控制思路,核心就是坐标变换。目的很明确:

  • 解耦:把三相耦合的交流量,变成两个独立的直流量。
  • 简化控制:直流量可以用经典的PI控制器去调,简单又稳定。
  • 等效直流电机:最终让交流电机拥有类似直流电机的控制特性——想调转矩就调转矩,想调磁通就调磁通。

核心思想:坐标变换不改变矢量的幅值和相位关系,只是换了一套「描述语言」。物理本质没变,数学形式变简单了。

3.2 Clark变换:从三相到两相静止坐标系

Clark变换,也叫3s/2s变换。就是把UVW三相静止坐标系,变换到αβ两相静止坐标系。

为什么是两相?因为三相系统里,如果三相平衡(Ia+Ib+Ic=0),其实只有两个自由度。多出来的一相是冗余的。Clark变换就是把这个冗余去掉,用两个正交的轴(α轴和β轴)来描述同一个空间矢量。

变换公式长这样(等幅值变换):

// Clark变换(等幅值)
Iα = Ia
Iβ = (Ia + 2*Ib) / √3

// 或者用矩阵形式
[ Iα ]   [ 1      -1/2    -1/2   ] [ Ia ]
[ Iβ ] = [ 0    √3/2   -√3/2  ] [ Ib ]
[ I0 ]   [ 1/2    1/2     1/2   ] [ Ic ]

嗯,这里要注意:公式里的系数有「等幅值」和「等功率」两种约定。我个人习惯用等幅值,因为这样变换前后矢量的模长不变,物理意义更直观。你在做代码实现时,一定要先搞清楚你的系统用的是哪种约定,不然算出来的角度和幅值全是错的——我曾经在这个坑里爬了两天。

变换后的结果:

  • α轴与U轴(A相)重合
  • β轴超前α轴90°
  • 三相正弦量变成了两相正弦量,但频率没变

小技巧:实际代码里,我们通常只采集两相电流(比如Ia和Ib),第三相Ic = -(Ia+Ib)直接算出来。省一个ADC通道,还少一个采样误差源。

3.3 Park变换:从静止到旋转坐标系

Clark变换完了,信号还是正弦波。为什么?因为αβ坐标系是静止的,而电机转子在转,定子磁场也在转。你站在静止的地面上看旋转的风扇叶片,当然看到的是周期变化。

那如果我们跟着转子一起转呢?

这就是Park变换(2s/2r变换)干的事。它把αβ静止坐标系,变换到dq旋转坐标系。d轴(直轴)通常与转子磁极方向对齐,q轴(交轴)超前d轴90°。

变换公式:

// Park变换
Id = Iα * cos(θ) + Iβ * sin(θ)
Iq = -Iα * sin(θ) + Iβ * cos(θ)

// 其中θ是转子位置角(电角度)

变换之后,原来正弦变化的电流,变成了两个直流量:

  • Id:励磁分量,控制磁通
  • Iq:转矩分量,控制力矩

你看,是不是跟直流电机一模一样了?调Id就是调磁场,调Iq就是调转矩。这就是矢量控制能实现高性能调速的根本原因。

避坑指南:Park变换需要准确的转子位置角θ。如果角度有偏差,Id和Iq会耦合——你调Iq的时候Id也跟着变,力矩和磁通互相干扰。我曾经在项目里用霍尔传感器估算角度,低速时角度误差大,电机抖得像筛子。后来换了编码器,问题才解决。角度精度,是矢量控制的命门。

3.4 逆变换:从旋转回到静止,再到三相

控制是在dq坐标系下算的(PI调节器输出Vd、Vq),但最终要给电机施加三相电压。所以得走回去:

  1. 反Park变换(dq → αβ):把Vd、Vq变回Vα、Vβ
  2. 反Clark变换(αβ → UVW):把Vα、Vβ变回三相占空比

反Park公式:

Vα = Vd * cos(θ) - Vq * sin(θ)
Vβ = Vd * sin(θ) + Vq * cos(θ)

反Clark公式(等幅值):

Va = Vα
Vb = -Vα/2 + √3/2 * Vβ
Vc = -Vα/2 - √3/2 * Vβ

整个流程串起来就是:采样电流 → Clark → Park → PI控制 → 反Park → 反Clark → SVPWM → 输出三相。这就是矢量控制的完整链路。

3.5 三种坐标系的关系对比

坐标系 轴数 是否旋转 信号形式 典型用途
UVW(三相静止) 3 否 正弦波(互差120°) 物理绕组、采样输入
αβ(两相静止) 2 否 正弦波(互差90°) 中间过渡、SVPWM扇区判断
dq(两相旋转) 2 是(同步转速) 直流量 PI控制、解耦调节

说白了,Clark变换是「降维」,把3个变成2个;Park变换是「同步」,把交流变成直流。两者配合,才让交流电机控制变得像直流电机一样优雅。

3.6 知识体系总览

下面这张图,把本章的核心逻辑串起来了。你可以把它当作坐标变换的「导航图」:

坐标变换知识体系图 坐标变换知识体系 UVW 三相静止坐标系 Clark 3s → 2s αβ 两相静止坐标系 Park 2s → 2r dq 两相旋转坐标系 反Park 反Clark 控制流程 采样电流 → Clark → Park → PI控制 → 反Park → 反Clark → SVPWM UVW特性 三相正弦 强耦合 物理直观 αβ特性 两相正交 仍为正弦 便于扇区判断 dq特性 直流量 解耦控制 适合PI调节

3.7 代码实现要点

最后,给一段实际工程中常用的C代码框架。你写代码时可以直接套用这个结构:

// 坐标变换结构体
typedef struct {
    float Ia, Ib, Ic;    // 三相电流
    float Ialpha, Ibeta; // 静止坐标系电流
    float Id, Iq;        // 旋转坐标系电流
    float Vd, Vq;        // 旋转坐标系电压
    float Valpha, Vbeta; // 静止坐标系电压
    float theta;         // 转子电角度
} FOC_Transform;

// Clark变换
void Clark_Transform(FOC_Transform *foc) {
    foc->Ialpha = foc->Ia;
    foc->Ibeta  = (foc->Ia + 2.0f * foc->Ib) * 0.57735f; // 1/√3
}

// Park变换
void Park_Transform(FOC_Transform *foc) {
    float ct = cosf(foc->theta);
    float st = sinf(foc->theta);
    foc->Id = foc->Ialpha * ct + foc->Ibeta * st;
    foc->Iq = -foc->Ialpha * st + foc->Ibeta * ct;
}

// 反Park变换
void Inv_Park_Transform(FOC_Transform *foc) {
    float ct = cosf(foc->theta);
    float st = sinf(foc->theta);
    foc->Valpha = foc->Vd * ct - foc->Vq * st;
    foc->Vbeta  = foc->Vd * st + foc->Vq * ct;
}

工程建议:实际项目中,sin/cos计算比较耗时。如果MCU没有硬件三角函数单元,建议用查表法或者Cordic算法。我一般在初始化时建一个1024点的正弦表,精度够用,速度还快。