1.功能
演示给定id、iq后通过反Park+反Clarke变换得到三相电流ia、ib、ic,并绘图对比两种工况。
2.matlab源码
Matlab
%% 电机控制中 id, iq 到三相电流 ia, ib, ic 的坐标变换
% 已知:
% 工况1: id = 1 A, iq = 1 A
% 工况2: id = 1 A, iq = 2 A
% 假设: 转子位置角度 theta 从 0 到 2*pi 变化
% 采用等幅值变换(常用在电机控制中)
clear; clc; close all;
%% 参数设置
theta = linspace(0, 2*pi, 360); % 电角度,一个完整的电气周期
%% 工况1: id = 1 A, iq = 1 A
id1 = 1;
iq1 = 1;
%% 工况2: id = 1 A, iq = 2 A
id2 = 1;
iq2 = 2;
%% 预分配数组
ia1 = zeros(size(theta));
ib1 = zeros(size(theta));
ic1 = zeros(size(theta));
ia2 = zeros(size(theta));
ib2 = zeros(size(theta));
ic2 = zeros(size(theta));
%% 对每个角度进行坐标变换
for k = 1:length(theta)
theta_elec = theta(k);
% 工况1: 反Park变换 (dq -> alpha, beta)
[i_alpha1, i_beta1] = inv_park(id1, iq1, theta_elec);
% 反Clarke变换 (alpha, beta -> a, b, c)
[ia1(k), ib1(k), ic1(k)] = inv_clarke(i_alpha1, i_beta1);
% 工况2: 反Park变换 (dq -> alpha, beta)
[i_alpha2, i_beta2] = inv_park(id2, iq2, theta_elec);
% 反Clarke变换 (alpha, beta -> a, b, c)
[ia2(k), ib2(k), ic2(k)] = inv_clarke(i_alpha2, i_beta2);
end
%% 绘图对比
figure('Position', [100, 100, 1200, 800]);
% 工况1
subplot(2,1,1);
plot(theta*180/pi, ia1, 'r-', 'LineWidth', 1.5); hold on;
plot(theta*180/pi, ib1, 'g-', 'LineWidth', 1.5);
plot(theta*180/pi, ic1, 'b-', 'LineWidth', 1.5);
plot(theta*180/pi, id1*ones(size(theta)), 'k--', 'LineWidth', 1);
plot(theta*180/pi, iq1*ones(size(theta)), 'm--', 'LineWidth', 1);
xlabel('电角度 (deg)');
ylabel('电流 (A)');
title(['工况1: id = ', num2str(id1), ' A, iq = ', num2str(iq1), ' A']);
legend('ia', 'ib', 'ic', 'id (参考)', 'iq (参考)', 'Location', 'best');
grid on;
xlim([0, 360]);
ylim([-3, 3]);
% 工况2
subplot(2,1,2);
plot(theta*180/pi, ia2, 'r-', 'LineWidth', 1.5); hold on;
plot(theta*180/pi, ib2, 'g-', 'LineWidth', 1.5);
plot(theta*180/pi, ic2, 'b-', 'LineWidth', 1.5);
plot(theta*180/pi, id2*ones(size(theta)), 'k--', 'LineWidth', 1);
plot(theta*180/pi, iq2*ones(size(theta)), 'm--', 'LineWidth', 1);
xlabel('电角度 (deg)');
ylabel('电流 (A)');
title(['工况2: id = ', num2str(id2), ' A, iq = ', num2str(iq2), ' A']);
legend('ia', 'ib', 'ic', 'id (参考)', 'iq (参考)', 'Location', 'best');
grid on;
xlim([0, 360]);
ylim([-3, 3]);
sgtitle('dq轴电流到三相电流的坐标变换结果');
%% 单独画在一个图上对比ia
figure('Position', [100, 100, 900, 600]);
plot(theta*180/pi, ia1, 'r-', 'LineWidth', 1.5); hold on;
plot(theta*180/pi, ia2, 'b--', 'LineWidth', 1.5);
xlabel('电角度 (deg)');
ylabel('ia 电流 (A)');
title('ia 电流对比 (id=1A, iq=1A vs id=1A, iq=2A)');
legend('iq=1A', 'iq=2A', 'Location', 'best');
grid on;
xlim([0, 360]);
%% 计算有效值对比
fprintf('========== 电流有效值对比 ==========\n');
fprintf('工况1 (id=1A, iq=1A):\n');
fprintf(' ia RMS = %.3f A\n', rms(ia1));
fprintf(' ib RMS = %.3f A\n', rms(ib1));
fprintf(' ic RMS = %.3f A\n', rms(ic1));
fprintf('\n工况2 (id=1A, iq=2A):\n');
fprintf(' ia RMS = %.3f A\n', rms(ia2));
fprintf(' ib RMS = %.3f A\n', rms(ib2));
fprintf(' ic RMS = %.3f A\n', rms(ic2));
fprintf('\n理论电流幅值:\n');
I_s1 = sqrt(id1^2 + iq1^2);
I_s2 = sqrt(id2^2 + iq2^2);
fprintf(' 工况1 合成电流幅值 = %.3f A\n', I_s1);
fprintf(' 工况2 合成电流幅值 = %.3f A\n', I_s2);
fprintf(' 三相电流幅值 = 合成电流幅值 (等幅值变换)\n');
%% ==================== 子函数定义 ====================
% 反Park变换: dq -> alpha, beta
function [i_alpha, i_beta] = inv_park(id, iq, theta)
% 等幅值变换的逆Park矩阵
% [i_alpha] = [cosθ -sinθ] [id]
% [i_beta ] [sinθ cosθ] [iq]
i_alpha = id * cos(theta) - iq * sin(theta);
i_beta = id * sin(theta) + iq * cos(theta);
end
% 反Clarke变换: alpha, beta -> a, b, c
function [ia, ib, ic] = inv_clarke(i_alpha, i_beta)
% 等幅值变换的逆Clarke矩阵
% ia = i_alpha
% ib = -0.5*i_alpha + sqrt(3)/2 * i_beta
% ic = -0.5*i_alpha - sqrt(3)/2 * i_beta
ia = i_alpha;
ib = -0.5 * i_alpha + sqrt(3)/2 * i_beta;
ic = -0.5 * i_alpha - sqrt(3)/2 * i_beta;
end
3.运行结果


4.运行结果说明
关键观察点:
-
电流幅值变化:iq从1A增加到2A后,三相电流幅值明显增大。根据等幅值变换,合成电流幅值 Is=id2+iq2Is=id2+iq2:
-
工况1:Is=12+12=1.414Is=12+12=1.414 A
-
工况2:Is=12+22=2.236Is=12+22=2.236 A
-
-
相位变化:保持id不变只增加iq,电流矢量的相位角 θi=arctan(iq/id)θi=arctan(iq/id) 会增大:
-
工况1:45°
-
工况2:约63.4°
-
-
三相电流波形:标准正弦波,互差120°,幅值等于合成电流幅值
物理意义:
-
iq增大 → 转矩分量增大 → 三相电流幅值增大
-
id不变 → 励磁分量不变 → 但电流矢量的相位会偏移
这段代码可以直接在MATLAB中运行,会生成两张对比图并输出电流有效值。