拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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

1. 为什么要在 Ubuntu 上折腾 ngspice 和 KiCAD很多人第一次接触电路仿真脑子里冒出来的第一个工具可能是 Multisim 或者在线版的 Falstad。Multisim 确实上手快拖拖拽拽就能跑出波形但它是个商业软件Linux 原生支持基本为零在 Ubuntu 上要么用虚拟机扛着要么用 Wine 硬跑体验都不太舒服。Falstad 在线仿真适合看个大概但真要做稍微正经一点的 AC/DC 分析比如带实际器件模型、需要扫描频率、需要导出数据做后处理的场景它就力不从心了。ngspice 和 KiCAD 这套组合是我在 Ubuntu 上做电路仿真最常用的方案。ngspice 是 SPICE 家族的第三代开源仿真引擎纯命令行跑在终端里速度快、脚本化能力强做 AC 扫描、DC 扫描、瞬态分析都很扎实。KiCAD 则是完整的 EDA 套件原理图绘制、PCB 布局、Gerber 输出一条龙它内部直接集成了 ngspice 作为仿真后端你画完原理图就能直接跑仿真不用手动写网表。这篇文章面向的是刚接触电路仿真、手头用的是 Ubuntu 系统、想从零跑通第一个 AC/DC 分析的人。我会把整个流程拆开讲从装软件、画原理图、设置仿真参数到看波形、排查报错每一步都给出我实际操作的细节和踩过的坑。你不需要有 SPICE 基础但最好对基本的电路概念有点了解比如什么是 RC 电路、什么是幅频特性。读完你至少能做到两件事一是用 KiCAD 画一个 RC 低通滤波器并跑出它的 AC 幅频响应二是用 ngspice 命令行独立完成一个 DC 工作点分析和 AC 扫描。先说清楚一个概念AC 分析和 DC 分析在 SPICE 里是两回事。DC 分析.op算的是电路在直流下的静态工作点所有电容开路、电感短路输出各节点电压和支路电流。AC 分析.ac则是先算直流工作点然后在这个工作点附近做小信号线性化再扫频输出的是复数形式的增益和相位。很多人第一次跑 AC 分析发现波形不对八成是把这两者搞混了或者忘了 AC 分析需要给信号源设置 AC 幅度。Ubuntu 环境下装这两个工具其实很简单但版本选择有讲究。KiCAD 在 Ubuntu 官方源里的版本往往偏旧比如 Ubuntu 22.04 默认源里是 KiCAD 6而目前稳定版已经到 8 了。版本差异直接影响仿真功能的完整度KiCAD 7 之后仿真器的易用性提升明显。所以我一般建议用官方 PPA 装新版本而不是直接apt install kicad。ngspice 倒是可以直接从源里装版本够用。2. 环境搭建Ubuntu 下装 ngspice 和 KiCAD 的正确姿势2.1 ngspice 的安装与验证ngspice 在 Ubuntu 源里就有安装命令很直接sudo apt update sudo apt install ngspice装完之后验证一下版本ngspice --version正常会输出类似ngspice-36或ngspice-38的信息。如果你用的是 Ubuntu 22.04源里大概是 36 版24.04 会新一些。这个版本做基础的 AC/DC 分析完全够用不用特意去编译最新版。有一点要注意ngspice 有两种运行模式交互模式和批处理模式。交互模式就是你直接敲ngspice进去然后一条条输命令批处理模式是ngspice -b circuit.cir跑完就退出。新手建议先用交互模式能看到每一步的反馈出错了也好排查。如果你想要图形化的波形查看器ngspice 自带一个叫ngspice的 X11 界面但说实话不太好用。我一般是用批处理模式跑仿真把输出写成数据文件然后用 Python 的 matplotlib 或者 gnuplot 来画图。这样更灵活也方便做后处理。2.2 KiCAD 的安装与版本选择KiCAD 的安装稍微麻烦一点因为 Ubuntu 源里的版本通常落后。我推荐用官方 PPAsudo add-apt-repository ppa:kicad/kicad-8.0-releases sudo apt update sudo apt install kicad如果你不想加 PPA也可以用 Flatpak 或者 AppImage但 PPA 的方式和系统集成最好文件关联、库路径都不会出问题。装完之后第一次启动 KiCAD 会提示你配置符号库和封装库。这一步别跳过否则画原理图的时候找不到器件。默认的库路径是/usr/share/kicad/symbols和/usr/share/kicad/footprints一般自动就能识别。如果提示库缺失去Preferences - Manage Symbol Libraries里手动添加一下。提示KiCAD 8 的仿真器需要系统里有 ngspice 的动态库。如果你是从 PPA 装的 KiCAD它会自动把 ngspice 作为依赖装上。但如果你之前手动编译过 ngspice可能会出现库版本冲突导致仿真器启动失败。遇到这种情况先把手动装的 ngspice 卸干净再用 apt 重装。2.3 验证仿真环境是否可用装完两个工具后做个快速验证。先建一个最简单的 RC 电路网表存成test.cirRC Test Circuit V1 1 0 DC 5 AC 1 R1 1 2 1k C1 2 0 1u .op .ac dec 10 1 100k .end然后在终端里跑ngspice -b test.cir如果能看到输出里有No. of Data Rows之类的信息说明仿真跑通了。如果报错说找不到模型或者语法错误那就要检查网表格式。SPICE 网表对格式比较敏感第一行是标题最后一行必须是.end中间每个元件一行节点编号从 0 开始0 是地。这一步跑通之后说明 ngspice 环境没问题。接下来打开 KiCAD新建一个工程随便放一个电阻和电容看看能不能启动仿真器。如果能打开仿真窗口那整套环境就齐了。3. 用 KiCAD 画第一个 RC 低通滤波器原理图3.1 新建工程与原理图绘制打开 KiCAD点File - New Project起个名字比如rc_lpf选好保存路径。工程建好后会自动打开原理图编辑器。画原理图的核心操作就几个放器件、连线、加电源和地、设置器件参数。我先放一个电阻和一个电容组成 RC 低通滤波器。低通滤波器的结构很简单输入信号经过电阻到输出节点输出节点再经过电容到地。截止频率的公式是$$f_c \frac{1}{2\pi RC}$$我选 R 1kΩC 100nF算下来截止频率大概是 1.59kHz。这个值在音频范围内方便观察。在 KiCAD 里放器件按快捷键A打开符号选择器搜R找到电阻搜C找到电容。放好之后按R旋转器件按M移动。连线用W键从器件引脚拖到另一个引脚就行。电源和地要从符号库里找。搜VAC或者VSIN可以找到交流信号源搜GND找到地符号。KiCAD 的仿真器支持多种源VDC是直流源VAC是交流源VSIN是正弦源。做 AC 分析要用VAC因为它自带 AC 幅度参数。3.2 器件参数设置与仿真模型放好器件后双击器件可以改参数。电阻的 Value 改成1k电容改成100n。注意 KiCAD 里单位写法有讲究1k表示 1kΩ100n表示 100nF不要写成100nF否则仿真器可能识别不了。交流源的设置稍微复杂一点。双击VAC源在属性里找到AC Magnitude和AC Phase。AC Magnitude 设成 1表示 1V 的交流幅度Phase 设成 0。这个幅度是 AC 分析用的和 DC 分析无关。很多人第一次跑 AC 分析发现增益是 0就是因为忘了设这个值。注意KiCAD 的仿真器默认用的是 ngspice 的模型库。如果你用的器件在库里有 SPICE 模型仿真器会自动加载。但如果你用的是通用符号比如普通的 R 和 C它就用理想模型。理想模型做基础分析够用但如果要考虑寄生参数或者温度特性就得手动指定模型文件。3.3 添加仿真指令与网表生成KiCAD 的仿真器有两种用法一种是在原理图上放仿真指令SPICE directive另一种是直接在仿真器界面里设置。我习惯用前者因为指令跟着原理图走方便复现。在原理图里按A搜spice可以找到Simulation SPICE Model或者直接放文本指令。更简单的做法是按CtrlShiftS打开仿真设置在里面选分析类型。但如果你想精确控制比如做十倍频程扫描还是手动写指令更靠谱。在原理图空白处放一个文本内容写.ac dec 100 10 1Meg这行指令的意思是AC 分析十倍频程扫描每十倍频程 100 个点从 10Hz 扫到 1MHz。dec是 decade 的缩写也可以用oct倍频程或者lin线性。放好指令后点工具栏上的仿真按钮一个波形图标KiCAD 会调用 ngspice 跑仿真然后弹出波形窗口。如果一切正常你会看到一条幅频曲线低频段增益接近 0dB高频段以 -20dB/十倍频程的斜率下降。4. ngspice 命令行做 DC 和 AC 分析的完整实操4.1 DC 工作点分析从网表到结果解读虽然 KiCAD 能跑仿真但我觉得新手还是应该用 ngspice 命令行跑一遍因为这样能看清每一步在干什么。DC 工作点分析是最基础的它告诉你电路在直流下的状态。我拿一个分压电路做例子网表如下DC Operating Point Example V1 1 0 DC 12 R1 1 2 10k R2 2 0 4.7k .op .end存成dc_op.cir跑ngspice -b dc_op.cir输出里会有一个Operating point information的段落列出每个节点的电压和每个电压源的电流。对于这个分压电路节点 2 的电压应该是$$V_2 12 \times \frac{4.7}{10 4.7} \approx 3.84V$$如果你算出来和仿真结果对不上先检查电阻值有没有写错再检查节点编号有没有搞混。SPICE 里节点 0 永远是地其他节点编号随便起但必须连续且不重复。DC 分析还有一个常见用途是扫描。比如你想看输出电压随输入电压变化的情况可以用.dc指令.dc V1 0 12 0.1这表示 V1 从 0V 扫到 12V步长 0.1V。跑完之后输出的是一个数据表你可以用 gnuplot 画出来。4.2 AC 扫描分析理解幅频与相频特性AC 分析是这篇文章的重点。还是用 RC 低通滤波器网表如下RC Low Pass Filter AC Analysis V1 1 0 DC 0 AC 1 R1 1 2 1k C1 2 0 100n .ac dec 100 10 1Meg .end跑完之后ngspice 会输出每个频率点的节点电压。但默认输出是文本表格看起来不直观。我一般加一个.print或者.plot指令.print ac v(2)这样输出里会直接给出节点 2 的电压幅度和相位。如果你想存成数据文件做后处理可以用.wrdata.wrdata rc_ac.dat v(2)这会生成一个两列的数据文件第一列是频率第二列是电压。注意.wrdata默认输出的是复数实际会写成频率、实部、虚部三列。你要自己算幅度和相位。我实测下来用 Python 处理这个数据最方便import numpy as np import matplotlib.pyplot as plt data np.loadtxt(rc_ac.dat) freq data[:, 0] real data[:, 1] imag data[:, 2] mag_db 20 * np.log10(np.sqrt(real**2 imag**2)) phase np.degrees(np.arctan2(imag, real)) plt.semilogx(freq, mag_db) plt.xlabel(Frequency (Hz)) plt.ylabel(Gain (dB)) plt.grid(True) plt.show()这段代码跑出来的图和 KiCAD 仿真器里看到的应该是一致的。截止频率处增益是 -3dB相位是 -45 度。如果你看到截止频率偏移了检查一下 R 和 C 的值是不是写对了。4.3 参数扫描与蒙特卡洛分析入门ngspice 支持参数扫描这在做设计验证的时候很有用。比如你想看电容值变化对截止频率的影响可以这样写RC Filter with Parameter Sweep V1 1 0 DC 0 AC 1 R1 1 2 1k C1 2 0 {cval} .ac dec 50 10 1Meg .step param cval list 50n 100n 200n .end.step指令会让 ngspice 对每个电容值跑一遍仿真输出多组数据。跑完之后你可以对比不同电容值下的幅频曲线直观看到截止频率的移动。蒙特卡洛分析稍微复杂一点需要定义元件的容差分布。ngspice 支持用agauss或者gauss函数生成随机值.param cnom100n .param cval{cnom * (1 agauss(0, 0.05, 1))}这表示电容值在标称值附近有 5% 的随机偏差。跑多次仿真后统计输出可以评估电路的鲁棒性。这个功能在实际产品设计中很有价值但新手可以先跳过等熟悉基础分析后再回来研究。5. 常见报错与排查技巧实录5.1 ngspice 报错速查表报错信息可能原因解决方法unknown parameter器件参数写法错误检查单位写法1k不是1K100n不是100nFsingular matrix电路有悬空节点或短路检查每个节点是否都有直流通路到地no such vector输出变量名写错节点电压用v(节点号)支路电流用i(器件名)timestep too small瞬态分析收敛失败减小步长或加.options reltol0.01model not found器件模型未定义检查.model指令或模型库路径这张表是我自己踩坑总结的基本上覆盖了新手 90% 的报错。其中singular matrix最常见通常是因为某个节点没有到地的直流通路。比如你放了一个电容串联在电路里直流分析时电容开路那个节点就悬空了。解决办法是在那个节点对地加一个大电阻比如 1Meg给直流一个通路。5.2 KiCAD 仿真器不启动或波形为空KiCAD 仿真器的问题通常和库路径有关。如果你点仿真按钮没反应先看终端里有没有报错。KiCAD 的仿真器是调用外部 ngspice 进程的如果 ngspice 不在 PATH 里或者版本不兼容就会静默失败。另一个常见问题是波形为空。这通常是因为仿真指令没放对位置或者分析类型选错了。比如你放了.ac指令但仿真器设置里选的是瞬态分析那就会跑瞬态而不是 AC。检查方法是打开仿真设置对话框确认分析类型和指令一致。还有一种情况是波形有数据但全是零。这多半是交流源的 AC 幅度没设。记住AC 分析用的是 AC 幅度不是 DC 值。DC 值只影响工作点不影响 AC 增益。5.3 收敛问题的通用处理思路SPICE 仿真的收敛问题是个老大难尤其是做瞬态分析或者带非线性器件的电路。ngspice 提供了一些选项来改善收敛.options reltol0.01 abstol1u vntol1m .options itl1200 itl2100reltol是相对误差容限默认 0.001放宽到 0.01 能显著改善收敛。abstol是电流绝对误差vntol是电压绝对误差。itl1和itl2是迭代次数上限加大这些值能让仿真器多试几次。如果还是不行可以试试加初始条件。比如在电容上并联一个.ic指令设定初始电压.ic v(2)0这告诉仿真器从 0V 开始算避免它在一个不合理的初始状态里打转。提示收敛问题没有万能解核心思路是给仿真器更多信息、更宽松的条件。先放宽容限再考虑加初始条件最后才去改电路拓扑。很多时候收敛失败是因为电路本身有问题比如正反馈环路或者参数不合理。6. 从仿真到实测一些经验之谈仿真跑通只是第一步真正有价值的是把仿真和实际电路对上。我做过不少 RC 滤波器的仿真和实测对比发现几个规律。第一理想模型和实际器件的偏差主要来自寄生参数。电容的等效串联电阻ESR和等效串联电感ESL在高频段影响很大。如果你仿真的截止频率是 1.59kHz实测可能在 1.5kHz 左右这个偏差是正常的。要更准的话得在仿真里加上寄生参数。第二ngspice 的 AC 分析假设电路是线性的但实际器件都有非线性。比如电容的容值随电压变化电阻的阻值随温度变化。这些在基础仿真里体现不出来需要用到更高级的模型。第三KiCAD 的仿真器适合快速验证ngspice 命令行适合精细控制。我通常先用 KiCAD 画图跑一遍确认电路拓扑没问题然后导出网表用 ngspice 做参数扫描和统计分析。两个工具配合使用效率最高。最后分享一个我常用的技巧把常用的仿真指令存成模板新建工程的时候直接复制。比如 AC 分析的指令、收敛选项、输出格式这些每次都要写存成模板能省不少时间。KiCAD 支持把仿真指令放在原理图模板里新建工程自动带上这个功能很多人不知道但用起来很顺手。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门