找回密码
 立即注册
首页 业界区 安全 使用 GeckoCircuits 设计 Buck 电源环路

使用 GeckoCircuits 设计 Buck 电源环路

俏挺喳 昨天 20:45
使用 GeckoCircuits 设计 Buck 电源环路

笔者最近发现一款开源的电力电子仿真软件 GeckoCircuits,它是由苏黎世联邦理工学院(ETH)开发的,具有极高的仿真速度,软件小巧,功能强大。本文尝试用这款软件仿真一下 Buck 电路及其控制环路。
电路搭建


  • 打开 GeckoCircuits,这是软件的主界面。
1.png


  • 从软件界面右侧的工具栏中找到 Circuit 元件组,使用里面的电路元件搭建 Buck 电路。
2.png


  • 电路参数设置:

\[U_{dc}=20V \\ L=300\mu H \\C=100\mu F \\R=10\Omega \]

  • 注意开关下方显示 "no gate-signal",那么接下来需要添加对应的信号源。
设置信号源


  • 找到 Signal/Sink 元件组,使用 Signal Source 作为开关的信号源。波形选择方波 (RECTANGLE),最大幅度值 (amplMAX)、频率 (f)、占空比 (d) 等参数先不填写,勾选 "Use external parameters",这样方便将参数连接到控制器。
3.png


  • 放置 Gate Control 元件,在属性菜单中选择开关元件的标号,这样就将栅极驱动信号连接到了开关上。
4.png


  • 放置 Constant Value 元件,设置数值并连接到信号源参数的输入。参数设置:

\[amplMAX=1 \\f=50e3 \\offset=0 \\phase=0 \\duty=0.5 \]

  • 这时的信号连接图:
5.png
小信号分析


  • 找到 Measure 元件组,放置 Voltage Measurement 元件,设置需要测量电压的网络名称:
6.png


  • 找到 Special 元件组,放置 Small Signal Analysis (SSA) 元件,对该电路传递函数 \(G_{vd}(s)\)(即输出电压对占空比的传递函数)进行小信号分析。
  • signal 连接大信号(一个固定占空比数值 0.5),out 连接需要被扰动的对象 duty,measure 连接输出信号 \(V_{out}\):
7.png


  • SSA 参数设置:

\[Ampl=20e-3 \\f_{Base}=10 \\f_{Max}=10e3\]
意思是对比占空比施加 2% 的扰动,扰动起始频率为 10Hz,最大频率为 10000 Hz。扰动幅度值需要反复调试,该值过大或过小都可能导致结果不准确。

  • 按 F5 设置仿真参数:
    仿真步距 (dt) 为 100 ns,仿真时长 (t_SIM) 为 100 ms,仿真断点 (t_BR) 暂不使用。
8.png


  • 按 F1 运行仿真,仿真结束时菜单栏会有 "stopped after xxxx" 的提示,双击 SSA 元件,查看分析结果。
9.png


  • 下面用理论值验证分析结果,Buck 电路的传递函数为:

\[G_{vd}(s) = \frac{\hat{V}_{out}}{\hat{d}} = \frac{D \cdot V_{in}}{s^2 \cdot R \cdot L \cdot C + s \cdot L + R}\]
在 Python 中使用 scipy.signal.lti 模块绘制该函数,并与 SSA 输出的 Bode 图进行对比:
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from scipy import signal
  4. # Buck转换器参数
  5. Vin = 20.0        # 输入电压 (V)
  6. Vout = 10.0       # 输出电压 (V)
  7. f_sw = 50e3       # 开关频率 (Hz)
  8. L = 300e-6        # 电感值 (H)
  9. C = 100e-6        # 电容值 (F)
  10. ESR = 0           # 电容的等效串联电阻 (欧姆)
  11. RL = 10.0         # 负载电阻 (欧姆)
  12. # 占空比
  13. D = Vout / Vin
  14. # 定义Buck转换器的传递函数
  15. # 使用小信号模型:
  16. # Gvd(s) = Vout(s)/D(s),其中Vin为常数
  17. # 传递函数的系数
  18. # 分子: [D * Vin]
  19. # 分母: [L*C, L/RL + ESR*C, 1]
  20. num = [D * Vin]
  21. den = [L*C, L/RL + ESR*C, 1]
  22. # 创建传递函数
  23. buck_tf = signal.TransferFunction(num, den)
  24. # 生成Bode图的频率范围
  25. frequencies = np.logspace(1, 7, 1000)  # 10 Hz 到 10 MHz
  26. omega = 2 * np.pi * frequencies
  27. # 生成Bode图
  28. fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))
  29. # 获取Bode图数据
  30. w, mag, phase = signal.bode(buck_tf, omega)
  31. # 幅度图
  32. ax1.semilogx(w, mag)
  33. ax1.set_ylabel('(dB)')
  34. ax1.set_title('')
  35. ax1.grid(True, which="both", ls="-", alpha=0.3)
  36. # 相位图
  37. ax2.semilogx(w, phase)
  38. ax2.set_xlabel('(Rad/s)')
  39. ax2.set_ylabel('(Degree)')
  40. ax2.grid(True, which="both", ls="-", alpha=0.3)
  41. plt.tight_layout()
  42. plt.show()
  43. # 计算附加参数
  44. # 零频率幅度 (在 ω = 0 处)
  45. zero_freq_mag = 20 * np.log10(abs(D * Vin))
  46. # 谐振频率 (无阻尼自然频率)
  47. omega_n = 1 / np.sqrt(L * C)
  48. f_res = omega_n / (2 * np.pi)
  49. # 穿越频率 (幅度为 0 dB 处的频率)
  50. # 查找幅度穿越 0 dB 的频率
  51. # 通过插值找到更精确的穿越频率
  52. mag_linear = 10**(mag/20)
  53. mag_diff = mag_linear - 1  # 与 1 (0 dB) 的差值
  54. # 查找符号变化的位置
  55. idx = np.where(np.diff(np.sign(mag_diff)))[0]
  56. if len(idx) > 0:
  57.     # 线性插值找到更精确的穿越频率
  58.     i = idx[0]
  59.     freq1, freq2 = w[i], w[i+1]
  60.     mag1, mag2 = mag_linear[i], mag_linear[i+1]
  61.     # 线性插值计算穿越频率
  62.     cross_freq = freq1 + (freq2 - freq1) * (1 - mag1) / (mag2 - mag1)
  63. else:
  64.     cross_freq = None
  65. # 打印传递函数详情
  66. print(f"Buck转换器传递函数:")
  67. print(f"占空比 (D) = {D:.2f}")
  68. print(f"传递函数: {num[0]:.2f} / ({den[0]:.2e}s^2 + {den[1]:.2e}s + 1)")
  69. print(f"零频率幅度: {zero_freq_mag:.2f} dB")
  70. print(f"谐振频率: {f_res:.2f} Hz ({omega_n:.2f} 弧度/秒)")
  71. if cross_freq is not None:
  72.     print(f"穿越频率: {cross_freq:.2f} 弧度/秒 ({cross_freq/(2*np.pi):.2f} Hz)")
  73. else:
  74.     print("穿越频率: 在频率范围内未找到")
复制代码
Python 输出结果如下:
  1. Buck转换器传递函数:
  2. 占空比 (D) = 0.50
  3. 传递函数: 10.00 / (3.00e-08s^2 + 3.00e-05s + 1)
  4. 零频率幅度: 20.00 dB
  5. 谐振频率: 918.88 Hz (5773.50 弧度/秒)
  6. 穿越频率: 19135.73 弧度/秒 (3045.55 Hz)
复制代码
10.png
与理论值相比较,SSA 生成的 Bode 图在零频处增益约为 25 dB,谐振频率约为 5000 rad/s,穿越频率约为 28000 rad/s。波形与理论值接近。
控制器设计


  • 搭建一个电压反馈环路,环路设定值为 10 V,控制器使用 2P1Z 补偿器。信号连接如下图:
11.png
解释一下其中用到的模块:SUB 是减法器,用于计算输出电压与环路设定值之间的差。右上角带红色箭头的元件是波形查看器 (Scope),它被连接到电压测量器上用于查看输出电压。H(S) 是传递函数模块,P 是增益模块 (GAIN),其实也属于传递函数的一部分,单独用来设置增益。P 模块设置为 30,H(S) 模块设置两个极点一个零点:
12.png
SSA 模块放置在 SUB 和 H(S) 模块之间,用于分析补偿后的开环传递函数:

\[H(s)*G_{vd}(s)=\frac{\hat{V}_{out}}{\hat{V}_e} \]

  • 然后运行仿真,查看 SSA 生成的结果。
13.png
在 6000 rad/s 处增益值有一个尖峰,这是 Buck 电路的谐振峰,它的位置和补偿前没太大变化。在高频处,相位值反复上下跳动,这在理论值波形中并没有这个现象。其实这是由于软件相位值的显示刻度不能缩放,显示范围有限,超出范围的部分会跳变到另一端。
查看时域波形


  • 将 SSA 模块去掉,将 SUB 直接和 H(S) 连接,再次运行仿真。点开 Scope 模块,查看时域波形:
14.png
总结

这款软件使用起来总体感觉是非常流畅的,软件的 UI 界面非常简洁和美观。软件是用 Java 语言写的,需要运行在 JVM 上,这点需要注意。不足点的话,SSA 模块有些 bug,比如运行时,如果设置的参数有误,比如设置的仿真时间低于了最低的扫频频率,那么运行完之后,这个模块就点不进去了,只能删掉重新放置一个。此外,软件还可以磁仿真、热仿真,自定义模块可以嵌入 C/C++, Java 等语言,可以说功能十分强大,后续使用之后再来分享。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册