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);
elsefprintf('未达到90%%参考电压\n');
end% THD计算函数
function thd = calculate_thd(signal, fund_freq, Ts)% 计算信号的总谐波失真(THD)N = length(signal);f = (0:N-1)/(N*Ts);% 计算FFTY = 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);% 计算THDthd = sqrt(harmonic_power) / fund_mag;
end
Simulink模型结构
由于无法直接提供Simulink模型文件,以下是模型的主要组成部分描述:
主系统模块
- 三相电源:提供三相交流电压
- PWM整流桥:使用IGBT或MOSFET的六开关桥式整流器
- LC滤波器:电网侧电感和直流侧电容
- 负载电阻:直流侧负载
控制模块
-
坐标变换:
- Clarke变换 (abc → αβ)
- Park变换 (αβ → dq)
- 反Park变换 (dq → αβ)
-
锁相环(PLL):跟踪电网电压相位
-
电压外环控制器:
- 采样直流侧电压
- 与参考电压比较
- PI控制器生成d轴电流参考值
-
电流内环控制器:
- 采样网侧电流并变换到dq坐标系
- 与电流参考值比较
- PI控制器生成dq轴电压参考值
- 前馈解耦控制
-
PWM生成:
- 空间矢量调制(SVPWM)或正弦PWM(SPWM)
- 生成开关信号驱动整流桥
测量模块
- 电压和电流传感器
- 功率计算模块
- THD分析模块
参考代码 AC-DC整流器程序 www.youwenfan.com/contentcng/51560.html
控制策略详解
双闭环控制结构
电压外环: Vdc_ref → [PI控制器] → Id_ref
电流内环: Id_ref → [PI控制器] → Vd_refIq_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:电网电压前馈项
运行说明
- 运行MATLAB脚本设置系统参数
- 脚本会自动打开并运行Simulink模型
- 仿真完成后会自动绘制结果图形
- 控制台会显示系统性能指标
参数整定建议
电流内环PI参数
电流内环需要快速响应,通常:
- 比例系数Kp_i:0.1-2
- 积分系数Ki_i:10-100
电压外环PI参数
电压外环响应较慢,通常:
- 比例系数Kp_v:0.01-0.5
- 积分系数Ki_v:1-20
参数整定方法
- 先整定电流内环,再整定电压外环
- 使用Ziegler-Nichols方法或试凑法
- 考虑系统稳定性和响应速度的权衡
这个仿真程序提供了AC-DC整流器双闭环控制的完整实现,可以作为研究和教学的基础平台。