反Park+反Clarke变换

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.运行结果说明

关键观察点:

  1. 电流幅值变化: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

  2. 相位变化:保持id不变只增加iq,电流矢量的相位角 θi=arctan⁡(iq/id)θi​=arctan(iq/id) 会增大:

    • 工况1:45°

    • 工况2:约63.4°

  3. 三相电流波形:标准正弦波,互差120°,幅值等于合成电流幅值

物理意义:

  • iq增大 → 转矩分量增大 → 三相电流幅值增大

  • id不变 → 励磁分量不变 → 但电流矢量的相位会偏移

这段代码可以直接在MATLAB中运行,会生成两张对比图并输出电流有效值。

相关推荐
bazhange3 小时前
python如何像matlab一样使用向量化替代for循环
开发语言·python·matlab
Evand J3 小时前
【MATLAB代码介绍】EKF+CKF对比程序
matlab·ekf·非线性滤波·ckf
yu85939585 小时前
matlab雷达信号与干扰的仿真
开发语言·matlab
我爱C编程8 小时前
基于分层QLearning强化学习的联合抗干扰算法matlab仿真
matlab·强化学习·分层qlearning·联合抗干扰
沅_Yuan10 小时前
基于核密度估计的Transformer-LSTM-KDE多输入单输出回归模型【MATLAB】
matlab·回归·lstm·transformer·核密度估计·kde
Evand J11 小时前
【MATLAB例程】二维平面下的CV和CA模型,组成IMM的仿真,滤波使用粒子滤波PF,适用于非线性目标跟踪、定位等
matlab·平面·目标跟踪·pf·粒子滤波·imm·多模型
简简单单做算法1 天前
基于GA遗传优化的Transformer-LSTM网络模型的时间序列预测算法matlab性能仿真
深度学习·matlab·lstm·transformer·时间序列预测·ga遗传优化·电池剩余寿命预测
t198751282 天前
光伏发电MPPT(最大功率点跟踪)MATLAB仿真程序
开发语言·matlab
551只玄猫2 天前
【数学建模 matlab 实验报告10】插值
开发语言·数学建模·matlab·课程设计·插值·实验报告