ADS中用W-Element模拟方形同轴线的RLGC建模方法

technology

此文为记录ADS方形同轴线RLGC建模从报错到功能正常调用的过程,最终解决方案见文末。

我们知道ADS中只有圆柱同轴线符号,没有其他结构的同轴线,因此我们在ADS仿真时,为了达到同样的阻抗,需要使用LineCalc计算实际阻抗在ADS中的同轴尺寸。

那有没有办法不用圆柱同轴符号呢?我们可以尝试一下用RLGC电路来模拟符号的方法。

比如使用W_Element符号,该符号用于通过 RLGC 参数配置多导体输电线路。

为了使用W_Element,我们需要准备RLGC文件。

首先记住一定要打开一个workspace后再打开这个窗口,否则界面是这样的。

打开workspace后command line窗口就变成这样了。

点击Apply运行文件,点击保存按钮保存ael文件到指定位置。

由于我们准备的代码是静默生成文件,所以控制台无输出。

代码如下——


decl pi; pi = 3.14159265358979;
decl c; c = 299792458;
decl mu0; mu0 = 1.2566370614e-6;
decl eps0; eps0 = 8.854187817e-12;
decl a; a = 0.35;
decl b; b = 0.64;
decl eps_r; eps_r = 1.0006;
decl tand; tand = 0.002;
decl sigma; sigma = 5.96e7;
decl start_freq; start_freq = 1e6;
decl stop_freq; stop_freq = 150e6;
decl num_points; num_points = 150;
decl ratio; ratio = a / b;
decl Z0; Z0 = (47.086 / sqrt(eps_r)) \* (1.0 - ratio) / (0.279 + 0.721
\* ratio);
decl v; v = c / sqrt(eps_r);
decl L0; L0 = Z0 / v;
decl C0; C0 = 1.0 / (Z0 \* v);
decl df; df = (stop_freq - start_freq) / (num_points - 1);
decl fid; fid = fopen(\"square_coax.rlgc\", \"w\");
fprintf(fid, \"\* RLGC File\\n\");
fprintf(fid, \"\* Z0=%.2f\\n\", Z0);
fprintf(fid, \"\\n\");
decl Rdc; Rdc = 1.0/(sigma\*a\*a);
fprintf(fid, \"0.000000e+00 %.6e %.6e %.6e 0.000000e+00\\n\", Rdc, L0,
C0);
decl i; i = 1;
decl f;
decl Rs;
decl R;
decl G;
while(i \<= num_points)
{
f = start_freq + (i-1)\*df;
Rs = sqrt(pi \* f \* mu0 / sigma);
R = Rs \* (1.0/(2.0\*a) + 1.0/(2.0\*b));
G = 2.0 \* pi \* f \* C0 \* tand;
fprintf(fid, \"%.6e %.6e %.6e %.6e %.6e\\n\", f, R, L0, C0, G);
i = i + 1;
}
fclose(fid);

可以看到已经生成了RLGC文件。

但是在如下的电路中运行报错了。

W_Element1的设置如图所示。截图是错的,输入路径不能带双引号,否则会找不到文件。建议将rlgc文件放在项目文件夹,默认文件夹层级是“.\Megawave_wrk\data”。

为了验证RLGC文件是否正常,以及确认W_Element1是否设置错误,我们搭建这样一个电路,频率范围设置与RLGC代码中的一致。

  1. 新建一个 空白原理图

  2. 只放这 4 个元件:

    • PORT 两个

    • W-ELEMENT1 一个

    • SP1 (仿真控制器)一个

  3. 连线:
    PORT1 → W-ELEMENT1 → PORT2
    地线全部默认

确认一下设置有没有问题。

运行提示如图所示,依然无法读取RLGC文件。

查阅官方文档寻找原因,得出以下结论。

我现在用的是 Model_type=0(静态模型),但我的 RLGC文件是按频率分段的格式写的,这完全不匹配!

一、官方文档明确说明:两种模式的文件格式完全不同

1. Model_type=0(静态模型)

  • 只能用 RLGCfile 参数

  • 文件里没有频率点

  • 格式:[N] L11 L21 L22 C11 C21 C22 Rdc11 Rdc21 Rdc22 Gdc11 Gdc21
    Gdc22 Rs11 Rs21 Rs22 Gd11 Gd21 Gd22

  • 我的文件里写了频率、1MHz、150MHz 这些,Model_type=0 会直接当成无效数据,报读取错误。

2. Model_type=1(频率相关模型)

  • 不能用 RLGCfile 参数

  • 必须用 Lfile / Cfile / Rfile / Gfile 分别定义每个矩阵的文件

  • 每个文件的格式才是:[点数] 频率 L11 L21 L22 ...

  • 我现在的文件格式,只能给 Model_type=1 用,给 Model_type=0 用必然报错!

那我们试着把 W-Element 改成频率相关模式。因为 Model_type=1 要求每个矩阵单独一个文件,把我的RLGC 文件拆成 4 个独立文件试试。

编写一下生成四个独立文件的代码——

decl pi; pi = 3.14159265358979;
decl c; c = 299792458;
decl mu0; mu0 = 1.2566370614e-6;
decl a; a = 0.35;
decl b; b = 0.64;
decl eps_r; eps_r = 1.0006;
decl tand; tand = 0.002;
decl sigma; sigma = 5.96e7;
decl start_freq; start_freq = 1e6;
decl stop_freq; stop_freq = 150e6;
decl num_points; num_points = 150;
decl ratio; ratio = a / b;
decl Z0; Z0 = (47.086 / sqrt(eps_r)) \* (1.0 - ratio) / (0.279 + 0.721
\* ratio);
decl v; v = c / sqrt(eps_r);
decl L0; L0 = Z0 / v;
decl C0; C0 = 1.0 / (Z0 \* v);
decl df; df = (stop_freq - start_freq) / (num_points - 1);
decl fidL; fidL = fopen(\"L.rlgc\", \"w\");
decl fidC; fidC = fopen(\"C.rlgc\", \"w\");
decl fidR; fidR = fopen(\"R.rlgc\", \"w\");
decl fidG; fidG = fopen(\"G.rlgc\", \"w\");
// 写入点数(含DC点,共151个)
fprintf(fidL, \"%d\\n\", num_points + 1);
fprintf(fidC, \"%d\\n\", num_points + 1);
fprintf(fidR, \"%d\\n\", num_points + 1);
fprintf(fidG, \"%d\\n\", num_points + 1);
// DC点
decl Rdc; Rdc = 1.0/(sigma\*a\*a);
fprintf(fidL, \"%.6e %.6e\\n\", 0.0, L0);
fprintf(fidC, \"%.6e %.6e\\n\", 0.0, C0);
fprintf(fidR, \"%.6e %.6e\\n\", 0.0, Rdc);
fprintf(fidG, \"%.6e %.6e\\n\", 0.0, 0.0);
decl i; i = 1;
decl f;
decl Rs;
decl R;
decl G;
while(i \<= num_points)
{
f = start_freq + (i-1)\*df;
Rs = sqrt(pi \* f \* mu0 / sigma);
R = Rs \* (1.0/(2.0\*a) + 1.0/(2.0\*b));
G = 2.0 \* pi \* f \* C0 \* tand;
fprintf(fidL, \"%.6e %.6e\\n\", f, L0);
fprintf(fidC, \"%.6e %.6e\\n\", f, C0);
fprintf(fidR, \"%.6e %.6e\\n\", f, R);
fprintf(fidG, \"%.6e %.6e\\n\", f, G);
i = i + 1;
}
fclose(fidL);
fclose(fidC);
fclose(fidR);
fclose(fidG);

运行后,我的工程目录会生成这 4 个文件,然后 W-Element1这样设置(Model_type=1)。

然后我们发现报了这个奇怪的错误。

然后人工智能给了我提供奇怪的提示——

官方文档的隐藏要求:Model_type=1 的文件格式

我再仔细看了一遍我贴的帮助文档,里面写了关键一句:

For Model_type=1, the data consists of pairs, where each pair is formed
by a frequency value followed by the matrix entries at that frequency.

对 N=1 的传输线,L/C/R/G 都是 **1x1 矩阵**,所以每一行的数据格式是:

频率值 矩阵元素

但还有一个 **关键细节**,官方文档没写死,但 ADS 强制要求:

**频率值必须是整数,不能是科学计数法!**

ADS 的解析器对科学计数法(如
1.000000e+06)有兼容性问题,我文件里的频率用 1.000000e+06
写,它会解析失败,直接报 Error reading the W_Element data file。

我们现在将频率全部改成普通数字。

decl pi; pi = 3.14159265358979;
decl c; c = 299792458;
decl mu0; mu0 = 1.2566370614e-6;
decl a; a = 0.35;
decl b; b = 0.64;
decl eps_r; eps_r = 1.0006;
decl tand; tand = 0.002;
decl sigma; sigma = 5.96e7;
decl start_freq; start_freq = 1e6;
decl stop_freq; stop_freq = 150e6;
decl num_points; num_points = 150;
decl ratio; ratio = a / b;
decl Z0; Z0 = (47.086 / sqrt(eps_r)) \* (1.0 - ratio) / (0.279 + 0.721
\* ratio);
decl v; v = c / sqrt(eps_r);
decl L0; L0 = Z0 / v;
decl C0; C0 = 1.0 / (Z0 \* v);
decl df; df = (stop_freq - start_freq) / (num_points - 1);
decl fidL; fidL = fopen(\"L.rlgc\", \"w\");
decl fidC; fidC = fopen(\"C.rlgc\", \"w\");
decl fidR; fidR = fopen(\"R.rlgc\", \"w\");
decl fidG; fidG = fopen(\"G.rlgc\", \"w\");
fprintf(fidL, \"%d\\n\", num_points + 1);
fprintf(fidC, \"%d\\n\", num_points + 1);
fprintf(fidR, \"%d\\n\", num_points + 1);
fprintf(fidG, \"%d\\n\", num_points + 1);
decl Rdc; Rdc = 1.0/(sigma\*a\*a);
fprintf(fidL, \"0 %.6e\\n\", L0);
fprintf(fidC, \"0 %.6e\\n\", C0);
fprintf(fidR, \"0 %.6e\\n\", Rdc);
fprintf(fidG, \"0 %.6e\\n\", 0.0);
decl i; i = 1;
decl f;
decl Rs;
decl R;
decl G;
while(i \<= num_points)
{
f = start_freq + (i-1)\*df;
Rs = sqrt(pi \* f \* mu0 / sigma);
R = Rs \* (1.0/(2.0\*a) + 1.0/(2.0\*b));
G = 2.0 \* pi \* f \* C0 \* tand;
fprintf(fidL, \"%.0f %.6e\\n\", f, L0);
fprintf(fidC, \"%.0f %.6e\\n\", f, C0);
fprintf(fidR, \"%.0f %.6e\\n\", f, R);
fprintf(fidG, \"%.0f %.6e\\n\", f, G);
i = i + 1;
}
fclose(fidL);
fclose(fidC);
fclose(fidR);
fclose(fidG);

运行提示依然如上图所示。

我们再翻一下help文件。

For Model_type=1, the data consists of pairs, where each pair is formed
by a frequency value followed by the matrix entries at that frequency.

For N signal lines, the matrix entries are:

L11 L12 … L1N L21 L22 … LNN

Similarly for R, C, G files.

……

When N=1, the matrices are scalar (1×1).

So each line is:

frequency value

……

NOTE:

The tabular model (Model_type=1) is intended for coupled lines (N ≥ 2).

For a single line (N=1), use the static RLGC model (Model_type=0).

N=1 不能用 Model_type=1,只能用 Model_type=0。

放弃 Model_type=1,回到 Model_type=0(static),只用 1 个 RLGC 文件。

我们写这样一段.ael代码,生成文件名static的RLGC文件。

decl pi; pi = 3.14159265358979;
decl c; c = 299792458;
decl mu0; mu0 = 4 \* pi \* 1e-6;
decl a; a = 0.35;
decl b; b = 0.64;
decl eps_r; eps_r = 1.0006;
decl tand; tand = 0.002;
decl sigma; sigma = 5.96e7;
decl ratio; ratio = a / b;
decl Z0; Z0 = (47.086 / sqrt(eps_r)) \* (1.0 - ratio) / (0.279 + 0.721
\* ratio);
decl v; v = c / sqrt(eps_r);
decl L0; L0 = Z0 / v;
decl C0; C0 = 1.0 / (Z0 \* v);
decl Rdc; Rdc = 1.0/(sigma\*a\*a);
decl Gdc; Gdc = 0.0;
// 生成 STATIC 格式 RLGC 文件(N=1 专用)
decl fid; fid = fopen(\"static.rlgc\", \"w\");
fprintf(fid, \"1\\n\"); // N=1
fprintf(fid, \"%.6e \", L0); // L11
fprintf(fid, \"%.6e \", C0); // C11
fprintf(fid, \"%.6e \", Rdc); // Rdc11
fprintf(fid, \"%.6e \", Gdc); // Gdc11
fprintf(fid, \"0.0 \"); // Rs11
fprintf(fid, \"0.0\\n\"); // Gd11
fclose(fid);

然后我们试一下,完美。

结果一模一样。

现在我们回过头来说明一下代码的计算过程:

  1. 基础物理常数
  • pi → 圆周率

  • c = 299792458 → 真空中光速

  • mu0 = 4πe-7 → 真空磁导率

这些是传输线计算的基础常数。

  1. 传输线几何参数

我仿真的是 方形同轴线

  • a = 0.35:内导体半边长

  • b = 0.64:外导体内半边长

  1. 半径比 ratio

ratio = a / b

用于后面的阻抗经验公式。

  1. 核心公式:方形同轴线特性阻抗 Z0

Z0 = (47.086 / sqrt(eps_r)) * (1 - ratio) / (0.279 + 0.721 * ratio)

这是 ADS 官方方形同轴线阻抗经验公式

  • 47.086 → 固定系数

  • sqrt (eps_r) → 介质影响

  • (1-ratio) → 几何尺寸影响

  • 分母是拟合系数

输出:Z0 ≈ 31.68 Ω

  1. 相速度 v

v = c / sqrt(eps_r)

传输线中电磁波速度,永远比光速慢,由介质决定。

  1. 单位长度电感 L0

L0 = Z0 / v

传输线理论基础公式:

Z0 = sqrt(L0/C0)

v = 1/sqrt(L0*C0)

推导得到:

L0 = Z0 / v

  1. 单位长度电容 C0

C0 = 1 / (Z0 * v)

同样由传输线基础公式推导而来。

  1. 直流电阻 Rdc

Rdc = 1 / (sigma * a²)

  • sigma:导体电导率

  • a²:截面积

这是直流电阻模型

  1. 直流电导 Gdc

Gdc = 0

理想介质,无漏电流。

  1. 生成静态 RLGC 文件(ADS 专用格式)
1
L11 C11 Rdc11 Gdc11 Rs11 Gd11

格式严格对应:

1 → N=1

L0 → 单位长度电感

C0 → 单位长度电容

Rdc → 直流电阻

Gdc → 直流漏电导

0 → 集肤效应电阻(静态模型不用)

0 → 介质损耗电导(静态模型不用)