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

判定通过条件:

  1. 程序编译无错误,运行后输出与上述预期一致(浮点舍入误差±0.0001内);
  2. θ=0°时Id=Iα、Iq=-Iβ,θ=90°时Id=Iβ、Iq=-Iα,符合Park变换定义;
  3. 角度扫描输出呈正弦/余弦变化规律,360°周期后回到初始值。

常见问题

  • 角度单位:函数内部使用弧度,测试代码中已将角度转换为弧度传入,勿混用单位。
  • 浮点精度:cosf/sinf返回float精度,与理论值存在±1e-6级误差,属正常现象。
  • 符号约定:本实现采用Iq = -Iα·sinθ + Iβ·cosθ,若工程中采用反方向旋转约定,需调整符号。