使用 GeckoCircuits 设计 Buck 电源环路

news/2025/11/2 20:39:57/文章来源:https://www.cnblogs.com/CIB27149/p/19185398

使用 GeckoCircuits 设计 Buck 电源环路

使用 GeckoCircuits 设计 Buck 电源环路

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

电路搭建

  • 打开 GeckoCircuits,这是软件的主界面。
  • 从软件界面右侧的工具栏中找到 Circuit 元件组,使用里面的电路元件搭建 Buck 电路。
  • 电路参数设置:

\[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",这样方便将参数连接到控制器。
  • 放置 Gate Control 元件,在属性菜单中选择开关元件的标号,这样就将栅极驱动信号连接到了开关上。
  • 放置 Constant Value 元件,设置数值并连接到信号源参数的输入。参数设置:

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

  • 这时的信号连接图:

小信号分析

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

\[Ampl=20e-3 \\ f_{Base}=10 \\ f_{Max}=10e3 \]

意思是对比占空比施加 2% 的扰动,扰动起始频率为 10Hz,最大频率为 10000 Hz。扰动幅度值需要反复调试,该值过大或过小都可能导致结果不准确。

  • 按 F5 设置仿真参数:
    仿真步距 (dt) 为 100 ns,仿真时长 (t_SIM) 为 100 ms,仿真断点 (t_BR) 暂不使用。
  • 按 F1 运行仿真,仿真结束时菜单栏会有 "stopped after xxxx[s]" 的提示,双击 SSA 元件,查看分析结果。
  • 下面用理论值验证分析结果,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 图进行对比:

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal# Buck转换器参数
Vin = 20.0        # 输入电压 (V)
Vout = 10.0       # 输出电压 (V)
f_sw = 50e3       # 开关频率 (Hz)
L = 300e-6        # 电感值 (H)
C = 100e-6        # 电容值 (F)
ESR = 0           # 电容的等效串联电阻 (欧姆)
RL = 10.0         # 负载电阻 (欧姆)# 占空比
D = Vout / Vin# 定义Buck转换器的传递函数
# 使用小信号模型:
# Gvd(s) = Vout(s)/D(s),其中Vin为常数# 传递函数的系数
# 分子: [D * Vin]
# 分母: [L*C, L/RL + ESR*C, 1]num = [D * Vin]
den = [L*C, L/RL + ESR*C, 1]# 创建传递函数
buck_tf = signal.TransferFunction(num, den)# 生成Bode图的频率范围
frequencies = np.logspace(1, 7, 1000)  # 10 Hz 到 10 MHz
omega = 2 * np.pi * frequencies# 生成Bode图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))# 获取Bode图数据
w, mag, phase = signal.bode(buck_tf, omega)# 幅度图
ax1.semilogx(w, mag)
ax1.set_ylabel('(dB)')
ax1.set_title('')
ax1.grid(True, which="both", ls="-", alpha=0.3)# 相位图
ax2.semilogx(w, phase)
ax2.set_xlabel('(Rad/s)')
ax2.set_ylabel('(Degree)')
ax2.grid(True, which="both", ls="-", alpha=0.3)plt.tight_layout()
plt.show()# 计算附加参数
# 零频率幅度 (在 ω = 0 处)
zero_freq_mag = 20 * np.log10(abs(D * Vin))# 谐振频率 (无阻尼自然频率)
omega_n = 1 / np.sqrt(L * C)
f_res = omega_n / (2 * np.pi)# 穿越频率 (幅度为 0 dB 处的频率)
# 查找幅度穿越 0 dB 的频率
# 通过插值找到更精确的穿越频率
mag_linear = 10**(mag/20)
mag_diff = mag_linear - 1  # 与 1 (0 dB) 的差值
# 查找符号变化的位置
idx = np.where(np.diff(np.sign(mag_diff)))[0]if len(idx) > 0:# 线性插值找到更精确的穿越频率i = idx[0]freq1, freq2 = w[i], w[i+1]mag1, mag2 = mag_linear[i], mag_linear[i+1]# 线性插值计算穿越频率cross_freq = freq1 + (freq2 - freq1) * (1 - mag1) / (mag2 - mag1)
else:cross_freq = None# 打印传递函数详情
print(f"Buck转换器传递函数:")
print(f"占空比 (D) = {D:.2f}")
print(f"传递函数: {num[0]:.2f} / ({den[0]:.2e}s^2 + {den[1]:.2e}s + 1)")
print(f"零频率幅度: {zero_freq_mag:.2f} dB")
print(f"谐振频率: {f_res:.2f} Hz ({omega_n:.2f} 弧度/秒)")
if cross_freq is not None:print(f"穿越频率: {cross_freq:.2f} 弧度/秒 ({cross_freq/(2*np.pi):.2f} Hz)")
else:print("穿越频率: 在频率范围内未找到")

Python 输出结果如下:

Buck转换器传递函数:
占空比 (D) = 0.50
传递函数: 10.00 / (3.00e-08s^2 + 3.00e-05s + 1)
零频率幅度: 20.00 dB
谐振频率: 918.88 Hz (5773.50 弧度/秒)
穿越频率: 19135.73 弧度/秒 (3045.55 Hz)

与理论值相比较,SSA 生成的 Bode 图在零频处增益约为 25 dB,谐振频率约为 5000 rad/s,穿越频率约为 28000 rad/s。波形与理论值接近。

控制器设计

  • 搭建一个电压反馈环路,环路设定值为 10 V,控制器使用 2P1Z 补偿器。信号连接如下图:

解释一下其中用到的模块:SUB 是减法器,用于计算输出电压与环路设定值之间的差。右上角带红色箭头的元件是波形查看器 (Scope),它被连接到电压测量器上用于查看输出电压。H(S) 是传递函数模块,P 是增益模块 (GAIN),其实也属于传递函数的一部分,单独用来设置增益。P 模块设置为 30,H(S) 模块设置两个极点一个零点:

main-interface

SSA 模块放置在 SUBH(S) 模块之间,用于分析补偿后的开环传递函数:

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

  • 然后运行仿真,查看 SSA 生成的结果。

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

查看时域波形

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

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/953788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第k小的数的分治算法

include using namespace std; int x=100; int rr(int b[],int left,int right) { int m=left,n=right+1; int h=b[left]; while(1) { while(b[++m]<h&&m<right); while(b[--n]>h); if(m>=n) { br…

Day29-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\reflect

单元测试 Junit单元测试框架package Basic.src.com.Junit;public class StringUtil {public static void printNumber(String name) {if (name == null) {System.out.println(0);return;//停掉方法}System.out.println…

k8s-Pod中的网络通信(3)

部署的pod都会涉及到和内外网络通信,我们部署的pod 有一个ip,这个IP 是集群内部的IP ,只能在集群内被访问,k8s中pod的网路通信是交给service来管理的,简称svc。负责将外部流量引入,和内部流量引出。 1.外部流量访…

一个灵感:思维的断章

一个灵感:思维的断章 它来时,没有预兆。 不是在逻辑的链条上规行矩步,也不是在记忆的仓库里按图索骥。它诞生于一片更为辽阔、更为混沌的模糊空间。 那片空间,是意识的背景辐射,是思想形成之前的星云。那里,概念…

第十届中国大学生程序设计竞赛 哈尔滨站(CCPC 2024 Harbin Site)

第十届中国大学生程序设计竞赛 哈尔滨站(CCPC 2024 Harbin Site)比赛链接 Review 因为下周就要“一起哈啤”,所以这周末来 VP 去年的“一起哈啤”,然而已经一个多月没写代码了! 开题顺序依旧,看了个 J 感觉还挺可…

CSP-S 回顾

开考后发现自己穿了一个绒秋裤,考场上要被热死了,不断通过喝水降低体温。 $1min$ 第一题一下想到$DP和反悔贪心$,还好学了(汗) $1min 1s$否决掉了$DP$ $20min$ 奶龙考试时遇到了一些问题: 优先队列pair<int,p…

https://heylink.me/tizihacks/

https://heylink.me/tizihacks/https://heylink.me/tizihacks/

2025CSP-J游记

今年是最后一次打J组了,考的还可以。 上考场了,心想必将 J组 \(AK\),我带着信心又有点慌进考场了。 先看 \(T_1\) \(T_1\) 我感觉隔壁同学(好像是华辰的)语文挺好,看题好快,迅速开打。 \(应该是“最难的题”了吧…

通达信:引用函数 - Leone

DRAWNULL 无效数返回无效数。用法: DRAWNULL例如: IF(CLOSE>REF(CLOSE,1),CLOSE,DRAWNULL)表示下跌时不画线。 BACKSET 向前赋值用法: BACKSET(X,N),若X非0,则将当前位置到N周期前的数值设为1. 例如: BACKSET(CLO…

项目架构

聊天机器人项目架构

CSP总结

DAY-1 机房里萦绕着一种特有的氛围,我复习了 \(wiki\) 上的数学与 \(DP\) 章节(但并没有用到)。 DAY1 8点到校,或许是前一天没睡好的缘故,在车上就想睡觉,于是在原本几乎全车人都很活跃的时间段里没有什么参与。…

AI泡沫再思考:技术革命与投资狂潮的真相

本文探讨了当前AI领域的投资泡沫现象与技术发展前景,分析了AGI实现时间表、就业市场影响以及初创企业生存率等关键问题,指出技术突破与市场震荡并存的复杂性。重新审视AI泡沫 | Daniel Miessler 为什么重大崩盘、AGI…

[群表示论]基本概念

取基础域为 \(\mathbb k\). 令 \(G\) 是一个群,同态 \(\rho\colon\ G\longrightarrow GL(V)\) 给出 \(G\) 的表示 \((V,\rho)\),其中 \(V\) 是线性空间. 我们称 \(V\) 是 \(G-\)模. 令 \(V\) 是 \(G-\)模,\(W\) 是 …

P14362 [CSP-S 2025] 道路修复

题目大意 给定 \(n\) 个点,\(m\) 条边的无向图且有边权,有 \(k\) 个额外点,每个额外点向这 \(n\) 个点连边,且额外点有点权,求最小生成树。 \(n\leq 1e4\),\(m\leq 1e6\),\(k\leq 10\)。 Sol 从考场思路改了一点…

10.30总结

1.早点休息了明天去泰山

基于 Maxwell 实现 MySQL 数据实时迁移到 Mongodb

在 DB 运维层而非应用层实现需求,以降低应用层的业务侵入性及性能影响。 maxwell 是一款 ETL 工具,基本原理是 实时解析 MySQL 的 binlog 丢到相应的 MQ 中供具体业务逻辑去消费。 比如最典型的一种大数据日志路径:…

CSP2025-S 坠机记

CSP2025-S 坠机记 省流:未能完成 AK 的心愿。初赛随便考的,94 分。 复赛依然是在七高,成功在 14:20 抵达教室,发现我所在的机房电脑性能要烂一些,然而键盘要好一些,应该是好事。位置是靠窗,比较好,开考前准备写…

世界计划:无法歌唱的初音未来

标题是骗你点进来的。 Day 0 上午爽爽玩神秘构造小游戏,连砍到 C 不知道多少。 然后写了点 AGC 题,感觉都很水啊,自己强爆了。 中午回去刷本,fgo 真特么好玩。 下午进考场,发现自己的座位附近散布了一堆熟人,但貌…

11.2 每日一题 赦免战俘

本题要求将一个矩阵分为四个子矩阵,在将四个子矩阵不断继续分成个子矩阵,直到无法分出,并且每次对左上角的矩阵进行处理。 本题可用dfs对矩阵不断进行划分如图所示,我们的目标为对每次划分出来的矩阵的左上角进行处…