做射频或高速信号的人,应该都经历过这种时刻:板材叠层参数来自板厂,介电常数标称值本身就带±10%的容差,再加上蚀刻偏差、半固化片厚度波动,仿真模型里的特性阻抗到底准不准,心里其实没底。这时候如果能在ADS里用S参数仿真(也就是常说的SP仿真)搭一个简单的开路短路测试,用两种极端负载下的输入阻抗把Z0直接算出来,我实测下来是既快又准的校验手段。
这个方法的核心价值,在于它不需要你精确知道传输线的长度或电长度。你只需要在同一个参考面下,分别测量一段传输线开路和短路时的输入阻抗,两者乘积再开方,就是特性阻抗。原理来自最基础的传输线方程,但工程里真正把它跑通、跑准,还是有细节的。本文我把ADS里的完整建模、仿真设置、数据后处理过程拆开讲一遍,同时把我踩过的坑和排查思路也一并放出来,适合正在做射频电路仿真的工程师,也适合刚接触传输线理论、想在软件里验证公式的学生。
1. 为什么开短路法值得自己搭一遍:不依赖线长的阻抗提取思路
很多人第一次听到“开路短路法”的时候,反应是:这难道不是教科书上最早的反射测量方法吗?现在有TDR时域反射计,有VNA直接测Z参数,还有各种自动夹具提取工具,为什么还要手动搭一个Open/Short仿真?
我的看法是,这个方法在特定场景下仍然不可替代。首先是它只需要单端口就能测,你不需要双端口夹具,也不需要保证传输线两端都能接上测试头。对PCB上的一段直线走线来说,一端接连接器测S11,另一端用焊锡搭一个开路或者短路垫,是很容易实现的物理操作。其次是它对线长不敏感。用TDR测Z0,你得根据反射波返回的时间和幅度来推算;用VNA直接测Z11也行,但必须是标准两端口校准之后,而且样品的远端要匹配良好,否则一坨反射叠在一起很难读数。开短路法中,长度信息在做乘法的时候被消掉了,只要你扫描频率不触发电长度谐振点,算出来的Z0基本就是这条线的固有特性。
我经常在两类场景里用它。一类是板厂回来之后抽测:样品板上切下一段直线走线,两侧用SMA头或者探针引出,先测开路再测短路,两条曲线一算,Z0偏差一目了然,比送去外面做阻抗测试要快很多。另一类是仿真建模时反推参数:当叠层信息不完整,或者板材批次更换之后,我拿开短路法仿真出这条线的实际Z0,再反向调整ADS微带模型里的介电常数或线宽,让仿真和实测对上,这样后续整板仿真才有可信度。
1.1 一个反直觉的结论:乘积开方与线长无关
我当初第一次看到这个做法时,也愣了一下:一条线的输入阻抗在开路和短路状态下,明明都跟线长强相关,为什么乘到一起长度就没了?
原因在传输线公式里。对一段长度为l、传播常数为γ的均匀传输线,开路输入阻抗是Z0·coth(γl),短路输入阻抗是Z0·tanh(γl)。双曲余切和双曲正切互为倒数,两者一乘,不管l取多少、不管有耗还是无耗,结果都严格等于Z0²。换句话说,开短路法测的是“这条线本身的固有阻抗”,长度只是中间变量,最后会被数学上彻底消掉。
这个结论看起来简单,实际使用中意义很大:你不需要知道板材的等效介电常数,也不需要精确量出线的电长度,只要保证开路和短路两次测量发生在同一段线、同一个参考面上,得到的结果就是可信的。对很多不知道叠层细节的测试场景来说,这几乎是唯一不会因为“长度猜错”而引入误差的方法。
1.2 开短路法、TDR、VNA直测的对比
为了说清楚它的定位,我把常用手段放在一起对比过:
| 方法 | 需要的端口 | 对线长的依赖 | 典型误差来源 | 适用场景 |
|---|---|---|---|---|
| 开路短路法 | 单端口 | 基本无 | 参考面漂移、非理想开短路 | 快速抽测、模型反推、教学验证 |
| TDR | 单端口 | 强(依赖反射时间) | 上升沿带宽、过渡区阻抗突变 | 均匀性检查、断点定位 |
| VNA直测Z11 | 双端口校准 | 中等 | 夹具去嵌入、端口间串扰 | 精确材料参数提取 |
TDR的优势是能看整条线上的阻抗分布,能发现哪一段窄了、哪一段过孔残桩长;但它的Z0读数要换算,对夹具的重复性要求也不低。开短路法更像一个“宏观平均值”,它给你这条线的整体特性阻抗,信息量少一些,但干净、利落、可复现。在仿真的语境下,这个方法尤其适合跟理论公式做交叉验证,因为ADS里你可以严格控制所有参数,不存在夹具误差,算出来如果跟设定值不一致,那一定是你哪里的设置出了问题——这正是排查建模问题的好抓手。
2. 输入阻抗公式推导与“乘积开方”背后的适用条件
在动手搭ADS之前,值得花五分钟把推导过程完整捋一遍,否则仿真结果对不上时,你连该怀疑什么都不知道。
2.1 从传输线方程到Open/Short输入阻抗
传输线输入阻抗的标准公式是:
Zin = Z0 × (ZL + Z0·tanh(γl)) / (Z0 + ZL·tanh(γl))
当末端开路时,ZL趋向无穷大,分子分母同时除以ZL,取极限得到:
Zin_open = Z0 · coth(γl)
当末端短路时,ZL等于0,直接代入得到:
Zin_short = Z0 · tanh(γl)
把两个式子相乘:
Zin_open · Zin_short = Z0² · coth(γl) · tanh(γl) = Z0²
所以特性阻抗就是:
Z0 = sqrt(Zin_open · Zin_short)
这里有一个重要的扩展认知:很多教材在讲这个方法时,只写了无耗线的情况,用-jZ0·cot(βl)和+jZ0·tan(βl)推到乘积等于Z0²。但实际上面这个推导用双曲函数,并没有假设α等于0。也就是说,有损耗的传输线一样能用这个公式,只是这时候Z0不再是纯实数,而是一个带虚部的复数。工程上通常取它的实部或者模值作为“标称特性阻抗”,虚部反映的是损耗带来的附加阻抗。
这个认知在ADS微带仿真里特别有用。你用理想传输线模型时,算出来的Z0基本是干净的实数;一旦换成带损耗的微带模型,Z0计算结果的虚部就会出现,而且通常是负数,频率越高越明显。这不是你算错了,而是理论本身如此。
2.2 为什么不能随便扫描:电长度谐振点的约束
公式虽然普适,但数值计算上有个隐藏约束:开路阻抗和短路阻抗在特定电长度下会趋向0或无穷大,乘积变成0×∞的不定式,数值必然不稳定。
看无耗线的退化形式:
Zin_open = -jZ0 · cot(βl)
Zin_short = jZ0 · tan(βl)
当βl等于90°(即线长为四分之一波长)时,tan(90°)趋向无穷,cot(90°)趋向0。开路输入阻抗是0,短路输入阻抗是无穷大,乘积理论上仍是Z0²,但数值上你是在用一个接近0的数乘以一个接近无穷大的数,仿真器的双精度浮点在接近奇点的地方会产生明显噪声,最终曲线在谐振频率附近会乱跳,甚至出现完全不符合物理的尖峰。
所以实操中有一条经验法则:最高扫描频率对应的电长度,尽量控制在60°以内,保守一点45°。如果样品线太长,要么缩短线长,要么降低扫描上限。这个约束在理想传输线模型和微带线模型中都成立,只是微带线因为有频散,计算等效波长时要按群速度对应的导波波长来估,别直接用空气中的波长算。
3. ADS实操:从理想传输线到微带模型的两种建模方式
接下来是真正的动手环节。我在ADS里通常分两步走:先用理想传输线模型验证公式本身,确保整个仿真链路正确;再换成微带线模型贴近真实板材,观察损耗和频散对结果的修正。
3.1 用TLINP理想传输线验证理论
新建一个原理图,从“TLines-Distributed”面板拖出TLINP模型。双击模型设置参数:Z0填75,E填20,F填1GHz。E代表电长度,单位是度,含义是这跟线在频率F下的电长度。例如E=20°@1GHz,即该线在1GHz时长度为20°,在3GHz时为60°,全程不会碰到90°谐振,适合做验证。
在“Simulation-S_Param”面板拖出Term元件作为端口,再拖一个S_Param仿真控件。设置扫描100MHz到3GHz,步长10MHz,参考阻抗Z取50。这里建议用两个TLINP并排放置:一个末端接大电阻模拟开路,另一个末端接小电阻模拟短路,两个Term分别接在两段线输入端。这样一次仿真就能同时拿到两条S11曲线。
大电阻取1兆欧量级就够,小电阻取0.001欧。为什么不用严格的开路和短路?严格开路意味着节点悬空,ADS的S参数仿真会报DC路径问题,而且很多情况下求解器会把极端阻抗变成病态矩阵;严格0欧电阻到地,等效于给网络增加了一个奇异的低阻抗支路,也不稳定。1兆欧相对50欧是天壤之别,1毫欧相对50欧也完全是短路,这两者对S11的数值影响远小于双精度浮点误差,足够了。
仿真结束后,在数据显示窗口写方程:
Zin_open = 50*(1+S(1,1))/(1-S(1,1)) Zin_short = 50*(1+S(2,2))/(1-S(2,2)) Z0_calc = sqrt(Zin_open * Zin_short)注意这里S(1,1)对应开路这条线,S(2,2)对应短路这条线。如果两个Term端口号不是这个顺序,在原理图里检查一下端口编号。把Z0_calc的实部画出来,整个频带内应该非常平坦,数值稳定在75欧附近,虚部接近0。我第一次跑通时,看到曲线在整段频率上平得像一条直线,误差在千分之一以内,这个步骤相当于给自己的仿真链路做了一次“仪器自检”。
3.2 换成MLIN微带线:损耗带来的复数修正
理想传输线验证通过后,就要处理真实问题。从“TLines-Microstrip”面板拖出MLIN微带线模型,同时拖一个MSUB叠层定义控件。MSUB里填板材参数:
| 参数 | 数值 | 说明 |
|---|---|---|
| Er | 4.4 | FR4典型相对介电常数 |
| H | 1.6 mm | 介质厚度 |
| T | 0.035 mm | 铜箔厚度 |
| TanD | 0.02 | 损耗角正切 |
| Cond | 5.8e7 | 铜的电导率 |
MLIN的线宽W需要先用ADS自带的LineCalc算一下,目标50欧、板厚1.6mm、Er4.4时,W大概在2.8到3.0mm附近。线长我建议取10mm左右,这样在2.4GHz处电长度大约50°,在3GHz处约63°,不会触及谐振。把两条MLIN也按刚才的方式接到两个Term上,末端分别接大电阻和小电阻。
仿真完成后用同样的方程算Z0_calc,你会发现三个变化:实部依然稳定,但数值跟理想的50欧略有偏差,因为微带线的有效介电常数和损耗会轻微改变特性阻抗的实部;虚部不再为零,而是负值,且频率越高负得越明显;曲线在高频段有轻微向下倾斜的趋势。这些全都是真实物理现象,不是数值误差。如果虚部小到可以忽略,比如只有实部的百分之一以下,那你在工程上完全可以只报实部。
3.3 开路和短路在原理图里的接法细节
这里有一个容易忽略的细节:Term元件应该放在传输线的同一侧。换句话说,你是从线的“这一头”看进去,线“另一头”接负载。很多人第一次会把Term放在负载位置,仿真出来的S11完全不是那么回事。
正确接法如下:
Term1 —— TLINP/MLIN —— R_open(1MΩ) —— GND Term2 —— TLINP/MLIN —— R_short(0.001Ω) —— GND两个传输线模型的参数必须完全一致,一个是10mm,另一个也必须是10mm,不能一个用毫米一个用电长度混着填。理想模型TLINP如果填的是E和F,那么两条线的E和F要一致;微带模型则要保证W、L、Substrate引用都指向同一个MSUB。这个“一致性”是开短路法的灵魂,任何一边设置不同,乘积里的长度项消不掉,结果就偏了。
4. 后处理的关键几步:S11转Zin,再算Z0
仿真跑完只是第一步,数据后处理才是决定结果可信度的关键。很多人在ADS里直接看S11曲线,觉得开路线的S11接近1、短路线的S11接近-1,好像能看出点什么,但反射系数的幅度和相位不能直观映射到阻抗上,必须做转换。
4.1 S11换算Zin:参考阻抗选多少才不翻车
反射系数和输入阻抗的关系是:
Γ = (Zin - Zref) / (Zin + Zref)
反过来:
Zin = Zref × (1 + Γ) / (1 - Γ)
在ADS里,Zref就是Term元件的参考阻抗,默认是50欧。如果被测量传输线的特性阻抗偏离50欧很远,比如你在测一根100欧的线,用50欧参考时反射系数有比较大的幅度,依然能算得准。但如果你的线是3欧的电源平面缝隙线或者120欧的差分线,而端口参考还是50欧,S11的模非常接近1,(1-S11)和(1+S11)变成两个很小的数相减,精度就开始吃紧。
我在做这类仿真时,会先把端口参考阻抗改成接近预估Z0的值。比如预估这条线是100欧,就把Term的Z改到100,数据方程里的Zref也同步改成100。ADS的S_Param仿真中Term的参考阻抗可以直接修改,这个操作对S参数本身并没有本质改变,但能让后续转换的数值更稳。
4.2 数据显示窗口的完整方程写法
在数据显示窗口,如果开短路两组数据来自同一个仿真,就按前面那个写法:
Zin_open = 50*(1+S(1,1))/(1-S(1,1)) Zin_short = 50*(1+S(2,2))/(1-S(2,2)) Z0_calc = sqrt(Zin_open * Zin_short)如果两次仿真是分别跑的,两个数据集名称分别是open.ds和short.ds,那方程就要带数据集前缀:
Zin_open = 50*(1+open.S(1,1))/(1-open.S(1,1)) Zin_short = 50*(1+short.S(1,1))/(1-short.S(1,1)) Z0_calc = sqrt(Zin_open * Zin_short)具体的数据集引用语法在不同ADS版本里略有差异,建议你建好之后多试一次,核心逻辑就是把两批数据分别取出来算。画图时,我习惯把Re(Z0_calc)和Im(Z0_calc)同时画出来,而不是只画一个abs(Z0_calc)。因为实部和虚部的曲线能告诉你很多信息:实部平坦说明整条线均匀;虚部是负的说明损耗模型工作正常;如果虚部出现明显振荡,大概率是某个频率点接近谐振,或者参考阻抗不匹配。
4.3 复数结果的读法:虚部到底代表什么
关于复数Z0,我想多说一句。很多人第一次看到Z0_calc带虚部会慌,怀疑自己算错了。其实有损耗传输线的特性阻抗本身就是复数:
Z0 = sqrt((R + jωL) / (G + jωC))
当导体损耗和介质损耗存在时,R和G都是正数,算出来的Z0在直流附近有明显虚部,频率升高后虚部占比逐渐减小。对FR4板材来说,在几百兆赫到几吉赫范围内,Z0虚部大约是实部的百分之零点几到百分之一二,看你损耗模型怎么设置。如果你把MSUB里的TanD设成0,Cond设成无穷大,虚部就会变得非常小,几乎归零。这是一个很有用的调试手段:当你怀疑结果异常时,把损耗关掉,看虚部是否消失、实部是否更接近理想值,就能反向判断是不是损耗参数填错了。
5. 仿真中容易翻车的四个细节与一次完整排查
理论推导没问题,ADS操作也熟练,但仿真过程中仍然有几个细节我翻过车,每次翻车都花了不少时间才定位到根因。在这里按排查顺序梳理一遍。
5.1 坑1:把频率扫到四分之一波长谐振点
这个问题在前面原理部分提过,但实际遇到时的表现值得描述一下。有一回我把TLINP的电长度设成45°@1GHz,扫频到3GHz,在Z0_calc的曲线上看到2GHz附近出现一条又尖又深的毛刺,数值直接跳到几百欧,完全失真。当时第一反应是方程写错,反复检查后才发现,2GHz正好是这跟线的90°电长度点。
以后我就养成了一个习惯:仿真前先粗算一下最高频率下的电长度。理想传输线直接用E乘以频率倍数;微带线用导波波长算,比如FR4上2.4GHz的导波波长大概是70到75mm,10mm线约50°。如果算出来接近80°以上,我就把线改短或者降扫描上限。宁可少扫一个频段,也不要让结果里混进几个病态点。
5.2 坑2:开路电阻和短路电阻取到极端值反而出错
理论上开路电阻越大越好,短路电阻越小越好,但仿真器不是数学软件,太极端的值会恶化矩阵求解。我试过把开路电阻设成1e12Ω,结果S11的幅度在某些频点超过了1,也就是反射系数跑到单位圆外面,这在无源网络里物理上是不可能的,纯粹是数值噪声。把开路电阻降到1e6Ω后,曲线立刻恢复正常。
短路线也一样,从1e-6Ω改成1e-3Ω,误差几乎为零,但求解稳定性明显提升。记住一个原则:能稳定求解的前提下,越靠近物理极限越好,但不要为了“更理想”而牺牲数值稳定性。1MΩ和1mΩ就是很好的工程折中。
5.3 坑3:参考阻抗设置不一致导致隐性偏差
还有一次,我为了测一根70欧的线,把Term的参考阻抗改成了70,但数据方程里忘了把50改成70。结果Z0算出来是一条缓慢上升的曲线,低频对,高频偏,怎么都找不到原因。后来逐项检查才发现方程里还写着50。
这个问题的隐蔽之处在于,它的结果不是完全错误,而是“低频看起来对、高频越来越偏”,像极了频散效应或者介质损耗设置错误。如果你也遇到这种“半对半不对”的结果,第一反应应该是检查Term的参考阻抗和数据方程里的Zref是否一致,不要一上来就调MSUB参数。
5.4 从“结果对不上”到定位问题:一次完整排查过程
假设你现在发现Z0_calc在低频段实部是48.2欧,高频段缓慢降到47.5欧,而理想设定是50欧。你会怎么排查?我的一般顺序是这样。
第一步,回到理想模型做对照。把MLIN全部换成TLINP,相同电长度,Z0设50,跑一根。如果TLINP结果准确,说明问题出在微带模型参数上。第二步,检查MSUB的叠层参数。Er、H、T、TanD有没有填反?H是介质厚度不是板厚,T是铜厚不是线厚,这两项填反会让50欧目标完全失效。第三步,检查MLIN的W和L有没有填对单位,ADS里默认是毫米,但你从其他工具复制参数时可能会带错单位。第四步,用LineCalc重算一遍W,看理论预估值和当前值差多少。通常走到第四步,问题就已经暴露了。如果都查不出来,就在一个极端条件下对比:把TanD设成0、Cond设成极大,如果实部还是很低,必定是W或H的问题,跟损耗无关。
这套流程看起来没什么技术含量,但比你在仿真里乱试参数要快十倍。排查的本质是控制变量,每次只改一个,并且保留上一版的结果做对比,而不是同时改三个参数看曲线变化。
6. 从仿真延展到实测:校准、去嵌入与反推介电常数
仿真跑通了,很多项目的最终目标其实是为了指导实测,或者用实测数据反过来修正仿真模型。这里两个方向都值得说一说。
6.1 实测中的非理想开路和短路
当你在真实PCB板上测开短路时,理想开路不存在。走线末端焊盘和周围的铺铜会形成边缘电容,这个电容在低频可以忽略,到了GHz频段可能等效成几皮法甚至十几皮法,串联在“开路”端会让Zin_open偏离纯开路。短路也一样,打过孔到地会有残桩电感和过孔本身的小电阻,不是理想零欧。
这就意味着,实测中你不能拿板厂给的样品直接测完就套公式。工程上的做法是先做Open-Short校准:测一根完全断开和一根完全短路的校准件,得到误差项,再测被测线,用这些误差项做修正。在ADS里模拟实测时,可以在传输线末端并联一个几皮法的电容来模拟真实开路焊盘,串联一个小电感来模拟过孔残桩,看看这两种非理想性对Z0计算结果的影响幅度。你会发现,只要频率不是特别高,实部的偏移并不大,虚部会明显变差。
6.2 用开短路法反推板材参数:一个非常实用的操作
反过来用这个方法,还能解决一个很难搞的建模问题:手上只有一段板厂切下来的线,没有准确叠层参数。你去问板厂要Er和H,得到的是标称值,不是每一批都准。这时候开短路法能帮你反推。
做法是:在ADS里用标称叠层参数建一个微带模型,仿真得到Z0_sim;然后现场实测同一尺寸走线的开路短路,得到Z0_meas。如果Z0_sim高于Z0_meas,说明模型里Er偏低或者H偏高,按方向调整MSUB里的Er或H,再仿真对比,一般两三轮迭代就能让两条Z0曲线吻合。收敛之后,你得到的不仅是一条线的特性阻抗,而是一套可用于后续所有走线仿真的有效叠层参数。
我在调整叠层参数时,优先改Er而不是H。因为Er对Z0的影响更单调,H的宽带频散效应会更复杂。改Er每次步进0.1,改H每次步进0.02mm,迭代到实部曲线和虚部曲线同时贴合,才算完成。只贴合实部、虚部对不上,通常说明损耗参数TanD还有偏差。
这个方法我已经用成了习惯。每次换板材供应商或者叠层调整后,第一件事不是急着做整板仿真,而是找板厂要一块测试条,切一段线,跑一轮开短路仿真和实测对标。整个过程不到一个小时,却能避免后续几个星期里因为阻抗模型不准导致的反复返工。如果你也在做射频或高速设计,我建议你把这一套流程在ADS里完整跑一遍,哪怕只是用理想模型验证公式,也值得。