4. 两相静止坐标系到两相旋转坐标系的Park变换基础实现

任务目标

实现Park变换,将两相静止坐标系下的电流分量(iα, iβ)转换到两相旋转坐标系下的电流分量(id, iq)。给定电角度θ,验证变换公式的正确性。

Park变换公式

Park变换的数学表达式为:

id = iα·cos(θ) + iβ·sin(θ)
iq = -iα·sin(θ) + iβ·cos(θ)

其中θ为转子电角度。该变换将交流分量转换为直流分量,便于后续PI控制器的设计。

关键完整代码


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

#define PI 3.14159265358979323846

/**
 * Park变换:两相静止坐标系(α,β) → 两相旋转坐标系(d,q)
 * @param i_alpha α轴电流分量
 * @param i_beta  β轴电流分量
 * @param theta   电角度(弧度)
 * @param id      输出d轴电流分量(指针)
 * @param iq      输出q轴电流分量(指针)
 */
void park_transform(double i_alpha, double i_beta, double theta,
                    double *id, double *iq) {
    double cos_theta = cos(theta);
    double sin_theta = sin(theta);
    
    *id =  i_alpha * cos_theta + i_beta * sin_theta;
    *iq = -i_alpha * sin_theta + i_beta * cos_theta;
}

int main() {
    // 测试用例1:θ=0°,iα=1.0,iβ=0.0
    // 预期:id=1.0,iq=0.0(d轴与α轴重合)
    double id1, iq1;
    park_transform(1.0, 0.0, 0.0, &id1, &iq1);
    printf("Test1 (θ=0°): id=%.4f, iq=%.4f\n", id1, iq1);
    
    // 测试用例2:θ=90°,iα=1.0,iβ=0.0
    // 预期:id=0.0,iq=-1.0(d轴旋转到β轴方向)
    double id2, iq2;
    park_transform(1.0, 0.0, PI/2.0, &id2, &iq2);
    printf("Test2 (θ=90°): id=%.4f, iq=%.4f\n", id2, iq2);
    
    // 测试用例3:θ=45°,iα=1.0,iβ=1.0
    // 预期:id=√2≈1.4142,iq=0.0(矢量与d轴对齐)
    double id3, iq3;
    park_transform(1.0, 1.0, PI/4.0, &id3, &iq3);
    printf("Test3 (θ=45°): id=%.4f, iq=%.4f\n", id3, iq3);
    
    // 测试用例4:θ=60°,iα=2.0,iβ=1.0
    // 预期:id=2·cos60°+1·sin60°=1.8660,iq=-2·sin60°+1·cos60°=-1.2321
    double id4, iq4;
    park_transform(2.0, 1.0, PI/3.0, &id4, &iq4);
    printf("Test4 (θ=60°): id=%.4f, iq=%.4f\n", id4, iq4);
    
    return 0;
}

编译与运行


gcc -o park_transform park_transform.c -lm
./park_transform

验证方法与判定标准

运行程序后,观察输出结果:

  • Test1:θ=0°时,d轴与α轴重合,id应等于iα,iq应等于0,输出应为id=1.0000, iq=0.0000。
  • Test2:θ=90°时,d轴旋转到β轴方向,id应等于iβ,iq应等于-iα,输出应为id=0.0000, iq=-1.0000。
  • Test3:θ=45°且iα=iβ时,合成矢量与d轴对齐,iq应为0,id应为√2≈1.4142,输出应为id=1.4142, iq=0.0000。
  • Test4:按公式手算验证,输出应为id=1.8660, iq=-1.2321。

若四个测试用例的输出与上述预期值一致(允许±0.0001浮点误差),则Park变换实现正确。

常见问题

  • 编译错误:链接数学库需添加-lm参数。
  • 角度单位:函数接收弧度值,若使用角度需先转换(角度×π/180)。
  • 浮点精度:cos/sin计算结果存在微小误差,比较时建议使用容差范围。