电路仿真基本流程:从网表到波形
说实话,很多初学者拿到 SPICE 第一件事就是点「运行」。结果呢?要么报错看不懂,要么波形出来不知道对不对。我当年也干过这事——直接拿别人网表一跑,看着波形挺漂亮,后来才发现电源极性都画反了。
电路仿真不是黑盒子。你得知道每一步在干什么。今天我就带你走一遍完整流程:网表编写 → 仿真器设置 → 运行仿真 → 查看波形。顺便把最常见的三种仿真类型(DC、AC、瞬态)讲透。
核心观点:仿真流程就像做实验——先搭电路(网表),再设仪器(仿真器),然后按按钮(运行),最后看数据(波形)。哪一步偷懒,结果就骗你。
第一步:网表编写——电路的「语言」
网表是什么?说白了,就是用文本描述电路。每个元件一行,节点编号连接,最后加个 .end 告诉仿真器「我说完了」。
我习惯把网表分成三块:
- 标题行:随便写,但要有辨识度。比如
My_First_Sim - 元件语句:电阻 R、电容 C、电感 L、电压源 V、电流源 I……每个元件一行
- 控制语句:以
.开头,告诉仿真器做什么分析、输出什么
看个最简单的例子——一个电阻分压电路:
* 电阻分压网表
V1 1 0 DC 5V
R1 1 2 1k
R2 2 0 2k
.DC V1 0 5 0.1
.PRINT DC V(2)
.END
注意那个 V1 1 0 DC 5V——节点 1 接正,节点 0 接地。节点 0 是全局地,所有仿真器都认。我见过有人把地节点写成 GND,结果仿真器直接报错。嗯,节点 0 是硬规定,别改。
小技巧:网表里用 * 开头的是注释。我习惯在每个模块前加一段注释,说明功能、作者、日期。三个月后你自己回头看,会感谢这些注释的。
第二步:仿真器设置——告诉它你想看什么
网表写好了,仿真器还不知道你要干嘛。是算静态工作点?还是扫频率?还是看波形随时间怎么变?
这些都由「分析语句」控制。最常用的三个:
| 分析语句 | 作用 | 典型写法 |
|---|---|---|
.DC |
直流扫描——改变某个源的值,看节点电压/电流变化 | .DC VIN 0 5 0.1 |
.AC |
小信号交流分析——扫频率,看幅频/相频特性 | .AC DEC 10 1 1MEG |
.TRAN |
瞬态分析——看时域波形 | .TRAN 1u 1m |
另外还有 .OP(直流工作点)、.TF(传输函数)等,但最常用的就是上面三个。我刚开始做仿真时,经常搞混 .DC 和 .TRAN——一个扫直流,一个跑时间,完全两码事。
注意:AC 分析的前提是电路已经算好了直流工作点。仿真器会先自动跑一遍 .OP,再在偏置点上叠加小信号。所以如果你的电路没给对偏置,AC 结果全是错的。我曾经在这上面栽过跟头——运放没加直流偏置,AC 扫出来增益是负的,查了半天才发现。
第三步:运行仿真——等它算完
设置好了,运行。大部分 SPICE 仿真器在命令行下就是敲 ngspice netlist.cir 或者点一下 GUI 里的「Run」按钮。
运行过程中,你会看到仿真器在屏幕上打印进度。如果网表有语法错误,它会直接报错退出。常见的报错有:
- 「No such device」——元件类型写错了,比如把
R写成r(大小写不敏感,但拼写不能错) - 「Node 0 is floating」——有节点没接地,或者没连到任何元件
- 「Singular matrix」——电路有矛盾,比如两个理想电压源并联
遇到报错别慌。我一般先看第一行错误提示,然后检查对应行附近的语法。80% 的错误都是拼写或节点编号问题。
避坑指南:我曾经写过一个网表,电阻值写成 1k 但忘了加单位后缀。SPICE 默认单位是欧姆,所以 1k 被当成 1 欧姆而不是 1 千欧。正确写法是 1k 或 1K,但 1k 后面不能有空格。养成习惯:数值和单位之间不要空格。
第四步:查看波形——数据变图形
仿真跑完了,数据存在 .raw 或 .out 文件里。你需要用波形查看器把它画出来。
常用的工具有:
- ngspice 内置的 plot:命令行下直接
plot V(2)就能看到简单波形 - GTKWave:开源,支持多种格式
- 专业 EDA 工具:Cadence ADE、Synopsys Custom WaveView 等
看波形时,我习惯先看整体趋势,再看细节。比如瞬态分析,先看信号有没有起振、幅度对不对,再放大看上升沿、过冲这些细节。
你想想看,如果波形出来是一条直线,可能是电路没工作,也可能是仿真时间太短。我遇到过有人跑瞬态只设了 1 纳秒,振荡器还没起振就结束了——波形当然是一条直线。
三种仿真类型详解
DC 分析——找静态工作点
DC 分析就是算电路在直流下的状态。所有电容开路、电感短路,只考虑电阻和直流源。结果就是每个节点的直流电压、每条支路的直流电流。
典型应用场景:
- 放大器偏置点检查——三极管 VCE 是否在合适范围
- 电源网络压降分析
- 传输门导通电阻计算
DC 扫描(.DC)则是让某个源的值从 A 变到 B,看电路响应。比如扫一个电阻分压器的输入电压,看输出怎么变——这就是最简单的传输特性曲线。
AC 分析——看频率响应
AC 分析是在直流工作点基础上,叠加一个小正弦信号,然后扫频率。结果就是幅频曲线和相频曲线。
为什么叫「小信号」?因为信号幅度足够小,电路可以近似为线性。如果信号太大,非线性效应就出来了,AC 分析就不准了。
我做过一个滤波器设计,AC 仿真显示 -3dB 带宽是 100kHz,实际测试出来是 95kHz。嗯,差 5% 以内,说明模型和仿真设置都没问题。如果差太多,就要检查寄生参数了。
瞬态分析——看时域波形
瞬态分析是最直观的——给一个激励,看电路怎么响应。比如给一个方波,看输出波形有没有过冲、振铃、延迟。
瞬态分析的核心参数是时间步长和总时长。步长太小,仿真慢;步长太大,波形失真。我一般先设一个保守的步长(比如信号周期的 1/100),跑通后再调大步长加速。
经验之谈:三种仿真类型各有用途,但实际项目中经常组合使用。先跑 DC 确认偏置点,再跑 AC 看频率特性,最后跑瞬态验证时域响应。三步走完,电路基本就摸透了。
一个完整的仿真示例
下面是一个共射放大器的完整网表,包含了三种分析:
* 共射放大器仿真
VCC 1 0 DC 12V
R1 1 2 10k
R2 2 0 4.7k
RC 1 3 2k
RE 4 0 1k
Q1 3 2 4 NPN
VIN 5 0 DC 0 AC 1 SIN(0 0.1 1k)
C1 5 2 10u
C2 3 6 10u
RL 6 0 10k
.MODEL NPN NPN(BF=200 VAF=50)
.DC VIN 0 1 0.01
.AC DEC 10 10 10MEG
.TRAN 1u 2m
.PRINT DC V(3)
.PLOT AC V(6)
.PROBE
.END
你看,一个网表里同时写了 .DC、.AC、.TRAN。仿真器会依次执行这三种分析,输出各自的结果。你只需要在波形查看器里选择想看哪个就行。
建议:刚开始学的时候,别急着跑复杂电路。拿一个电阻分压器练手,把 DC 扫描、AC 分析、瞬态分析都跑一遍。等流程走熟了,再上放大器、滤波器这些。我当年就是这么过来的——一个分压器跑了十遍,把每个参数都试了一遍,后来遇到复杂电路心里就有底了。