.MEASURE 语句进阶:TRAN、AC、DC 的用法与区别
上一章我们聊了 .MEASURE 的基本用法,说白了就是让 LTspice 帮我们自动抓数据。但很多工程师用了一两年,还只会写最基础的 .MEASURE TRAN V(out) AT 1m。其实 .MEASURE 的潜力远不止这些——它针对三种不同的仿真类型,有完全不同的触发逻辑和窗口函数。
我个人习惯把 .MEASURE 分成三大家族:TRAN 家族、AC 家族和DC 家族。它们各自对应不同的仿真域,语法细节也有差异。今天我们就来彻底搞清楚它们。
核心观点:.MEASURE 不是"一个"命令,而是"三套"命令。选错类型,结果就是错的。
三种 .MEASURE 的本质区别
先看一张对比表,快速建立整体认知:
| 特性 | .MEASURE TRAN | .MEASURE AC | .MEASURE DC |
|---|---|---|---|
| 仿真类型 | .TRAN(瞬态) | .AC(小信号) | .DC(直流扫描) |
| 横轴变量 | 时间 | 频率 | 扫描源值 |
| 典型用途 | 上升时间、过冲、建立时间 | 带宽、增益、相位裕度 | 传输特性、输入输出范围 |
| 触发条件 | 时间点 / 边沿 / 电平 | 频率点 / 频带 | 扫描值 / 区间 |
| 窗口函数 | FROM / TO | FROM / TO | FROM / TO |
你想想看,这三种仿真跑出来的数据维度完全不同。TRAN 是时域,AC 是频域,DC 是静态特性。如果你在 .AC 仿真里写 .MEASURE TRAN,LTspice 会直接报错——它根本不知道你要测什么。
.MEASURE TRAN:时域测量的主力
这是用得最多的一种。我在项目中遇到过最典型的场景:测一个 buck 转换器的启动时间。老板问"这个电源上电要多久?"你不能用手去量波形吧?
基本语法:
.MEASURE TRAN 结果名 表达式 触发条件 [窗口函数]
常用的触发条件有四种:
- AT=时间值:在指定时刻采样。比如 .MEASURE TRAN Vout AT 1m
- WHEN 表达式=值:当信号到达某个电平时触发。比如 WHEN V(out)=1.5
- TRIG / TARG:从触发点到目标点之间的测量。这是最强大的功能
- RISE / FALL / CROSS:指定第几次边沿
我的习惯:测上升时间时,永远用 TRIG/TARG 配合 CROSS 关键字。比手动算准确十倍。
来看一个实际例子——测一个运放输出的上升时间:
.MEASURE TRAN t_rise TRIG V(out)=0.1 RISE=1 TARG V(out)=0.9 RISE=1
这条命令的意思是:从 V(out) 第一次上升到 0.1V 的时刻开始,到它第一次上升到 0.9V 的时刻结束,计算时间差。嗯,这里要注意:RISE=1 指的是第一次穿越,不是第二次。
窗口函数 FROM/TO 可以限定测量范围:
.MEASURE TRAN Vout_max MAX V(out) FROM=1m TO=2m
这会在 1ms 到 2ms 的时间窗口内找 V(out) 的最大值。为什么要加窗口?因为很多电路在启动阶段有浪涌,不加窗口会把浪涌峰值当成正常值。
.MEASURE AC:频域测量的利器
AC 仿真测的是小信号频率响应。我记得刚入行时,测一个 LDO 的电源抑制比(PSRR),手动在波形图上找 -3dB 点,找了半天还找不准。后来学会用 .MEASURE AC,一秒搞定。
AC 测量的横轴是频率,所以触发条件变成了频率点:
.MEASURE AC gain_at_1k FIND V(out) AT=1k
这条命令在 1kHz 处读取 V(out) 的值。注意,AC 仿真的结果是复数,默认显示幅度(dB)和相位。如果你想单独测相位:
.MEASURE AC phase_at_1k FIND PH(V(out)) AT=1k
测带宽是 AC 测量的经典应用:
.MEASURE AC bandwidth WHEN V(out)=3dB DROP=1
这里 DROP=1 表示从低频增益下降 1dB?不对,DROP 的单位是绝对值,不是 dB。更准确的做法是用相对值:
.MEASURE AC f_3dB WHEN V(out)=V(out_0)*0.707
先测低频增益,再找 -3dB 点。我建议把两步分开写:
.MEASURE AC gain_0 FIND V(out) AT=100
.MEASURE AC f_3dB WHEN V(out)=gain_0*0.707
曾经踩过的坑:AC 仿真中,V(out) 默认是幅度比(单位是 dB 或线性)。如果你用 dB 显示,0.707 对应的是 -3dB。但如果你用线性显示,0.707 就是 0.707。一定要确认你的 .AC 仿真设置的是线性还是 dB 输出。
.MEASURE DC:直流扫描的专属工具
DC 测量用得相对少,但在某些场景下不可或缺。比如测一个比较器的输入阈值、一个电流镜的输出范围。
DC 扫描的横轴是扫描源的值(电压源、电流源或温度)。语法和 TRAN 类似,但触发条件基于扫描值:
.MEASURE DC Vth WHEN V(out)=V(in)*0.5
这条命令在 V(out) 等于 V(in) 一半时,记录当前的扫描值。常用于测反相器的阈值电压。
另一个常用场景是测输入输出范围:
.MEASURE DC Vout_min MIN V(out) FROM=0 TO=5
.MEASURE DC Vout_max MAX V(out) FROM=0 TO=5
这会在 0V 到 5V 的扫描范围内找 V(out) 的最小值和最大值。对于轨到轨运放,这个数据特别重要。
触发条件与窗口函数的通用规则
三种 .MEASURE 的触发条件和窗口函数其实是通用的。我整理了一张速查表:
| 关键字 | 用途 | 适用类型 | 示例 |
|---|---|---|---|
| AT | 在指定点采样 | TRAN / AC / DC | AT=1m / AT=10k / AT=2.5 |
| WHEN | 条件触发 | TRAN / AC / DC | WHEN V(out)=1.5 |
| TRIG / TARG | 区间测量 | TRAN / AC / DC | TRIG ... TARG ... |
| RISE / FALL | 边沿计数 | TRAN | RISE=2 / FALL=1 |
| CROSS | 穿越计数 | TRAN | CROSS=3 |
| FROM / TO | 窗口限定 | TRAN / AC / DC | FROM=1m TO=2m |
窗口函数 FROM/TO 特别有用。我曾经调试一个 PLL 的锁定时间,不加窗口时,仿真结果总是包含初始瞬态,导致测量值偏大。加上 FROM=10u TO=100u 之后,数据才真正反映锁定后的行为。
知识结构图
下面这张图帮你理清三种 .MEASURE 的关系和适用场景:
实战建议:如何选择
说了这么多,到底什么时候用哪种?我总结三条经验:
- 看仿真类型:跑的是 .TRAN 就用 .MEASURE TRAN,跑的是 .AC 就用 .MEASURE AC。这个不用多想。
- 看你要测什么:时域特性(时间相关)用 TRAN,频域特性(频率相关)用 AC,静态特性(电压/电流相关)用 DC。
- 看输出格式:TRAN 输出的是瞬时值,AC 输出的是幅度/相位,DC 输出的是扫描值对应的结果。确保你的表达式和输出格式匹配。
一个小技巧:如果你不确定语法对不对,先跑一次仿真,然后在 Error Log 里看 .MEASURE 的输出。LTspice 会把每条 .MEASURE 的结果都打印出来,包括单位。看到单位不对,马上就能发现问题。