
玩 SPICE 仿真这件事我见过太多人卡在开头那半小时软件装好了教程也看了结果画完原理图一按仿真按钮屏幕上不是红色报错就是一条莫名其妙的直线最后默默关掉软件继续回去搭面包板。其实问题往往不在电路本身而在于你还没分清 KiCAD、ngspice、SPICE 这三者的关系以及你手里那些原理图符号到底有没有“仿真能力”。这篇文章我想用最接地气的方式带你走完一个完整流程用 KiCAD 画一个最简单的分压电路交给内置的 ngspice 做 SPICE 仿真最后把电压波形、工作点数据都看懂。这个例子虽然基础但它几乎覆盖了新手会踩的所有典型坑——电源怎么放、模型怎么挂、单位怎么写、结果怎么看、加载之后为什么电压会变。把这套流程跑通后面你再去碰运放、三极管、MOSFET 仿真心里会踏实很多。1. 先别急着画图SPICE、ngspice、KiCAD 到底谁负责干什么很多新手一上来就被“SPICE 仿真”四个字吓住觉得这是个高大上的东西。其实 SPICE 不是软件而是一种电路仿真程序的统称它的全称是 Simulation Program with Integrated Circuit Emphasis最早是伯克利大学搞出来的。你只需要记住一句话SPICE 是一种“电路描述语言”加一套仿真算法它干的事就是把你给它的网表netlist算成各种电压电流曲线。ngspice 是 SPICE 的一个开源实现也是 KiCAD 内置的仿真引擎。KiCAD 负责画图画完图生成一张“网表”文件ngspice 拿这个网表去算。所以你可以把 KiCAD 理解成“前端编辑器”把 ngspice 理解成“后台计算器”。1.1 为什么推荐 ngspice KiCAD 而不是 LTspice 或立创 EDA网上搜索热词里有很多人问“LTspice 导入 spice 模型”“立创 EDA 和 KiCAD 哪个好用”说明大家都在这个选择路口犹豫过。我个人的看法是如果你纯粹做电路仿真、想快速验证一个芯片的模型LTspice 确实顺手它对模型文件的兼容性和收敛性做得很聪明。但问题在于LTspice 是亚德诺ADI自家的工具很多第三方库文件需要转换才能用而且它的原理图风格和 KiCAD、立创 EDA 的画板流程是脱节的。KiCAD ngspice 最大的优势是“一条龙”你在原理图里画的电阻、电容、芯片最终是要拿去画 PCB 的。KiCAD 画完原理图可以直接生成网表给 ngspice也可以继续走 PCB 流程中间不需要倒腾两个软件。对新手来说环境越统一学习成本越低。立创 EDA 的优点是元件库全、上手快尤其国内用户画个 ESP32、STM32 小板的效率确实高。但它的仿真模块相对弱一些很多时候你要把电路导出成 SPICE 网表再去别的工具里跑对新手来说反而是二次负担。所以我的建议是如果你目标明确就是学仿真、做项目、甚至以后开源硬件直接上 KiCAD ngspice这套组合免费、跨平台、没有版权顾虑而且当你真正理解网表之后再去用任何 SPICE 工具都是秒上手。1.2 为什么拿“分压电路”当第一个仿真项目最合适分压电路简单到不能再简单一个电源两个电阻输出中点电压。公式就是 Vout Vin × R2 / (R1 R2)高中物理都学过。但恰恰是这么简单的电路能一次性帮你搞清楚仿真里的三件大事第一怎么给电路提供电源。很多人画图的时候放个电池符号就以为完事了其实 SPICE 里电压源必须作为独立元件存在而且要指定 DC 值。第二怎么设置要算的东西。是看点电压Operating Point还是看电压随输入变化的曲线DC Sweep这决定了你用哪种分析类型。第三怎么理解负载效应。分压公式成立的前提是输出端“空载”一旦你在 Vout 那儿接一个电阻分压比例马上变。这个现象不是理论错了而是现实世界的客观规律仿真能帮你直观看到它。我见过很多新手第一步就去仿真一个带反馈的运放电路结果调了三天都没搞明白为什么波形不对。其实根子就在基础的分压、负载、地这些概念上没建立起直觉。分压电路规模小出问题时你能快速定位非常适合建立“电路 — 网表 — 仿真结果”这条心智链路。2. 从零搭建你的第一个仿真KiCAD 原理图到 ngspice 运行时在白纸上画一个分压电路很容易但在 KiCAD 里画一个“能被 ngspice 正确识别”的分压电路需要你注意几个关键操作。下面我按完整流程走一遍每一步都说明为什么这么做。2.1 安装与版本别追最新用稳定版首先装 KiCAD。不管你用 Windows、macOS 还是 Linux都建议去官网下载当前的稳定版比如 KiCAD 7.x 或 8.x。不要一看到 KiCAD 9 出了预览版就急着装稳定版的内置 ngspice 是经过完整测试的教程代码跑起来不会突然行为不同。安装过程中如果你没改过组件选项它默认会带上 ngspice。装好之后可以在命令行里跑一下ngspice --version确认如果提示找不到命令可以到安装目录里找可执行文件或者重装时勾选对应组件。另外有一点要提醒Linux 用户如果用的是发行版自带的软件源版本可能偏旧。如果你 Ubuntu 仓库里只有 KiCAD 5.1那建议还是去官网装 AppImage 或 flatpak因为 KiCAD 5 的仿真工作流和 6/7/8 差别不小你网上搜到的教程基本都是新版本界面太旧版本容易看不懂。2.2 画原理图电阻要“能仿真”电源要“会供电”打开 KiCAD新建工程进入原理图编辑器。放置电阻。在右侧工具栏点“放置符号”在库搜索里输入R选那个标准的R符号放两个到画布上。关键一步双击其中一个电阻打开属性面板里面有“Value”字段。你可以填10k表示 R1 是 10 千欧另一个电阻填1k或10k随便。这里我要特别强调一下KiCAD 的普通原理图符号默认并不携带仿真模型。它的库分为两部分概念——符号Symbol负责在原理图上显示引脚和形状仿真模型Simulation Model负责告诉 ngspice 这是一个什么器件、有什么参数。对电阻来说你填了 Value 之后还没有真正挂上 SPICE 模型除非你给该元件添加了仿真属性。在 KiCAD 7/8 中双击电阻符号属性面板底部有一个“仿真模型”选项区域。你把模型类型选成“电阻”再填上电阻值这样 ngspice 才会把它当做一个电阻来处理。如果你漏掉这步生成的网表里它可能只是个无源端子仿真时会报节点缺少连接器件。放置电源。在符号搜索里输入V或直接找Simulation_Spice库里面有很多带 SPICE 模型的仿真源比如 VSOURCE通用电压源、VSIN正弦源、VPULSE脉冲源。放一个 VSOURCE 到原理图上双击它把 Value 改成5表示 5V 直流再把仿真模型类型设成“电压源”。放置地线。这点很多人会忘在仿真电路里地GND是所有电压的参考零点没有地ngspice 会不知道该以谁为基准算电压。你从工具栏点“放置电源/地”搜索GND放一个地符号在 R2 下端。然后连线电源正端 —— R1 —— Vout 节点 —— R2 —— GNDVSOURCE 的负端也接到 GND。画完后看起来就像一个“口”字形的回路。2.3 设置仿真先看工作点再做直流扫描原理图画完后点菜单“检查 → SPICE 仿真”或工具栏的仿真按钮会弹出 ngspice 仿真面板。面板上有几个标签页常见的两种分析类型是 Operating Point工作点和 DC Sweep直流扫描。Operating Point 适合求静态工作点也就是电路在直流稳态下每个节点电压、每个支路电流。对分压电路来说这就是我们要的答案之一。点一下“运行”面板下方会输出类似v(vout) 2.500000e00这就说明分压电路的 Vout 已经是 2.5V 了。DC Sweep 适合看“当某个输入源从 a 变到 b 时输出怎么变”。在面板里选择 DC Sweep把源选成你的 V1起始值填 0终止值填 10步长填 0.1运行后它画出 Vout 随 Vin 从 0 到 10V 变化的曲线。对纯电阻分压来说你会得到一根过原点的直线斜率等于分压系数。这里我建议新手把 OP 和 DC Sweep 都跑一遍。OP 帮你理解数值DC Sweep 帮你理解趋势。两个能力后面都会用到。3. 结果不能光看一个数分压电路里藏着三个“必懂”现象很多人跑到上一步就停下来觉得“哦分出 2.5V仿真成功收工”。如果你只是打卡那确实可以收工。但如果你想从仿真里学到东西至少要做三个小实验它们会颠覆你对分压电路“简单”的刻板印象。3.1 用节点电压验证公式再反推一遍电流第一件事回到原理图在仿真面板的 Operating Point 结果里除了 v(vout)应该还能看到各个支路电流或者你通过查看电压源的电流来验证总电流。对 10k 和 10k 两个电阻、5V 电源理论电流是 5V / 20k 0.25mA。仿真结果里如果看到电源电流是 -2.5e-4 这种数据负号表示方向是从源正端流出恭喜你手算和仿真对上了。这一步的意义在于仿真不是魔法它只是忠实地按照欧姆定律和基尔霍夫定律在求解手算结果如果不一致那一定是你哪里设置错了而不是仿真在骗你。我见过有人遇到仿真值与理论值不同时第一反应是“软件出 bug 了”结果查了半天发现是电阻值填错了一位单位。3.2 做一次 DC Sweep理解“斜率就是分压比”在 DC Sweep 里扫描 Vin 从 0 到 10VVout 会从 0 到 5V 上升。如果你把 Vout 曲线的斜率算出来它正好等于 R2/(R1R2)。这听上去很平淡但请你记住这个直觉线性网络里输入到输出的关系就是一条直线斜率由阻值比例决定。这个直觉在你后面看稳压器、放大器、衰减器时都会反复用到。如果你有时间还可以尝试固定 R110k把 R2 改成 1k 再仿真看斜率怎么变或者把 R2 改到 100k。多改几次你对“分压比的阻值敏感度”就会有真实感受。3.3 带载分压为什么你的 Vout 突然不是那个数了这是我认为整个分压电路里最值得做的一次实验。把负载电阻 RL1k 接到 Vout 与 GND 之间再跑一次 OP你会发现 Vout 再也不是 2.5V而是明显下降。原因很简单RL 与 R2 是并联关系等效阻值变成 10k || 1k ≈ 0.909k分压比自然就变了。这个现象在实际电路里随处可见——你用两个 10k 电阻分压出一个 2.5V 送给 ADC 采集结果 ADC 的内部输入阻抗不够高读数就偏低。很多新手在调试时遇到“电压不对”第一时间怀疑传感器坏了其实是被负载效应坑了。仿真里你可以用“参数扫描”功能让 RL 从 100Ω 扫到 10MΩ看 Vout 曲线的变化过程低阻时明显偏离 2.5V高阻时趋于 2.5V。这个实验做完你就能理解为什么 ADC 芯片的数据手册上总要强调输入阻抗要高一些。4. 分压电路之后赶紧升级加一个从网上下载的 SPICE 模型分压电路本身很简单但很多新手在“加一个真实芯片”这一步会突然卡住尤其看到网上搜索词里那么多人问“LTspice 导入 spice 模型”“74HC14 的 spice 模型”“HCNR201 光耦的 spice 文件”我就知道大家被模型文件折磨得不轻。4.1 模型文件到底长什么样又是怎么被 ngspice 调用的先看一份 74HC14施密特触发反相器的模型文件结构。你从芯片厂商官网下载下来的文件通常是一段 SPICE 文本里面会有类似下面的内容.SUBCKT 74HC14 A Y VCC VSS * 内部结构略 R1 A N1 10k M1 N1 VCC VCC PMOS ... M2 VSS N1 Y NMOS ... .ENDS 74HC14这就是一个子电路模块用.SUBCKT开头.ENDS结尾名字是 74HC14引脚顺序是 A、Y、VCC、VSS。ngspice 要用它有两种方式第一种是在原理图里给对应元件挂载模型文件。在 KiCAD 中双击元件符号在属性面板里打开仿真模型设置填写模型名称例如 74HC14以及.include的路径指向你下载下来的.lib或.cir文件。第二种方式更直接在 SPICE 仿真面板的“附加命令行”或“额外 spice 指令”里手动敲一行.include /你的路径/74hc14.lib这样 ngspice 在运行时就会把里面的子电路定义加载进来。很多新手从网上随便下载一个.lib文件放进工程目录然后直接用一个叫“74HC14”的元件符号仿真时却报unknown model。大概率是因为你在原理图里只设置了内部名称但没告诉 ngspice 这个名称来自哪个.include文件或者模型文件里定义的子电路名跟你在原理图里填的名字不一致。4.2 我从网上下载了 HCNR201 光耦的 SPICE 文件为什么还是仿真失败HCNR201 是安华高Avago的线性光耦用来做模拟隔离很常见。这类芯片的 SPICE 模型内部结构更复杂往往包含发光二极管、两个光电二极管和一堆受控源。常见的坑有三个一是模型文件里可能用了引脚顺序与厂商官网不一致的子电路封装比如.SUBCKT hcnr201 A C E1 K1 E2 K2而你原理图里符号的引脚顺序是另一个导致 ngspice 把“阳极”接到了“阴极”上仿真结果必然离谱。二是模型文件内部用了某些非标准语法比如GAIN这种自定义参数LTspice 能容忍ngspice 会直接报错。这时你需要打开文件手动注释掉影响收敛的自定义函数或者找到报错行逐一修改。三是这类光耦模型依赖 SPICE 里的全局参数.PARAM如果没把参数文件一并 include 进来仿真也会停。解决办法是把整个模型压缩包里的所有.lib文件都放到一个目录然后在仿真指令里挨个.include或者干脆自己写一个主文件把其他文件都 include 进来。我个人的习惯是任何从网上下载的模型第一件事先用文本编辑器打开看搞明白子电路名、引脚顺序、是否有外部依赖。这一步能帮你省下至少一个下午的排查时间。4.3 为什么同一个模型在 LTspice 里能跑在 ngspice 里却报错这个问题太常被问了。根本原因是 LTspice 对 SPICE 语法做了大量兼容性扩展很多第三方的模型文件其实是被 LTspice 的宽容解析器“惯坏了”写出了一些非标准语法。当你把同样的文件交给 ngspice它更严格于是原形毕露。比如下面这段直白语法V1 1 0 DC 5在 LTspice 和 ngspice 里都能认出 5V 电源。但如果有人在里面写R1 1 0 10K R2 1 0 10k虽然两个工具都能接受大小写混写但对M的处理就完全不同了。SPICE 里默认大小写不敏感且M代表“毫”1e-3如果要表示“兆欧”必须写成MEG或Meg。你如果看见别人的网表里写R10M别以为那是 10 兆欧在 ngspice 里它是 10 毫欧这个坑坑过一代又一代电子工程师。所以在 ngspice 里跑下载的模型之前先全局搜一下M结尾的阻值、容值改成MEG或u、n这类明确后缀能免去一堆莫名其妙的错。5. 常见报错与排查速查我踩过的坑都写在表里这部分是给卡住的人看的。如果你按上面的流程走还是报错直接对照下面几张表。5.1 电源与地相关报错把电源符号和地符号摆错位置是新手最常见的低级错误。ngspice 报错可能是一大段英文字符里面带no DC path to ground或者node X is floating意思就是某个节点悬空或者没有直流回路。最常见原因只画了 VSOURCE 正端负端没接地。用了普通电源符号比如 5V 这种电源旗标但没给它挂仿真模型。电阻一端忘了连接到任何元件整个网络悬空。解决方式回到原理图打开“检查 → 电气规则检查ERC”先看有没有引脚未连接的标记。再双击可疑元件确认仿真模型类型和参数都填了。我在带初学者时发现一个很实用的办法把原理图导成一张网表直接看。KiCAD 里选“生成网表”切到 SPICE 格式然后打开文本文件找到你的分压电路部分。如果 R1 一端连着N001另一端连着N002V1 正端也连着N001负端连着0那就一目了然。看到0就代表地。5.2 模型文件相关报错报错关键词含义处理办法unknown model type模型名称找不到检查是否.include了对应库文件subckt not found子电路不存在检查元件属性里的模型名与文件内.SUBCKT是否一致unable to open file文件路径错误用绝对路径避免中文目录与空格invalid syntax模型文件语法 ngspice 不支持打开文件逐行排查修改非标准语法这里我想多说一句。有很多新手动不动就问“大家有没有这个芯片的 spice 模型”其实大部分型号去官网都能搜到。如果官网没有去 Google 搜型号 ngspice model或型号 .lib英文结果更靠谱。再不行用同系列、同拓扑的模型替代但要在仿真报告里注明。5.3 数值单位相关报错与“仿真结果明显不对”很多“结果不对”根本不是设置问题而是单位写错了。我把常见后缀整理成表你想要的量正确写法常见错误写法错误后果10 千欧10k10K可行大小写不敏感一般没问题10 兆欧10Meg10Mngspice 当成 10 毫欧1 微法1u1M错误1M 被当成 1 毫法或 1 兆欧取决于量纲1 毫安1mA1m单位可以但注意 m 是小写数字后面不写单位的情况下SPICE 默认跟随器件类型比如电阻没写后缀就是欧姆电容没写后缀就是法拉。如果仿真结果比你预估的大了一千倍或者小了一千倍优先怀疑是不是把Meg写成了M把u写成了m。我和同事开玩笑说SPICE 仿真的本质就是“一秒钟计算出你设定错误的值”。5.4 收敛性错误分压电路一般不会不收敛但你加载了复杂芯片模型后偶尔会遇到transient analysis: timestep too small或者No convergence in loop。这时不要慌按优先级尝试检查模型文件里有没有“初始状态”相关参数必要时给关键电容加.ic初值。如果做瞬态分析把最大步长tmax设得小一点比如从 1ns 改成 100ps。把仿真方法改成Gear integration或换trapezoidalngspice 面板里通常可以直接设置。给某些元件并联一个大电阻到地缓解浮空节点带来的数值振荡。大多数仿真不收敛根因都是模型不干净或者电路拓扑存在微小浮空节点。学会看ngspice日志里第一次出现Warning的位置往往比盲目调参数更有效。6. 从分压电路走向真实设计三个扩展方向供你练手跑通了第一个仿真别满足。分压电路是一个非常强的“母电路”往三个方向演化能直接帮你进入真实项目。6.1 方向一传感器分压采集把固定电阻 R2 替换成一个可变电阻比如光敏电阻、NTC 热敏电阻或电位器Vout 就变成了一个随环境物理量变化的电压。MCU 里用 ADC 读这个电压就能换算成温度或光照。这种电路最简单的实现方式就是“电阻分压”但在画板之前先用 ngspice 仿真一遍不同阻值下的 Vout 范围就能提前确认 ADC 输入量程是否合适。例如NTC 用常用的 10k 规格在 25℃ 时阻值 10kR1 也取 10kVDD3.3VVout 就是 1.65V。温度升高NTC 阻值下降Vout 随之变化。你可以用 DC Sweep 扫描 NTC 阻值从 1k 到 50k直接看到输出电压覆盖范围用来判断要不要加上抬升电阻或运放缓冲。6.2 方向二分压偏置放大器把分压电路用在三极管放大器的基极偏置上是经典到不能再经典的应用。R1 和 R2 组成基极分压偏置为三极管提供一个稳定的工作点。你在 KiCAD 里把这个电路画出来仿真工作点你会看到三极管的集电极电流如何受偏置电阻影响。之后再叠加一个交流小信号源观察输出波形与输入波形的关系就开始摸到“放大器设计”的门槛了。这一步对新手来说跨度略大但它是值得的。因为你之前做的所有基础仿真操作——设置直流源、查看工作点、跑瞬态分析——都会在这里集中用到。6.3 方向三分压衰减与阻抗匹配在射频或高速信号里分压电路常作为衰减器attenuator出现。你可以试着把 R1、R2 改成特殊比例并用 AC 扫描分析频率响应。虽然纯电阻分压器的频响是平的但一旦加入寄生电容高频响应就会发生变化。你用 ngspice 给每个电阻并联一个几皮法的电容再跑 AC 扫描就会看到分压比随频率变化这是理解示波器探头补偿原理的绝佳练手。我个人在实际带新人的过程中最欣慰的一幕就是看到学员把分压电路的仿真做完后自己默默去查了 ADC 输入阻抗、去看了数据手册的输入等效电路。这说明他意识到仿真不是终点而是把理论变成工程直觉的起点。跑完这篇文章里的流程你应该能从“看到一个 SPICE 模板就头皮发麻”变成“随手搭个分压电路快速验证自己想法”的状态。当然ngspice 的命令行用法、KiCAD 的模型封装、复杂芯片的仿真收敛问题每个方向都有一大堆东西可以继续深挖。但基础盘你已经有了剩下的就是多仿真、多报错、多修错而已。