1. Buck变换器开环仿真
任务说明
搭建一个Buck变换器开环仿真模型,输入电压Vin=24V,开关频率fsw=100kHz,电感L=330μH,电容C=470μF,负载电阻R=10Ω。通过改变PWM占空比D(分别取0.25、0.50、0.75),观察稳态输出电压波形,验证Buck电路基本关系Vout=D·Vin。
仿真模型实现
采用Python搭建Buck变换器的时域仿真模型。模型基于状态空间平均法,在每个开关周期内分别求解开关管导通(0≤t<DTsw)和关断(DTsw≤t<Tsw)两个子区间的电路微分方程,使用四阶Runge-Kutta法进行数值积分。仿真持续20ms(2000个开关周期),确保电路达到稳态后提取输出电压波形。
Python仿真代码
import numpy as np
import matplotlib.pyplot as plt
# Buck变换器参数
V_in = 24.0 # 输入电压 (V)
L = 330e-6 # 电感 (H)
C = 470e-6 # 电容 (F)
R = 10.0 # 负载电阻 (Ω)
f_sw = 100e3 # 开关频率 (Hz)
T_sw = 1.0 / f_sw # 开关周期 (s)
def buck_simulation(D, sim_time=20e-3, dt=1e-8):
"""Buck变换器开环时域仿真(状态空间平均法 + RK4)"""
n_steps = int(sim_time / dt)
t = np.zeros(n_steps)
iL = np.zeros(n_steps) # 电感电流
vC = np.zeros(n_steps) # 电容电压(输出电压)
# 初始状态
iL[0] = 0.0
vC[0] = 0.0
for k in range(n_steps - 1):
t[k+1] = t[k] + dt
phase = (t[k] % T_sw) / T_sw # 当前周期内的相位 (0~1)
sw_on = phase < D # 开关管导通状态
# 状态方程: dx/dt = A*x + B*V_in
# 状态变量 x = [iL, vC]
def f(x, sw):
i, v = x
if sw: # 开关导通: V_in - L*di/dt - v = 0
di_dt = (V_in - v) / L
else: # 开关关断: 二极管续流
di_dt = -v / L
dv_dt = (i - v / R) / C
return np.array([di_dt, dv_dt])
# RK4积分
x = np.array([iL[k], vC[k]])
k1 = f(x, sw_on)
k2 = f(x + 0.5*dt*k1, sw_on)
k3 = f(x + 0.5*dt*k2, sw_on)
k4 = f(x + dt*k3, sw_on)
x_next = x + (dt/6.0) * (k1 + 2*k2 + 2*k3 + k4)
iL[k+1] = x_next[0]
vC[k+1] = x_next[1]
return t, vC, iL
# 扫描不同占空比
duty_cycles = [0.25, 0.50, 0.75]
results = {}
for D in duty_cycles:
t, vC, iL = buck_simulation(D)
results[D] = (t, vC, iL)
# 计算稳态平均值(取最后5ms)
steady_mask = t > 15e-3
v_avg = np.mean(vC[steady_mask])
print(f"D={D:.2f}: V_out(avg) = {v_avg:.3f} V, 理论值 = {D*V_in:.3f} V")
# 绘制输出电压波形
fig, axes = plt.subplots(3, 1, figsize=(10, 9), sharex=True)
for idx, D in enumerate(duty_cycles):
t, vC, _ = results[D]
ax = axes[idx]
# 只显示最后2ms的稳态波形
mask = t > 18e-3
ax.plot(t[mask]*1e3, vC[mask], linewidth=1.2, color=f'C{idx}')
ax.axhline(y=D*V_in, color='gray', linestyle='--', linewidth=0.8)
ax.set_ylabel(f'D={D:.2f}\nV_out (V)')
ax.set_ylim(0, 25)
ax.grid(True, alpha=0.3)
ax.text(19.8, D*V_in+0.8, f'{D*V_in:.1f}V', fontsize=9, ha='right')
axes[-1].set_xlabel('时间 (ms)')
axes[0].set_title('Buck变换器开环仿真 - 不同占空比下的输出电压波形')
plt.tight_layout()
plt.savefig('buck_openloop.png', dpi=150)
plt.show()
运行与验证
运行方式:将上述代码保存为buck_openloop.py,在已安装NumPy和Matplotlib的Python环境中执行python buck_openloop.py。
验证方法:程序会输出三个占空比对应的稳态平均电压,并生成输出电压波形图。判定标准:
- D=0.25时,稳态输出电压约为6.0V(理论值6.0V);
- D=0.50时,稳态输出电压约为12.0V(理论值12.0V);
- D=0.75时,稳态输出电压约为18.0V(理论值18.0V);
- 波形图中可见输出电压在稳态值附近有微小纹波(纹波幅值约数十毫伏量级),且随占空比增大,输出电压线性升高。
若三个占空比下的稳态电压与理论值偏差均在±0.1V以内,且波形无发散或明显振荡,则仿真模型正确,Buck变换器基本工作原理得到验证。