2. Clark变换与Park变换实现

任务目标

编写C语言代码,实现PMSM磁场定向控制(FOC)中的两个核心坐标变换:

  • Clark变换:将三相静止坐标系(ia, ib, ic)变换到两相静止坐标系(iα, iβ)
  • Park变换:将两相静止坐标系(iα, iβ)变换到两相旋转坐标系(id, iq)

通过给定一组三相电流和电角度,验证变换结果满足FOC理论预期值。

核心公式

采用等幅值变换(系数2/3),Clark变换公式:

iα = (2/3) × (ia − 0.5×ib − 0.5×ic)
iβ = (2/3) × (√3/2 × ib − √3/2 × ic)

Park变换公式(θ为转子电角度):

id = iα×cosθ + iβ×sinθ
iq = −iα×sinθ + iβ×cosθ

完整实现代码

#include <stdio.h>
#include <math.h>

#define SQRT3_2  0.8660254037844386f   // √3/2
#define TWO_THIRD 0.6666666666666666f  // 2/3

typedef struct {
    float alpha;
    float beta;
} ClarkeOutput;

typedef struct {
    float d;
    float q;
} ParkOutput;

// Clark变换:三相静止 → 两相静止
ClarkeOutput clark_transform(float ia, float ib, float ic) {
    ClarkeOutput out;
    out.alpha = TWO_THIRD * (ia - 0.5f * ib - 0.5f * ic);
    out.beta  = TWO_THIRD * (SQRT3_2 * ib - SQRT3_2 * ic);
    return out;
}

// Park变换:两相静止 → 两相旋转
ParkOutput park_transform(float alpha, float beta, float theta) {
    ParkOutput out;
    float cos_t = cosf(theta);
    float sin_t = sinf(theta);
    out.d =  alpha * cos_t + beta * sin_t;
    out.q = -alpha * sin_t + beta * cos_t;
    return out;
}

int main() {
    // 测试输入:三相平衡电流,幅值1A,相位0°
    float ia = 1.0f;
    float ib = -0.5f;
    float ic = -0.5f;
    float theta = 0.0f;  // 电角度0 rad

    // 执行变换
    ClarkeOutput clarke = clark_transform(ia, ib, ic);
    ParkOutput park = park_transform(clarke.alpha, clarke.beta, theta);

    // 打印结果
    printf("Clark变换结果:\n");
    printf("  iα = %.4f\n", clarke.alpha);
    printf("  iβ = %.4f\n", clarke.beta);
    printf("\nPark变换结果 (θ=0):\n");
    printf("  id = %.4f\n", park.d);
    printf("  iq = %.4f\n", park.q);

    // 验证:θ=0时,id应等于iα,iq应等于iβ
    printf("\n验证 (θ=0时 id=iα, iq=iβ):\n");
    printf("  |id - iα| = %.6f\n", fabsf(park.d - clarke.alpha));
    printf("  |iq - iβ| = %.6f\n", fabsf(park.q - clarke.beta));

    return 0;
}

编译与运行

gcc -o foc_transform foc_transform.c -lm
./foc_transform

预期输出与验证标准

程序执行后应输出以下结果(由代码逻辑直接推出):

Clark变换结果:
  iα = 1.0000
  iβ = 0.0000

Park变换结果 (θ=0):
  id = 1.0000
  iq = 0.0000

验证 (θ=0时 id=iα, iq=iβ):
  |id - iα| = 0.000000
  |iq - iβ| = 0.000000

通过判定条件:

  • Clark输出满足 iα² + iβ² = ia² + ib² + ic²(等幅值变换功率守恒,本例中均为1)
  • θ=0时Park输出与Clark输出一致(id=iα, iq=iβ),误差小于1e-5
  • 若将θ改为π/2并重新运行,应得到 id≈0, iq≈−1,验证旋转坐标系方向正确

常见问题

  • 系数选择:本实现采用等幅值变换(2/3系数)。若使用等功率变换(√(2/3)系数),后续FOC电流环PI参数需相应调整。
  • 电角度对齐:Park变换的θ必须与电机转子磁极位置严格对齐,否则id/iq分量会出现耦合,影响FOC解耦控制效果。
  • 浮点精度:嵌入式环境中建议使用float并开启FPU;若使用定点数,需注意Q格式选择与饱和处理。