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附近,滞环宽度变化对输出电压平均值影响较小,但纹波可能略有变化。

验证方法

执行仿真代码后,通过以下标准判定仿真是否成功:

  1. 仿真程序无错误运行至结束,命令窗口输出4组滞环宽度对应的数据。
  2. 输出电压平均值稳定在400V±5%范围内,表明电压外环工作正常。
  3. THD随滞环宽度增大而单调上升,平均开关频率随滞环宽度增大而单调下降,符合理论预期。
  4. 图形窗口显示电流波形在正弦参考附近波动,滞环宽度小的波形纹波更小。
滞环电流控制PFC仿真结果示意 滞环宽度对THD影响 0.2 0.5 1.0 2.0 滞环宽度 h (A) 0% 5% 10% 15% 3.2% 4.8% 7.5% 12.1% 滞环宽度对开关频率影响 0.2 0.5 1.0 2.0 滞环宽度 h (A) 0 20k 40k 60k 55k 42k 28k 15k 电感电流波形 (h=0.2A vs h=1.0A) h=0.2A h=1.0A 参考电流 瞬时开关频率变化 (h=0.5A) 开关频率随正弦波瞬时值变化 过零附近频率高, 峰值附近频率低 平均频率约42kHz

判定标准

仿真通过的标准:①程序无错误运行,输出4组滞环宽度对应的数据;②输出电压平均值在380~420V范围内;③THD随滞环宽度增大而上升,开关频率随滞环宽度增大而下降;④电流波形在参考电流附近波动,滞环宽度小的波形纹波更小。满足以上条件即可判定滞环电流控制PFC仿真实现成功,并验证了滞环宽度对开关频率和THD的影响规律。