开篇

在PCB设计中,阻抗控制主要是指控制信号线的特性阻抗,使其与传输线或连接设备的阻抗匹配,以确保信号在传输过程中不产生过多的反射和损耗,常用于传输线的设计中。上述的重点就是阻抗匹配,客户端若在PCB中存在阻抗管控的要求,需要某一段线路的阻抗在XΩ±Y%(例:50Ω±10%)的范围内,PCB厂商在生产的过程中需要尽量保证阻抗线完整、平滑。

除了在生产过程中保证应该有的质量保证,还需要在工程设计阶段对资料中阻抗线的理论阻抗值进行模拟,如果模拟的阻抗值超出客户要求的阻抗管控范围,或偏差较大时,PCB厂商通常会对阻抗线进行建议调整,以确保阻抗值在客户要求的范围内。此外PCB生产完毕后,还需要指定的阻抗条测试模块,对PCB的阻抗进行测试,此时测量出来的就是板内实际的阻抗值了。

那么,如何对阻抗进行模拟计算呢?

Polar SI9000

我们需要使用到各种阻抗模拟的软件,本文使用的软件为:Polar SI9000,SI9000是Polar公司开发的一款用于PCB设计的阻抗模拟软件,可以帮助设计师精确计算和优化传输线的特性阻抗。该软件中有各种阻抗线的模拟层叠结构,常用的有单线、单线共面、双线、双线共面,以及提供了内层、外层、盖油、不盖油的几类模拟阻抗模拟计算结构;

若需要模拟阻抗,只需要选择一个符合客户资料设计的阻抗线模型,填入需要的参数后,点击Calculate(计算)即可实现对理论阻抗的模拟。接下来我们使用Coated Microstrip1B(外层单线盖油)模型来实现对阻抗的模拟计算:

首先,填入软件需要的参数:介质层厚度(H1)、介质层介电常数(Er1)、线路下线宽(W1)、线路上线宽(W2)、线路厚度(T1)、基材上油墨厚度(C1)、线路上基材厚度(C2)、油墨介电常数(CEr);

这些参数根据PCB厂商总结的常规参数填入即可,其中W1与W2,阻抗线的上下线宽通常是相差1Mil(受蚀刻药水的影响),1Mil是PCB厂商的常规蚀刻要求侵蚀的量,W1-W2=1Mil;关于板材以及油墨的介电常数需要让板材、油墨供应商来提供;填完参数点计算即可出现相应的阻抗Zo值了。

以上是一个阻抗仿真的步骤,实际上操作会比文本描述更加繁琐,更何况一个PCB中常规情况下不仅仅只有1个阻抗需要管控。并且SI9000的保存做的不是很好,如果PCB的层压叠构改变,所有阻抗都需要重新计算!非常难受... 这就让我产生了对SI9000阻抗程序的研究,找到软件的接口,制作一个基于SI9000计算接口的阻抗计算项目;

CalcEngineBEMDll.dll

旧版本的SI9000安装目录中,没有CalcEngineBEMDll.dll,应该是集成在软件中了,本文使用的SI9000版本是V7.1.0,其中CalcEngineBEMDll.dll版本为V3.30,PolarGraphDll.dll的版本为V1.30。

该阻抗计算软件的接口均在CalcEngineBEMDll.dll中,SI9000.exe本体就是调用dll中的开放的接口来实现阻抗值的计算。为什么?因为SI8000是SI9000的老版本,8000的安装目录中提供了两个Excel文件,分别为Si8000.xls、Si8000Expert.xls,这些Excel中的VBA代码均被加密,使用网上的破解方法进入查看工程代码后,发现表中实现阻抗值计算的方法均是来自CalcEngineBEMDll.dll,该dll使用depends.exe加载后显示存在139个方法,其中阻抗计算的方法就有95个,在depends.exe加载的dll并不能展示方法所需的参数个数、参数类型等信息,但是在SI8000的Excel中VBA工程中所有方法的参数、参数类型都在其中!

以上,我们可以知道,阻抗计算方法在DLL中,方法可以被调用,方法的传参可以参考VBA工程;但前提是,用户电脑上必须安装好SI9000软件才可以;

接下来,本文中我将使用Python对DLL中计算方法进行调用,其它的语言请读者自行尝试。

Python调用

Python是一个强大的高级编程语言,简单易用,各种领域都会有它的身影,无论是大小项目,都可以使用现有的pip包轻松实现。

示例项目使用的包为Python自带的ctypes,这个项目结构如下:

|--Auto_SI9000

|----main.py > 调用calcFun中的类实现阻抗值计算

|----models.py > 定义一些需要使用的结构体

|----si9000.py > 加载DLL,定义DLL中方法的传参及返回值

|----calcFun.py > Calc类(单计算),Calc_Plus类(多计算,继承Calc)

|---lib文件夹 > 存放需加载的DLL相关文件

接下来展示一下调用DLL的简单代码流程:

1、首先调用DLL中的ClaimFlexLicence方法,认证一下产品Key(仅需要认证一次);

2、使用IsCalculationModelAllowed方法,指定需要使用的模型并允许DLL可以准备开始计算;

3、调用计算方法CoatedMicrostrip1B方法,并传入需要前面讲到的单线模型需要的一些参数(H1、Er1等),调用完成后会立刻返回,它的返回值是int(long)类型,1或0;该方法会将传入的参数进行检查,检查后会立刻返回检查的结果,返回1,则代表计算已经开始,返回0,代表计算参数存在错误,需要重新检查参数正确性!

4、调用QueryCalculationFinished等待方法,等待计算结束;

5、使用QueryCalculationResult方法获取阻抗计算结果,该方法如果直接传入结构体,会出现写入权限限制的问题,需要将变量的地址作为参数解决该问题;

最后,结构体中的dImpedance就是结果阻抗值了!

以上的调用流程均是来自VBA工程中的,其中部分方法可以跳过,或更改流程,读者可自行尝试。

最后

本文到此为止就结束了,更多的DLL方法请自行在VBA工程中解读;

该项目目前还未完成,现只提供了一个单线模型的计算方法示例;

我会在文本末尾添加上本次示例项目的下载链接(Python代码,SI9000安装包),请自行下载,感谢各位!

项目下载链接:https://image.180402.xyz/S3/Auto_SI9000%20V2.exe