交流异步电动机矢量调速控制系统(MATLAB/Simulink 实现)

交流异步电动机矢量控制(FOC)仿真系统,包含间接磁场定向控制(IFOC)和直接转矩控制(DTC)两种方案


一、系统架构

1.1 矢量控制系统框图

速度参考 → 速度PI → 转矩电流参考(iqs*) → 电流PI → 电压参考 → SVPWM → 逆变器 → 异步电机
                ↓
位置/速度反馈 ← 编码器/观测器
                ↑
磁链电流参考(ids*) → 电流PI → 电压参考 ↗

1.2 关键控制策略

控制方法 特点 适用场景
间接磁场定向控制(IFOC) 解耦转矩和磁链,动态性能好 高性能调速系统
直接转矩控制(DTC) 直接控制转矩和磁链,响应快 快速启停、牵引系统
无速度传感器控制 省去编码器,降低成本 普通工业应用

2.1 主仿真模型 induction_motor_foc.slx 结构

induction_motor_foc/
├── Speed_Control/          % 速度环控制
├── Current_Control/        % 电流环控制
├── Coordinate_Transform/   % Clark/Park变换
├── SVPWM_Generator/        % 空间矢量调制
├── Inverter/               % 三相逆变器
├── Induction_Motor/        % 异步电机模型
├── Speed_Sensor/           % 速度反馈
└── Scopes/                 % 示波器

2.2 MATLAB 脚本初始化 init_motor_params.m

%% 交流异步电动机矢量控制参数初始化
clear; clc; close all;

%% ========== 1. 电机参数 ==========
motor.Rs = 0.435;          % 定子电阻 (Ω)
motor.Rr = 0.816;          % 转子电阻 (Ω)
motor.Ls = 0.0719;         % 定子电感 (H)
motor.Lr = 0.0719;         % 转子电感 (H)
motor.Lm = 0.0693;         % 互感 (H)
motor.J = 0.089;           % 转动惯量 (kg·m²)
motor.B = 0.001;           % 摩擦系数 (N·m·s)
motor.p = 2;               % 极对数
motor.V_nom = 380;         % 额定电压 (V)
motor.f_nom = 50;          % 额定频率 (Hz)
motor.P_nom = 3e3;         % 额定功率 (W)

% 计算漏感
motor.Lls = motor.Ls - motor.Lm;
motor.Llr = motor.Lr - motor.Lm;

% 额定转速
motor.n_sync = 60 * motor.f_nom / motor.p;  % 同步转速 (rpm)
motor.n_rated = 1440;                       % 额定转速 (rpm)

fprintf('电机参数初始化完成:\n');
fprintf('  额定功率: %.1f kW\n', motor.P_nom/1000);
fprintf('  额定电压: %.1f V\n', motor.V_nom);
fprintf('  额定电流: %.1f A\n', motor.V_nom/(sqrt(3)*motor.Ls*2*pi*motor.f_nom));
fprintf('  同步转速: %.1f rpm\n', motor.n_sync);
fprintf('  极对数: %d\n', motor.p);

%% ========== 2. 控制器参数 ==========
ctrl.Ts = 1e-4;            % 采样时间 (s)
ctrl.T_sim = 2;            % 仿真时间 (s)

% 速度环PI参数
ctrl.speed.Kp = 0.5;
ctrl.speed.Ki = 10;
ctrl.speed.Kd = 0.01;
ctrl.speed.limit = 1500;   % 速度上限 (rpm)

% 电流环PI参数
ctrl.current.Kp = 100;
ctrl.current.Ki = 500;
ctrl.current.Kd = 0.1;
ctrl.current.limit = 10;   % 电流上限 (A)

% 磁链参考值
ctrl.flux_ref = motor.Lm * motor.I_nom;  % 磁链参考
ctrl.flux_ref = 0.8;                     % 标幺值

% 转矩参考计算
ctrl.te_ref = ctrl.speed.Kp * (speed_ref - speed_feedback) + ...
              ctrl.speed.Ki * integral_error;

fprintf('控制器参数初始化完成:\n');
fprintf('  速度环: Kp=%.2f, Ki=%.2f\n', ctrl.speed.Kp, ctrl.speed.Ki);
fprintf('  电流环: Kp=%.2f, Ki=%.2f\n', ctrl.current.Kp, ctrl.current.Ki);

%% ========== 3. 逆变器参数 ==========
inv.Vdc = 540;             % 直流母线电压 (V)
inv.deadtime = 2e-6;       % 死区时间 (s)
inv.switching_freq = 10e3; % 开关频率 (Hz)

%% ========== 4. 仿真工况 ==========
sim.speed_ref = [0, 1000, 1000, 1200, 1200];  % 速度参考 (rpm)
sim.time_points = [0, 0.5, 1.0, 1.5, 2.0];     % 时间点 (s)
sim.load_torque = [0, 5, 10, 5, 0];            % 负载转矩 (N·m)

fprintf('仿真工况设置完成:\n');
fprintf('  仿真时间: %.1f s\n', ctrl.T_sim);
fprintf('  速度变化: 0 → 1000 → 1200 → 0 rpm\n');
fprintf('  负载变化: 0 → 5 → 10 → 5 → 0 N·m\n');

%% ========== 5. 保存参数 ==========
save('motor_params.mat', 'motor', 'ctrl', 'inv', 'sim');
fprintf('参数已保存到 motor_params.mat\n');

2.3 异步电机模型 induction_motor_model.m

function [dx, Te, speed] = induction_motor_model(t, x, u, motor)
% 异步电机在α-β坐标系下的数学模型
% 状态变量 x = [i_alpha, i_beta, psi_alpha, psi_beta, speed]
% 输入 u = [V_alpha, V_beta]

% 状态变量
i_alpha = x(1); i_beta = x(2);
psi_alpha = x(3); psi_beta = x(4);
speed = x(5);

% 输入电压
V_alpha = u(1); V_beta = u(2);

% 转子电角速度
wr = speed * 2*pi/60 * motor.p;  % rad/s

% 电流微分方程
di_alpha = (V_alpha - motor.Rs*i_alpha - ...
            (motor.Ls*motor.Lr - motor.Lm^2)/(motor.Ls*motor.Lr) * ...
            (motor.Lr*psi_alpha - motor.Lm*motor.Lm*i_alpha)) / motor.Ls;

di_beta = (V_beta - motor.Rs*i_beta - ...
           (motor.Ls*motor.Lr - motor.Lm^2)/(motor.Ls*motor.Lr) * ...
           (motor.Lr*psi_beta - motor.Lm*motor.Lm*i_beta)) / motor.Ls;

% 磁链微分方程
dpsi_alpha = V_alpha - motor.Rs*i_alpha;
dpsi_beta = V_beta - motor.Rs*i_beta;

% 转子磁链方程
psi_r_alpha = motor.Lm * i_alpha + motor.Llr * (psi_alpha - motor.Lm*i_alpha)/motor.Lr;
psi_r_beta = motor.Lm * i_beta + motor.Llr * (psi_beta - motor.Lm*i_beta)/motor.Lr;

% 电磁转矩
Te = (3/2) * motor.p * (psi_alpha*i_beta - psi_beta*i_alpha);

% 机械运动方程
dspeed = (Te - motor.B*speed - motor.load_torque) / motor.J;

% 状态微分
dx = [di_alpha; di_beta; dpsi_alpha; dpsi_beta; dspeed];
end

2.4 坐标变换函数

%% Clarke变换 (三相静止→两相静止)
function [alpha, beta] = clarke_transform(a, b, c)
alpha = a;
beta = (a + 2*b) / sqrt(3);
end

%% Park变换 (两相静止→两相旋转)
function [d, q] = park_transform(alpha, beta, theta)
d = alpha * cos(theta) + beta * sin(theta);
q = -alpha * sin(theta) + beta * cos(theta);
end

%% 反Park变换 (两相旋转→两相静止)
function [alpha, beta] = inverse_park_transform(d, q, theta)
alpha = d * cos(theta) - q * sin(theta);
beta = d * sin(theta) + q * cos(theta);
end

%% 反Clarke变换 (两相静止→三相静止)
function [a, b, c] = inverse_clarke_transform(alpha, beta)
a = alpha;
b = -alpha/2 + sqrt(3)/2 * beta;
c = -alpha/2 - sqrt(3)/2 * beta;
end

2.5 SVPWM 调制器 svpwm_generator.m

function [Va, Vb, Vc] = svpwm_generator(Vd, Vq, theta, Vdc)
% 空间矢量PWM发生器
% 输入:Vd, Vq - d-q轴电压,theta - 电角度,Vdc - 直流母线电压
% 输出:Va, Vb, Vc - 三相相电压

% 反Park变换得到α-β电压
[Valpha, Vbeta] = inverse_park_transform(Vd, Vq, theta);

% 扇区判断
angle = atan2(Vbeta, Valpha);
if angle < 0
    angle = angle + 2*pi;
end
sector = floor(angle / (pi/3)) + 1;

% 计算相邻矢量作用时间
T1 = sqrt(3) * abs(Vbeta) / Vdc * 1e-4;  % 简化计算
T2 = (sqrt(3)*Valpha - Vbeta) / (2*Vdc) * 1e-4;

% 过调制处理
if T1 + T2 > 1e-4
    T1 = T1 / (T1 + T2) * 1e-4;
    T2 = T2 / (T1 + T2) * 1e-4;
end

% 三相电压输出
switch sector
    case 1
        Va = (T1 + T2) * Vdc;
        Vb = T2 * Vdc;
        Vc = 0;
    case 2
        Va = T1 * Vdc;
        Vb = (T1 + T2) * Vdc;
        Vc = 0;
    % ... 其他扇区类似
end
end

2.6 主仿真循环 run_foc_simulation.m

%% 运行FOC矢量控制仿真
clear; clc;

% 加载参数
load('motor_params.mat');

% 初始化变量
t = 0:ctrl.Ts:ctrl.T_sim;
N = length(t);

% 状态变量
speed = zeros(N,1);
torque = zeros(N,1);
i_d = zeros(N,1); i_q = zeros(N,1);
V_d = zeros(N,1); V_q = zeros(N,1);
theta = zeros(N,1);

% 控制器积分项
int_speed_error = 0;
int_id_error = 0;
int_iq_error = 0;

% 初始状态
speed(1) = 0;
theta(1) = 0;

fprintf('开始FOC矢量控制仿真...\n');

for k = 1:N-1
    % ===== 1. 速度参考 =====
    speed_ref = interp1(sim.time_points, sim.speed_ref, t(k), 'linear', 'extrap');
    
    % ===== 2. 速度PI控制器 =====
    speed_error = speed_ref - speed(k);
    int_speed_error = int_speed_error + speed_error * ctrl.Ts;
    i_q_ref = ctrl.speed.Kp * speed_error + ctrl.speed.Ki * int_speed_error;
    i_q_ref = max(min(i_q_ref, ctrl.current.limit), -ctrl.current.limit);
    
    % ===== 3. 磁链参考 =====
    i_d_ref = ctrl.flux_ref;  % 保持恒定磁链
    
    % ===== 4. 电流PI控制器 =====
    % d轴电流控制
    id_error = i_d_ref - i_d(k);
    int_id_error = int_id_error + id_error * ctrl.Ts;
    V_d(k) = ctrl.current.Kp * id_error + ctrl.current.Ki * int_id_error;
    
    % q轴电流控制
    iq_error = i_q_ref - i_q(k);
    int_iq_error = int_iq_error + iq_error * ctrl.Ts;
    V_q(k) = ctrl.current.Kp * iq_error + ctrl.current.Ki * int_iq_error;
    
    % ===== 5. SVPWM调制 =====
    [Va, Vb, Vc] = svpwm_generator(V_d(k), V_q(k), theta(k), inv.Vdc);
    
    % ===== 6. 电机模型 =====
    u = [Va; Vb; Vc];
    x = [i_d(k); i_q(k); 0; 0; speed(k)];  % 简化状态
    
    % 使用ode45求解电机微分方程
    [t_ode, x_ode] = ode45(@(t,x) induction_motor_model(t, x, u, motor), [0, ctrl.Ts], x);
    
    % 更新状态
    i_d(k+1) = x_ode(end,1);
    i_q(k+1) = x_ode(end,2);
    speed(k+1) = x_ode(end,5);
    torque(k+1) = (3/2) * motor.p * (motor.Lm * (i_d(k+1)*i_q(k+1) - i_q(k+1)*i_d(k+1)));
    
    % 更新电角度
    theta(k+1) = theta(k) + speed(k+1) * 2*pi/60 * motor.p * ctrl.Ts;
    
    % 显示进度
    if mod(k, 1000) == 0
        fprintf('  仿真进度: %.1f%%, 速度: %.1f rpm, 转矩: %.2f N·m\n', ...
                k/N*100, speed(k), torque(k));
    end
end

fprintf('仿真完成!\n');

%% ===== 7. 结果可视化 =====
figure('Position', [100, 100, 1400, 800]);

% 速度响应
subplot(3,3,1);
plot(t, speed, 'b-', 'LineWidth', 2); hold on;
plot(sim.time_points, sim.speed_ref, 'r--', 'LineWidth', 2);
xlabel('时间 (s)'); ylabel('转速 (rpm)');
title('速度响应');
legend('实际速度', '参考速度');
grid on;

% 转矩响应
subplot(3,3,2);
plot(t, torque, 'g-', 'LineWidth', 2); hold on;
plot(sim.time_points, sim.load_torque, 'r--', 'LineWidth', 2);
xlabel('时间 (s)'); ylabel('转矩 (N·m)');
title('转矩响应');
legend('电磁转矩', '负载转矩');
grid on;

% d-q轴电流
subplot(3,3,3);
plot(t, i_d, 'b-', 'LineWidth', 1.5); hold on;
plot(t, i_q, 'r-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('电流 (A)');
title('d-q轴电流');
legend('i_d (励磁)', 'i_q (转矩)');
grid on;

% d-q轴电压
subplot(3,3,4);
plot(t, V_d, 'b-', 'LineWidth', 1.5); hold on;
plot(t, V_q, 'r-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('电压 (V)');
title('d-q轴电压');
legend('V_d', 'V_q');
grid on;

% 三相电流
subplot(3,3,5);
[ia, ib, ic] = inverse_clarke_transform(i_d, i_q);
plot(t, ia, 'b-', 'LineWidth', 1.5); hold on;
plot(t, ib, 'r-', 'LineWidth', 1.5);
plot(t, ic, 'g-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('电流 (A)');
title('三相定子电流');
legend('Ia', 'Ib', 'Ic');
grid on;

% 磁链轨迹
subplot(3,3,6);
psi_d = motor.Lm * i_d;  % 简化磁链计算
psi_q = motor.Lm * i_q;
plot(psi_d, psi_q, 'k-', 'LineWidth', 1.5);
xlabel('ψ_d'); ylabel('ψ_q');
title('转子磁链轨迹');
grid on;
axis equal;

% 速度误差
subplot(3,3,7);
speed_error = interp1(sim.time_points, sim.speed_ref, t, 'linear', 'extrap') - speed;
plot(t, speed_error, 'm-', 'LineWidth', 2);
xlabel('时间 (s)'); ylabel('速度误差 (rpm)');
title('速度跟踪误差');
grid on;

% 电流THD
subplot(3,3,8);
% 计算电流THD(简化)
current_thd = zeros(size(t));
for k = 101:length(t)
    % 使用FFT计算THD
    N_fft = 1024;
    current_segment = ia(k-min(N_fft,100):k);
    if length(current_segment) >= N_fft
        Y = fft(current_segment, N_fft);
        P2 = abs(Y/N_fft);
        P1 = P2(1:N_fft/2+1);
        P1(2:end-1) = 2*P1(2:end-1);
        fundamental = P1(2);  % 基波幅值
        harmonics = sum(P1(3:end).^2);
        current_thd(k) = sqrt(harmonics) / fundamental * 100;
    end
end
plot(t, current_thd, 'c-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('THD (%)');
title('定子电流THD');
grid on;

% 效率分析
subplot(3,3,9);
electrical_power = Va.*ia + Vb.*ib + Vc.*ic;
mechanical_power = torque .* (speed * 2*pi/60);
efficiency = mechanical_power ./ electrical_power * 100;
efficiency(isnan(efficiency)) = 0;
plot(t, efficiency, 'k-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('效率 (%)');
title('系统效率');
grid on;

sgtitle('异步电动机矢量控制(FOC)仿真结果', 'FontSize', 14, 'FontWeight', 'bold');

%% ===== 8. 保存结果 =====
save('foc_simulation_results.mat', 't', 'speed', 'torque', 'i_d', 'i_q', 'V_d', 'V_q');
fprintf('仿真结果已保存到 foc_simulation_results.mat\n');

%% 创建FOC矢量控制Simulink模型
model_name = 'induction_motor_foc';

% 创建新模型
new_system(model_name);
open_system(model_name);

% 添加模块
add_block('simulink/Sources/Constant', [model_name '/Speed_Ref']);
add_block('simulink/Sources/Constant', [model_name '/Load_Torque']);
add_block('simulink/Continuous/Integrator', [model_name '/Speed_PI']);
add_block('simulink/Continuous/Integrator', [model_name '/Current_PI_d']);
add_block('simulink/Continuous/Integrator', [model_name '/Current_PI_q']);
add_block('powerlib/machines/Asynchronous Machine SI Units', [model_name '/Motor']);
add_block('powerlib/power electronics/Universal Bridge', [model_name '/Inverter']);
add_block('powerlib/control/abc_to_dq0 Transformation', [model_name '/Clark_Park']);
add_block('powerlib/control/dq0_to_abc Transformation', [model_name '/Inv_Clark_Park']);
add_block('powerlib/measurements/Current Measurement', [model_name '/Ia']);
add_block('powerlib/measurements/Speed Measurement', [model_name '/Speed']);
add_block('simulink/Sinks/Scope', [model_name '/Scope']);

% 连接模块
add_line(model_name, 'Speed_Ref/1', 'Speed_PI/1');
add_line(model_name, 'Speed_PI/1', 'Current_PI_q/1');
add_line(model_name, 'Current_PI_d/1', 'Inverter/1');
add_line(model_name, 'Current_PI_q/1', 'Inverter/2');
add_line(model_name, 'Inverter/1', 'Motor/1');
add_line(model_name, 'Motor/1', 'Ia/1');
add_line(model_name, 'Ia/1', 'Clark_Park/1');
add_line(model_name, 'Clark_Park/1', 'Current_PI_d/1');
add_line(model_name, 'Clark_Park/2', 'Current_PI_q/1');
add_line(model_name, 'Motor/2', 'Speed/1');
add_line(model_name, 'Speed/1', 'Speed_PI/2');

% 设置参数
set_param([model_name '/Motor'], 'Rs', 'motor.Rs', 'Rr', 'motor.Rr', 'Ls', 'motor.Ls');
set_param([model_name '/Inverter'], 'SnubberResistance', '1e6', 'SnubberCapacitance', 'inf');

% 保存模型
save_system(model_name);
close_system(model_name);

fprintf('Simulink模型 %s 创建完成\n', model_name);

四、无速度传感器控制扩展

4.1 磁链观测器 flux_observer.m

function [psi_alpha, psi_beta, speed_est] = flux_observer(i_alpha, i_beta, V_alpha, V_beta, motor)
% 磁链观测器(电压模型)
persistent psi_alpha_hat psi_beta_hat;
if isempty(psi_alpha_hat)
    psi_alpha_hat = 0;
    psi_beta_hat = 0;
end

% 电压模型
dpsi_alpha = V_alpha - motor.Rs * i_alpha;
dpsi_beta = V_beta - motor.Rs * i_beta;

% 积分得到磁链
psi_alpha_hat = psi_alpha_hat + dpsi_alpha * 1e-4;
psi_beta_hat = psi_beta_hat + dpsi_beta * 1e-4;

% 速度估计(简化)
speed_est = (psi_alpha_hat * i_beta - psi_beta_hat * i_alpha) / ...
            (motor.p * (psi_alpha_hat^2 + psi_beta_hat^2)) * 60/(2*pi);
end

五、运行说明

5.1 直接运行

  1. 运行 init_motor_params.m 初始化参数
  2. 运行 run_foc_simulation.m 执行仿真
  3. 查看结果图表

5.2 参数调优建议

参数 建议值 说明
speed.Kp 0.3~1.0 速度环比例系数
speed.Ki 5~20 速度环积分系数
current.Kp 50~200 电流环比例系数
current.Ki 200~1000 电流环积分系数
flux_ref 0.7~0.9 磁链参考值

5.3 预期结果

  • 速度响应:无超调,稳态误差 < 1%
  • 转矩响应:快速跟踪负载变化
  • 电流THD:< 5%
  • 系统效率:> 85%

参考代码 交流异步电动机在Matlab中的矢量调速控制 www.youwenfan.com/contentcnw/81904.html

六、工程应用建议

6.1 硬件实现

% 生成C代码用于DSP/MCU
codegen run_foc_simulation -args {speed_ref, load_torque} -report

6.2 实时仿真

% 使用Simulink Real-Time
slrt('load', 'induction_motor_foc');
slrt('start');

6.3 故障保护

% 过流保护
if max(abs([i_d; i_q])) > 15
    error('过流保护触发!');
end

% 过温保护
if motor_temperature > 120
    warning('电机温度过高!');
end
posted @ 2026-06-22 16:19  yes_go  阅读(28)  评论(0)    收藏  举报