ARTICLE DETAIL

资讯详情

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

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

Ubuntu下ngspice与KiCAD电路仿真:从AC/DC分析到实战 1. 为什么要在 Ubuntu 上折腾 ngspice 加 KiCAD 这套组合很多人第一次接触电路仿真脑子里冒出来的第一个工具大概率是 Multisim 或者 LTspice。Windows 平台下这些软件确实成熟图形界面友好拖拖拽拽就能跑出波形。但如果你是一个长期在 Linux 环境下干活的开发者或者手头只有一台装了 Ubuntu 的机器又或者你单纯想搞明白仿真软件底层到底在算什么那 ngspice 加 KiCAD 这套组合就值得认真玩一玩。我先说清楚这套方案是什么。ngspice是一个开源的 SPICE 电路仿真引擎纯命令行驱动负责真正的数值计算——解节点方程、做直流工作点分析、跑交流小信号扫描、算瞬态响应。KiCAD则是开源 EDA 套件负责画原理图、设计 PCB它内置了和 ngspice 的对接能力可以把原理图直接导出成 ngspice 能吃的网表文件。两者配合起来你就能在 Ubuntu 上完成从画图到仿真的完整闭环全程不花一分钱。这套东西能解决什么问题最直接的就是验证电路设计。你画了一个 RC 振荡电路想知道它起振频率对不对你搭了一个 Buck 电路想看看输出电压纹波有多大你设计了一个分压偏置的共射放大电路想确认静态工作点是否合适。这些在动手焊板子之前都可以先用仿真跑一遍省时省料。适合谁来参考电子相关专业的学生、刚入行的硬件工程师、想从 Windows 迁移到 Linux 的开发者以及任何对电路仿真底层原理好奇的折腾党。我自己的情况是早年在 Windows 上用 Multisim 做课程设计后来工作环境全面转向 Ubuntu被迫找替代方案。一开始觉得命令行仿真反人类用久了才发现ngspice 的脚本化能力反而让批量仿真和参数扫描变得极其顺手。KiCAD 这几年的版本迭代也很给力原理图编辑器的体验已经不比商业软件差多少。所以这篇文章我就把在 Ubuntu 环境下用 ngspice 和 KiCAD 做第一个 AC/DC 分析的完整过程拆开来讲包括安装、画图、导出网表、写仿真指令、看波形、排查问题尽量把每个环节的坑都提前给你标出来。注意本文所有操作基于 Ubuntu 22.04 LTS 和 KiCAD 7.x 版本不同版本之间菜单项位置可能有差异但核心逻辑一致。2. 环境搭建Ubuntu 下安装 ngspice 和 KiCAD 的正确姿势2.1 安装 ngspice 与 KiCAD 的两种方式对比在 Ubuntu 上装软件无非就是 apt 和源码编译两条路。对于 ngspice 和 KiCAD我强烈建议优先用 apt原因很简单省事、依赖自动处理、后续升级方便。源码编译虽然能拿到最新版本但 KiCAD 的依赖树相当庞大编译一次动辄半小时起步新手很容易在某个依赖报错上卡住。安装命令如下sudo apt update sudo apt install ngspice kicad kicad-symbols kicad-footprints这里解释一下为什么要把kicad-symbols和kicad-footprints单独列出来。KiCAD 主程序包有时候不会自动拉取完整的符号库和封装库尤其是你用的是较老的 Ubuntu 版本或者第三方源。符号库是画原理图时用的元件符号封装库是画 PCB 时用的物理尺寸做仿真主要用到符号库但既然装了 KiCAD顺手把封装库也装上后面想画板子就不用再折腾了。装完之后验证一下ngspice --version kicad --version如果 ngspice 输出了版本号KiCAD 也能正常启动那环境就算齐了。我实测下来Ubuntu 22.04 的官方源里 ngspice 是 36 版KiCAD 是 6.x 或 7.x对于学习和一般项目足够用了。提示如果你之前装过 KiCAD 的旧版本建议先sudo apt remove kicad再重装避免配置文件冲突导致符号库加载异常。2.2 中文环境与界面字体的小坑Ubuntu 默认的英文环境对 KiCAD 没什么影响但如果你装了中文输入法或者系统语言设成了中文KiCAD 的界面字体可能会变得很难看甚至出现部分文字显示为方块。这不是 KiCAD 的 bug而是字体配置的问题。解决办法是安装一套完整的字体包sudo apt install fonts-wqy-zenhei fonts-wqy-microhei然后在 KiCAD 的设置里把界面字体指定为 WenQuanYi Zen Hei 或者 Noto Sans CJK。我试过不改字体直接用原理图里的中文注释会变成乱码虽然不影响仿真但看着糟心。另外ngspice 本身是纯命令行工具不涉及字体问题它的输出全是 ASCII 字符这点倒是省心。还有一个容易被忽略的点Ubuntu 的环境变量配置。如果你把 ngspice 装在了非标准路径或者想用自己编译的版本需要把路径加到PATH里。检查方法which ngspice echo $PATH正常情况下which ngspice应该输出/usr/bin/ngspice。如果输出为空说明 PATH 有问题可以在~/.bashrc末尾加一行export PATH$PATH:/your/ngspice/path然后source ~/.bashrc生效。2.3 验证安装跑一个最简单的直流分压电路装完不验证等于没装。我习惯用一个最简电路来确认 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参数表示批处理模式跑完直接输出结果退出。你应该能看到类似这样的输出Node Voltage ---- ------- 1 10.000000 2 5.000000两个 1k 电阻分 10V中间节点正好 5V说明 ngspice 工作正常。这一步看着简单但它是后面所有复杂仿真的基础。如果这里就报错那大概率是安装出了问题先解决环境再往下走。3. 用 KiCAD 画原理图并导出 ngspice 网表3.1 新建工程与原理图绘制要点打开 KiCAD选择File - New - Project给工程起个名字比如rc_osc。KiCAD 会生成一个.kicad_pro工程文件和配套的.kicad_sch原理图文件。接下来是画图。我以RC 振荡电路为例这也是热词里经常出现的仿真对象。一个典型的 RC 相移振荡电路需要三个 RC 环节加一个放大级但为了演示 AC 分析我们可以先画一个更简单的 RC 低通滤波器后面再扩展到振荡电路。画图时要注意几个关键点元件符号必须来自 KiCAD 自带库比如Device:R、Device:C、pspice:VDC。不要用自己随手画的符号因为 ngspice 需要识别元件的 SPICE 模型自定义符号如果没有绑定模型导出网表时会报错。每个元件都要有唯一的参考编号比如 R1、R2、C1、V1。KiCAD 会自动分配但你要检查有没有重复。接地符号必须用power:GND这是 ngspice 识别参考节点的关键。如果你用了一个普通的连线当接地仿真会提示节点悬空。画完之后用Annotate Schematic功能给所有元件编号再用Electrical Rules Check检查一遍连接性。ERC 会告诉你哪些引脚没接、哪些电源没驱动提前把这些问题解决掉比导出网表后再排查要轻松得多。3.2 为仿真配置元件模型与激励源KiCAD 默认的电阻、电容符号是不带 SPICE 模型的但 ngspice 对 R、C、L 这些基本元件有内置模型所以直接导出也能用。真正需要额外配置的是有源器件和激励源。以电压源为例你要用pspice:VDC这个符号它的属性里可以设置直流值。如果是 AC 分析还需要设置 AC 幅度和相位。在 KiCAD 里双击电压源符号找到Simulation相关的字段填入DC直流工作点值比如 12VACAC 分析时的幅度通常设为 1方便看增益PULSE或SIN瞬态分析时的波形参数这里有个坑KiCAD 的仿真模型字段名必须和 ngspice 的语法对应。比如你想让电压源在 AC 分析时输出 1V 幅度字段名要写ac值写1。如果你写成了AC_MAG之类的自定义名字ngspice 不认识仿真时就会忽略这个设置结果波形全是零。对于二极管、三极管这类器件需要指定具体的 SPICE 模型名。KiCAD 的pspice库里有D1N4148、Q2N2222等常用型号直接用就行。如果要用自己导入的模型需要把.model语句写在网表里或者通过 KiCAD 的模型加载功能关联。3.3 导出网表从原理图到 ngspice 可读文件原理图画好、ERC 通过之后就可以导出网表了。在 KiCAD 里选择Tools - Generate Netlist格式选Spice然后保存为一个.cir或.net文件。导出的网表大概长这样* Eeschema Netlist V1 1 0 DC 12 AC 1 R1 1 2 1k C1 2 0 100n .end注意看KiCAD 自动把元件连接关系翻译成了 SPICE 语法。V1 1 0表示电压源接在节点 1 和节点 0地之间R1 1 2 1k表示电阻接在节点 1 和 2 之间阻值 1k。这个网表已经可以直接喂给 ngspice 了但还缺少分析指令。提示KiCAD 导出的网表默认以.end结尾如果你要手动添加分析指令记得把.end移到文件最后否则 ngspice 会在.end处停止解析后面的指令全部忽略。我一般会把导出的网表复制一份重命名为sim.cir然后在里面追加分析指令。这样原始网表保持干净修改仿真参数时不会影响原理图。4. AC 分析与 DC 分析实操从指令到波形4.1 DC 工作点分析读懂电路的静态状态DC 分析是最基础的分析类型它告诉你在没有交流信号输入时电路各节点的直流电压和各支路的直流电流。对于放大电路来说这就是静态工作点决定了晶体管是否工作在放大区。在网表里添加.op指令* DC Operating Point Analysis V1 1 0 DC 12 R1 1 2 1k R2 2 0 2k .op .end跑ngspice -b sim.cir输出会列出所有节点的电压和所有电压源的电流。对于这个分压电路节点 2 的电压应该是12 * 2k / (1k 2k) 8V。如果输出不是 8V那就要检查电阻值有没有填错或者节点编号有没有搞混。DC 分析还有一个进阶用法参数扫描。比如你想看电源电压从 0V 扫到 12V 时节点 2 的电压怎么变化可以用.dc指令.dc V1 0 12 0.5这表示 V1 从 0 扫到 12步长 0.5。ngspice 会输出一系列数据点你可以用plot命令画成曲线。在批处理模式下可以配合wrdata把数据导出成文本再用 gnuplot 或者 Python 画图。4.2 AC 小信号分析扫频看增益和相位AC 分析是这篇文章的重点。它做的事情是在直流工作点的基础上给电路加一个小幅度的交流信号然后扫描频率看输出幅度和相位随频率的变化。这就是我们常说的频率响应。对于前面那个 RC 低通滤波器AC 分析的指令是* AC Analysis of RC Low-Pass Filter V1 1 0 DC 0 AC 1 R1 1 2 1k C1 2 0 100n .ac dec 100 1 1Meg .end逐项解释.ac dec 100 1 1Megdec表示按十倍频程扫描也就是频率按对数分布100每个十倍频程取 100 个点点越多曲线越平滑1起始频率 1Hz1Meg终止频率 1MHz这个电路的截止频率是1 / (2 * pi * R * C) 1 / (2 * 3.14159 * 1000 * 100e-9) ≈ 1591.5Hz。在 AC 分析结果里你应该能看到幅度在 1591Hz 附近下降到 -3dB相位下降 45 度。ngspice 批处理模式下AC 分析的结果默认不会直接画图但会输出到标准输出或者你指定的文件。更好的做法是在交互模式下跑ngspice sim.cir进入 ngspice 交互界面后输入run plot vdb(2) plot vp(2)vdb(2)是节点 2 电压的 dB 值vp(2)是相位。ngspice 会弹出一个图形窗口显示曲线。如果你在纯终端环境没有图形界面可以用wrdata导出数据wrdata ac_data.txt vdb(2) vp(2)然后拿ac_data.txt到有图形界面的机器上画图或者用 Python 的 matplotlib 处理。4.3 从 AC 分析扩展到 RC 振荡电路仿真RC 相移振荡电路的核心是放大级提供 180 度相移三个 RC 环节再提供 180 度相移总相移 360 度满足正反馈条件电路起振。起振频率由 RC 参数决定公式是f 1 / (2 * pi * R * C * sqrt(6))。在 KiCAD 里画这个电路需要三个电容、三个电阻、一个运算放大器或者晶体管放大级。对于新手我建议先用理想运放模型搭避免晶体管偏置的复杂性。KiCAD 的pspice库里有OPAMP符号可以直接用。导出网表后AC 分析的指令和前面一样但观察的重点不同你要看的是环路增益在哪个频率上相位为 0 度且增益大于 1。那个频率就是起振频率。如果增益小于 1电路不会起振需要调整放大级的增益或者 RC 参数。这里有个实操心得AC 分析只能告诉你电路能不能起振不能告诉你起振后的波形。要看振荡波形需要跑瞬态分析.tran。瞬态分析的指令格式是.tran 1u 10m表示步长 1 微秒总时长 10 毫秒。跑完之后用plot v(2)看节点 2 的波形如果电路设计正确你应该能看到一个正弦波逐渐建立起来。注意瞬态分析对初始条件很敏感。如果电路不起振可以尝试在反馈回路里加一个很小的初始扰动或者用.ic指令设置某个节点的初始电压。5. 常见问题与排查技巧实录5.1 网表导出后 ngspice 报错怎么办这是新手最容易卡住的地方。KiCAD 导出的网表在 ngspice 里跑不起来报错信息五花八门。我整理了几种最常见的情况报错信息原因解决方法unknown subckt用了自定义符号但没绑定模型换用 KiCAD 自带库的符号或手动添加.subckt定义singular matrix节点悬空或存在电压源环路检查所有节点是否都有直流通路避免两个电压源直接并联no such node节点编号在网表中不存在检查原理图连接重新导出网表timestep too small瞬态分析步长设置过小或电路存在不收敛点增大步长或添加.options reltol0.01放宽收敛条件其中singular matrix是最常见的。它的本质是电路方程无解通常是因为某个节点没有到地的直流通路。比如你用一个电容隔直但电容另一端悬空那个节点在直流分析时就是浮空的。解决办法是在该节点和地之间加一个大电阻比如 1Meg给直流一个通路对交流特性影响可以忽略。5.2 AC 分析结果不对的排查思路AC 分析跑出来了但波形和预期不符这种情况我也遇到过好几次。排查顺序建议如下检查激励源设置。AC 分析需要激励源有 AC 幅度如果你只设了 DC 值没设 AC 值输出全是零。在 KiCAD 里确认电压源的ac字段填了 1。检查频率范围。如果你要看的截止频率是 1.6kHz但扫描范围设成了 1Meg 到 10Meg那自然看不到 -3dB 点。把范围放宽到 1Hz 到 10MHz 试试。检查节点编号。KiCAD 导出的网表里节点编号是自动分配的和你原理图上的标号不一定一致。用plot命令时确认你画的节点确实是输出节点。检查元件值单位。SPICE 里1k是 1000 欧姆1K也是但1m是 0.0011M是 1e6。如果你把100n写成了100m电容值差了十万倍频率响应自然全错。我个人的习惯是每次导出网表后先跑一遍.op确认直流工作点正常再跑.ac。直流都不对交流肯定不对。5.3 Ubuntu 环境下 ngspice 图形界面的替代方案ngspice 自带的图形界面在 Ubuntu 上有时候会出问题尤其是你没有装完整的 X11 库或者用的是 WSL 环境。如果plot命令弹不出窗口有几个替代方案用wrdata导出数据用 gnuplot 画图。gnspice 的wrdata命令把仿真数据写成纯文本gnuplot 可以读这个文本画曲线。gnuplot 在 Ubuntu 上装起来很简单sudo apt install gnuplot。用 Python 的 matplotlib。导出的数据用numpy.loadtxt读进来然后plt.plot画图。这种方式最灵活适合做报告或者批量处理。用 KiCAD 自带的波形查看器。KiCAD 7.x 版本内置了一个仿真波形查看器如果你在 KiCAD 里直接点仿真按钮结果会显示在 KiCAD 的窗口里不需要额外的图形界面。我实测下来对于简单的 AC 分析KiCAD 自带的查看器最方便对于需要精细调整或者批量仿真的场景ngspice 加 Python 的组合更顺手。5.4 几个让我踩过坑的细节第一个坑是接地符号的命名。KiCAD 里有GND、GNDA、GNDD等多种接地符号ngspice 默认只认节点 0 为地。如果你用了GNDA导出网表后它可能被分配成节点 1 或者其他编号导致电路没有参考地。解决办法是统一用power:GND或者在网表里手动把接地节点改成 0。第二个坑是元件参考编号重复。KiCAD 在复制粘贴元件时有时候会保留原来的编号导致两个电阻都叫 R1。ERC 能查出来这个问题但如果你跳过了 ERC 直接导出网表ngspice 会报重复定义错误。养成画完图先跑 ERC 的习惯能省很多事。第三个坑是单位大小写。SPICE 对单位大小写敏感1M是兆1m是毫。我在一个 Buck 电路仿真里把电感值100u写成了100Ungspice 直接报错退出。虽然大多数情况下u和U都能识别但为了保险统一用小写。第四个坑是**.end的位置**。前面提过KiCAD 导出的网表自带.end如果你在后面追加指令必须把原来的.end删掉或者移到文件末尾。我有一次忘了删结果.ac指令完全没生效排查了半小时才发现问题。6. 从仿真到实战这套流程还能怎么扩展6.1 参数扫描与批量仿真ngspice 最强大的地方在于它的脚本化能力。你可以写一个 shell 脚本循环改变某个电阻值每次跑一遍仿真把结果导出到不同文件。比如你想看 RC 低通滤波器的截止频率随电阻值的变化#!/bin/bash for r in 1k 2k 5k 10k; do sed s/R1 1 2 1k/R1 1 2 $r/ sim.cir sim_$r.cir ngspice -b sim_$r.cir result_$r.txt done这个脚本把sim.cir里的 R1 值替换成不同的值分别跑仿真结果存到不同文件。然后你可以用 Python 读这些文件画一张对比图。这种批量操作在图形界面软件里要手动点很多次在 ngspice 里就是几行脚本的事。6.2 从仿真网表到 PCB 设计的衔接仿真验证通过之后下一步就是画 PCB。KiCAD 的原理图和 PCB 是联动的你在原理图里改元件值PCB 里可以同步更新。但要注意仿真用的网表和 PCB 用的网表是两回事。仿真网表关注的是电气连接和 SPICE 模型PCB 网表关注的是封装和物理布局。我的做法是仿真阶段用一套符号库确认电路参数没问题后再给每个元件指定封装然后导出 PCB 网表。这样避免在仿真阶段就被封装问题干扰。KiCAD 的Assign Footprints工具可以批量给元件指定封装比一个个手动改快得多。6.3 和其他仿真工具的对比热词里提到了 Falstad 电路仿真、立创 EDA、Multisim、Simulink 等工具我简单说一下我的使用感受。Falstad 是在线仿真适合快速验证想法但元件模型比较理想化不适合精细分析。立创 EDA 的仿真功能这几年进步很大中文界面友好但底层引擎和 ngspice 不是一回事有些 SPICE 指令不支持。Multisim 功能最全但它是商业软件Ubuntu 上跑不了。Simulink 更偏向系统级仿真做电路级分析有点杀鸡用牛刀。ngspice 加 KiCAD 的组合优势在于开源、跨平台、脚本化能力强。缺点是学习曲线陡图形界面不如商业软件友好。但一旦你熟悉了这套流程仿真效率反而比点鼠标高得多。尤其是做参数扫描和批量分析的时候命令行工具的优势非常明显。6.4 给新手的练习建议如果你刚接触这套工具我建议按这个顺序练手直流分压电路练.op分析熟悉网表结构和节点编号。RC 低通滤波器练.ac分析理解频率响应和截止频率。RC 相移振荡电路练.tran分析观察起振过程和稳态波形。二极管整流电路练非线性电路仿真理解.model语句和收敛问题。Buck 电路练开关电源仿真这个难度较高涉及平均模型和瞬态分析技巧。每练一个电路都先把理论计算值算出来再和仿真结果对比。如果对不上先检查网表再检查模型参数最后检查仿真设置。这个过程本身就是最好的学习方式。我在实际使用中发现ngspice 的报错信息虽然有时候比较晦涩但大部分问题都能通过检查网表和调整收敛参数解决。KiCAD 的符号库和 ngspice 的兼容性总体不错偶尔遇到不支持的符号换一个等效的就行。这套工具链我已经用了三年多从简单的分压电路到复杂的开关电源都能跑得通。如果你也在 Ubuntu 上做电路仿真不妨从这篇文章的 RC 低通滤波器开始跑通第一个 AC 分析后面的路就顺了。
返回列表