.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 的关系和适用场景:

.MEASURE 语句三大家族 .MEASURE 语句 .MEASURE TRAN .MEASURE AC .MEASURE DC 时域测量 上升/下降时间 过冲/建立时间 脉宽/周期/频率 频域测量 带宽/-3dB点 增益/相位裕度 PSRR/CMRR 直流测量 阈值电压 输入/输出范围 传输特性拐点 触发条件与窗口函数通用 AT / WHEN / TRIG-TARG / FROM-TO 三种类型均可使用

实战建议:如何选择

说了这么多,到底什么时候用哪种?我总结三条经验:

  1. 看仿真类型:跑的是 .TRAN 就用 .MEASURE TRAN,跑的是 .AC 就用 .MEASURE AC。这个不用多想。
  2. 看你要测什么:时域特性(时间相关)用 TRAN,频域特性(频率相关)用 AC,静态特性(电压/电流相关)用 DC。
  3. 看输出格式:TRAN 输出的是瞬时值,AC 输出的是幅度/相位,DC 输出的是扫描值对应的结果。确保你的表达式和输出格式匹配。

一个小技巧:如果你不确定语法对不对,先跑一次仿真,然后在 Error Log 里看 .MEASURE 的输出。LTspice 会把每条 .MEASURE 的结果都打印出来,包括单位。看到单位不对,马上就能发现问题。