1. Clark变换基础实现
任务目标
编写C语言函数,将三相电流 \(i_a, i_b, i_c\) 通过等幅值Clark变换映射到两相静止坐标系 \(i_\alpha, i_\beta\),并生成一组三相正弦输入数据,验证变换后 \(i_\alpha, i_\beta\) 的幅值与相位关系。
核心公式
采用等幅值变换(系数2/3),变换矩阵为:
| iα | | 1 -1/2 -1/2 | | ia |
| iβ | = | 0 √3/2 -√3/2 | × | ib |
| ic |
即:\(i_\alpha = \frac{2}{3}(i_a - \frac{1}{2}i_b - \frac{1}{2}i_c)\),\(i_\beta = \frac{2}{3}(\frac{\sqrt{3}}{2}i_b - \frac{\sqrt{3}}{2}i_c)\)。
完整实现代码
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979
// Clark变换:三相电流 → 两相静止坐标系(等幅值)
void clark_transform(float ia, float ib, float ic, float *i_alpha, float *i_beta) {
*i_alpha = (2.0f / 3.0f) * (ia - 0.5f * ib - 0.5f * ic);
*i_beta = (2.0f / 3.0f) * (0.8660254f * ib - 0.8660254f * ic); // √3/2 ≈ 0.8660254
}
int main() {
float ia, ib, ic;
float i_alpha, i_beta;
float amplitude = 5.0f; // 三相电流幅值(A)
float freq = 50.0f; // 频率(Hz)
float dt = 0.0001f; // 采样周期(s)
float t;
int i, samples = 200; // 采样点数
printf("时间(s)\t ia(A)\t ib(A)\t ic(A)\t iα(A)\t iβ(A)\n");
for (i = 0; i < samples; i++) {
t = i * dt;
// 三相平衡正弦电流,相位互差120°
ia = amplitude * sin(2 * PI * freq * t);
ib = amplitude * sin(2 * PI * freq * t - 2 * PI / 3);
ic = amplitude * sin(2 * PI * freq * t + 2 * PI / 3);
clark_transform(ia, ib, ic, &i_alpha, &i_beta);
printf("%.4f\t %.3f\t %.3f\t %.3f\t %.3f\t %.3f\n", t, ia, ib, ic, i_alpha, i_beta);
}
return 0;
}
编译与运行
gcc -o clark clark.c -lm
./clark
验证方法与判定标准
程序输出200行采样数据。验证要点:
- 幅值验证:\(i_\alpha\) 的峰值应约为5A(与输入相电流幅值一致),\(i_\beta\) 峰值也约为5A。
- 相位验证:\(i_\beta\) 波形应超前 \(i_\alpha\) 90°电角度。在 \(t=0\) 时刻,\(i_\alpha \approx 0\),而 \(i_\beta \approx -5\)(因 \(i_b\) 初始为负半波),后续过零点相差2.5ms(对应50Hz的1/4周期)。
- 数值验证:任意时刻满足 \(i_\alpha^2 + i_\beta^2 \approx 25\)(幅值平方),误差小于0.01即通过。
预期输出示例(前5行)
时间(s) ia(A) ib(A) ic(A) iα(A) iβ(A)
0.0000 0.000 -4.330 4.330 0.000 -5.000
0.0001 0.157 -4.187 4.030 0.157 -4.750
0.0002 0.314 -4.033 3.719 0.314 -4.500
0.0003 0.471 -3.868 3.397 0.471 -4.250
0.0004 0.628 -3.693 3.065 0.628 -4.000
注意:\(i_\alpha\) 与 \(i_a\) 数值相同(因 \(i_b + i_c = -i_a\) 时公式简化为 \(i_\alpha = i_a\)),\(i_\beta\) 初始为-5A,验证了90°相位差关系。