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格式选择与饱和处理。