3. DCM Boost PFC 的占空比与电感设计
任务目标
在 DCM(断续导通模式)Boost PFC 中,开关周期内电感电流会降到零。设输入电压 vin(t)=Vm·|sin(ωt)|,输出电压 Vo,开关周期 Ts,电感 L。DCM 下峰值电流 ipk=vin·D·Ts/L,由伏秒平衡可得占空比关系:
D(t) = sqrt(2·L·(Vo-vin(t)) / (Ts·Vo·vin(t)))
要让输入电流包络接近正弦,需保证在每个工频半周内电感电流峰值 ipk(t) 与 vin(t) 成正比,即 ipk(t)=k·vin(t)。本案例用数值方法:给定 Vm、Vo、Ts、L,计算全工频周期内的 D(t) 与 ipk(t),并验证 ipk(t)/vin(t) 是否近似恒定,从而判断电感取值是否合适。
关键公式与设计约束
- DCM 条件:
ipk·(1-D)·Ts/(2·L) < Vo不成立时进入 CCM,需检查。 - 峰值电流:
ipk(t)=vin(t)·D(t)·Ts/L。 - 正弦包络判据:
ipk(t)/vin(t)的波动率(max-min)/mean越小越好,工程上可要求 < 5%。 - 电感下限由最大占空比与 DCM 边界共同决定,本案例通过扫描
L找到满足波动率的最小电感。
完整可运行代码(Python)
import numpy as np
# 设计参数
Vm = 311.0 # 输入峰值电压 (V), 220Vrms
Vo = 400.0 # 输出电压 (V)
Ts = 1e-5 # 开关周期 (s), 100kHz
f_line = 50.0 # 工频 (Hz)
N = 2000 # 半周采样点数
t = np.linspace(0, 1/(2*f_line), N, endpoint=False)
vin = Vm * np.sin(2*np.pi*f_line*t)
vin = np.clip(vin, 1e-3, None) # 避免除零
def duty(vin, L):
# DCM 占空比
return np.sqrt(2*L*(Vo - vin) / (Ts*Vo*vin))
def ipk(vin, D, L):
return vin * D * Ts / L
def ripple_ratio(L):
D = duty(vin, L)
ip = ipk(vin, D, L)
ratio = ip / vin
return (ratio.max() - ratio.min()) / ratio.mean()
# 扫描电感,找满足波动率<5%的最小值
L_candidates = np.linspace(10e-6, 500e-6, 500)
best_L = None
for L in L_candidates:
if ripple_ratio(L) < 0.05:
best_L = L
break
print("满足正弦包络(<5%)的最小电感: %.1f uH" % (best_L*1e6))
# 用选定电感计算占空比与峰值电流
L = best_L
D = duty(vin, L)
ip = ipk(vin, D, L)
ratio = ip / vin
print("占空比范围: %.3f ~ %.3f" % (D.min(), D.max()))
print("峰值电流范围: %.2f ~ %.2f A" % (ip.min(), ip.max()))
print("ipk/vin 波动率: %.2f%%" % (ripple_ratio(L)*100))
# 验证 DCM 边界:关断期间电流是否降到零
t_off = (1 - D) * Ts
i_valley = ip - (Vo - vin) * t_off / L
print("最小谷值电流: %.4f A (应>=0 表示DCM)" % i_valley.min())
运行方式
python dcm_boost_pfc.py
依赖:numpy。无需其他库。
验证方法与通过条件
- 脚本输出“满足正弦包络(<5%)的最小电感”,说明在该电感下
ipk(t)/vin(t)波动小于 5%,输入电流包络接近正弦。 - 输出“占空比范围”应随
vin增大而减小,符合 DCM 占空比规律。 - 输出“最小谷值电流”应 ≥ 0,否则说明部分区间进入 CCM,需增大电感或调整参数。
- 若波动率始终 ≥ 5%,说明扫描范围内无合适电感,需扩大
L_candidates范围或检查Vo/Vm比例。