AC-DC整流器双闭环控制MATLAB/Simulink仿真

AC-DC整流器双闭环控制系统的MATLAB/Simulink仿真程序,包含电压外环和电流内环控制。

这个仿真实现了一个三相PWM整流器的双闭环控制:

  • 电压外环:控制直流侧输出电压,提供电流内环的参考信号
  • 电流内环:控制网侧电流,实现单位功率因数运行

MATLAB:参数设置与仿真启动

% AC-DC整流器双闭环控制仿真
% 电压外环 + 电流内环控制

clear; clc; close all;

%% 系统参数设置
fprintf('设置系统参数...\n');

% 电网参数
fg = 50;                % 电网频率 (Hz)
Vg_rms = 220;           % 电网相电压有效值 (V)
wg = 2*pi*fg;           % 电网角频率 (rad/s)

% 整流器参数
Rg = 0.1;               % 电网侧等效电阻 (Ω)
Lg = 5e-3;              % 电网侧滤波电感 (H)
Cdc = 2000e-6;          % 直流侧电容 (F)
Rload = 20;             % 负载电阻 (Ω)
Vdc_ref = 650;          % 直流侧电压参考值 (V)

% 开关频率和采样时间
fsw = 10e3;             % 开关频率 (Hz)
Ts = 1/fsw;             % 采样时间 (s)
Tsim = 0.3;             % 仿真时间 (s)

% PWM参数
Vtri = 1;               % 三角载波幅值 (V)

% 电流内环控制器参数
% 采用PI控制器: Gci(s) = Kp_i + Ki_i/s
Kp_i = 0.5;             % 比例系数
Ki_i = 20;              % 积分系数

% 电压外环控制器参数
% 采用PI控制器: Gcv(s) = Kp_v + Ki_v/s
Kp_v = 0.1;             % 比例系数
Ki_v = 5;               % 积分系数

% 前馈补偿系数
Kff = 1;                % 前馈系数

fprintf('参数设置完成!\n');

%% 运行Simulink仿真
fprintf('启动Simulink仿真...\n');

% 打开Simulink模型
model = 'ACDC_Rectifier_Dual_Loop';
open_system(model);

% 设置仿真参数
set_param(model, 'StopTime', num2str(Tsim));
set_param(model, 'Solver', 'ode23t');
set_param(model, 'MaxStep', num2str(Ts/10));

% 运行仿真
sim(model);

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

%% 结果可视化
fprintf('绘制仿真结果...\n');

% 提取仿真数据
t = simout.Time;
Vdc = simout.Data(:,1);
Id = simout.Data(:,2);
Iq = simout.Data(:,3);
Ia = simout.Data(:,4);
Ib = simout.Data(:,5);
Ic = simout.Data(:,6);
Va = simout.Data(:,7);
Vb = simout.Data(:,8);
Vc = simout.Data(:,9);
P = simout.Data(:,10);
Q = simout.Data(:,11);

% 绘制直流侧电压
figure('Name', '直流侧电压', 'Position', [100, 100, 800, 400]);
plot(t, Vdc, 'b-', 'LineWidth', 1.5);
hold on;
plot(t, Vdc_ref*ones(size(t)), 'r--', 'LineWidth', 1.5);
xlabel('时间 (s)');
ylabel('电压 (V)');
title('直流侧电压');
legend('实际电压', '参考电压');
grid on;

% 绘制d轴和q轴电流
figure('Name', 'd轴和q轴电流', 'Position', [100, 100, 800, 400]);
plot(t, Id, 'b-', 'LineWidth', 1.5);
hold on;
plot(t, Iq, 'r-', 'LineWidth', 1.5);
xlabel('时间 (s)');
ylabel('电流 (A)');
title('d轴和q轴电流');
legend('I_d', 'I_q');
grid on;

% 绘制三相电流
figure('Name', '三相电流', 'Position', [100, 100, 800, 600]);
subplot(3,1,1);
plot(t, Ia, 'b-', 'LineWidth', 1.5);
ylabel('I_a (A)');
title('A相电流');
grid on;

subplot(3,1,2);
plot(t, Ib, 'r-', 'LineWidth', 1.5);
ylabel('I_b (A)');
title('B相电流');
grid on;

subplot(3,1,3);
plot(t, Ic, 'g-', 'LineWidth', 1.5);
xlabel('时间 (s)');
ylabel('I_c (A)');
title('C相电流');
grid on;

% 绘制有功和无功功率
figure('Name', '有功和无功功率', 'Position', [100, 100, 800, 400]);
plot(t, P, 'b-', 'LineWidth', 1.5);
hold on;
plot(t, Q, 'r-', 'LineWidth', 1.5);
xlabel('时间 (s)');
ylabel('功率 (W/VAR)');
title('有功和无功功率');
legend('有功功率', '无功功率');
grid on;

% 绘制A相电压和电流
figure('Name', 'A相电压和电流', 'Position', [100, 100, 800, 400]);
yyaxis left;
plot(t, Va, 'b-', 'LineWidth', 1.5);
ylabel('电压 (V)');
yyaxis right;
plot(t, Ia, 'r-', 'LineWidth', 1.5);
ylabel('电流 (A)');
xlabel('时间 (s)');
title('A相电压和电流');
legend('电压', '电流');
grid on;

% 计算功率因数
% 选择稳态区间进行分析
t_steady = t(t > 0.15);
Ia_steady = Ia(t > 0.15);
Va_steady = Va(t > 0.15);

% 计算功率因数
[~, fund_idx] = max(abs(fft(Ia_steady)));
[~, fund_idx_v] = max(abs(fft(Va_steady)));
phase_diff = angle(fft(Ia_steady)(fund_idx)) - angle(fft(Va_steady)(fund_idx_v));
power_factor = cos(phase_diff);

fprintf('系统功率因数: %.4f\n', power_factor);

% 计算THD
thd_a = calculate_thd(Ia_steady, fg, 1/fsw);
fprintf('A相电流THD: %.4f%%\n', thd_a*100);

%% 性能评估
fprintf('性能评估:\n');

% 计算电压稳态误差
Vdc_steady = Vdc(t > 0.2);
Vdc_error = abs(mean(Vdc_steady) - Vdc_ref);
fprintf('直流电压稳态误差: %.2f V (%.2f%%)\n', Vdc_error, Vdc_error/Vdc_ref*100);

% 计算电压纹波
Vdc_ripple = max(Vdc_steady) - min(Vdc_steady);
fprintf('直流电压纹波: %.2f V (%.2f%%)\n', Vdc_ripple, Vdc_ripple/Vdc_ref*100);

% 计算响应时间
% 找到电压首次达到90%参考值的时间
Vdc_norm = Vdc / Vdc_ref;
t_90 = t(find(Vdc_norm >= 0.9, 1));
if ~isempty(t_90)
    fprintf('上升时间(90%%): %.3f s\n', t_90);
else
    fprintf('未达到90%%参考电压\n');
end

% THD计算函数
function thd = calculate_thd(signal, fund_freq, Ts)
    % 计算信号的总谐波失真(THD)
    N = length(signal);
    f = (0:N-1)/(N*Ts);
    
    % 计算FFT
    Y = fft(signal);
    P2 = abs(Y/N);
    P1 = P2(1:floor(N/2)+1);
    P1(2:end-1) = 2*P1(2:end-1);
    f = f(1:floor(N/2)+1);
    
    % 找到基波分量
    [~, fund_idx] = min(abs(f - fund_freq));
    fund_mag = P1(fund_idx);
    
    % 计算谐波分量
    harmonic_indices = setdiff(1:length(P1), fund_idx);
    harmonic_power = sum(P1(harmonic_indices).^2);
    
    % 计算THD
    thd = sqrt(harmonic_power) / fund_mag;
end

Simulink模型结构

由于无法直接提供Simulink模型文件,以下是模型的主要组成部分描述:

主系统模块

  1. 三相电源:提供三相交流电压
  2. PWM整流桥:使用IGBT或MOSFET的六开关桥式整流器
  3. LC滤波器:电网侧电感和直流侧电容
  4. 负载电阻:直流侧负载

控制模块

  1. 坐标变换

    • Clarke变换 (abc → αβ)
    • Park变换 (αβ → dq)
    • 反Park变换 (dq → αβ)
  2. 锁相环(PLL):跟踪电网电压相位

  3. 电压外环控制器

    • 采样直流侧电压
    • 与参考电压比较
    • PI控制器生成d轴电流参考值
  4. 电流内环控制器

    • 采样网侧电流并变换到dq坐标系
    • 与电流参考值比较
    • PI控制器生成dq轴电压参考值
    • 前馈解耦控制
  5. PWM生成

    • 空间矢量调制(SVPWM)或正弦PWM(SPWM)
    • 生成开关信号驱动整流桥

测量模块

  1. 电压和电流传感器
  2. 功率计算模块
  3. THD分析模块

参考代码 AC-DC整流器程序 www.youwenfan.com/contentcng/51560.html

控制策略详解

双闭环控制结构

电压外环: Vdc_ref → [PI控制器] → Id_ref
电流内环: Id_ref → [PI控制器] → Vd_ref
          Iq_ref(=0) → [PI控制器] → Vq_ref

前馈解耦控制

电流内环采用前馈解耦控制,消除d轴和q轴之间的耦合:

Vd = Vd' - ωL·Iq + Ed
Vq = Vq' + ωL·Id + Eq

其中:

  • Vd', Vq':PI控制器输出
  • ωL·Iq, ωL·Id:解耦项
  • Ed, Eq:电网电压前馈项

运行说明

  1. 运行MATLAB脚本设置系统参数
  2. 脚本会自动打开并运行Simulink模型
  3. 仿真完成后会自动绘制结果图形
  4. 控制台会显示系统性能指标

参数整定建议

电流内环PI参数

电流内环需要快速响应,通常:

  • 比例系数Kp_i:0.1-2
  • 积分系数Ki_i:10-100

电压外环PI参数

电压外环响应较慢,通常:

  • 比例系数Kp_v:0.01-0.5
  • 积分系数Ki_v:1-20

参数整定方法

  1. 先整定电流内环,再整定电压外环
  2. 使用Ziegler-Nichols方法或试凑法
  3. 考虑系统稳定性和响应速度的权衡

这个仿真程序提供了AC-DC整流器双闭环控制的完整实现,可以作为研究和教学的基础平台。

posted @ 2025-09-12 10:58  荒川之主  阅读(54)  评论(0)    收藏  举报