3. 峰值电流控制PFC仿真

峰值电流控制PFC仿真 学习卡片

任务定义

本案例面向单相Boost PFC变换器,实现峰值电流控制(Peak Current Control, PCC)的数字仿真模型。目标为:在给定输入电压与负载条件下,验证PCC控制下电感电流波形是否跟踪输入电压波形,量化电流峰值与平均值之间的误差(即峰值与平均值之差相对平均值的百分比),并通过FFT分析输入电流的THD(总谐波失真),评估谐波含量是否满足预期。

控制原理与实现方案

峰值电流控制PFC的核心思想是:当电感电流上升到由基准信号(与输入电压同相的正弦半波)决定的阈值时,关断开关管;当开关管导通时间达到最大值或电感电流过零时,重新开通。本案例采用固定开关频率下的峰值电流控制,在每个开关周期内,比较电感电流采样值与基准值,当电流达到基准时关断MOSFET,直至下一个周期开始重新导通。

仿真模型基于以下方程构建:

  • 输入电压:v_in(t) = V_peak * sin(2πft),其中V_peak=311V(220V RMS),f=50Hz
  • Boost电感:L=1mH,开关频率f_sw=100kHz
  • 输出负载:R=100Ω,输出电容C=470μF,输出电压目标V_out=400V
  • 控制基准:i_ref(t) = k * v_in(t),其中k为比例系数,由输出功率决定

仿真采用离散时间步进法,时间步长Δt=1μs(即每个开关周期采样100点),在Python中实现数值积分。

仿真代码实现

import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft, fftfreq

# 参数定义
V_peak = 311          # 输入电压峰值 (V)
f_line = 50           # 工频 (Hz)
L = 1e-3              # 电感 (H)
C = 470e-6            # 输出电容 (F)
R_load = 100          # 负载电阻 (Ω)
V_out_target = 400    # 目标输出电压 (V)
f_sw = 100e3          # 开关频率 (Hz)
T_sw = 1 / f_sw       # 开关周期 (s)
dt = 1e-6             # 仿真步长 (s)
sim_time = 0.1        # 仿真时长 (s),10个工频周期

# 控制参数
k_p = 0.002           # 电流基准比例系数(需根据功率调整)
V_out = 0             # 输出电压初始值
i_L = 0               # 电感电流初始值
i_load = 0            # 负载电流

# 数据记录
time_points = np.arange(0, sim_time, dt)
n_points = len(time_points)
i_L_record = np.zeros(n_points)
v_in_record = np.zeros(n_points)
v_out_record = np.zeros(n_points)
switch_state = np.zeros(n_points)

# 仿真主循环
for idx, t in enumerate(time_points):
    # 输入电压
    v_in = V_peak * np.sin(2 * np.pi * f_line * t)
    v_in_record[idx] = v_in
    
    # 电流基准(与输入电压同相)
    i_ref = k_p * abs(v_in)
    
    # 开关状态判断(峰值电流控制)
    # 在每个开关周期开始时导通,当电流达到基准时关断
    cycle_pos = (t % T_sw) / T_sw  # 当前开关周期内的位置 (0~1)
    
    if cycle_pos < 0.1:  # 每个周期开始10%时间内强制导通(最小导通时间)
        switch_on = True
    elif i_L >= i_ref:   # 电流达到基准,关断
        switch_on = False
    else:
        switch_on = True  # 未达到基准,保持导通
    
    switch_state[idx] = 1 if switch_on else 0
    
    # 电路方程(前向欧拉法)
    v_L = v_in - (0 if switch_on else V_out)  # 开关导通时电感电压为vin,关断时为vin - V_out
    di_L_dt = v_L / L
    i_L_new = i_L + di_L_dt * dt
    
    # 输出电容充放电
    i_diode = i_L if not switch_on else 0  # 开关关断时电感电流流向输出
    i_load = V_out / R_load
    dv_out_dt = (i_diode - i_load) / C
    V_out_new = V_out + dv_out_dt * dt
    
    # 更新状态
    i_L = max(0, i_L_new)  # 电感电流不能为负
    V_out = max(0, V_out_new)
    
    # 记录数据
    i_L_record[idx] = i_L
    v_out_record[idx] = V_out

# 稳态分析(取最后2个工频周期)
steady_start = int(0.08 / dt)
t_steady = time_points[steady_start:]
i_L_steady = i_L_record[steady_start:]
v_in_steady = v_in_record[steady_start:]

# 1. 电流峰值与平均值误差分析
# 提取正半周峰值电流
peak_indices = []
for i in range(1, len(i_L_steady)-1):
    if i_L_steady[i] > i_L_steady[i-1] and i_L_steady[i] > i_L_steady[i+1]:
        if i_L_steady[i] > 1:  # 忽略过零附近的微小波动
            peak_indices.append(i)

peak_currents = i_L_steady[peak_indices]
avg_current = np.mean(i_L_steady[i_L_steady > 0.1])  # 正半周平均电流

# 计算峰值与平均值误差
if len(peak_currents) > 0:
    peak_avg = np.mean(peak_currents)
    error_pct = (peak_avg - avg_current) / avg_current * 100
else:
    peak_avg = 0
    error_pct = 0

# 2. FFT谐波分析
# 对输入电流(即电感电流正半周包络)进行FFT
# 取最后2个工频周期(0.04s)的数据
fft_window = int(0.04 / dt)
i_L_fft = i_L_record[-fft_window:]
t_fft = time_points[-fft_window:]

# 去除直流分量
i_L_ac = i_L_fft - np.mean(i_L_fft)

# FFT计算
N = len(i_L_ac)
yf = fft(i_L_ac)
xf = fftfreq(N, dt)
yf_mag = np.abs(yf[:N//2]) * 2 / N
xf_pos = xf[:N//2]

# 提取基波(50Hz)和谐波
f_fund = 50
fund_idx = np.argmin(np.abs(xf_pos - f_fund))
fund_mag = yf_mag[fund_idx]

# 计算THD(考虑2~20次谐波)
thd_sum = 0
for h in range(2, 21):
    h_idx = np.argmin(np.abs(xf_pos - h * f_fund))
    thd_sum += yf_mag[h_idx]**2
thd = np.sqrt(thd_sum) / fund_mag * 100

# 输出结果
print(f"=== 峰值电流控制PFC仿真结果 ===")
print(f"输出电压: {V_out:.1f} V")
print(f"平均电流(正半周): {avg_current:.3f} A")
print(f"峰值电流平均值: {peak_avg:.3f} A")
print(f"峰值-平均值误差: {error_pct:.2f}%")
print(f"输入电流THD (2~20次): {thd:.2f}%")

# 绘制波形
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))

# 波形图
ax1.plot(t_steady, i_L_steady, 'b-', linewidth=0.5, label='电感电流')
ax1.plot(t_steady, v_in_steady/100, 'r--', label='输入电压(缩小100倍)')
ax1.set_xlabel('时间 (s)')
ax1.set_ylabel('电流 (A)')
ax1.set_title('电感电流与输入电压波形')
ax1.legend()
ax1.grid(True)

# FFT频谱图
ax2.stem(xf_pos[:2000], yf_mag[:2000], linefmt='b-', markerfmt='bo', basefmt='r-')
ax2.set_xlim(0, 1000)
ax2.set_xlabel('频率 (Hz)')
ax2.set_ylabel('幅值 (A)')
ax2.set_title('输入电流频谱')
ax2.grid(True)

plt.tight_layout()
plt.savefig('pfc_peak_current_control.png', dpi=150)
plt.show()

运行与验证方法

运行环境:Python 3.8+,需安装numpy、matplotlib、scipy库。

执行步骤:

  1. 将上述代码保存为pfc_peak_current.py;
  2. 在终端执行python pfc_peak_current.py;
  3. 观察终端输出的电压、电流误差与THD数值;
  4. 查看生成的pfc_peak_current_control.png图像,确认电流波形为整流正弦包络,且与输入电压同相。

判定标准:

  • 输出电压稳定在400V±10%范围内(因未加电压闭环,实际值可能略低,但应大于350V);
  • 峰值电流与平均电流误差在10%~30%之间(峰值电流控制固有特性,因电流纹波导致峰值高于平均值);
  • 输入电流THD小于30%(满足基本PFC要求,但不如平均电流控制效果好);
  • 电感电流波形呈现高频开关纹波叠加在工频正弦包络上,且包络与输入电压同相。

结果分析与讨论

峰值电流控制PFC的固有缺点是电流峰值与平均值存在较大误差。由于控制直接限制峰值而非平均值,当占空比变化时,平均电流与峰值电流之比随输入电压瞬时值变化,导致电流波形发生畸变。从FFT分析可见,除基波外,3次、5次等奇次谐波含量较高,这是峰值电流控制PFC的典型特征。若需进一步降低THD,可改用平均电流控制或增加谐波补偿环节。

峰值电流控制PFC仿真验证观测点 交流输入 ~50Hz 整流 L A Q G极驱动 D B C R 电流采样 电压采样 峰值电流控制器 1. 生成正弦基准 i_ref = k·|vin| 2. 比较 i_L 与 i_ref 3. 输出PWM驱动信号 PWM 观测点与验证指标 ① 电感电流波形(示波器通道1) ② 输出电压(万用表/示波器通道2) ③ 电流峰值与平均值误差计算 ④ FFT频谱分析(谐波含量) 判定标准 • 输出电压稳定在 400V ± 10% • 峰值-平均值误差:10% ~ 30% • 输入电流THD < 30% • 电流包络与输入电压同相 预期波形:电感电流为整流正弦包络 + 高频纹波