3. 峰值电流控制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库。
执行步骤:
- 将上述代码保存为
pfc_peak_current.py; - 在终端执行
python pfc_peak_current.py; - 观察终端输出的电压、电流误差与THD数值;
- 查看生成的
pfc_peak_current_control.png图像,确认电流波形为整流正弦包络,且与输入电压同相。
判定标准:
- 输出电压稳定在400V±10%范围内(因未加电压闭环,实际值可能略低,但应大于350V);
- 峰值电流与平均电流误差在10%~30%之间(峰值电流控制固有特性,因电流纹波导致峰值高于平均值);
- 输入电流THD小于30%(满足基本PFC要求,但不如平均电流控制效果好);
- 电感电流波形呈现高频开关纹波叠加在工频正弦包络上,且包络与输入电压同相。
结果分析与讨论
峰值电流控制PFC的固有缺点是电流峰值与平均值存在较大误差。由于控制直接限制峰值而非平均值,当占空比变化时,平均电流与峰值电流之比随输入电压瞬时值变化,导致电流波形发生畸变。从FFT分析可见,除基波外,3次、5次等奇次谐波含量较高,这是峰值电流控制PFC的典型特征。若需进一步降低THD,可改用平均电流控制或增加谐波补偿环节。