4. Park变换基础实现
任务目标
实现Park变换,将两相静止坐标系(αβ轴)上的电流/电压分量变换到两相旋转坐标系(dq轴),并验证转子角度θ变化时变换输出的正确性。输入为Iα、Iβ及电角度θ,输出为Id、Iq。
核心原理
Park变换数学表达式:
Id = Iα·cosθ + Iβ·sinθ
Iq = -Iα·sinθ + Iβ·cosθ
关键完整代码
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846
typedef struct {
float alpha;
float beta;
} ClarkeOutput;
typedef struct {
float d;
float q;
} ParkOutput;
// Park变换:静止αβ → 旋转dq
ParkOutput park_transform(float I_alpha, float I_beta, float theta_rad) {
ParkOutput out;
float cos_t = cosf(theta_rad);
float sin_t = sinf(theta_rad);
out.d = I_alpha * cos_t + I_beta * sin_t;
out.q = -I_alpha * sin_t + I_beta * cos_t;
return out;
}
// 测试:给定固定αβ输入,扫描不同角度
void test_park_angle_sweep(void) {
// 固定输入:Iα=1.0A, Iβ=0.0A(纯α轴电流)
float I_alpha = 1.0f;
float I_beta = 0.0f;
printf("Iα=%.1f, Iβ=%.1f 时Park变换输出:\n", I_alpha, I_beta);
printf(" 角度(°) | Id(A) | Iq(A)\n");
printf("-----------|-----------|----------\n");
// 扫描0°到360°,步进45°
for (int deg = 0; deg <= 360; deg += 45) {
float theta = deg * PI / 180.0f;
ParkOutput result = park_transform(I_alpha, I_beta, theta);
printf(" %3d° | %7.4f | %7.4f\n",
deg, result.d, result.q);
}
}
// 验证:已知角度下的手算对照
void test_known_angle(void) {
printf("\n已知角度验证(Iα=1, Iβ=0):\n");
// θ=90°: Id = 1·cos90 + 0·sin90 = 0, Iq = -1·sin90 + 0·cos90 = -1
ParkOutput r90 = park_transform(1.0f, 0.0f, PI/2);
printf("θ=90° → Id=%.4f, Iq=%.4f (期望: Id=0, Iq=-1)\n", r90.d, r90.q);
// θ=0°: Id = 1·cos0 + 0 = 1, Iq = -1·sin0 + 0 = 0
ParkOutput r0 = park_transform(1.0f, 0.0f, 0.0f);
printf("θ=0° → Id=%.4f, Iq=%.4f (期望: Id=1, Iq=0)\n", r0.d, r0.q);
}
int main(void) {
printf("=== Park变换基础实现测试 ===\n");
test_known_angle();
test_park_angle_sweep();
return 0;
}
编译与运行
gcc -o park_test park_test.c -lm
./park_test
验证方法与判定标准
预期输出(与代码逻辑严格一致):
=== Park变换基础实现测试 ===
已知角度验证(Iα=1, Iβ=0):
θ=90° → Id=0.0000, Iq=-1.0000 (期望: Id=0, Iq=-1)
θ=0° → Id=1.0000, Iq=0.0000 (期望: Id=1, Iq=0)
Iα=1.0, Iβ=0.0 时Park变换输出:
角度(°) | Id(A) | Iq(A)
-----------|-----------|----------
0° | 1.0000 | 0.0000
45° | 0.7071 | -0.7071
90° | 0.0000 | -1.0000
135° | -0.7071 | -0.7071
180° | -1.0000 | 0.0000
225° | -0.7071 | 0.7071
270° | 0.0000 | 1.0000
315° | 0.7071 | 0.7071
360° | 1.0000 | 0.0000
判定通过条件:
- 程序编译无错误,运行后输出与上述预期一致(浮点舍入误差±0.0001内);
- θ=0°时Id=Iα、Iq=-Iβ,θ=90°时Id=Iβ、Iq=-Iα,符合Park变换定义;
- 角度扫描输出呈正弦/余弦变化规律,360°周期后回到初始值。
常见问题
- 角度单位:函数内部使用弧度,测试代码中已将角度转换为弧度传入,勿混用单位。
- 浮点精度:cosf/sinf返回float精度,与理论值存在±1e-6级误差,属正常现象。
- 符号约定:本实现采用Iq = -Iα·sinθ + Iβ·cosθ,若工程中采用反方向旋转约定,需调整符号。