4. 滞环电流控制PFC仿真
任务定义
本案例实现单相Boost PFC变换器的滞环电流控制仿真。控制目标:使输入电流跟踪整流后的正弦电压波形,实现功率因数校正。重点观察:①滞环宽度对开关频率的影响;②不同滞环宽度下输入电流的THD变化趋势。仿真在MATLAB/Simulink环境中完成,通过编写m脚本建立离散时间模型并执行仿真。
滞环电流控制原理
滞环控制是一种非线性电流控制方法:当电感电流低于参考电流下限(i_ref−h/2)时,开关管导通,电感电流上升;当电感电流高于参考电流上限(i_ref+h/2)时,开关管关断,电感电流下降。其中h为滞环宽度。由于开关动作由电流误差直接触发,开关频率不固定,随工作点变化而波动。滞环宽度越小,电流纹波越小,但开关频率越高,开关损耗增大;滞环宽度越大,开关频率降低,但电流畸变加剧,THD升高。
仿真模型建立
建立单相Boost PFC主电路模型,参数如下:输入电压有效值220V/50Hz,输出直流电压400V,负载电阻200Ω(输出功率800W),Boost电感L=2mH,输出电容C=470μF,开关频率范围由滞环宽度自然决定。控制部分采用电压外环PI调节器生成电流参考幅值,电流内环采用滞环比较器产生开关信号。仿真步长设为0.5μs以捕捉高频开关动作。
MATLAB仿真代码
% 滞环电流控制PFC仿真
% 文件: hysteresis_pfc_sim.m
clear; clc; close all;
%% 参数定义
Vg_rms = 220; % 输入电压有效值(V)
f_line = 50; % 电网频率(Hz)
Vout_ref = 400; % 输出电压参考(V)
R_load = 200; % 负载电阻(Ω)
L = 2e-3; % Boost电感(H)
C = 470e-6; % 输出电容(F)
h_values = [0.2, 0.5, 1.0, 2.0]; % 滞环宽度(A)
fs_sim = 2e6; % 仿真采样率(Hz)
dt = 1/fs_sim; % 仿真步长
t_end = 0.2; % 仿真时长(s),取10个工频周期
t = 0:dt:t_end;
N = length(t);
%% 电压外环PI参数
Kp_v = 0.05;
Ki_v = 5;
Verr_int = 0; % 积分器初值
%% 存储结果
results = struct();
for hidx = 1:length(h_values)
h = h_values(hidx);
% 状态变量初始化
Vout = 0; % 输出电压
iL = 0; % 电感电流
Verr_int = 0;
i_ref_prev = 0;
switch_state = 0; % 开关状态: 1导通, 0关断
% 记录数组
iL_rec = zeros(1,N);
Vout_rec = zeros(1,N);
Vin_rec = zeros(1,N);
switch_rec = zeros(1,N);
fs_rec = zeros(1,N); % 瞬时开关频率
% 开关周期检测
last_rising = 0;
period_count = 0;
for k = 1:N
time = t(k);
% 输入电压瞬时值
Vin = sqrt(2)*Vg_rms*sin(2*pi*f_line*time);
Vin_rec(k) = Vin;
% 整流后电压(取值)
Vin_rect = abs(Vin);
% 电压外环: 输出电压误差经PI生成电流参考幅值
Verr = Vout_ref - Vout;
Verr_int = Verr_int + Ki_v * Verr * dt;
Iref_amp = Kp_v * Verr + Verr_int;
Iref_amp = max(Iref_amp, 0); % 限幅
% 电流参考: 与整流电压同相
if Vin_rect > 1
i_ref = Iref_amp * Vin_rect / (sqrt(2)*Vg_rms);
else
i_ref = 0;
end
i_ref_prev = i_ref;
% 滞环电流控制
if switch_state == 1
% 导通状态: 电感电流上升
diL_dt = Vin_rect / L;
if iL >= (i_ref + h/2)
switch_state = 0; % 关断
end
else
% 关断状态: 电感电流下降
diL_dt = (Vin_rect - Vout) / L;
if iL <= (i_ref - h/2)
switch_state = 1; % 导通
end
end
% 更新电感电流(前向欧拉)
iL = iL + diL_dt * dt;
iL = max(iL, 0); % 电感电流不能为负
% 输出电容充放电
if switch_state == 1
% 开关导通: 输出由电容供电
dVout_dt = -Vout/(R_load*C);
else
% 开关关断: 电感向输出供电
dVout_dt = (iL - Vout/R_load)/C;
end
Vout = Vout + dVout_dt * dt;
% 记录
iL_rec(k) = iL;
Vout_rec(k) = Vout;
switch_rec(k) = switch_state;
% 检测开关周期(上升沿)
if k > 1 && switch_rec(k) == 1 && switch_rec(k-1) == 0
if last_rising > 0
period = (k - last_rising) * dt;
fs_rec(k) = 1/period;
end
last_rising = k;
end
end
% 稳态分析(取最后5个工频周期)
steady_start = round(0.15/dt);
iL_steady = iL_rec(steady_start:end);
Vin_steady = Vin_rec(steady_start:end);
t_steady = t(steady_start:end);
% 计算输入电流THD(基于FFT)
% 提取输入电流(整流前, 即电感电流的值)
i_in = abs(iL_steady);
N_fft = length(i_in);
win = hanning(N_fft)';
i_in_win = i_in .* win;
Y = fft(i_in_win);
f_axis = (0:N_fft-1) * (1/(N_fft*dt));
% 找到基波(50Hz)和谐波分量
f_fund = 50;
fund_idx = round(f_fund * N_fft * dt) + 1;
fund_mag = abs(Y(fund_idx)) * 2 / N_fft;
% 计算THD(考虑2~40次谐波)
harmonic_power = 0;
for n = 2:40
h_idx = round(n * f_fund * N_fft * dt) + 1;
if h_idx <= N_fft/2
harmonic_power = harmonic_power + (abs(Y(h_idx)) * 2 / N_fft)^2;
end
end
THD = sqrt(harmonic_power) / fund_mag * 100;
% 计算平均开关频率(稳态段)
fs_steady = fs_rec(steady_start:end);
fs_valid = fs_steady(fs_steady > 0);
if ~isempty(fs_valid)
fs_avg = mean(fs_valid);
else
fs_avg = 0;
end
% 计算输出电压纹波
Vout_ripple = (max(Vout_rec(steady_start:end)) - min(Vout_rec(steady_start:end)));
% 存储结果
results(hidx).h = h;
results(hidx).THD = THD;
results(hidx).fs_avg = fs_avg;
results(hidx).Vout_avg = mean(Vout_rec(steady_start:end));
results(hidx).Vout_ripple = Vout_ripple;
results(hidx).iL_rec = iL_rec;
results(hidx).Vout_rec = Vout_rec;
results(hidx).t = t;
fprintf('滞环宽度 h=%.1fA: 平均开关频率=%.1f kHz, THD=%.2f%%, 输出电压=%.1fV\n', ...
h, fs_avg/1e3, THD, results(hidx).Vout_avg);
end
%% 结果可视化
figure('Position', [100 100 1200 800]);
% 子图1: 不同滞环宽度下的THD对比
subplot(2,2,1);
h_plot = [results.h];
thd_plot = [results.THD];
bar(h_plot, thd_plot);
xlabel('滞环宽度 h (A)');
ylabel('THD (%)');
title('滞环宽度对THD的影响');
grid on;
% 子图2: 不同滞环宽度下的平均开关频率
subplot(2,2,2);
fs_plot = [results.fs_avg]/1e3;
bar(h_plot, fs_plot);
xlabel('滞环宽度 h (A)');
ylabel('平均开关频率 (kHz)');
title('滞环宽度对开关频率的影响');
grid on;
% 子图3: 典型滞环宽度下的电流波形对比
subplot(2,2,3);
hold on;
for hidx = [1, 3] % 取h=0.2和h=1.0对比
idx = find([results.h] == h_values(hidx));
t_plot = results(idx).t;
% 取0.1~0.12s的波形
mask = t_plot >= 0.1 & t_plot <= 0.12;
plot(t_plot(mask), results(idx).iL_rec(mask), 'LineWidth', 1);
end
hold off;
xlabel('时间 (s)');
ylabel('电感电流 (A)');
legend('h=0.2A', 'h=1.0A');
title('不同滞环宽度下的电流波形');
grid on;
% 子图4: 开关频率瞬时变化
subplot(2,2,4);
idx = find([results.h] == 0.5);
t_plot = results(idx).t;
mask = t_plot >= 0.1 & t_plot <= 0.12;
% 重新计算该段的瞬时频率
sw = switch_rec(round(0.1/dt):round(0.12/dt));
t_sw = t(round(0.1/dt):round(0.12/dt));
rising_edges = find(diff(sw) == 1);
if ~isempty(rising_edges)
periods = diff(rising_edges) * dt;
fs_inst = 1./periods;
t_fs = t_sw(rising_edges(2:end));
plot(t_fs, fs_inst/1e3, 'b-');
end
xlabel('时间 (s)');
ylabel('瞬时开关频率 (kHz)');
title('瞬时开关频率变化 (h=0.5A)');
grid on;
%% 保存结果
save('pfc_hysteresis_results.mat', 'results');
disp('仿真完成,结果已保存至 pfc_hysteresis_results.mat');
仿真结果分析
运行上述代码后,命令窗口将输出不同滞环宽度下的平均开关频率、THD和输出电压值。预期可观察到以下规律:
- 滞环宽度与开关频率:滞环宽度h增大时,电流纹波允许范围变大,开关动作频率降低,平均开关频率下降。
- 滞环宽度与THD:滞环宽度增大导致电流波形偏离正弦参考的程度增加,谐波含量上升,THD值增大。
- 输出电压稳定性:电压外环PI调节器维持输出电压在400V附近,滞环宽度变化对输出电压平均值影响较小,但纹波可能略有变化。
验证方法
执行仿真代码后,通过以下标准判定仿真是否成功:
- 仿真程序无错误运行至结束,命令窗口输出4组滞环宽度对应的数据。
- 输出电压平均值稳定在400V±5%范围内,表明电压外环工作正常。
- THD随滞环宽度增大而单调上升,平均开关频率随滞环宽度增大而单调下降,符合理论预期。
- 图形窗口显示电流波形在正弦参考附近波动,滞环宽度小的波形纹波更小。
判定标准
仿真通过的标准:①程序无错误运行,输出4组滞环宽度对应的数据;②输出电压平均值在380~420V范围内;③THD随滞环宽度增大而上升,开关频率随滞环宽度增大而下降;④电流波形在参考电流附近波动,滞环宽度小的波形纹波更小。满足以上条件即可判定滞环电流控制PFC仿真实现成功,并验证了滞环宽度对开关频率和THD的影响规律。