拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ubuntu下ngspice与KiCAD电路仿真入门:从DC到AC分析实战

Ubuntu下ngspice与KiCAD电路仿真入门:从DC到AC分析实战 1. 为什么要在Ubuntu上折腾ngspice加KiCAD这套组合很多人第一次接触电路仿真第一反应是打开浏览器找个在线工具拖几个元件、连几根线、点一下运行看到波形跳出来就觉得自己会仿真了。这种体验确实爽但它有个致命问题你永远不知道仿真器背后到底在算什么模型参数从哪来收敛失败的时候该调什么。等到真正要做一个有几十个节点、带反馈环路的电路时在线工具要么跑不动要么给你一个莫名其妙的错误然后什么都不解释。我自己的路径是从在线工具转到桌面级开源方案的。ngspice是SPICE家族的第三代开源实现血统可以追溯到伯克利那套经典的SPICE3支持DC、AC、瞬态、噪声、温度扫描等各种分析类型而且完全免费、源码开放。KiCAD则是目前开源EDA里生态最完整的工具链原理图绘制、PCB布局、Gerber输出一条龙从KiCAD 6开始内置了ngspice作为仿真引擎意味着你画完原理图可以直接在同一个界面里跑仿真不用导出网表再手动改。那为什么强调Ubuntu环境因为这套组合在Linux下的体验和Windows下完全是两回事。Windows上你要么装个臃肿的安装包要么在WSL里折腾路径映射而Ubuntu下一条apt install就能把ngspice装好KiCAD也有官方PPA版本更新及时。更重要的是ngspice的批处理模式在Linux终端里跑起来非常顺手配合脚本可以做参数扫描和自动化分析这是图形界面给不了的。这篇文章面向的是刚接触电路仿真、手头有一台Ubuntu机器、想认认真真把AC和DC分析跑通的新手。我不会只给你一串命令让你照抄而是把每个步骤背后的原因讲清楚——为什么选这个模型、为什么设这个参数、波形不对的时候先怀疑哪里。读完你应该能独立完成一个RC低通滤波器的DC扫描和AC扫频并且知道怎么把同样的方法套到Buck电路或者RC振荡电路上。提示本文所有操作在Ubuntu 22.04 LTS和Ubuntu 24.04 LTS上验证过KiCAD版本为7.x和8.xngspice版本为38和40。如果你用的是更老的版本部分菜单路径可能有差异但核心逻辑不变。2. 环境搭建从裸机到能跑仿真的完整链路2.1 Ubuntu下安装ngspice和KiCAD的正确姿势先说ngspice。Ubuntu官方仓库里就有直接sudo apt update sudo apt install ngspice装完之后在终端敲ngspice --version应该能看到版本号和编译选项。这里有个细节要注意Ubuntu仓库里的ngspice默认可能没开--enable-xspice和--enable-cider这些高级选项对于初学者做AC/DC分析完全够用但如果你后面要跑BSIM模型或者XSPICE数字混合仿真可能需要自己编译。我建议新手先用仓库版本跑通流程遇到瓶颈再考虑源码编译。KiCAD的安装稍微讲究一点。Ubuntu仓库里的版本往往偏旧推荐用官方PPAsudo add-apt-repository ppa:kicad/kicad-8.0-releases sudo apt update sudo apt install kicad如果你想要最新的稳定版把8.0换成对应的版本号即可。安装包比较大包含符号库、封装库、3D模型下载时间取决于网络。装完之后第一次启动KiCAD它会问你要不要导入旧版本配置全新安装直接跳过。这里有个很多人踩过的坑KiCAD的符号库和ngspice的模型库是两套东西。KiCAD符号库里自带的元件符号有些带了SPICE模型关联有些不带。你在原理图里放一个电阻它默认用的是理想电阻模型只有R值没有寄生参数。如果你需要更真实的仿真得手动给元件指定模型文件。这个后面会详细讲。2.2 验证ngspice能否独立工作在碰KiCAD之前先确保ngspice本身是活的。建一个最简单的网表文件比如叫test.cir* Simple voltage divider V1 1 0 DC 10 R1 1 2 1k R2 2 0 1k .op .end然后在终端跑ngspice -b test.cir-b表示批处理模式跑完直接输出结果到终端。你应该能看到节点2的电压是5V电源电流是5mA。如果这一步就报错那说明ngspice安装有问题先解决这个再往下走。注意网表文件的第一行在SPICE里是标题行会被忽略。很多人把元件写在第一行结果仿真器不认就是因为这个。养成习惯第一行永远写注释或者标题。2.3 KiCAD里启用仿真器的隐藏开关KiCAD 7和8都内置了ngspice但默认的仿真界面需要手动调出来。打开KiCAD主界面进入原理图编辑器Eeschema在菜单栏找工具→仿真器。如果这个选项是灰的说明你的原理图里还没有任何带仿真模型的元件或者KiCAD没检测到ngspice。另一个容易忽略的点KiCAD的仿真器依赖系统里的ngspice共享库。如果你是从PPA装的KiCAD它通常会自带一份ngspice但如果你系统里也装了ngspice可能会出现版本冲突。检查方法是看KiCAD仿真器启动时终端有没有报库加载错误。如果有最简单的办法是卸载系统ngspice让KiCAD用自己的sudo apt remove ngspice但这样你就没法在终端直接用ngspice了。我的建议是保留系统ngspice如果KiCAD仿真器能用就不管它真出问题了再排查。3. 用KiCAD画一个能仿真的RC低通滤波器3.1 原理图绘制中的仿真相关设置打开KiCAD新建工程命名比如rc_lpf。进入原理图编辑器从符号库放几个元件一个电压源Device:VSOURCE或者Simulation_SPICE:VDC、一个电阻Device:R、一个电容Device:C、一个接地power:GND。这里的关键区别在于普通Device:R和Simulation_SPICE库里的元件在仿真行为上不一样。Device:R在KiCAD里默认关联了一个理想电阻的SPICE模型可以直接仿真。但如果你想用更精确的模型比如带温度系数的电阻就得从Simulation_SPICE库里选或者手动编辑元件的仿真模型字段。连线的时候注意KiCAD的仿真器需要电路有明确的参考地。power:GND符号会自动把所在节点标记为节点0这是SPICE的约定。如果你自己画一个地符号但没关联到GND网络仿真会报no ground node错误。放好元件后双击每个元件设置参数。电阻设10k电容设100nF电压源设AC 1V、DC 0V。电压源的设置里有个Simulation Model选项卡里面可以填DC值、AC幅度和相位。对于AC分析AC幅度必须非零否则输出全是零。3.2 从原理图生成SPICE网表的底层逻辑KiCAD生成网表的过程本质上是把图形化的连接关系翻译成SPICE能读的文本。你可以通过工具→生成网表→SPICE网表来手动导出也可以直接在仿真器里让它自动生成。导出的网表大概长这样.title rc_lpf V1 1 0 DC 0 AC 1 R1 1 2 10k C1 2 0 100n .end注意KiCAD自动给节点编号你的原理图里看不到这些编号但网表里必须有。这也是为什么有时候你改了原理图但仿真结果没变——可能是网表没重新生成。KiCAD的仿真器每次运行都会重新生成网表所以一般不用担心但如果你手动导出过网表再用ngspice跑记得重新导出。提示KiCAD的SPICE网表导出功能在调试时非常有用。当你怀疑仿真器行为不对时导出网表用终端ngspice跑一遍对比结果能快速定位是原理图问题还是仿真器问题。3.3 在KiCAD仿真器里跑第一个DC工作点原理图画好、参数设好之后点工具→仿真器打开仿真窗口。第一次打开会提示你选择分析类型。选DC Operating Point直流工作点然后点运行。你应该能看到一个文本输出列出每个节点的电压和每个电压源的电流。对于这个RC电路节点2的电压应该等于电源电压因为电容对DC是开路没有电流流过电阻所以没有压降。如果电源DC设的是0V那所有节点都是0V这很正常。DC工作点分析的意义在于它告诉你电路在直流下的静态偏置。对于放大器电路这一步是检查晶体管是否工作在放大区对于滤波器这一步确认没有直流路径导致意外偏置。很多人跳过DC分析直接跑AC结果AC波形不对回头查半天才发现是DC偏置错了。4. AC扫频分析从设置到读懂幅频特性曲线4.1 AC分析参数的物理含义与设置方法在KiCAD仿真器里新建一个分析类型选AC Analysis。需要填几个参数Start Frequency起始频率比如1HzStop Frequency终止频率比如10MHzNumber of Points每十倍频程的点数通常设100到1000Sweep Type扫描类型选Decade按十倍频程这几个参数决定了你看到的曲线有多细。点数太少曲线会变成折线点数太多计算时间变长但曲线更平滑。对于RC低通100点每十倍频程足够看出-3dB点和滚降斜率。AC分析的数学本质是在DC工作点附近对电路做小信号线性化然后在这个线性化模型上扫频计算每个频率下的复数增益和相位。所以AC分析的前提是电路有稳定的DC工作点。如果DC分析都不收敛AC分析肯定跑不出来。4.2 用ngspice命令行做同样的AC分析为了理解KiCAD仿真器背后在干什么我们用终端ngspice跑同样的分析。建一个rc_ac.cir* RC low-pass AC analysis V1 1 0 DC 0 AC 1 R1 1 2 10k C1 2 0 100n .ac dec 100 1 10Meg .plot ac vdb(2) .end跑ngspice -b rc_ac.cir终端会输出一堆数据点但-b模式下plot命令不会真的画图只是把数据打印出来。要看图得用交互模式ngspice rc_ac.cir进入交互界面后输入run然后plot vdb(2)会弹出一个图形窗口。如果你在纯终端环境没有X11可以用wrdata命令把数据导出成文本再用Python或者gnuplot画。这里有个实用技巧vdb(2)表示节点2电压的分贝值vp(2)表示相位。KiCAD仿真器里默认也是用这两个量。截止频率的理论值是[ f_c \frac{1}{2\pi RC} \frac{1}{2\pi \times 10^4 \times 10^{-7}} \approx 159.15 \text{Hz} ]在159Hz处增益应该比通带低3dB相位应该滞后45度。你可以在仿真结果里找这个点验证。4.3 读懂幅频曲线里的关键信息跑完AC分析KiCAD仿真器会显示一张波特图。横轴是频率对数纵轴是增益dB。对于RC低通你应该看到低频段增益接近0dB因为AC输入是1V输出也是1V在159Hz附近开始下降高频段以-20dB/十倍频程的斜率滚降如果曲线形状不对比如高频段斜率是-40dB/十倍频程那说明你实际上做了二阶滤波可能是不小心多放了一个电容。如果低频段增益就不是0dB检查AC输入幅度是不是设成了1。相位曲线同样重要。一阶RC低通的相位从0度开始在截止频率处是-45度高频趋向-90度。相位信息在反馈电路分析里至关重要因为相位裕度决定了系统稳定性。注意KiCAD仿真器的波特图默认可能只显示增益相位曲线需要手动添加。在仿真结果窗口里右键选择Add Plot然后选相位量。或者直接在表达式里写vp(2)。5. 把方法迁移到Buck电路和RC振荡电路5.1 Buck电路的DC分析关注点Buck电路是DC-DC降压的经典拓扑但它的仿真和RC滤波器完全不是一个难度级别。核心区别在于Buck电路有开关管需要瞬态分析才能看到开关行为DC分析只能看稳态工作点。不过DC分析在Buck电路里仍然有用它可以帮你快速验证反馈网络的分压比是否正确。比如你设计了一个输出5V的Buck反馈电阻分压到参考电压0.8V那DC分析应该显示反馈节点电压接近0.8V。如果差很远说明电阻值算错了。用KiCAD画Buck电路时开关管可以用Simulation_SPICE:SW里的电压控制开关或者用理想MOSFET模型。电感用Device:L电容用Device:C。DC分析时把开关设成固定导通或固定关断看输出电压是否符合预期。5.2 RC振荡电路的AC分析特殊性RC振荡电路比如文氏桥振荡器的AC分析和普通滤波器有个本质区别它需要正反馈。在AC分析里你要看的是环路增益而不是输入输出增益。具体做法是在反馈环路里插入一个AC源跑AC分析看环路增益的幅度和相位。文氏桥的振荡条件是在振荡频率处环路增益幅度等于1相位等于0度或者360度。用AC分析扫频找到幅度过0dB且相位过0度的频率点那就是振荡频率。如果幅度小于1电路不会起振如果相位不对振荡频率会偏移。这里有个实操心得AC分析只能告诉你电路能不能振荡不能告诉你振荡幅度。因为AC分析是小信号线性分析而振荡幅度由非线性限幅机制决定。要看实际振荡波形必须跑瞬态分析。5.3 从仿真到实测的差距在哪里仿真跑通了不代表电路就能用。我踩过的最大的坑是仿真里用的理想元件实际电路里根本不存在。比如仿真里的电容是理想电容实际电容有等效串联电阻ESR和等效串联电感ESL。在低频段这些寄生参数影响不大但在高频段一个100nF的陶瓷电容可能变成一个电感。另一个差距是电源和地的质量。仿真里电源是理想电压源地是理想零阻抗。实际电路里电源有内阻地平面有阻抗这些都会影响高频性能。所以仿真结果和实测结果在低频段通常吻合得很好高频段偏差可能很大。我的建议是仿真用来验证拓扑和参数趋势实测用来确认最终性能。不要指望仿真能精确预测每一个细节但可以用它快速排除明显错误的设计。6. 新手最容易卡住的几个问题和排查思路6.1 仿真不收敛的常见原因ngspice报singular matrix或者no convergence是最常见的错误。原因通常有几类节点悬空某个节点只连了一个元件没有直流通路。SPICE要求每个节点都有到地的DC路径。电压源环路两个电压源直接并联或者电压源和电感形成环路。这在数学上无解。模型参数错误比如给二极管设了负的饱和电流或者给MOSFET设了不合理的宽长比。排查方法先跑DC工作点看哪个节点电压异常。如果DC都不收敛AC和瞬态肯定跑不了。可以在网表里加.options gmin1e-10或者.options itl1500来放宽收敛条件但这只是权宜之计根本问题还是要找到电路里的结构性错误。6.2 波形不对时的检查清单当你看到波形和预期不符时按这个顺序查AC输入幅度是否非零AC分析里如果AC幅度是0输出全是零。地节点是否正确确认power:GND符号关联到了节点0。元件值单位是否正确KiCAD里填100n表示100纳法填100表示100法差九个数量级。网表是否重新生成改了原理图后仿真器是否用了新网表。分析类型是否匹配DC分析看不了频率响应AC分析看不了开关波形。6.3 KiCAD和ngspice版本兼容性坑KiCAD 7自带的ngspice和系统ngspice可能存在版本差异。我遇到过KiCAD仿真器里能跑的网表导出到终端ngspice跑报错的情况原因是KiCAD用了自己编译的ngspice支持一些扩展语法而系统版本不支持。解决办法要么统一用KiCAD自带的要么统一用系统的。如果要在终端跑导出网表后把KiCAD特有的语法比如.include路径改成系统ngspice能识别的。最稳妥的方式是在KiCAD里仿真验证在终端ngspice里做批处理参数扫描两者分工明确。提示如果你在Ubuntu上同时装了多个版本的ngspice用which ngspice和ngspice --version确认当前用的是哪个。KiCAD仿真器不受系统PATH影响它用自己的库。7. 把仿真流程自动化的几个实用技巧7.1 用ngspice批处理做参数扫描手动改一个电阻值跑一次仿真改十次跑十次效率太低。ngspice支持.step命令做参数扫描但更灵活的方式是写一个shell脚本循环生成网表并调用ngspice。比如要扫描RC低通的电阻从1k到100kfor r in 1k 10k 100k; do sed s/R1 1 2 10k/R1 1 2 $r/ rc_ac.cir rc_ac_$r.cir ngspice -b rc_ac_$r.cir result_$r.txt done然后用Python读result_$r.txt提取每个频率点的增益画在一张图上对比。这种方法比在图形界面里手动改参数快得多而且结果可复现。7.2 用Python处理ngspice输出数据ngspice的wrdata命令可以把仿真数据导出成纯文本格式是两列或者多列。用Python的numpy和matplotlib处理非常方便import numpy as np import matplotlib.pyplot as plt data np.loadtxt(ac_output.txt) freq data[:, 0] gain_db data[:, 1] plt.semilogx(freq, gain_db) plt.xlabel(Frequency (Hz)) plt.ylabel(Gain (dB)) plt.grid(True) plt.show()这样你可以把多次仿真的结果画在一起或者做后处理计算截止频率、相位裕度等指标。7.3 在KiCAD里保存仿真配置以便复用KiCAD的仿真器允许你把分析设置保存成.wbk文件工作簿下次打开直接加载。对于经常做的分析类型比如DC工作点AC扫频可以存成一个模板新电路直接套用。具体操作在仿真器里设好参数后点File→Save Workbook选个路径保存。下次打开仿真器File→Load Workbook加载即可。注意工作簿里保存的是分析设置不包含电路本身所以换电路后要确认节点名称是否匹配。8. 从第一个仿真到独立分析的学习路径我自己的经验是新手最容易犯的错误是贪多。第一个仿真就选Buck电路或者锁相环结果卡在收敛问题上好几天信心直接崩了。正确的路径是先跑通一个电阻分压的DC分析理解节点电压和电流的关系。然后加一个电容跑RC低通的AC分析理解截止频率和相位。再然后加一个电感跑RLC谐振理解品质因数和阻尼。最后再上开关电路和反馈系统。每一步都要问自己这个结果符合理论计算吗如果不符合是理论错了还是仿真设置错了这种理论-仿真-对比的循环才是真正学会仿真的方式。光会点按钮跑出波形遇到问题还是不知道怎么查。ngspice和KiCAD这套组合的好处是它不会帮你隐藏任何东西。网表是透明的模型是可见的参数是可调的。你看到的每一个结果都能追溯到具体的数学计算。这种透明性是在线仿真工具给不了的。最后分享一个我常用的调试技巧当仿真结果完全看不懂时把电路简化到极致。比如RC低通跑不对先去掉电容只留电阻跑DC分析看分压对不对。对了再加电容跑AC看低频增益对不对。一步一步加回来问题出在哪一步就清楚了。这个方法看起来笨但比盯着复杂电路瞎猜有效得多。
返回列表