用于制造印制电路板的补偿模型和配准仿真器装置及方法 版权说明
本专利文献中的一部分包括受到版权保护的内容。版权所有人并不反对任何人对专利文献的内容进行传真复制,只要是在专利和商标局的文件和记录中出现就行;除此以外,版权所有人保留一切版权。发明背景
1.发明领域
本发明涉及多层印制电路板,更加具体地说,涉及在层压成型之前多层印制电路板(MLB)的配准方法。
2.相关技术
在印制电路板行业,很少有问题能够象配准这个问题一样富有挑战性,也很少能够象它这样重要。在钻孔的时候或者进行电测试的时候对多层印制电路板废品堆进行检查会使人迷惑不解并且非常懊恼。在许多电路板中或者一个底板上有一个电路可能是完美无缺的,而下一个电路则是乱七八糟,到处都是错误。如果废品量很大,就有必要立即修改电路板设计。用来解决配准问题的修正方案常常不是看一眼就能够找到的,因此实际进行的修正常常无法给出令人满意的结果。
多层印制电路板出现配准误差的原因有许多,它们包括:(1)偏移误差;(2)角度误差;(3)随机噪声;(4)补偿误差。补偿误差来源于对芯板和电介质层进行多层层压成型以后,对多层印制电路板由于材料移动导致的收缩和膨胀的错误估计。
可惜的是,在估计需要多大补偿的时候,现有技术只是建议考虑每个芯板上有多少铜,以及芯板地厚度,而根本没有考虑整个多层印制电路板的设计和结构。在现有技术中用于产生矩阵的数据是在以往生产信息的基础之上获得的。现有技术中的这些模型没有能够精确地估计到底需要多少补偿,甚至有时候,在模型和实际产品之间会出现高达正负15个密尔的误差。在图1中给出了现有技术中补偿矩阵的一个实例。这个矩阵是大小是24英寸乘以18英寸的底板的一个补偿矩阵,其中在经线方向(X方向)是18英寸,在纬线方向(Y方向)是24英寸。现有技术中的这个矩阵只是根据芯板上有多少铜和这个芯板的厚度来确定的,在减小补偿误差的过程中,这一点使得这一矩阵的有效性大打折扣。
实际上,使用现有技术中的补偿矩阵会打断多层印制电路板的生产过程。图2给出了一个大型印制电路板车间中补偿工艺简化工艺流程的一个流程图。图2中的箭头30说明非常不稳定的工艺所在的区域。在图2所描述的反馈过程中,错误信息会差之毫厘,缪以千里,引发极大的配准误差。这种现象发生在反馈信息是错误的或者反馈发生在很长的延迟周期以后的情况下。不巧的是,印制电路板车间在生产过程中需要做大量的工作这一事实极大地限制了去掉有害的滞后时间的能力。信息不完整和输入延迟也会限制对生产过程中的产品进行补偿改正的能力。在完整的生产批量已经完成以后才进行补偿修改无异于修改工艺流程,这样做常常会导致废品率直线上升。减小补偿误差的一条途径是提高在生产之前对生产误差补偿的预测精度。现有技术中基于以往生产数据组的策略缺乏所需要的设计组合来检测控制材料移动的重要变量和相互作用。因此,现有技术中的补偿矩阵不能够在生产之前精确地预测误差,从而需要在生产过程中采用成本高昂的改进方法。
在图2所示的方框32中,初始补偿值是从图1所示的尺寸矩阵中选择出来的。在方框34中,测试样品(它通常是10块或者更多的多层印制电路板叠放在一起)和第一批产品被“投入”(开始)生产。由于时间紧迫,通常都不可能首先进行测试来确定是否存在生产问题(也就是说没有时间来检查预测出来的补偿值实际上是否正确),然后再进行实际生产。相反,必须为生产同时准备好测试样品和生产批量。在方框36中,对测试样品进行测量有没有误差,而同时还在进行生产。在那以后,在方框38中,将多出的芯板(它们是上面腐蚀出了电路的多余芯板)收集起来。因为有一些印制电路板会成为废品,所以多生产了一些芯板。这些多出来的产品被储存起来以便在需要它们的时候拿出来使用。
在方框42中对测试样品所进行的测量的基础之上,在图2所示的方框40中修改布线图,以便能够减小补偿误差。但是,由于老一批产品仍然在生产线上,这些老一批产品仍然在使用,如同方框44所示,这一点导致了在解决生产中存在的问题的过程中出现不稳定的滞后。还有,由于时间有限,在生成过程中仍然在使用老的芯板,如同方框46所示。
目前确定和修正多层印制电路板配准误差的方法效率很低,而且无法预测,导致出现大量的废品。因此需要在生产开始以前而不是在生产过程中确定配准误差,特别是补偿误差。
除此以外,现有技术还没有能够很好地搞清楚不同配准误差源之间是如何相互作用的。通常情况下,现有技术只是将所有配准误差源的方差加起来,以此尝试计算出总的配准误差。例如,布线图中的补偿误差,腐蚀后打孔机引起的偏移误差和角度误差,以及钻床的随机噪声,不能通过计算它们的平方和来合并。这种一维分析无法搞清楚这些误差如何在底板表面流动,同样无法搞清楚这些配准误差源是否互相独立,这些误差组合在一起,产生非常复杂,看起来无法解释的配准误差模式。正因为如此,需要考虑各种类型误差之间的相互作用,才能够更好地实现多层印制电路板的配准。
发明简述
一方面,本发明提供了一种方法,用来模拟在印制电路板的配准过程中所进行的补偿。这种方法包括提供多个印制电路板的步骤,这多个印制电路板有多个芯板,它们在这些芯板之间采用至少一层电介质。这种方法还包括测量每个印制电路板的至少一个芯板在生产过程中出现的移动。还有,这个方法还包括在这个芯板移动测量结果的基础之上以及在至少一个电介质层的基础之上形成一个补偿模型的步骤。
第二方面,本发明提供了一种方法,用来模拟在印制电路板的配准过程中所进行的补偿。这个方法包括提供多个印制电路板的步骤,这多个印制电路板有多个芯板,在芯板之间具有电介质层,这些芯板位于印制电路板中。这个方法还包括测量这些芯板在印制电路板生产过程中发生的移动的步骤。还有,这个方法还包括在芯板移动测量结果的基础之上以及在印制电路板中芯板位置的基础之上产生一个补偿模型的步骤。
第三方面,本发明提供一种方法,用来模拟在印制电路板的配准过程中所进行的补偿。这个方法包括提供带有至少第一个芯板和第二个芯板的印制电路板的步骤,在第一个芯板的至少一面以及在第二个芯板的至少一面有电路布局。这个方法还包括在生产过程结束以后测量印制电路板的芯板,以便搞清楚每个芯板移动程度的步骤。还有,这个方法还包括在印制电路板芯板测量结果的基础之上,以及在第一个芯板至少一面以及第二个芯板至少一面上的电路布局的基础之上产生一个补偿模型的步骤。
第四方面,本发明提供一种方法,用于在加工具有多个芯板、电路在这个芯板上、电介质层在这些电路之间的多层印制电路板的过程中,减小补偿误差。这个方法包括确定多层印制电路板从一组特征中挑选出来的至少一个特征的步骤,这一组特征包括芯板在多层印制电路板中的位置、电介质层和相邻芯板上的电路。这个方法还包括在来自补偿模型至少一个特征的基础之上产生至少一个补偿系数的步骤。还有,这个方法还包括在至少一个补偿系数的基础之上修改电路的步骤。
第五方面,本发明提供一种仿真器,用于确定多层印制电路板中的补偿误差,这个多层印制电路板具有至少一个电介质层、多个芯板以及多个芯板上的电路结构。这个仿真器包括一个处理器以及跟这个处理器有电连接的一个存储器装置,这个存储器装置包括误差数据的一个补偿矩阵,其中包括在这个多层印制电路板至少一个特征基础之上的X误差和Y误差测量结果,这个多层印制电路板的至少一个特征是从一组特征中选择出来的,这一组特征至少包括一个电介质层、芯板在这一叠层中的位置、多个芯板上的电路结构、这个多层印制电路板的组合以及芯板跟电介质层之间的相互作用。
第六方面,本发明提供一种方法,用于在印制电路板的配准过程中对误差进行仿真。这个方法包括在多层印制电路板的一层上汇集至少多个点的步骤。这个方法还包括在一个偏移模型、一个角度模型、一个补偿模型和一个随机噪声模型的基础之上修改多个点的位置,以便产生这多个点的一个修改位置的步骤。还有,这个方法还包括输出多个点的位置被修改了的这多个点的位置的一个补偿措施的步骤。
第七方面,本发明提供了一种方法,用于对印制电路板配准过程中出现的误差进行仿真。这个方法包括确定进行精确配准所必需的真实位置的步骤。这个方法还包括确定在配准过程中出现的误差的至少两个误差源的步骤。这个方法还包括以一种相互独立的方式合并在配准过程中出现的误差的至少两个源的步骤。还有,这个方法包括将合并了的至少两个误差源跟真实位置进行比较的步骤。
本发明的一个目的是提供一种方法和装置,用于正确地估计印制电路板层压成型以后所需要的补偿。
本发明的另外一个目的是提供一种方法和装置,用于对配准误差进行仿真,以便更好地设计印制电路板的布局,并且更好地理解所需要的生产工艺控制。附图说明
图1是现有技术中的一个补偿矩阵;
图2是一个大型印制电路板车间里补偿工艺一个简化工艺流程的流程图;
图3是多层印制电路板的一个实例;
图4a是设计规则配置(DRA)和真实位置半径(TPR)的一个图形表示;
图4b是说明通用计算机、输入装置和输出装置的一个方框图;
图5是配准仿真器的一个X(水平)和Y(垂直)偏移误差输出结果;
图6a是配准仿真器的一个角度误差输出结果;
图6b是配准仿真器的一个偏移误差和角度误差输出结果;
图7是底板表面上配准仿真器的一个随机噪声输出结果;
图8a是配准仿真器的一个X补偿误差和Y补偿误差输出结果;
图8b是图8a的一个等高线图;
图8c是配准仿真器的一个补偿误差矢量图;
图9是本发明的一个实施方案中模拟补偿误差的一个流程图;
图10a~c是分别为厚度为4个密尔、5个密尔和8个密尔的芯板产生补偿矩阵的试验结果的表格;
图11a~f分别是厚度为4个密尔经线和纬线、5个密尔经线和纬线以及8个密尔经线和纬线的外层芯板补偿模型的等式系数;
图11g~l分别是厚度为4个密尔经线和纬线、5个密尔经线和纬线以及8个密尔经线和纬线的内层芯板补偿模型的等式系数;
图12是多层印制电路板各种结构经线和纬线的补偿误差图;
图13是在生产之前和生产过程中使用补偿模型的一个实例的流程图;
图14a和14b分别是改变树脂百分比和固化百分比的时候6个密尔芯板的经线和纬线移动的试验结果的示意图;
图14c和14d是改变树脂百分比和固化度的时候6个密尔芯板的经线和纬线中补偿误差的示意图;
图15a是本发明一个实施方案中对配准误差进行计算和仿真的一个流程图;
图15b是在生产之前和生产过程中使用配准仿真器的一个实例的一个流程图;
图16是基线测量结果的一个直方图;
图17是说明试验结果的一个直方图,它同时说明最差情况下TPR的历史;
图18是腐蚀后打孔机上故障模式和影响分析(FMEA,)的一个表;
图19是单独一台腐蚀后打孔机(PEP)上25内层底板上的生产数据;
图20是配准仿真器输出的一个等高线图,它说明一个实例中配准误差组合的底板表面上的结果;
图21是配准仿真器输出的一个等高线图,它说明第二个实例中配准误差组合的底板表面上的结果;
图22是利用配准仿真器从试验设计(DOE)获得的结果;
图23是从1000次仿真得到的最大TPR结果的一个直方图;和
图24是在修改了印制电路板工艺以后,1000次仿真尝试的最大TPR结果的一个直方图。发明详述
多层印制电路板(MLB)包括多层电路。在一个芯板上腐蚀出来由导体材料或者铜这样的金属组成的电路作为一层。这个芯板可以是任意形状的。通常情况下,芯板的形状是矩形,它的宽度是18英寸(x方向),高度是24英寸(y方向)。另外,芯板具有各种各样的厚度(z方向),包括4个密尔、5个密尔和8个密尔。为了缩小电路的尺寸,电路板正在小型化。为了缩小电路板的尺寸和厚度,至少要做两件事情:(1)在一个芯板的两面腐蚀电路形成两层和(2)将这些电路叠放在一起。这样,典型的多层印制电路板会有3、4、5、10或者更多叠放起来的芯板。
为了组装多层印制电路板,需要一个分界层,它将各个芯板上的电路图结合起来,同时作为一个绝缘层,防止两边的电路层互相影响。典型情况下,分界层是一种电介质层,比方说半固化片。半固化片通常都是用玻璃纤维通过浸满一种树脂形成的。半固化片被看成一种b级材料,其中的树脂被部分地固化。具有腐蚀好的电路对儿的芯板通常都是一种c级材料,这种材料是完全固化的。在处理过程中,半固化片放在一层一层的芯板之间,通过压力和加热而固化。这样,半固化片夹在芯板之间,作为粘接剂和电介质绝缘体。
除了半固化片,也可以将其他电介质层用于芯板层之间。可以选择的电介质层包括涂满了树脂的箔,或者是任何其它树脂或者是涂满了环氧树脂的材料,或者是用于将芯板层叠起来的层。
为了在不同的层上将电路连接起来,需要通过不同的芯板层垂直地钻上过孔或者洞。这些过孔在芯板电路上精确地预先确定的位置(例如触点)上将电路层连接起来。因此,这些过孔必须在一定的公差范围内将多层上的多层电路排列整齐;否则,这些过孔就不能正确地连接电路,而且它们会影响其它电路,导致发生电路故障。设计好多层印制电路板,从而使这些过孔跟电路对准,这种工艺过程被叫做配准。然而,印制电路板的生产或者制造过程中有多种因素会导致配准误差,这些配准误差使过孔不能正确地跟触点对齐,从而影响已经有的电路。配准故障不是一眼就能看出来的,除非在多层印制电路板生产完以后进行电路测试。
图3是说明一个总共有8层的多层印制电路板的一个示意图。图3只是用于进行讨论,并不代表印制电路板各层的相对厚度。如同后面所讨论的一样,电介质层(图3中的50、58、66、74)可以是半固化片(包括一个电介质层中的多个半固化片层,具有不同树脂百分比的半固化片和具有不同固化程度的半固化片)。第2层到第7层(图3中的52、56、60、64、68、72)可以包括信号线、接地线或者信号线和接地线组合的不同电路结构。这些芯板(图3中的54、62、70)可以具有各种厚度,包括4个密尔、5个密尔和8个密尔。第1层和第8层(图3中的48和76)是外层箔材导电材料,在印制电路板层压成型之前放在电介质层上。外层允许在印制电路板上形成电路图形。这些外层箔材电路图形不会产生配准误差,因为它们在生产好以后不会发生明显的移动。
多层印制电路板的配准误差用设计规则配置(DRA)和真实位置半径(TPR)来表征。DRA指的是真实位置那里(需要进行精确配准)的过孔边缘到这一层中相邻部分电路边缘之间的距离。TPR指的是真实位置的径向误差,因此是配准误差的一个度量。参考图4a,其中原理性的说明了什么是DRA和TPR。
DRA包括所有层之间元件之间的距离。通常情况下,这个信息可以从计算机辅助设计(CAD)文件中获得,其中的程序查找多层印制电路板每一层上的元件,并且计算DRA。对于有些电路板,有环形圈要求,以防止钻好的洞或者过孔到达电路板的边缘。但不是说对于所有的印制电路板都是这样的。DRA代表公差极限,因为违反DRA会导致电路短路。通常情况下,DRA在6.5个密尔到16个密尔之间,其中6.5个密尔被看成最小的配准公差。
如图4a所示,TPR是配准误差的度量。利用平方和的平方根将X方向和Y方向上的误差合并起来得到TPR。通常都要比较TPR和DRA,并且TPR必须小于DRA,以避免配准废品(也就是印制电路板报废)。
对TPR有影响的配准误差源包括:(1)偏移误差;(2)角度误差;(3)随机噪声;(4)补偿误差。用来配准印制电路板的机器和印制电路板本身对配准误差都有影响。偏移误差通常都是跟多层印制电路板加工过程有关的误差,比方说穿孔、固定、印制和钻孔。参考图5,其中画出了本发明中配准仿真器的一个输出结果,其中的配准误差是以X方向(水平方向)和Y方向(垂直方向)偏移误差为基础的。X偏移误差和Y偏移误差可以通过经验获得,并且分别在方框69和71中输入配准仿真器。在图5中,以及随后的图中,加号(+)表示需要精确配准的元件真实位置。图中的星号(*)说明考虑了配准误差以后元件的位置。图5画出的是一个18英寸乘以24英寸的底板,其中有130个图点,说明底板上每两个英寸的间隔上的真实位置和配准误差。这个图中每个角落上的方框(79,80,81和82)都说明误差量,用关于真实位置的半径(TPR)表示。这个TPR是通过计算X方向的偏移误差(3个密尔)和Y方向的偏移误差(-3个密尔)的平方和,然后计算它的平方根(4.24个密尔)来获得的。这个图上所有点的平均TPR在图5中的顶部中心部分方框78中给出。从图5可以看见,在这个底板表面偏移误差是一致的。偏移误差一致的原因的一个实例是腐蚀后打孔机没有对准。在准备压这些印制电路板层的时候,腐蚀后打孔机在芯板上打孔。如果机器没有很好地对准,就会发生偏移误差。偏移误差的另外一个实例是芯板周围的层没有对准。如图3所示,在芯板2上腐蚀出第四层和第五层。然而,如果在腐蚀过程之前的印制过程中有一个误差,第四层就会跟第五层发生偏移,导致偏移误差。
第二种配准误差是角度误差。跟偏移误差一样,角度误差也跟多层印制电路板加工过程有关,比方说打孔、固定和钻孔。角度误差有一个角度旋转中心,还有一个角度误差度数。为了进行分析,假设角度旋转的中心在底部24英寸边缘的中心。这样来选择角度旋转中心只是为了方便,可以在修改偏移误差的基础上移动它。例如,如图6b所示,旋转的角度中心通过修改x偏移误差移动到这一层的近似中心。角度误差是比例误差的一个实例。在印制电路板车间常常不考虑角度误差,因为它们很难测量,而且人们认为很小的角度不会对整个配准误差有多大影响。为了了解为什么很小的旋转角度会带来问题,让我们来看12英寸长9个密尔高的一个三角形。得到的角度只是大约0.04度,这个角度常常会被忽略掉,而实际上它会带来很大的误差。参考表1,其中将TPR作为底部底板边缘上角度的函数。考虑整个底板表面的时候(例如18英寸乘以24英寸),离得比较远的角落会产生更大的误差,如同表1中的TPR所示。
表1作为角度的函数的TPR 弧度 度 TPR(密尔) 0.0001 0.00572958 1.20 0.0002 0.01145916 2.40 0.0003 0.01718873 3.60 0.0004 0.02291831 4.80 0.0005 0.02864789 6.00 0.0006 0.03437747 7.20 0.0007 0.04010705 8.40 0.0008 0.04583662 9.60
参考图6a,其中说明了本发明中配准仿真器的一个角度误差输出结果。这个角度误差可以通过检查在多层印制电路板的制造过程中使用的机器的输出来获得,它包括腐蚀后打孔机的输出。在方框67中将角度误差输入配准仿真器。如图6a所示,绕着长度是24英寸的底边的中心稍微转动0.02度(角(度))就会导致平均的TPR等于4.21个密尔,左下角和右下角的TPR是4.19个密尔,左上角和右上角的TPR是7.55个密尔。在优化过程中,比方说在腐蚀以后给芯板进行打孔的过程中,会因为很小的校准误差而对目标产生角度误差。现有技术中的腐蚀后打孔机把目标定位在靠近底板的中心线上。一种改进的打孔(或者过孔)方法是将目标定位在四个角上,从而使很小的校准误差对角度误差影响很小。
现在来看图6a,仅仅是角度误差也会产生一些潜在的难以理解的配准误差。例如,底板下半部分的底板比上半部分配准得更好。右上角的配准误差是朝向左和上的,左上角的配准误差是朝向左和下的。从130个点构成的阵列可以清楚地看到图6中发生了旋转。但是,检查产品底板的时候,角度误差不是那么明显,常常会将角度误差当作补偿误差。如果只看底板左半部分或者右半部分这一点就更加明显。对角度误差进行补偿会产生更大的补偿误差,而角度误差不会有任何明显的改善。错误的补偿变化导致TPR的增大会非常惊人。因此,本发明的模型和仿真器提供一种测量系统,它能够将角度误差和偏移误差跟补偿误差分离开来,以避免引起成品率下降的修正错误。
第三个配准误差源是随机噪声,它的原因可能有许多。随机噪声的一个实例是打过孔的过程中出现的现象。钻头可能会随机地晃动,产生大量的点分布在真实位置周围。随机噪声的其它实例包括在层压成型以后底板移动距离的差、随机加工误差和随机测量噪声。
参考图7,其中给出了本发明中配准仿真器的输出,它以图形方式说明在底板平面上的随机噪声误差。配准仿真器假设随机噪声分量具有正态分布,在X方向和Y方向上具有相等的标准偏差。图7中的标准偏差是1.5个密尔,如同方框77所示。典型情况下,随机噪声常常被认为是非常严重的误差,并且在一些工序中经常有许多试图减小随机噪声的印制电路板制造设备。但是,因为其它三个误差模式的数量巨大,所以减小随机噪声误差的努力并不总是成功的。尤其,人们总是忽视的是当偏移误差、补偿误差和角度误差被减小了以后,则能够承受更大的随机噪声。但是,电路密度越高,层数越多铜也越多的时候,以及对提高多层印制电路板生产率的需要,这些都会导致不利于减小随机噪声的情况出现。
另外一种误差是补偿误差。补偿误差是由多层印制电路板材料的移动造成的,比方说在多层印制电路板的生产过程中芯板材料的移动、电路布局的移动和电介质层的移动。多层印制电路板制造的实例可以包括用电介质板将芯板夹起来,并且给它们加热加压。材料移动指的是在多层印制电路板的生产过程中所见到的各种多层印制电路板层的相对膨胀和收缩。所有的材料移动都会导致电路布局出现扭曲,或者相对于它们预期的X、Y位置发生变化。由于存在扭曲和移动,在芯板上腐蚀出来的电路的设计无法配准,必须进行修正。为了修正扭曲和移动导致的配准误差,具有紧设计公差的印制电路板被拉伸或者收缩以便补偿在层压成型以后能够看见的材料移动。例如,如果某一层由于补偿误差预计要成比例地收缩10.0个密尔,就可以按比例地扩大电路板10.0密尔来修正电路。因此,扩大电路能够补偿由于补偿误差引起的收缩。
参考图8a,其中给出了本发明中配准仿真器的一个输出,它们说明X补偿误差和Y补偿误差。在方框73和75中,分别将X补偿误差和Y补偿误差输入配准仿真器。配准误差是成比例的,如图8a所示。0.5个密尔每英寸误差的X分量在角落上产生6个密尔的误差(0.5×24/2)。-0.5个密尔每英寸误差的Y分量在角落上产生4.5个密尔的误差。X和Y分量合起来得到7.5密尔的TPR角落误差。在某些部分成比例的误差可以被集中或被优化。例如,腐蚀后打孔机是加工设备的一个实例,它被设计成努力缩小从底板中心向外成比例的误差。在底板表面有一些目标,腐蚀后打孔机在打孔之前确定它们。如果这些目标由于收缩发生了移动,腐蚀后打孔机就对它加以调整以便缩小误差。图8a说明在底板表面已经非常理想地优化了的补偿误差。
对于成比例的误差,多层印制电路板角落TPR会比平均的多层印制电路板的TPR大。这一点在图8b中的等高线图和图8c中的矢量图里能够更加清楚地看出来,它们中的每一个都是用本发明的仿真过程产生的。在图8b中,深色区域代表配准得非常良好,明亮区域代表配准得非常不好。在图8c中,具有较短长度的矢量表示配准得非常好,较大的长度表示配准得非常差。
将成比例的误差错误地当成在加压的过程中材料的移动、滑动或者旋转并不罕见的。因此,为了使移动稳定,有人可能会想到应当在层压成型的过程中在角落上安装销钉。在特定的情形中角落不稳定性是由于移动还是由于滑动引起的这个问题是可以用本发明的仿真方法来回答的一个问题,这个仿真方法产生图8a~c所示的图,在这种情况下,这些图说明由于补偿误差使得角落没有很好地配准。仿真误差的模拟
角度误差、偏移误差和随机噪声都是人们非常了解的机械配准误差源。人们了解得最少的配准误差是补偿误差,它同时源于机械和材料。由于需要对补偿误差的多层印制电路板CAD设计文件数据进行补偿,以及无法在生产之前预测补偿值,使得非常复杂的补偿过程必不可少。当印制电路板车间要设计很多电路板的时候,补偿过程的复杂性以及管理多个补偿变化的负担变得更加复杂,它们会导致制造周期出现不稳定性,产生大量的废品,极大地降低生产率。
为了在多层印制电路板生产之前以及在多层印制电路板生产过程中使补偿误差最小,本发明的补偿模型提供了一种精确全面的补偿误差预测方法。本发明的这个补偿模型对现有技术中没有考虑到的多个变量进行评估,它们包括:(1)导电电路层的组合(例如相邻芯板上的电路层);(2)芯板周围电介质材料的类型(例如不同类型的半固化片);(3)芯板周围各种类型电介质材料的组合(例如一种芯板在两种不同的半固化片之间);(4)电介质层、芯板和芯板上导体材料之间的相互作用;(5)多层中芯板的位置(例如芯板是在多层印制电路板中一叠芯板的内部位置还是外部位置);(6)电介质中粘合材料的量(例如半固化片中树脂的百分比);(7)电介质材料的层数;(8)多层印制电路板中芯板的层数;(9)芯板上采用的不同导电材料厚度;(10)在多层印制电路板中多个芯板厚度的组合;(11)多层印制电路板的组装;和(12)这块板的固化度。
在本发明的一个实施方案中,提供了一种方法,用于制作多层印制电路板,利用一个补偿模型使补偿误差最小,这个补偿模型考虑了上面列出的11个特征中的一个或者多个。在本发明的这个实施方案中,这个方法按照图9所示的流程来进行,其中利用试验板进行了试验,它们具有上面11个特征中的一个或者多个。通过这些试验,可以产生一个补偿模型。除此以外,通过外推,这个模型可以用来预测多个多层印制电路板结构的补偿误差。
在图9中的方框83中,选择至少一个芯板厚度。在一个优选实施方案中采用多个芯板厚度。如同下面将描述的一样,图10a、10b、10c所示的补偿模型是为三个芯板产生的:4个密尔;5个密尔和8个密尔。
至少选择电介质层的一个特征用于模拟,如图9中的方框84所示。示例性的电介质层特征包括电介质类型(也就是半固化片的不同类型)、粘合材料的类型(也就是不同的树脂百分比)和固化百分比的类型(是较高或者较低的固化百分比)。图10a~c中所示的“电介质”变量90代表所使用的电介质层材料中的变量。例如,可以将不同类型的半固化片用作电介质层。在图10a~c所示的实施方案中,使用了4种类型的“半固化片”102(电介质等于1,2,3和4,它们分别对应于半固化片1080,半固化片2113,半固化片2116和半固化片7628)。也可以结合其它的半固化片特征。例如,电介质等于1表示具有标准树脂的半固化片材料1080。电介质等于5可以代表具有较高树脂的半固化片材料1080。除此以外,象固化率、高或者低的固化程度等等这样的电介质特性都可以结合进采用的电介质设计。这样,在“电介质”这一栏90中列出的每个数字都是指具有电介质层的一个或者多个特性的一种材料。
除此以外,通常情况下可以将电路板作成具有一层或者两层或者更多层的半固化片。这里建议对于半固化片106、1080、2113和2116这样的薄玻璃,在每个芯板周围采用两层半固化片。对于半固化片7628,这里建议采用一层半固化片。建议的这些层数反映了标准的工业实践情况。
如图9中的方框85所示,可以选择不同的电路布局结构。在一个优选实施方案中,图10a~c中的“结构”栏89中,代表芯板上电路层组合里的变化。在印制电路板芯板上可能有各种电路布局。在一个实施方案中,电路布局的模拟是在芯板上不同百分比导电材料(比方说铜)的基础之上进行的。在这种情况下,有3种可能的电路布局:信号、接地或者混合(同一层上有一些信号线还有一些接地线)。包括电路布局的导电材料的量取决于电路布局类型。对于被设计成“信号”布局(S)的一个电路布局,估计有百分之二十的芯板是导电材料,比方说铜。对于被设计成“接地”(g)布局的一个电路布局,估计有百分之八十的芯板是导电材料。还有,对于被设计成“混合”布局(m)的电路布局,估计导电材料的量在20%和80%之间。在其它的实施方案中,可以采用不同的变量来描述印制电路板中一层上的导体材料的量,或者用不同的电路结构来描述。
除此以外,如图10a~c所示,“结构”代表不同的电路结构组合。例如,结构等于1对应于ss/gg/ss,其中在顶部外层芯板周围的层中有信号电路布局,在内层芯板周围的层中有接地电路布局,在底部外层芯板周围的层中有信号电路布局。在图3所示的实例中,第二层和第三层是信号电路,第四层和第五层是接地电路,第六层和第七层是信号电路。为了完整地模拟多数电路结构,只需要在试验多层印制电路板中结合进少部分电路布局(或者“结构”变量)。例如,只需要使用“结构”变量的4种组合,包括ss/gg/ss;gg/ss/gg;gs/ss/sg;和gs/gg/sg。其余的布局都可以在这个模型的基础之上外推出来。
除此以外,除了“结构”和“电介质”以外,还可以使用其它的因子来建立这个补偿模型,但并不要求这样做。例如,“时间”91和“机器”93可以通过试验来确定,并且在补偿仿真中使用。现有技术中的补偿模型没有考虑跟多层印制电路板的组装有关的补偿误差。但是,组装这些印制电路板的机器在性能上会各不相同,这一次加压和下一次加压不同,并且随着时间改变而改变。为了将这些生产性能变化考虑进去,可以让这个模型将“机器”类型作为一个修正因子包括进去。还可以在补偿模型中包括“时间”。例如,时间等于1(93)可以是这些多层印制电路板的第一个生产日,时间等于2(94)可以是生产这些多层印制电路板的第二天。比较时间等于1、时间等于2、时间等于3或者时间等于4的输出可以搞清楚这个补偿模型是不是跟时间有关。还有,分析不同机器的补偿模型(也就是机器等于1跟机器等于2是不同的一次加压)可以确定补偿模型是否依赖于所使用的具体机器。这样,印制电路板的组装方式就可以作为一个因素而被考虑入补偿模型中。
选择好所需要的因子以后,就为所需要的每个芯板厚度准备好试验用的印制电路板,如同方框86所示。为了获得有价值的试验结果,最好是使用的每个印制电路板都包括至少一个一致的特性。需要的一致性的实例包括使用单一类型的电介质层(例如半固化片1080、标准树脂、低固化度),使用单一厚度的芯板(例如4个密尔厚的芯板),使用一叠10块或者更多的八层印制电路板,或者它们的组合。最好是选择使用一叠10块或者更多的八层印制电路板,其在由于热传导而使电路移动方面具有一致性,从而使混合叠层或具有大量仿真(dummy)底板的叠层不反映真实的处理条件。
为获得有关层移动情况的信息,在印制电路板层压成型以后钻孔之前测量在其上放置了的层的芯板。应当应用精度在0.1到0.3个密尔之间的仪器来测量这些芯板。这样的精度可以通过高质量的X射线设备来获得。每一层最好有多个目标,用作移动测量点。这些目标最好位于印制电路板的四个角落上。例如,对于芯板1,如图3所示,将在第二层的经线方向上进行两次测量,在第三层的经线方向上进行两次测量。对于10个底板(它们最后包括一个试验底板),在一个方向每个芯板会有40个读数。将这些读数平均,在试验结果表中给出一个数据输入点。例如,在图10a中,对于结构等于1、电介质等于1、时间等于1和机器等于1,m23x(95)的值(第二层和第三层周围的芯板(也就是芯板1)的移动)是-16.90。它代表了读数的平均值(在m23x中用“m”表示)。还有,这意味着用于在这个层上对电路进行布局的布线图应当增大,以便补偿x方向上16.9个密尔的收缩。同样,m45y栏的值是y方向上第四层和第五层周围芯板(也就是芯板2)的移动。还有,m67x栏是x方向上第六层和第七层(也就是芯板3)周围芯板的移动。
为选择出来的每个条件和条件组合制作试验用印制电路板。得到的数据被平均,并且按照图10a~c制成表格。完后产生所述模型,如同方框88所示。图10a~c说明分别为芯板4个密尔、5个密尔和8个密尔产生补偿矩阵的试验结果。数据是从试验用印制电路板获得的,它们中间的某些工艺特征被精确地改变。图10a~c中的每一行都说明了如何设置变量,以及每一个芯板和芯板方向上的平均结果。在“试验结果”下面的栏中的T数据代表了这个印制电路板各个层在x方向和y方向上的移动。
将说明现有技术中模拟方法的图1跟图10a~c比较就能够揭示现有技术中的方法没有能够揭示的补偿误差的主要来源。例如,图1中经线方向上一个信号/信号4个密尔芯板具有17.982个密尔的补偿。如图10a(96)所示,一个信号/信号内部4个密尔芯板具有8.65个密尔的补偿(结构单元等于2,电介质等于4)。这两个值之间的差是9.3个密尔或者0.518个密尔每英寸或者518 PPM的补偿误差。这一个补偿误差自己只会在24英寸乘以18英寸的底板上,在进行了理想优化的每个角落上产生2.6个密尔和4.7个密尔的平均TPR。当Y方向上的误差增加到这个实例中来的时候,我们得到的误差就是1.056个密尔减去9.76个密尔或者10.82个密尔或者450 PPM。X方向和Y方向补偿误差的合并结果是4.21个密尔的平均补偿TPR,在角落上是7.13个密尔。
这个模型的统计有效性在图10a中用Rsquare标签说明。这些Rsquare值接近1.0,它说明很大一部分补偿误差可以用这个补偿模型来解释。对于2-3芯板和4-5芯板,具有高度的统计有效性。如同后面将详细描述的一样,芯板3被看作芯板1的一个镜像。因此,没有将来源于芯板3的数据用于构造这个补偿模型;然而,芯板3的数据给出了一致性程度的一种度量(也就是说,将来自芯板3的数据跟来自芯板1的数据进行比较,以便确定这些数据是不是一致的)。
图10a说明图1所示的现有技术中的补偿矩阵过于简单,很难进行精确的补偿误差预测。图10a中能够看到的最大范围是(21.75个密尔~3.70个密尔)X(经线)方向18.05个密尔和Y(纬线)方向15.63个密尔。4个密尔芯板的这些范围远远超过了图1所列出的所有芯板中可以看到的范围。
除此以外,本发明中准备出来的补偿模型可以用许多种格式表示,对于4个密尔、5个密尔和8个密尔的芯板,分别包括表格形式,如图10a~c所示,用等式形式,如图11a~l所示,用修正因子格式,如同后面将讨论的一样,或者用图形格式表示,如图8a和8b所示。从图10a~c可以看出,可以产生多项式等式的系数,如图11a~l所示。参考图11a~l,其中分别为厚度是4个密尔的经线和纬线,厚度是5个密尔的经线和纬线以及厚度是8个密尔的经线和纬线的外层芯板画出了这个补偿模型的等式的系数。参考图11g~l,其中分别为厚度是4个密尔的经线和纬线、厚度是5个密尔的经线和纬线以及厚度是8个密尔的经线和纬线的内层芯板说明了这个补偿模型的等式的系数。这些系数是利用图10a~c中的数据采用最小二乘回归分析产生的。最小二乘回归分析具有预测器变量(例如电介质、结构、时间机器等等),它们是无条件的,其中的变量取离散值,这些值没有任何特别的顺序。例如,对于图11a中的系数,这些系数是一个外层4个密尔经线补偿模型的,在图10a中检查m23x这一栏。同样,对于图11b中的系数,这些系数是一个外部4个密尔纬线补偿模型的系数,在图10中查看m23y这一列。对于这些系数,很明显这个补偿模型是基于电介质层、电路布局和电介质层跟这个电路布局之间的相互关系的,如图1中的97栏所示,其中的系数跟结构、电介质和结构*电介质有关。
下面给出利用图11a~l所示的等式估计补偿误差的一个实例。图11g画出了一个内层芯板在经线方向上4个密尔芯板的系数。根据这个结构和电介质的类型,考虑不同的系数。对于图11g所示的实例,结构等于2(gg/ss/gg),采用了4层电介质。被标为pp1的第一层电介质是半固化片(2),如同99栏所示,它是半固化片2113。由于有一层半固化片(2),所以栏99a等于1,从而使栏99b中的总和等于1*0.5966518。如同栏100所示,被标为pp2的第二层电介质是半固化片(4),也就是半固化片7628。如同栏101所示,被标为pp3的第三层电介质是半固化片(1),也就是半固化片1080。如同栏102所示,被标为pp4的第四层电介质是半固化片(2),也就是半固化片2113。除此以外,必须将结构*电介质的系数考虑在内。在这个实例中,对于两层半固化片(2)、一层半固化片(1)和一层半固化片(4),必须将结构等于2考虑在内。计算补偿误差的方法如下。首先,将这些栏中的总和加在一起。例如,计算栏99b的总和。其次,对这些栏中的总和进行加权平均。例如,在图11g中,这些栏中的每个总数都用25%乘。之后,通过将这个加权平均除以经线方向上的总的英寸数(在这种情况下是18英寸)来计算这个密尔每英寸。
图11a~g中的每一个图都确定了外层芯板的补偿误差,其中结构等于1和2层结构等于2,1层电介质等于1和1层电介质等于3。图11a说明了经线方向上4个密尔芯板的补偿误差-0.601个密尔每英寸。图11b确定了纬线方向上4个密尔芯板的补偿误差-0.274个密尔每英寸。图11c确定了经线方向上5个密尔芯板的补偿误差-0.272个密尔每英寸。图11d确定了纬线方向上5个密尔芯板的补偿误差-0.334个密尔每英寸。图11e确定了经线方向上8个密尔芯板的补偿误差-0.315个密尔每英寸。图11f确定了纬线方向上8个密尔芯板的补偿误差-0.420个密尔每英寸。
补偿模型的外推:
用于准备图10a~c和11a~f所示模型的试验多层印制电路板数据是可能的无数个印制电路板结构的一个子集。但是在以下基础之上本发明中的补偿仿真可以用于许许多多的印制电路板结构:(1)不同的电路结构;(2)不同的电介质层;(3)不同的芯板厚度;(4)叠层中芯板的位置;(5)电路中导电材料的厚度;(6)补偿误差对时间的依赖性;和(7)补偿误差对机器的依赖性。因此,一方面本发明提供一种仿真器,它能够模拟所有可能的印制电路板结构。在另外一个实施方案中,可以模拟所有可能的印制电路板结构,从而不需要外推。
1.电路结构
可以修改本发明的模型用来估计多种电路结构的补偿误差。在一个优选实施方案中,如图10a~c所示,只制作和测量其中电路结构的一个子集。模拟所有可能的电路结构是不切实际的,因为它们的组合实在是太多了。参考附录A,其中画出了不同多层印制电路板结构和不同电介质层的各种组合。其中说明的可能组合总个数是147456,很难用一个一个地试验来对它们进行模拟。但是,对这些组合的一个子集作试验,并且将结果进行外推来模拟其余组合的翘曲、膨胀和收缩行为使得这个补偿模型变得切实可行。
如图10a~c所示,对于每一次试验,会产生一个平均结果,如同其中的m23x、m23y、m45x、m45y、m67x和m67y栏所示。如前所述,制作并且测试这些电路结构的一个子集。为了获得其它电路结构的结果,可以从表中的试验电路结构数据进行外推。例如,下表说明如何在电路结构1~4的基础之上计算没有计算过的电路结构。
表2电路结构的外推结构 描述 外部(芯板的位置) 内部(芯板的位置) 1 ss/gg/ss ss gg 2 gg/ss/sg gg ss 3 gs/ss/sg gs ss 4 gs/gg/sg gs gg 5 ss/ss/ss 结构=1 结构=3 6 gg/gg/gg 结构=2 结构=4 7 gs/gs/sg 平均结构=3, 结构=4 平均结构=3, 结构=4 8 ss/gs/ss 结构=2 平均结构=3, 结构=4 9 gg/sg/sg 结构=1 平均结构=2, 结构=4
如表2所示,没有计算出来的电路结构误差可以从原始试验结果利用本发明的仿真器确定出来。例如,结构等于5的外层是ss。这个外层跟结构等于1的外层结构相似。这样,m23x和m23y的结果可以用于结构等于5的外层。在另外一个实施方案中,通过更加复杂的分析可以获得额外的精度。例如,在结构等于5的外层中的补偿误差部分地取决于内存布局(例如ss/ss/ss)。但是,针对结构等于1利用这个外层测量结果不能完整地模拟补偿误差,因为结构等于1的布局是ss/gg/ss。如果能够获得额外的精度,就可以在一个相似的结构上进行额外的试验。或者,可以对已有的试验结果进行更加复杂的外推。
除此以外,可以对两个结构进行平均,以便获得第三个结构。例如,对于结构等于7的内层(gs),结构等于3(ss)和结构等于4(gg)的内层被平均。在其它的实施方案中,可以进行更加复杂的数学运算,以便获得没有计算过的电路结构更加精确的结果。
2.电介质层
除了对试验电路布局进行外推来获得其它电路布局的补偿结果以外,还可以从这个模型外推出来不同的电介质层。如图10a~c所示,半固化片有四个值,它们是这些试验的对象。例如,在图10a中,结构等于1,电介质等于2,时间等于2和机器等4,在整个多层印制电路板中使用的电介质是半固化片2113。实际上,在印制电路板中需要的半固化片材料有许多不同的种类。例如,可以在一个芯板周围使用不同的电介质层。作为一个实例,考虑5个密尔的一个内层芯板(它的结构等于1),其中芯板的一面有半固化片1080(电介质等于1),其中芯板的另外一面有半固化片2116(电介质等于3)。根据图10b,结构等于1和电介质等于1的X方向上的移动(不依赖于时间和机器)是13.316个密尔的收缩。同样,结构等于1和电介质等于3的移动(不依赖于时间和机器)是15.322个密尔的收缩。为了在这个实例中混合电介质层的基础之上计算一个补偿误差,计算出补偿误差的平均值,于是这个补偿误差是-14.319。
此外,可以对一个芯板周围多层半固化片的补偿误差进行估计。作为前面的实例的改进,考虑在它的芯板的一面有2个电介质层的5个密尔的一个内层芯板中(它的结构等于1):一片半固化片1080(电介质等于1)和一片半固化片2113(电介质等于2),这个芯板的其它面有两个电介质层:一片半固化片2116(电介质等于3)和一片半固化片7628(电介质等于4)。为了在补偿模型的基础之上估计芯板周围多层半固化片的补偿误差,可以进行加权平均。在一个优选实施方案中,采用加权平均,其中芯板周围每个半固化片的“权”是建立在使用的半固化片片数的基础之上的。在上面的实例中,每个半固化片都用一片,从而使每个半固化片的权是25%。因此采用加权平均,从而使补偿误差等于:
(-13.316*.25)+(-11.4265*.25)+(-15.322*.25)+(-8.5175*.25)=-12.15
另外,可以针对不同的半固化片树脂百分比来估计补偿误差。如同前面所讨论的一样,图10a~c说明具有标准含量或者较高树脂含量的电介质层。如果这个模型没能具体地说明具有相同树脂百分比的电介质层,就可以在前面的试验结果的基础上进行外推。参考图14a和14b,其中画出了一个图,它是改变树脂百分比和固化百分比的时候,6个密尔的芯板的经线和纬线的移动的试验结果。这个多层印制电路板有6层电路板,在芯板和每个芯板周围的2叠半固化片1080上都有信号/信号结构。实际上,在图14a和14b中,(++)代表较高的树脂百分比,较高的固化百分比;(+-)代表较高树脂百分比,较低的固化百分比;(-+)代表较低的树脂百分比,较高的固化百分比;(--)代表较低的树脂百分比,较低的固化百分比。高树脂百分比和低树脂百分比之间的百分比差别是10%。在这些试验结果的基础之上,可以获得一个修正因子。例如,我们来看图14b,可以发现对于(++)试验,平均纬线移动是-4个密尔。同样,对于(-+),平均纬线移动大约是+5个密尔。这样,通过在树脂百分比变化的基础之上计算修正因子,可以计算出以下结果:
(高百分比树脂的移动-低百分比树脂的移动)/(百分比偏差)(-4个密尔-5个密尔)/10%=-.9个密尔/%
这样,对于两个芯板和每个芯板周围2叠1080个半固化片的信号/信号结构的6个密尔的电路板,不同于这个模型的一个树脂百分比在纬线方向上的修正因子是-.9个密尔/%。
最后,通过查看图14a和图14b,可以明显地看出固化百分比中的变化带来的效果小于树脂百分比的变化的效果。如同前面所讨论的一样,将半固化片看成一种b级材料,因为它没有完全固化。固化百分比说明了半固化片的固化程度。如图14a所示,经线方向的移动在固化百分比的基础之上改变。特别是,对于(++)试验(高固化百分比),平均移动大约是-12.2个密尔,而(+-)试验的平均移动(低固化百分比)大约是-10.1个密尔。除此以外,对于(-+)试验(高固化百分比),平均移动大约是-15.0个密尔,而(--)试验(低固化百分比)的平均移动大约是-18.5个密尔。在这一信息的基础之上,就可以在固化百分比的基础之上产生一个修正因子。
参考图14c和14d,其中画出了改变树脂百分比和固化程度的时候经线和纬线的补偿误差。画出其它的图是为了确定是否有其它因素对这个补偿误差有影响。例如,考虑了内部和外层芯板(也就是芯板图的2/3(外层芯板)和4/5(内层芯板))说明芯板位置在计算补偿误差的时候对于树脂百分比的变化或者固化百分比的变化,没有明显的影响。同样,检验了其中不同的底板。如同前面所讨论的一样,在试验模型中,将10个或者更多的多层印制电路板互相叠放在一起用于测试。从图中可以看出,这一迭中多层印制电路板的位置的影响似乎不太明显。但是,对于60.7%到70%的树脂变化,经线和纬线的补偿误差范围分别是-13到-8和8到-7个密尔。除此以外,对于从35%到46%的固化百分比的变化,经线和纬线的补偿误差的范围分别是-17到-12和-8到-7个密尔。从这些结果可以清楚地看出,在经线方向和纬线方向上,树脂百分比都是非常重要的影响因素。在低得多的程度上,固化百分比有可能对经线方向上的补偿误差有影响。
3.芯板的厚度
图10a~c是全部具有相同芯板厚度的印制电路板的补偿模型(例如图10a中具有相同芯板厚度的整个叠层使用的4个密尔的芯板)。但是,会出现这样的情况,其中在多层印制电路板中采用具有不同厚度的芯板。印制电路板结构的一个实例在图3中说明。采用不同的芯板厚度,在外层芯板中采用四个密尔的芯板,在内层芯板中采用5个密尔的芯板。在一个优选实施方案中,寻找外层芯板或者内层芯板的移动量的时候,只检查对应于芯板的厚度的那一些表格(也就是在这个实例中检查图10a,看外层4个密尔的芯板有没有移动,同时检查图10b,看5个密尔的内层芯板有没有移动)。在另外一个实施方案中,利用这些表中的结果进行外推。例如,内层5个密尔的芯板的移动可以是5个密尔的芯板和四个密尔的芯板的补偿模型的加权平均。
4.叠层中芯板的位置
如图10a~c所示,这个叠层中芯板的位置是确定补偿误差的一个因素。这个位置信息影响由于补偿误差而导致的移动,其中给出了不同的补偿误差值,例如,m23x,m45x,m23y和m45y。在一个优选实施方案中,用于这个模型中的芯板被指定为内层芯板或者外层芯板。内层芯板位于多层印制电路板内,比方说图3中的芯板2,内层芯板跟外层芯板相邻。如图10a~c所示,内层芯板的补偿模型是m45x和m45y。外层芯板的实例,如图3所示,是芯板1和芯板3。在一个优选实施方案中,外层芯板的补偿模型用m23x和m23y表示,如图10a~c所示。芯板3移动的结果(m67x和m67y)被用于确定m23x和m23y的结果是否能够令人接受。
当试验多层印制电路板具有8层和三个芯板的时候,这个补偿仿真器能够应用于具有更多或者更少的层和芯板的多层印制电路板。例如,在一个实施方案中,对于具有四个芯板(和总共10层的)的多层印制电路板,根本没有必要进行外推。例如,对于厚度是四个密尔的芯板,可以直接用图10a来估计补偿误差。外层芯板[芯板1(第二层和第三层)和芯板4(第八层和第九层)]的估计对应于m23x和m23y栏。由于这个10层板的内层芯板(芯板2和3)中的每一个都跟一个外层芯板(分别是芯板1和4)相邻,所以这个10层板的内层芯板的补偿移动跟八层板(其中的内层芯板也跟一个外层芯板相邻)的内层芯板的补偿移动相同。这样,内层芯板[芯板2(第四层和第五层)和芯板3(第六层和第七层)]的估计对应于m45x和m45y。栏
对于具有5个芯板的一个多层印制电路板,具有两个外层芯板[芯板1(第二层和第三层)和芯板5(第十层和第十一层)]。这些外层芯板的补偿误差的估计是m23x和m23y。跟一个外层芯板相邻的这些内层芯板[芯板2(第四层和第五层)和芯板4(第八层和第九层)]的补偿误差的估计是m45x和m45y。跟另外一个内层芯板相邻的一个内层芯板的估计应当从这个模型进行外推来获得。
5.电路中导电材料的厚度
电路中导电材料的厚度可能不同。例如,当导体是铜的时候,它的厚度常常是1.2个密尔或者0.5个密尔。厚度很有可能是对补偿误差有影响的一个因素,它的影响可以通过经验方式来确定,这一点类似于在树脂百分比的基础之上确定修正因子。
6.时间变量补偿误差
如图10a~c所示,试验性的设计给出的矩阵具有多达四个的变量,其中的两个变量(时间和机器)跟系统中的噪声有关。四个时间中每一个时间和四个机器中每一个机器的补偿误差都能用一个标准偏差计算出来。从这一点可以看出,能够确定平均值之间的统计差。如果这些平均值具有差别,就需要进一步分析。例如,如果在时间等于1和时间等于4的结果之间有一个统计差,那么这一点就说明这个补偿误差是跟时间有关的。利用这一信息,就能够继续努力检查印制电路板工艺,以确定跟时间有关的变量的源。或者,也可以接受补偿误差对时间的依赖性,从而使这个模型中包括一个跟时间有关的变量。
7.机器变量补偿误差
类似于补偿误差对时间的潜在依赖性,如果在机器等于1和机器等于3之间有一个统计差,就应该检查这个机器,看这个机器是否发生了故障(比方说层压故障、操作员错误或者测量机器故障)。或者可以在印制电路板机工车间为每台机器确定补偿误差。
补偿模型的应用
这个补偿模型可以用图4b所示的通用计算机来实现。参考图4b,其中画出了通用计算机、输入装置和输出装置的一个方框图。这台计算机140包括一个处理器142,这个处理器142跟一个存储器144连接。这个存储器144包括一个只读存储器(ROM)146和一个随机存取存储器(RAM)148。这个随机存取存储器包括一些表150,比方说图10a~c所示的那一些表格。处理器142还跟输入/输出驱动器152连接,这个输入/输出驱动器152跟一个输出装置154连接,比方说跟一个打印机或者一个监视器连接,还跟一个输出装置156连接,比方说小键盘或者鼠标器。驻留在存储器144中的是用来实现补偿模型的软件。在存储器144中还驻留着CAD文件,它们包括各层上电路的布局。在位于存储器144中的这个补偿模型的基础之上,处理器142计算出用于补偿误差导致的收缩或者膨胀的大小。然后处理器142就能够修改CAD文件。例如,处理器可以缩放这个CAD文件(例如通过乘以或者除以这个CAD文件中的分量),以便改变电路布局。除此以外,处理器还可以为补偿模型进行外推,比方说对这个模型的不同方面进行平均或者合并。
这个补偿模型可以用于多种情形,不管是在生产之前还是在生产过程中。例如,这个补偿模型可以用于在生产之前确定多层印制电路板配准过程中的潜在误差。如图2所示,配准误差最好是在开始生产之前就进行修正。这样,为了尽可能少地中断生产过程,这个补偿模型在生产开始之前就能够使配准误差最小。
通常情况下,印制电路板制造商收到制造有特定因素的多层印制电路板的订单(比方说芯板数、电路布局、电介质类型等等)。利用这个补偿模型,制造商可以在开始生产之前就确定这些多层印制电路板的配准是否在公差范围之内。如果这一配准不在公差范围之内,就可以按照上面讨论的方式改变电路布局(通过收缩或者扩展电路布局来消除材料移动的影响和减小补偿误差)。
例如,如图12所示,可以修改其中的因子并且确定经线和纬线移动。如同图12所示,用7种不同的结构(见其中的x轴)和不同的补偿误差(见其中的y轴)来修改半固化片。除此以外,如图2所示,在生产过程中改变工艺图上的一些点,以便使补偿误差最小,见图2中的方框40。
参考图13,其中画出了在生产过程之前以及在生产过程中,使用补偿模型的一个实例的一个流程图。如同方框103所示,为这个补偿模型确定其中的因子。在这些因子的基础之上,从这个补偿模型确定补偿误差,如同方框104所示。随着这些因子和补偿模型的不同,外推有可能是必不可少的,如同方框105和106所示。修改这个CAD文件中的布线图。之后进行生产,如同方框108所示。
在生产过程中,可以检查补偿误差,如同方框109所示。例如,这可以通过在层压成型以后通过检查这些层来实现。除此以外,如果需要就周期性地更新这个补偿模型,如同方框110所示。例如,周期性地检查这个补偿模型,以确保这个模型仍然是有效的。更进一步,这个模型可以在新产品的基础之上辅以额外的电路结构、电介质类型等等。例如,如果这一生产过程包括这个模型中没有考虑到的结构,就可以检查最终的生产结果,并且用于更新这个模型。
在生产过程中补偿误差大小的基础之上,修改电路布线图,如同方框11 1所示。跟生产之前修改电路布线图一样,从更新过的补偿模型确定补偿误差,如同方框1 12所示。这些因子和更新过的补偿模型的不同,外推可能是必不可少的,如同方框113和方框114所示。修改CAD文件中的布线图,如同方框115所示,以便克服补偿误差的影响。之后,修改这一生产过程,如同方框116所示。模拟配准误差
单层印制电路板和多层印制电路板中都会出现配准误差。出现配准误差有多种原因,包括但不限于偏移误差、角度误差、随机噪声误差和补偿误差。当这些误差模式组合在一起的时候,它们会以一种互相依赖互相影响的方式起作用。因此,将这些方差加在一起是不正确的,因为这些误差不是独立的。例如,来源于布线图的补偿误差,来源于腐蚀后打孔机的偏移误差和角度误差,以及来源于例如钻孔的随机噪声,就不能用它们的平方和来合并,而现有技术中就是这样做的。除此以外,给总的配准误差产生一个数的这种一维分析方法不能很好地揭示底板表面上的误差传播。为了全面地揭示这些误差如何在单层印制电路板和多层印制电路板的表面上传播,一种图形配准模型是必不可少的。
在一个实施方案中,所有的配准误差源,包括偏移、角度、补偿和随机噪声误差,都被考虑进这个配准仿真器。在其它的实施方案中,可以单独考虑所有配准误差源的子集。例如,这个配准仿真器可以考虑进一个误差源,比方说偏移误差(如图5所示)、角度误差(如图6a所示)、随机噪声误差(如图7所示)和补偿误差(如图8a和8b所示)。另外,这个配准仿真器还可以考虑进误差的组合,比方说偏移误差和角度误差(如图6b所示);角度误差和补偿误差;偏移误差和补偿误差;偏移、角度和补偿误差等等。于是就可以通过检查这些配准误差的源的这些子集来分析每一个误差源和误差源之间的相互作用。
配准仿真器的计算
附录B是用Matlab语言代码(以M函数文件格式)编写的配准仿真器的软件代码,用于个人计算机上的Matlab程序。在一个优选实施方案中,对多层印制电路板上各种芯板上不同位置的移动进行了仿真。用矩阵来代表印制电路板上的离散位置。Xp=真实x位置,Xe1=将偏移误差X加到Xp上面去获得的矩阵位置,Xe2=将补偿误差X加到Xe1上面去以后得到的矩阵位置,Xe3=将角度分量X加到Xe3上面去以后得到的矩阵位置,以及Xe4=加到每个Xe3分量上去的随机噪声。在其它的实施方案中,可以对芯板区的移动或者多层印制电路板的整个芯板的移动进行仿真。
在一个优选实施方案中,采用本发明中的配准仿真器的一种方法在图15a中用流程图说明。如同方框116所示,将配准仿真器的阵列初始化。在一个实施方案中,印制电路板的形状是一个18英寸高和24英寸长的矩形。这个矩形被130个元素划分,其中的13列和10行(x,y)对如下:
(0,18)... ...(24,18)
...
...
(0,6) (2,6)
(0,4) (2,4) ...
(0,2) (2,2) (4,2) (6,2) ...
(0,0) (2,0) (4,0) (6,0) (8,0) (10,0) (12,0) ... (24,0)
在一个优选实施方案中,将左下角标为(0,0),右下角标为(24,0),左上角标为(0,18),将右上角标为(24,18)。上面的那些值代表真实的配准位置(也就是完全对准的位置)。x和y位置初始阵列被划分成两个矩阵:(1)包括所有x值的Xp;和(2)包括所有y值的Yp。例如,Xp被表示为:
Xp=0 2 4 6...2 4
0 2 4 6...2 4
...
...
0 2 4 6...2 4
其中Xp有13列和11行。类似地,Yp用以下表达式表示:
Yp=0 0 0 0...0
2 2 2 2...2
18 18 18 18...18
Yp有13列和11行。将Yp作为Xp的函数画出来,得到仿真器上最初的130个测点网(例如图3中的“+”)。这些Xp和Yp矩阵储存在程序中,从而能够计算误差,画出真实的配准位置。将(x,y)对分成两个不同的矩阵,就能够将X方向和Y方向上不同的误差加起来。另外,Xp和Yp中的行和列代表从真实位置的初始阵列垂直地翻转过来的底板。例如,作为一个(x,y)对的Xp(1,1){Xp的第一行第一列}和Yp(1,1)代表右下角。同样,作为一个(x,y)对的Xp(13,10)和Yp(13,10)代表右上角。
如同前面所讨论的一样,配准误差可能来源于各种源,比方说角度、偏移、补偿和随机噪声误差。配准仿真器排列这些误差的顺序并不重要。在一个实施方案中,按顺序对偏移、补偿、角度和随机噪声误差进行分析,以便确定不同位置的移动。例如,如同后面将描述的一样,用4个矩阵来计算不同位置的误差移动:Xe1和Ye1(因子偏移误差);Xe2和Ye2(因子偏移和补偿误差);Xe3和Ye3(因子偏移、补偿和角度误差);以及Xe4和Ye4(因子偏移、补偿、角度和随机噪声误差)。或者,可以按照操作员喜欢的顺序来分析这些误差。
如同图15a中的方框117所示,在阵列中考虑偏移误差。在一个实施方案中,由用户指定X偏移误差和Y偏移误差。在另外一个实施方案中,可以按照经验来确定X偏移误差和Y偏移误差,下面将对此进行详细描述。将X偏移误差加到Xp矩阵的每个分量上去,形成第一个X误差矩阵,将它叫做Xe1。同样,将Y偏移误差加到Yp矩阵的每个分量上去,形成第一个Y误差矩阵Ye1。
作为在偏移误差的基础之上确定不同位置的移动的一个实例,令Cx=10行13列指定X偏移误差的一个常数矩阵。于是:
Xe1=Xp+Cx
这些Xe1和Ye1矩阵被随后用于其它误差计算,得到最后的配准误差。为了产生这一效果的图,将偏移误差矩阵的“矩阵图”标定为100。例如,如果只有一个X偏移误差,并且这个偏移误差是两个密尔,那么就能够画出下面的Xe1矩阵随Yp的变化:
Xe1(图)=0+.002×100 2+.002×100...24+.002×100
等等
对于这个矩阵图,将所有的误差以一个因子100来调整,以便用图形方式来查看误差。
如同方框118所示,将补偿误差分解成阵列。具体地说,将补偿误差跟偏移误差计算得到的结果加起来。可以给偏移数据阵列中130个元素中的每一个作上标记,用行号和列号来识别,这些行号和列号也叫做下标。为了将补偿误差加起来,利用这些下标值将Xe1矩阵分成左半部分和右半部分,将Ye1矩阵分成上半部分和下放部分。Xe1lh(左半部分)由Xe1第一行到第13行(所有的行)和第一列到第6列构成。Xe1rh(右半部分)由Xe1的第一行到第13行和第一列到第13列构成。补偿误差不会影响底板的中心(也就是说在中心下标没有任何收缩或者膨胀,如图8a和8b所示)。由于补偿误差来自中心下标(X的第7列和第五行跟第6行之间),因此Xe1的第7列没有改变。Xe2rh元素被计算出来,其中d=2英寸(元素之间的间隔),1=从第7列开始数的元素个数,xce=以密尔每英寸为单位的补偿误差(它可以是正的也可以是负的,分别代表过补偿或者欠补偿),以及xe1=X方向上的偏移误差):
Xe2rh=(2+xe1)+2*1*xce
对于第1~6列和第一行到第10行。Xe1rh的第一行最好是这个样子:
2(1+1*xce)+xe1 2(1+2*xce)+xe1...2(1+12*sce)+xe1
左半部分用同样的方式计算出来。为了获得整个Xe2矩阵:
Xe2=[Xe21h,第7列,Xe2rh]
针对Ye2矩阵执行同样的程序。对于Ye2bh(下半部分),计算第一行,作为间隔的一半,因为元素的中心位于Ye1矩阵的第5行和第6行之间。其它行将采用完整的2英寸+1英寸间隔。对于ye1等于Y偏移误差,yce等于Y偏移误差,这个等式如下:
Ye2bh(第一行)=1+yce+ye1...1+yce+ye1
Ye2bh(第二行)=(2(1)+1)(1+yce)+ye1...
Ye2bh(第五行)=(2(4)+1)(1+yce)+ye1...
将下半部分和右半部分合并起来得到Ye2矩阵:
Ye2=[Ye2uh
Ye2bh]
如同方框119所示,将角度误差分解成阵列。从Xe2和Ye2矩阵计算出角度误差。在一个实施方案中,角度误差旋转轴的中心是这个底板的底边的中心。如同前面所讨论的一样,是否这样选择旋转轴的中心是操作员的事情。
为了使仿真器能够利用Matlab程序正确地工作,将以角度表示的角度误差转换成弧度。要加到Xe2和Ye2上面去的分量从旋臂的给定长度、角度计算出来,并且用cos(角度)表示X,用sin(角度)表示Y。例如,定义Xe3rh跟Xe2rh相似,就能计算出Xe3rh的第一行:
Xe3rh(第一行)=xe2(1,8)*(1+cos(角度))...xe2(1,13)*(1+cos(角度))
为了计算第二行,必须考虑垂直轴的旋转。通过以下方式,就会在旋转方向上产生x值的一个交错:
xadd(第二行)=(y距离)*sin(角度)
其中对于第二行,y距离=2英寸,对于第三行,y距离=4英寸,等等。这样,对于Xe3rh的第二行,有:
Xe3rh(第2行)=xadd(第2行)+xe2(2,8)*(1+cos(角度))...
左半部分将用相同的方式计算出来,只有角度的符号(+,-)要反过来。第7列也将从第二行开始偏移。偏移量将是列的当前位置加上指定行的xadd。于是这个Xe3矩阵是:
[Xe31h,第7列用Xadd,Xe3rh加以调整]
由于旋转产生的Y的偏移可以从角度的正弦计算出来。为了计算Y旋转误差,应该考虑旋转中心的位置,它在24英寸底边上。由于将旋转中心选择在底边上,Ye3矩阵没有因为计算的目的而分裂成上半部分和下半部分。这些Y位置可以从Ye2计算出来。例如,Ye3的第一行将是:
Ye2(0,0)+2*6*sin(-1*角度); Ye2(0,1)+2*5*sin(-1*角度);...Ye2(0,7);...
Ye2(0,13)+2*6*sin(角度)
Ye3接下来的行用同样的方式计算出来。
如同方框120所示,将随机噪声考虑进上述矩阵。这个随机噪声被加到Xe3和Ye3矩阵上去。在一个实施方案中,选择一个正态分布的随机数,这个正态分布的平均值是0,标准偏差由操作员指定。这个随机数可以从一个随机数发生器选择出来,比方说Matlab中的(normrand)函数。这个程序为Xe3中130个元素中的每一个和Ye3中的130个元素中的每一个计算出一个噪声值。然后将这些噪声值加到Xe3和Ye3上面去。具体地说,为Xe3和Ye3构造一个噪声矩阵,其中Nx=X噪声,Ny=Y噪声。于是:
Xe4=Xe3+Nx;Ye4=Ye3+Ny
这样,Xe4和Ye4中包括130个元素的误差位置,稍后将它们跟真实位置(完全配准的时候的位置)进行比较。
如同图15a中的方框121所示,计算出误差。计算出几个误差,包括平均TPR(如同图5~8b中的方框78所示),右上角的TPR(如同方框的79所示),右下角的TPR(如同方框80所示),左下角的TPR(如同方框81所示),和左上角的TPR(如同方框82所示)。其中的TPR是跟真实位置的径向误差,定义为:
TPR=(xerror^2+yerror^2)的平方根
为了获得整个130元素阵列的平均TPR,计算以下值:
ErrorX=Xp-Xe4;ErrorY=Yp-Ye4
平均TPR=(ErrorX的平方和+ErrorY的平方和)的平方根/130
角落上的TPR(如同图5~8b中的方框79~82所示)计算起来更加直接,它们是4个角落上的TPR。例如,右下角的TPR是:
TPRllc=(Xe4(0,0)^2+Ye4(0,0)^2)的平方根
如同方框122所示,画出配准仿真器的图。在一个优选实施方案中,总共画出4个图:(1)说明新位置相对于原始位置的标记,用“+”表示完全配准的位置,用“*”表示新的位置(例如图5、6、7和8a);(2)说明误差幅度(相对TPR)和误差方向的矢量(例如图8c);(3)说明TPR的幅度的等高线图,其中的线条表示相似的值,非常象山脉的海拔高度图(例如图8b);和(4)在等高线图上叠加矢量图的组合图(例如图6b)。每个图都能够用于检查配准模式。例如,标记图有一点象钻孔以后用X射线看到的图。等高线图说明电路板上配准得比较差的区域,它能帮助确定制造能力,并且说明这些电路应该如何放在底板上。矢量图说明这些误差如何在底板上流动。还有,组合图和能够用来同时检查这些流动和误差等高线。
标记图是(Xe4,Ye4)的图并且将它叠加在(Xp,Yp)图上面。矢量图用于检查130个位置点上每一个上的每一对(x,y)。例如,左下角的矢量的矢量幅度是:
矢量幅度(llc)=(Xe4(0,0)^2+Ye4(0,0)^2)的平方根
它的方向是:
矢量角度(llc)=arctan(Xe4(0,0)/Ye4(0,0))
等高线图是具有相同TPR的点的连线。
配准仿真器的应用
本发明中的配准仿真器合并了配准误差模式,并且在底板表面上画出误差分布。通过合并误差模式,就能对不同的配准效应进行量化和显示,从而解释在配准过程中出现的看起来无法解释的误差现象。这样,配准仿真器可以用于(1)获得对配准误差的来源的一般性的理解;(2)在生产之前或者在生产过程中预测配准误差、废品率等等;和(3)通过利用试验设计(DOE),分析配准误差的每一个源或者几个源,努力减小总的配准误差。
这个配准仿真器可以用图4b所示的通用计算机来实现。驻留在存储器144中的是用来实现配准仿真器的软件,如同附录B所示。除此以外,这个处理器还执行存储器144中的软件指令,以便在输出装置154上产生一个输出。
1.对配准误差的来源获得一般性的了解
通过检查配准仿真器的实例,就能了解跟配准误差的一些来源有关的几个趋势,包括:(1)在所有4个角落上都没能配准可能是因为X补偿误差和Y补偿误差造成的;(2)在所有4个角落上都没能配准可能是由旋转误差和X或者Y偏移误差同时引起的;(3)有一半底板没能很好地配准,但是在这个底板的另外一半却配准得非常好,这有可能是由偏移误差跟补偿误差一起造成的;(4)有一半底板没有能够很好地配准可能是因为角度误差和X偏移误差和Y偏移误差造成的;(5)在2个角落上没有能够很好地配准有可能是由角度误差引起的;和(6)在一个角落上没有能够很好地配准有可能是由角度误差、偏移误差和补偿误差造成的。
从这些趋势可以看出,4个角落最容易出现配准问题。除此以外,操作员还可以在生产的过程中分析完成了的底板或者电路,并且作出配准误差来源的假设。
2.在生产之前和生产过程中预测配准误差、废品率等等
利用这个配准仿真器,就能够在生产过程之前和生产过程中预测配准误差,这个配准仿真器是一个非常有用的工具。在生产之前预测配准误差使得制造商能够据此确定多层印制电路板的生产价格,因为这样做生产商就能够对这个订单的难度有一定的了解。更进一步,利用这个配准仿真器使得制造商能够在生产之前通过提出印制电路板制造工艺的改进建议来减小配准误差。
另外,这个配准仿真器能够在生产过程中通过许多种方式来减小误差。首先,这个配准仿真器能够用于监视生产过程中配准误差的大小。其次,这个配准仿真器能够通过在生产过程中提出配准工艺的改进建议来减小误差。
参考图15b,其中画出了在生产过程以前以及在生产过程中应用这个配准仿真器的一个实例的一个流程图。如同方框123所示,对配准误差源进行估计。通常情况下,制造多层印制电路板的订单包括许多因素,比方说芯板块数,电路布局,电介质层,以及确定补偿误差必不可少的其它因素,就像前面所讨论的一样。另外,印制电路板的制造商可以在生产之前根据经验来确定可能对配准误差有影响的其它误差,比方说偏移误差、角度误差和随机噪声误差。制造商可以针对特定的工艺条件在以前的误差的历史的基础之上估计偏移误差、角度误差和随机噪声误差。例如,特定工艺条件下的特定机器(比方说使用特定的机器;每次钻一个底板、两个底板或者多个底板;用新的钻头;用新的布线图等等)具有以前测量出来的偏移误差、角度误差和随机噪声误差的测量结果。
如同图15中的方框124b所示,在配准误差的源的估计的基础之上,运行这个配准仿真器。利用配准仿真器的输出,包括图形和TPR的计算结果,制造商能够估计在最佳情形和最差情形下的成品率。
如同图15b的方框125所示,制造商还可以在这个配准仿真器上进行试验设计(DOE),以便减小配准误差。如同前面所讨论的一样,可能有几个源会对配准误差有影响。这样制造商就能够利用试验设计检查配准误差的所有源、一些源或者一个源,以便确定工艺变化对配准误差的影响。如同方框126所示,确定配准误差的源的范围。不同的误差,比方说偏移误差、角度误差、补偿误差和随机噪声误差,它们的范围取决于最好情形和最差情形。例如,随着生产条件的不同,比方说使用特定的机器、一次钻一个底板、两个底板或者多个底板或者使用新的钻头,随机噪声误差的值都有一个范围。在这些范围的的基础之上,可以确定误差的源对整个配准误差的影响。例如,可以检查随机噪声误差值的范围,以确定随机噪声误差对总的配准误差的影响。还有,通过分析试验设计,可以通过划分对总的配准误差有影响的误差的重要程度确定误差的源的效果,如同方框126所示。例如,在试验设计的基础之上,可以确定随机噪声误差对总配准误差的影响必补偿误差对总的配准误差的影响要小。
如同方框128所示,可以在确定的误差的源的影响的基础之上提出改进建议。这些改进选择包括改变多个误差或者一个误差。例如,可以选择减小多个误差,包括角度误差和补偿误差,而不改变随机噪声误差的源。在这些改进选择的基础之上进行生产,如同方框129所示。或者,制造商可以通过改变工艺条件和多层印制电路板的因子以迭代方式确定成品率。通过这些迭代,制造商能够在生产之前确定在特定的生产工艺条件下生产多层印制电路板获得特定成品率所需要的成本。
在生产过程中,可以估计配准误差的来源,如同方框130所示。这些配准误差的来源可以在生产过程中的测量的基础之上搞清楚。还有,这些生产的测量可以是随机的,它们也可以是周期性地进行的。例如,如果主要的角度误差和偏移误差的来源是腐蚀后打孔机,就可以检查这个机器的输出(以随机的方式或者预先确定的时间)以确定角度误差和偏移误差。除此以外,可以在层压成型以后通过检查电路板来估计补偿误差。还有,如果随机噪声的主要来源是钻孔机,就可以检查这个钻孔机的输出,以确定随机噪声误差。在这些测量结果的基础之上,可以估计配准误差的来源。这些估计可以具有各种形式,包括具有平均值和标准偏差的一个分布。
在对配准误差的来源的测量结果的基础之上,可以运行配准仿真器,如同方框131所示。通过在这个配准仿真器上做“如果这样会怎样”分析或者试验设计,就能够分析改进途径和跟它们有关的成本,以及能够减小总的配准误差的最佳措施。除此以外,通过跟生产过程进行直接比较还能够找到其它的误差。例如,这个配准仿真器还可以预测针对特定DRA的废品率。这一估计能够为制造商提供这一生产潜力的有关信息。例如,如果估计出来的废品率跟实际的废品率相差很远,那么除了输入给配准仿真器的那些误差源以外,还存在其它的误差源。这个配准仿真器能够最终为生产过程预测配准误差的分布。如同前面所讨论的一样,误差的来源可能采取的一种格式是具有一个平均值和一个标准偏差的一个分布。这样,对于每个误差源(偏移误差、角度误差、补偿误差和随机噪声误差),都有一个分布。利用蒙特卡罗(Monte Carlo)方法,比方说在McQuarrie,Gray的“制作无法制作的板子”,印制电路板制造1998年7月第70~79页中公布的方法,这里将它引入作参考,可以在生产过程中获得配准误差的一个分布。可以从误差分布的每一个来源随机地选择数据,输入配准仿真器,在这个配准仿真器的基础之上获得一个输出(或者是一个平均TPR,或者是一个最大的TPR,等等)。这些输出形成生产过程中配准误差的分布,可以将它们跟生产过程中配准误差的实际分布进行比较。如果这两个分布(估计出来的分布和实际分布)相似,那么对误差的来源的估计就是有效的。如果这两个分布(估计出来的分布和实际分布)不相似,那就还有其它的误差来源没有包括在这个配准仿真器中。
如同方框132所示,制造商还可以进行试验设计(DOE),以便减小配准误差。跟生产之前进行试验设计相似,确定这些误差的来源的范围,如同方框133所示,确定这些误差的来源的效果,如同方框134所示,并且提出改进建议,如同方框135所示。这些改进建议被用于修改生产工艺,如同方框136所示。
实例1
应用补偿模型的一个实例在图16和图17中给出。图16用直方图说明基线测量结果。首先,良好的测量(t)对于确定改进措施非常重要。补偿精度的度量被定义成在分辨率为0.1个密尔的Fein Focus X射线机上测量得到的多层印制电路板的层之间的最大补偿TPR。参考图16,基线是两个月时间内对16,000个底板进行的测量结果(这是实际生产的一个代表)。规格上限(USL)等于10.3个密尔,这意味着大于它的所有测量结果都被认为是发生了故障。为了将这一个目标作为补偿误差的目标,对于24英寸乘以18英寸的电路板,300ppm的X补偿误差和400ppm的Y补偿误差会在角落上产生5.1个密尔的补偿误差,或者产生10.2个密尔的总的补偿TPR,这是一个未经优化的补偿误差。
一个目标实例可以是减小直方图面积中定义的变化的25%。为了进行改进,采用可变的CPK。CPK被按照以下公式定义成一个稳定过程的性能指数:
Cpk=(USL-μ)/(3*δ)
其中μ=平均TPR
δ=标准偏差
目标是给定10.3个密尔的规格上限的时候,获得最大的TPR,而Cpk不小于1。
参考图17,其中给出了补偿改进程序的一个记录。在这个记录中给出了最差情况下TPR的历史。图16所示的结果在图17中用前面的条形图和线条说明,在X轴上用“基线”标签说明。在左边的Y轴上是TPR的尺寸误差,在右边的尺寸是Cpk。其中给出了平均的TPR(μ),等于平均的TPR加上3倍标准偏差(δ)的工艺上限(UPL,),等于10.3个密尔以下的最大TPR的目标线,以及从上面描述的公式计算出来的Cpk。降低条形的高度意味着改进,增大Cpk的正斜率也有可能同样意味着改进。
图17中说明了三个阶段。第一个阶段包括建立基线以及分析使用尺寸矩阵的补偿工艺组合工作。第二阶段包括实现在第一阶段中找到的某些项目,并且进行试验设计(DOE)模拟和对试验设计模拟进行分析。第三阶段是通过实现在第二阶段建立的模型来做到的改进阶段。图17所示的改进值得注意的是这一改进来源于只在三种芯板类型上减小补偿误差。其它的改进可以通过分析其它芯板以便补充这一模型来获得。
图17说明采用六西格玛(6 sigma)方法的改进是一步一步完成的。6 sigma工艺的本质一测量、分析、改进、控制一意味着不会立即获得结果。事实上,有可能需要几个星期或者几个月,直到时间和资源投资都被耗费掉。图17说明总共用了26个星期才得到明显的改进,但是采取了正确措施的时候改方案是立杆见影的。特殊的救火方法看起来会在较短的时间内获得结果,但是从很长的一段时间来看它们很难获得真正的改进。6sigma方法不能保证找到成功的捷径,但如果做的工作正确,就会找到真正的改进途径。
实例2
在6 sigma理论宝库中的另外一个工具是故障模式和影响分析(FMEA)。这一工艺分析给了我们某些目标:
.利用围绕中心的一个旋转轴,将角度误差缩小到芯板之间最大0.0084度。
·将X方向和Y方向上的补偿误差缩小到最大0.2个密尔每英寸。
·在X方向和Y方向上将偏移误差保持在最大正负一个密尔。
·在已经采取了其它措施以后,就考虑将钻孔叠层板高度缩小到每次一个底板。
上面列出的几项对于任何印制电路板制造商们来说都是挑战。例如,将角度和偏移保持在6.5个密尔的DRA所需要的程度就是一个巨大的挑战。仅仅是在腐蚀后打孔领域内,这可能需要进行几次改进,包括重新抛光或者替换成套模具、精确的台面配准,摄像机的标校、清洗或者替换马达和驱动轴、更新PM方案、签订维修合同、购买特殊的测量设备、制定打孔机测试计划以及控制重要参数的图。脑子里能够想到的任务的个数令人望而却步,不进行良好的计划管理和支持是很难做到的。
为了使改进能够成功,需要一班人马,包括工厂工作人员、工程师和一线管理员,制定一个共同的目标,为表4中列出的那些目标一样的目标而奋斗。要准备好一个工艺图以及原因和影响图。这样会将所有的问题提到日程上来,确定它们在工艺过程中的位置,它们会带来什么影响,以及它们对配准误差的影响。
在这项工作完成以后,可以进行故障模式和影响分析(FMEA)。腐蚀后打孔项目的一个故障模式和影响分析的实例在图18中给出。这个故障模式和影响分析考虑了每个工艺输入的严重程度,这一故障出现的概率以及检测这一输入并且将这一输入控制在规范内的能力。通过故障模式和影响分析计算出风险级别(RPN,)。划定风险级别使得这一班人马能够注意到必须立即采取的措施。这一班人马然后回到故障模式和影响分析中去,记录下来什么时候什么人要采取的措施。更进一步,输入严重性、出现次数和/或可检测性的改进方案,并且计算出计划中的风险级别。故障模式和影响分析是上层管理人员为了确定进程和项目是否成功以及是否有适当的资源支持这些措施,要关注的改进努力的关键点。
实例3
配准误差的来源,包括补偿误差、角度误差、偏移误差和随机噪声误差,应当在生产过程中进行估计,以便使用配准仿真器。为了弄清楚怎么做,考虑一个真实的实例。图19是腐蚀后打孔机上(PEP)25个内层底板上的实际生产数据。这个底板布局是每个底板三个电路。这块电路板有6.5个密尔DRA的紧配准公差。在这个图中打过孔的芯板是四个密尔的芯板图上面有一个盎司的铜和信号图形。用一个光学检查系统来测量这个芯板打孔后的结果。虚线的交点给出了正确的最佳位置,这个PEP机器能够跟它配准,可以对实际的线进行分析来确定角度误差和偏移误差。例如,这些线条的斜率跟角度误差有关,这些线条的长度跟材料移动的距离的大小有关。
最差的底板的参数如下:
·0.014度的角度误差。
·-3个密尔的X方向偏移误差。
·-2.5个密尔的Y方向偏移误差。
对于角度误差,假设旋转轴是这个18英寸乘以24英寸底板的中心。图20说明这些误差组合起来在这个底板表面上的结果。图中-1个密尔的偏移对于说明角度误差是必不可少的,它导致了两个密尔的X方向上的偏移。
图20说明相对于真实位置的误差的大小。这个图说明,对于6.5个密尔的DRA,至少有66%(每3个电路中有两个好电路)的产品会具有最差情形),只要没有任何其它误差。除了其它误差以外,还有另外一个挑战。图19中的误差说明了芯板的随机噪声、偏移误差和角度误差。这意味着在芯板与芯板之间将存在误差,芯板之间的误差有时会比芯板偏离真实位置的误差大得多。
参考图19和图20中给出的实例,可以用所有生产误差的一个估计来估计最终的成品率。例如,考虑从图19获得的这些输入:
·平均来讲,这些芯板之间的角度是0.012度。
·平均X偏移误差是-2个密尔。
·平均Y偏移误差是-1.5个密尔。
·平均的X补偿误差和Y补偿误差是0.33个密尔每英寸。
·小直径钻头带来的随机钻孔噪声具有一个密尔的标准偏差(每次钻两个底板,新的钻头)。
图21用一个等高线图说明最终结果。黑色的区域表示配准得很好,比较光亮的区域表示配准得不好。在这个底板表面上配准误差的范围是从0个密尔到8.4个密尔以上。图21说明对于6.5个密尔的DRA,三个电路板中平均有2个电路板会很好,或者说平均有33%的废品率。这一估计充分地向制造商表明这一生产的生产潜力。
对于40块底板的批量,这项工作的实际废品率是从25%到50%。显然能够假设废品率的变化说明有特殊的原因。例如,当废品率是百分之二十五的时候,可以认为这一工艺正在得到改进,当废品率是百分之五十的时候,显然存在其它的问题。知道了平均废品率是百分之三十三以及批量是40块底板,在二项式分布的基础之上废品率95%的置信间隔(confidenceinterval)是从18%到56%。废品率信息本身并不足以预测这一过程是在变得更好还是更坏。这样,从一个批量分析看起来非常大的废品率变化是没有意义的。
在配准仿真器的基础之上,制造商能够找出方法来减小配准误差。例如,图21说明成品率极大地依赖于底板尺寸。如果底板的布局是在一个更小尺寸的底板上或者是在相同尺寸的底板上每个底板两个电路,成品率就会大幅度地上升(额外的材料碎片会增加额外的成本)。为了补偿这一增加的成本,配准误差的缩小会允许每一次钻两个底板,如果对于较大尺寸的底板每次只是钻一个底板。如果底板的尺寸不能改变,那么影响配准的误差模式就需要改进。
实例4
用6 sigma工具的一个系统方法能够帮助全面地理解长期应该做什么以及短期能够做什么。这个方法是:
·工艺测量
·工艺分析
·工艺改进
·工艺控制
这个方法是建立在能够找到变化的源并且能够进行并且控制永久性的改进这样一个假设的基础之上的。通过试验设计(DOE),生产车间能够分析配准误差的来源,然后从长期角度和短期角度,最大程度地减小配准误差。
如图19所示,工艺测量在确定配准误差模式,以及确定配准误差是否是随机的,是否是跟机器、偏移、操作员、一天中的时间、哪个星期、哪个月或者哪一年有关这些方面是非常重要的。工艺变量的测量为工艺分析提供所需要的数据。如果没有仔细地测量得到的数据,分析结果就是有争议的,采取措施就不能真正得到改进。
考虑前面每个底板上有三个电路,DRA是6.5个密尔的18英寸乘以24英寸的多层板的实例。通过收集数据、工艺分析和应用这个配准仿真器,就能够寻找工艺改进选择。这个仿真器的一种使用方法是每次改变一个变量,研究不同高设置和低设置的影响。在6 sigma理论库中最强有力的一个工具是试验设计(DOE)。研究这些可能性的一种更好的方式是用包括所有两个因素相互作用的32次运行。表3给出了用于这个试验中的设置,图2说明它的结果。
表3试验设计的变量设置 变量 低设置 高设置 百分比变化 角度 0.005度 0.012度 58% X偏移 0.5个密尔 1.0个密尔 50% Y偏移 0.5个密尔 1.0个密尔 50% X收缩 0.2个密尔每英寸 0.33个密尔每英寸 39% Y收缩 0.2个密尔每英寸 0.33个密尔每英寸 39% 噪声 0.4个密尔标准偏差 1个密尔标准偏差 60%
参考图22,其中给出了这个DOE中使用配准仿真器得到的结果。在图22中,一行一行地从上到下分别是平均(avg)TPR、左上角(ulc)TPR、左下角(llc)TPR、右上角(urc)TPR和右下角(lrc)TPR的输出。从左到右一列一列的分别是角度、X偏移、Y偏移、X收缩、Y收缩和噪声的输入。从图22中可以看出,向上的斜线说明低设置更好,向下的斜线说明高设置更好,水平线说明没有任何影响。这条线的误差带是回归(regression)的95%的置信间隔。
在计算机上,图22中的图是动态的,由于两个因子相互作用,其中线条的斜率随着变量设置的不同而变化。
通过对试验设计的分析,可以为对整个配准误差有影响的误差划分级别。例如,看图22中的当前设置,而影响程度划分依次是角度、X收缩、Y收缩和噪声。1个密尔以上的偏移改进对于配准来说没有任何好处。
在这一信息的基础之上,可以确定如何选择要减小的误差。这些选择包括改变一些误差或者一个误差。例如,可以选择减小一些误差,包括角度误差和补偿误差。
另外,在这个实例中,随机噪声不是减小误差的主要方向,因为跟角度误差和补偿误差相比,它不那么重要。因此,随机噪声的公差更大(也就是说,可能要求每次只钻一块电路板从而达到0.4个密尔的随机噪声误差标准偏差的处理是不需要的;目前,用来钻孔的电路板保持在每次钻两块底板,将造成提高到一个密尔的标准偏差)。允许由于钻孔噪声而产生的随机误差是对这一特殊批量情形中控制每个变量方法的背离。6 sigma方法强调减小影响最大的误差。实际上,不可能在所有时间总是控制住每一个变量。
相反,注意力集中在对于改进最有意义的步骤上。建议的改进措施在表4中给出:
表4建议的改进措施变量 从 到 百分比变化角度 0.012度 0.0084度 30%X收缩 0.33密尔每英寸 0.2密尔每英寸 39%Y收缩 0.33密尔每英寸 0.2密尔每英寸 39%
配准仿真器的结果是2.67个密尔平均TPR,4.4个密尔的左上角TPR,3.2个密尔的左下角TPR,5.0个密尔右上角TPR和4.03个密尔的右下角TPR。即使所有的TPR都小于6.5个密尔的DRA,这个配准仿真器也只能给出一个底板的结果。因为有随机噪声,所以每次(一个底板跟另外一个底板)的结果都不相同。
实例5
还可以这样,如果试验设计的主要目的是改变一个误差源。作为一个实例,可以通过这个配准仿真器分析随机噪声误差的来源。图23是1000次仿真运算中最大TPR的结果。每一次运算都包括考虑底板表面上130个位置上的最大TPR值。即使有14.7%的底板最大值超过了6.5个密尔的DRA,仍然不能说明会有14.7%的电路废品。如果用图21中的设置进行1000次仿真试验,100%的底板的最大TPR值会超过6.5个密尔。废品率的更好估计是14.7%/3=4.5%的计划废品率,因为14.7%是底板的成品率,但是对于每个底板三个电路,电路的成品率是4.5%。
可以减小随机噪声,分析对总的配准误差的影响。例如,如果这块板是每次钻一个底板,那么钻头的偏移就会下降到0.4个密尔的标准偏差。图24说明在这种情况下1000次仿真试验得到的最大TPR。图24说明当叠层的高度下降的时候废品率会下降。在这些结果的基础之上,操作员可以分析每次钻一块底板导致的成本增加是否被配准误差的下降所补偿。另外,通常情况下通过降低叠层高度来改进钻孔质量是提高配准成品率的第一步;但是这一步骤无法带来实际的好处,除非其它的配准模式误差很小。
本发明前面详细描述不是为了对本发明加以限制,而仅仅是对本发明加以说明,下面的权利要求,包括所有的等价条款,都是用来给出本发明的范围。
附录A
考虑四个不同的半固化片类型(1080,2113,2116,7628)上一个八层板,每个芯板之间有两叠半固化片,3个不同的芯板厚度(4个密尔、5个密尔和8个密尔)以及两种不同的图型类型(信号,接地)的以下设计变量。此外,只使用平衡的芯板厚度和半固化片组合。具体地说,对于一个八层板,芯板1的厚度等于芯板2的厚度,半固化片关于多层结构的中心线必须采用相同的类型和顺序。这一点跟标准的制造实践相同。除此以外,电路图形的不平衡性质也是标准的制造实践。
外层铜箔
半固化片1(1080,2113,2116,7628)
半固化片2
第二层(S,G)
芯板1(4,5,8)
第三层
半固化片3
半固化片4
第四层
芯板2
第五层
半固化片4
半固化片3
第六层
芯板3
第七层
半固化片2
半固化片1
外层铜箔
可以使用许多的电介质层。在以上实例中,电介质层包括上述层之间的两个不同的半固化片。在这些条件下,有64种不同的图形组合(26),256种不同的半固化片组合(28),以及9种不同的芯板厚度组合。可能的组合总数是147456(256×64×9)。
64种图形组合如下。
模式 lyr2 lyr3 lyr4 lyr5 lyr6 lyr7 结构
111111 s s s s s s 5
111112 s s s s s g 10
111121 s s s s g s 10
111122 s s s s g g 11
111211 s s s g s s 8
111212 s s s g s g 12.
111221 s s s g g s 12
111222 s s s g g g 13
112111 s s g s s s 8
112112 s s g s s g 12
112121 s s g s g s 12
112122 s s g s g g 13
112211 s s g g s s 1
112212 s s g g s g 14
112221 s s g g g s 14
112222 s s g g g g 15
121111 s g s s s s 10
121112 s g s s s g 3
121121 s g s s g s 3
121122 s g s s g g 16
121211 s g s g s s 17
121212 s g s g s g 7
121221 s g s g g s 7
121222 s g s g g g 16
122111 s g g s s s 17
122112 s g g s s g 7
122121 s g g s g s 7
122122 s g g s g g 18
122211 s g g g s s 19
122212 s g g g s g 4
122221 s g g g g s 4
122222 s g g g g g 20
211111 g s s s s s 10
211112 g s s s s g 3
211121 g s s s g s 3
211122 g s s s g g 16
211211 g s s g s s 17
211212 g s s g s g 7
211221 g s s g g s 7
211222 g s s g g g 18
212111 g s g s s s 17
212112 g s g s s g 7
212121 g s g s g s 7
212122 g s g s g g 18
212211 g s g g s s 14
212212 g s g g s g 4
212221 g s g g g s 4
212222 g s g g g g 20
221111 g g s s s s 11
221112 g g s s s g 16
221121 g g s s g s 16
221122 g g s s g g 2
221211 g g s g s s 13
221212 g g s g s g 18
221221 g g s g g s 18
221222 g g s g g g 21
222111 g g g s s s 13
222112 g g g s s g 18
222121 g g g s g s 18
222122 g g g s g g 21
222211 g g g g s s 15
222212 g g g g s g 20
222221 g g g g g g 20
222222 g g g g g g 6
如果芯板的顺序s/g无关紧要,而且23芯板和67芯板可以交换,那么这些组合就减小到21种结构。一些实例是:sg/sg/gs跟gs/gs/gs和gs/sg/sg相同;gs/gg/gg跟gg/gg/sg和gg/gg/gs相同。
在试验设计中可以从4种结构获得21种结构。这4种结构是:
Core1 Core2 Core3 config1 ss/gg/ss ss gg ss config2 gg/ss/gg gs ss gg configS gs/ss/sg gs ss sg config4 gs/gg/sg gs gg sg configS ss/ss/ss config1 config3 config1 confige gg/gg/gg config2 config4 config2 config7 gs/gs/sg avg(c3,c4) avg(c3,c4) avg(c3,c4) configS ss/gs/ss config1 avg(c3,c4) config1 config9 gs/gs/gg config2 avg(c2,c4) config2config10 gs/ss/ss config1 config3 config3config11 gg/ss/ss config1 config2 config2config112 gs/gs/ss avg(c3,c4) avg(c3,c4) config1config113 ss/gs/gg config1 avg(c3,c4) config2config114 ss/gg/sg .config1 config4 config4config115 ss/gg/gg config1 config4 config4config16 gs/ss/sg configS config2 config2config17 ss/gs/gs config1 avg(c3,c4) avg(c3,c4)config18 gs/gs/gg avg(c3,c4) avg(c3,c4) config2config19 gs/gg/ss config4 config4 config1config20 gs/gg/gg config4 config4 config2config21 gg/sg/gg config2 config4 config2
-->xstep=2;ystep=2;xdim=12;ydim=9;scale=100;%图形初始化xoffset=xo;yoffset=yo;xshrink=xs;yshrink=ys;notse_x=ns;noise_y=ns;angle=a*scale;%坐标轴初始化%初始阵列xstep=2;xdim=12;for i=1;xdim+1; xp(i)=xstep*i-xstep;endystep=2;ydim=9;for i=1:ydim+1; yp(i)=ystep*i-ystep;end[Xp,Yp]=meshgrid(xp,yp);%Plot=1将画出蓝色目标标记if tplot==1 %关闭颜色棒 h=findobj(′Tag′,′Axes2′); axes(h) cla axis off %重新设置图形蓝色目标上的轴 h=findobj(′Tag′,′Axes1′); axes(h) cla plot(Xp,Yp,′+b′) set(gca,′Tag′,′Axes1′) axis off end %在x尺度上加上偏移误差for i=1:xdim+1; x(i)=xstep*i-xstep+xoffset;end%底板右半部分收缩shrink=0;n=0;for i=8:13; n=n+1; shrink=n*xstep*xshrink; x(i)=x(i)+shrink;end%底板作半部分收缩shrink=0;n=0;for i=6:-1:1; n=n+1; shrink=n*xstep*xshrink; x(i)=x(i)-shrink;end%在y方向上加上偏移误差for i=lydim+1; y(i)=ystep*i-ystep+yoffet;end%底板上半部分收缩shrink=0;n=0;y(6)=y(6)+.5*ystep*yshrink;for i=7:10; n=n+1; shrink=(n+.5)*ystep*yshrink; y(i)=y(i)+shrink;end%底板下半部分收缩shrink=0;n=0;y(5)=y(5)-.5*ystep*yshrink;for i=4:-1:1;n=n+1; shrink=(n+.5)*ystep*yshrink; y(i)=y(i)-shrink;end%构造网格[X,Y]=meshgrid(x,y);%旋转网格for i=1:10; for j=1:13; xadd=Y(i,j)*sin(angle); X(i,j)=X(1,j)*cos(angle)+(24-24*cos(angie))/2-xadd; endendyadd=(X*sin(angle)-24*sin(angle)/2);Y=Y+yadd;for i=1:1 %将噪声加到网格-X方向上去 ifnoise_x-=0 for i=1:10; for j=1:13; noise=noiTnmd(0,noise_x); X(ij)=X(i,j)+noise; end end end %将噪声加到网格-Y方向上去. ifnoise_y-=0 for i=1:10; for j=1:13; noise s normmd(0,noise_y); Y(i,j)=Y(i,j)+noise; end end end end %如果plot=1,就用红星画出没有对准的地方( iftplot==1 hold on; plot(X,Y,‘*r′); axis on end %计算并且画出TPR和平均TPR和角落上的TPR TPR=sqrt((Xp-X).^2+(Yp-Y).^2).*1000/scale; TPRv=reshape(TPR,130,1); MeanTPR=mean(TPRv); TPR_UL=sqrt((Xp(10,1)-X(10.1)).^2+(Yp(10,1) -Y(10,1)).^2).*1000/scale; TPR_UR=sqrt((Xp(10.13)-X(10,13)).^2 +(Yp(10,13)-Y(10,13)).^2).*1000/scale; TPRJ.L=sqrt((Xp(1,1)-X(1,1)).^2+(Yp(1,1) -Y(1,1)).^2).*1000/scale; TPR_LR=sqrt((Xp(1,13)-X(1,13))^2+(Yp(1,13) -Y(1,13)).^2).*1000/scale; %TPR误差的等高线图%if or(angle-=0,yshrink^2+xshrink^2-=0)iftplot==2 h=findobj(‘Tag′,′Axes1′); axes(h) hold off da reset axis on [C H]=contourf(TPR,15);% C=round(10.*C)./10;% dabel(C,H); shading flat colormap jet% brighten(.5) h=findobj(‘Tag′,′Axes1′); set(h,′XLimMode′,′manual′) set(h,′Xtim′,[0 12]) set(gca,′XTickLabel′,(2610141822]); set(gca,′YTickLabel′,
); holcLon piot([5,5],[1,10].′w-′) plot([9,9],[1,10],′,‘) plot([1,13],[4,4],′w-′) plot([1,13],[7,7],′w-′) hold off set(gca,Tag′,′Axes1′) h=findobj(‘Tag′,′Axes2′); colorbar(h) axes(h) axis on set(gca,Tag′,′Axes2′)end%画出矢量.iftplot==3 %关闭颜色棒 h=findobj(‘Tag′,′Axes2′); axes(h) da axis off %重新设置蓝色目标的州( h=findobj(‘Tag′,′Axes1′); axes(h) da quiver(Xp,Yp,X-Xp,Y-Yp)end%画出矢量和等高线iftplot==4 %关闭颜色棒 h=findobj(‘Tag′,′Axes2′); axes(h) da axis off %重新设置轴和等高线和矢量( h=findobj(‘Tag′,‘Axes1′); axes(h) dacontour(Xp,Yp,TPR,15) hold on quiver(Xp,Yp,X-Xp,Y-Yp) h=findobj(‘Tag′,′Axes1′); set(gca,Tag′,′Axes1′);endfunction regentry%这个程序跟regmod一起使用%用于手工输入文本字段%%获取文本字段中的值h=findobj(‘Tag′,‘angle′);degstr=get(h,′String′);deg=str2num(degstr);a=pi*deg/180;h=findobj(‘Tag′,′xoffset′);xostr=get(h,′String′);xo‘-str2num(xostr)/10;h=findobj(‘Tag′,′yoffset′);yostr=get(h,′String′);yo=str2num(yostr)/10;h=findobj(′Tag′,′xshrink′);xsstr=get(h,′String′);xs=str2nurn(xsstryi0;h=findobj(‘Tag′,′yshrink′);ysstr=get(h,′String′);ys=str2num(ysstryi0; h=findobj(‘Tag′,′noise′); nsstr=get(h,′String′); ns=str2num(nsstr)/10; h=findobj(‘Tag′,′graphtype′); gt=get(h,′Value′); %设置滑动棒 h=findobj(‘Tag′,‘aslider′); set(h,′Value′,a) h=findobj(‘Tag′,′xoslider′); set(h,Value′,xo) h=findobj(‘Tag′,′yoslider′); set(h,′Value′,yo) h=findobj(‘Tag′,′xsslider′); set(h,′Value′,xs) h=findobj(′Tag′,′ysslider′); se′h,Value′,ys) h=findobj(‘Tag′,′nsslider′); set(h,′Value′,ns) %将结果列表( ifgt==1 axis equal end [mtpr ultpr urtpr Illpr trtpr]=misreg(a,xo,yo,xs,ys,ns,gt); mtpr=round(100*mtpr)/100; ultpr=round(100*ultpr)/100; urtpr=round(100*urtpr)/100;lltpr=round(100*iltpr)/100;Irtpr=round(100*lrtpr)/100;ifgt==1 axis equalend%输出设置(h=findobj(‘Tag′,′AvgTPR′);set(h,′String′,mtpr)h=findobj(‘Tag′,′ulTPR′);set(h,′String′,ultpr)h=findobj(′Tag′,′urTPR′);set(h,′String′,urtpr)h=findobj(‘Tag′,′IITPR′);set(h,′String′,lltpr)h=findobj(‘Tag′,‘lrTPR′);set(h,′String′,mtpr)function fig=regrnod%这个程序用于为配准仿真器产生滑动棒和对象(load regmodh0=figure(′Color′,[0.8 0.8 0.8].... ′Colormap′,mat0,... ‘Position′,[439 228 652 533],... ‘Tag′,‘Figl′);h1=uicontrol(′Parenf,h0,... ′Units′,‘points′,... ′Callback′,′regsbar′.... ‘Max′,0.0008,... ′Mir′-0.0008,... ‘Position′,[33 48 96 16].... ‘SliderStepM5e-05 0.0002],... ′Style′,′slide″,... ‘ Tag′,′aslider′);h1=uicontroK′Parenf, h0,... ′Linits′,‘points′,... ′BackgroundColo″,[1113,... ′Callback′,′regent′y′,... ‘Position′,(50 17 58 22],... ′String′,‘0′,... ′Style′,‘edit’,... ‘ Tag′,‘angle′);h1=uicontrol(′Pafent′,h0,... ‘Units′,points′,... ′Position′,[39 70 65 16],... ′String′,′Angle(deg)′,... ‘Style′,‘text’,... ‘Tag′,StaticText1′);h1=uicontrol(′Parent′,h0,... ′Unite′,‘points′,... ′BackgroundColor′,[111],... ‘Position′,132 485 60 20],... ‘ String′,‘0′,... ′Style′,‘ text’,... ‘Tag′,‘ulTPR′);hlt=uicontToK′Parent′,h0,... ′Units′,‘points′,... ′BackgroundColor′,[111],... ′Position′,[547 487 60 20],... ‘String′,′0′,... ‘Style′,‘text’,... ‘ Tag′,‘urTPR′);III=uicontrol(′Parent′,h0,... ′Units′,‘pointe′,... ′BackgroundCotor′,[111],... ′Position′,[32 98 60 20],... ′String′,′0′,... ′Style′,‘text’,... ‘ Tag′,′IITPR′);h1=uicontrol(′Parent′,h0,... ′Units′,‘points′,... ′BackgroundColor′,[111],... ′Position′,(548 97 60 20],... ′String′,′0′,... ′Style′,‘text’,... ‘ Tag′,′lrTPR′); h1=uicontrol(′Parent′,h0,... ′Units′/points′,... ′BackgroundColor′,[111],... ′Position′,[284 484 60 203,... ′String′,′0′,... ′Style′,’text’,... ′Tag′,‘AvgTPR′); h1=uicontrol(′Parent′,h0,... ′Units′/points′,... ′Position′.[283 505 61 16],... ′String′,‘avg.TPR′,... ′Style′,’text’,... ‘ ‘ Tag′,′StaticText2′) ;h1=uicontrol(′Parenf,h0,... ′Units′/points′.... ‘Callback′/′egsbar′,... ‘Min′,-1,... ′Position′.U 33 47 96 18],... ‘Style′/slider-.... ‘ Tag′,′xoslide″);h1=uicontrol(′Parenf,h0,... ′Units′/points′,... ′Callback′,“egsbar′,... ′Min′,-1,... ′Position′,(232 47 95 17],... ′Style′/slide″.... ‘ Tag′,′yostide0;h1=uicontrol(′Parent′,h0,... ′Units′/points ′,... ′Callback′,′regsbar′,... ′Max′,0.1,... ′Min′,-0.1,... ‘Position′,[332 48 9516],... ′SliderStep′, [0.0010.01].... ′Style′,′slide″,... ‘ Tag′,′xsslidei′; h1=uiconfrol(′Parenf,h0,... ‘Units′/points′,... ′Callbacl<′/regsbar′,... ′Max′,0.1,... ′Min′.-0.1,... ′Position′,[430 47 96 18],... ′SliderStep′,t0.001 0.01],... ′Sty′e′,′slider′,... ‘ Tag′,′ysslider′);) h1=uicontrol(′Parenf,h0,... ′Units′,‘points′,... ′Callback′,‘regsbar′,... ′Max′,0.5,... ′Position′,[529 48 96 16],... ′SliderStep′.10.001 0.01],... ′Style′,′slider′.... ‘ Tag′/nsslider′); h1=uicontrot(′Parent′,h0,... ′Units′/points′,... ′Positional 40 69 77 16],... ′String′,‘X offset(mils)′,... ′Style′,‘text’,... ‘Tag′,‘ StaticText1′); h1=uicontroK′Parent′,h0,... ′Units′,‘points′,... ‘Pasition′.[241 68 75 17],... ′5′0′,′offse′mils)′,... ′Style′,‘text’,... ‘ Tag′,‘ StaticText1′); h1=uicontroK′Parenf,h0,... ′Units′,‘points′,... ‘Position′,{329 69 96 16],... ‘String′,‘X shrink(miir)′,... ′Style′,′text′.. ‘ Tag′,‘ StaticText1′); h1=uicontrol(′Parent′,h0,... ′Units′,‘points′,... ′Position′,(430 69 94 16],... ′String′,‘Y shrink(mil′)′.... ′Style′,text,... ‘ Tag′,‘StaticText1′);h-1==uicontroK′Parenf,h0,... ‘Units′,‘points′,... ‘Position′,[526 71 93 16],... ′String′,′Noise(mils std)′,... ‘Style′,‘text′,... ‘ Tag′,‘StaticText1′);h1=uicontrol(′Parent′,h0,... ‘Unite′,‘pointe′,... ′BackgroundColor′,[111],... ‘Callback′,′regentry′,... ′Position′,[143 18 60 20],... ′String′,′0′,... ‘Style′,‘edit′,... ‘ Tag′,‘offsef);h1=uicontrol(′Parent′,h0,... ′Units′,‘points′,... ′BackgroundColor′,[111],... ′Callback′,′regentry′,... ′Position′,(2471860 20],... ′String′,′0′,... ‘Style′,‘edit’,... ‘Tag′,′yoffsef’);h1=uicontrol(′Parenf,h0,... ′Units′,‘points′,... ′BackgroundCo′or′,[111],... ′Callback′,‘regentry′,... ′Position′,[346 18 60 20],... ′String′,′0′,... ′Style′,‘edit’,... ‘Tag′,‘xshrink′);h1=uicontrol(′Parent′,h0,... ′Units′,‘points′,... ′BackgroundColor′,[111],... ′Callback′,‘regentry′,... ‘Position′,(440 19 60 20],... ′String′,′0′,... ‘Style′,‘edit’,... ‘Tag′,‘yshrink′); h1=uicontroK′Parent′, h0,... ′Units′,‘points′,... ′BackgroundColo″,[111],... ′Callback′,‘regentry′,... ‘Position′,[54219 60 20],... ′String′,′0′,... ′Style′,‘edit’,... ‘Tag′,‘noise′);h1=uicontroK′Parenf,h0,... ′Units′,‘points′,... ′Callback′,′‘egsbar′,... ′Position′.[393 486 89 21],... ′String′.mati,... ′Style′,′popupmenu′,... ‘ Tag′,‘ graphtype′,... ‘Value′,1);.h1=uicontrol(′Parenf,h0,... ′Units′,‘points′,... ‘Position′,tOS 484 30 19],... ′String′,‘mils′,... ‘Style′,‘ text’,... ‘ Tag′,‘StaticTe′);h1=uicontroK′Parent′,h0,... ′Units′,‘pointe′,... ′Position′,[344 485 30 19],... ′String′,‘mils′,... ′Style′,’text’,... ‘ Tag′,‘ StaticTextS′) ;h1=uicontroK′Parenf,h0,... ‘Units′,‘points′,... ′Position′,[606 488 30 19],... ′String′,‘mils′,... ‘Style′,text′.... ‘Tag′,‘StaticTe″);h1=uicontrol(′Parenf,h0,... ′Units′,‘points′,... ′Position′,(92 99 30 19],... ′String′,‘mils′,...‘’ ′Style′,’text’,... ′Tag′,′StaticText3′);h1==uicontroK′Parent′,h0,... ′Units′,‘points′,... ′Position′,[608 98 30 19],... ′String′,‘mils′,... ′Style′,text′.... ‘ Tag′,‘StaticTextS′);h1=uicontrol(′Parent′,h0,... ′Units′,‘points′,... ′Callback′,‘resetreg′,... ′Position′,‘ 66 486 60 20],... ′String′,‘Resef,... ‘ Tag′,‘PushbuttonI′);h1=uicontrol(′Parent′,h0,... ′Unfts′,‘points′,... ′FontSize′.S,... ′Position′,[293 101 63 16],... ′String′,‘inches′,... ‘Style′,‘ text’,... ‘Tag′,′StaticText4′);h1=uicontrol(′Parent′,h0,... ′Units′/points′.... ′FontSize′,9,... ′Position′,[15 31134 19],... ′String′,‘inches′,... ′Style′,‘text′,... ‘Tag′,‘StaticTextS′) ;h1=axes(′Parent′,h0,... ′Units′,‘pixels′,... *Rr′Y*′fin* ‘CameraUpVector′,
,... ′CameraUpVectotMode′,‘manual′,... ‘Color′,[1111.... ′Colo′Order′,nr′at2,... ′DataAspectRatioMode′/manual′,... ′DeleteFcn′,‘cotorbarC′delete’)′,... ‘Layer′,top′.... ′PlotBoxAspectRatio′,[2234111],... ′PlotBoxAspectRatioMode′,‘manual′,... ‘Posilion′,1613 136 22 341],... ‘ Tag′,′Axes2′,... ′UserData′.matS,... Visible′,‘off,... ′Wa′pToFi′l′,′of′,... ′Wa′pToFillMode′,′manual′,... ‘XColor′,
,... ‘XLim′,[-11],... ′XLimMode′,‘manual′,... ′XTickMode′,‘manual′,... ‘YAxisLocation′,‘righf.... ′YColor′,(0 0 0],... ‘ZOolor-.tO 0 0]); h2=text(‘Parenf,h1,... ‘Color′,[0 0 0],... ‘HandleVisIbility′,‘ofT,... ′HorizontalAlignment′,‘center′,... ′Position′,mat4,... ‘ Tag′,′Axes2Text4′,... ′VerticatAlignmenf.′cap′,... Visible′,‘off); set(get(h2,′Parent′),′XLabel′,h2); h2=‘text(′Parent′,h1,... ‘Color′,tOO 0].... ‘HandleVisibility′,‘ofT,... ′HorizontalAlignment′,‘center′,... ′Position′.P0.4047619047619051155.9027026792005]. ′Rotation′,90,... ′Tag′,′Axes2Text3′,... VerticalAlignment′,‘cap′,... ′‘/isible′,′off); set(get(h2.′Parent′).′YLabel′,h2); h2=text(′Parent′,h1,... ′Color′,
,... ′HandleVisibility′,‘off,... ′HorizontalAlignment′,‘right′,... ′Position′,[-59.3809523809523822.02380952380952155.9027026792005],... ‘ Tag′,′Axes2Text2′,... Visible′,‘off); set(9et(h2,′Parent′),′ZLabel′,h2); h2=text(′Parent′.h1,... ‘Cdo″,[0 0 0],... ‘HandleVisibility′,′off,... ′HorizontalAlignment′,‘center′,...′Position′,[-0.047619047619043916.4047619047619155.9027026792005],... ‘Tag′,′Axes2Text1′,... ′Ve′ticalAlignment′,′bottom′); set(get(h2,′Parenf),′Title′.h2); h1=axes(′Parenf, h0,... ′Box′,‘on′,... ′Came′aUpVector′,
,... ′CameraU′VectorMode′,‘manual′,... ′Colo′U11],... ′Color0′der′.rnat5,... ‘NextPlof.′add′,... ′Position′,mat6.... ‘ Tag′/AxesI′,... ′XColor′,(0 0 0],... ′YColor′,tO 0 0],... ′ZColor′,[0 0 0]); h2=text(‘Pa′enf.hi,... ‘Color′,[0 0 0],... ′HandleVisibility′,′off′,... ′Hori2ontalAlignmenf,′centel″,...′Position′.[12.4517374517374518.2123893805309817.32050807568877],... ‘ Tag′,‘AxesITe″,... ′VerticalAlignmenf,′bottom′) ; set(get(h2,′Pa′enr),′Title′,h2); h2=text(′Parenf,h1,... ‘Color′,(0 0 0],... ‘HandleVisibility′,‘off,... ′Ho′izontalAtignmenf,′center′,... ′Positional 2.45173745173745 -0.902654867256636417.32050807568877].... ‘Tag′,′Axes1 Text3′,... VerticalAlignmenf.′cap′); set(get(h2,′Parenf).′XLabel′,h2); h2=text(′Parenf, h1,... ‘0010′,10 0 0],... ‘HandleVisibility′,‘off,... ′HorizontalAlignment′,‘center′,...′Position′,[-0.96525096525096518.92035398230088817.32050807568877],... *Rotation′.90,... ‘Tag′,′Axes1Text2′,... ′VerticalAlignmenf,′baseline′);set(get(h2.′Parent′),′YLabel′,h2); h2=text(′Parent′.h1.... ‘Color′,tO 0 0],... ‘HandleVisibility′,‘off,... ′HorizontalAlignment′,‘righf,... ′Position′,[-3.37837837837837921.0796460176991217.32050807568877],... ‘Tag′,‘AxesIText1′,... ′Visible′,‘off); se′(Qet(h2,′Parent′).′ZLQbe\′,h2)′, h2=line(′Parent′,h1,... ′Color′,[0 01],... ′LineStyle′,′none′,... ‘Marker′.v,.., ‘ Tag′,′Axes1Line26′,... ′XData′,mat7,...‘ ‘YData′.mat8); h2=line(′Parent′,h1,... ‘Color′,[0 01],... ′LineStyle′,‘none′,... ′Ma′ke″,′+′,... ‘ Tag′,′Axes1Line25′,... ‘XData′,mat9,... ‘ YData′.mat10); h2=line(′Parenf, h1,... ‘Co′or′,[0 01],... ‘lineStyle′,‘none′,... ‘Marker′,′+ ′,... ‘ Tag′,′Axes1Line24′,... ‘Data′.mati1,... ′YData′,mat′12);h2=line(′Parent′.h1,... ′Colo,[0 01].... ′UneStyle′,‘none′,... ′Ma′ker′,′+ ′,... ‘ Tag′,′Axes1Line23′,... ‘XData′,mat13,... ′YData′,mat14);h2=line(′Parenf,h1,... ‘Color′,[0 01],... ′UneStyle′,‘none′,... ′Marke″,‘ + ′.... ‘ Tag′,‘Axes1Line22′,... ′XData′,mat15,... ‘YData′.matie);h2=line(′Parenf, h1,... ‘Color′,[0 01];... ′UneStyle′,‘none′,... ‘Marker′,′+ ′,... ‘ Tag′,′Axes1Une21 ′,... ′XData′,mat17,... ′YData′,mat18);h2=line(′Parent′,h1,... ′Color′,[0 01],... ′LineStyle′,‘none′,... ‘Marker′,′+ ′,... ‘ Tag′,′Axes1Une20′,... ′XData′,mat19 ‘YData′,mat20); h2=line(′Parenf,h1 ‘Color′,[0 01).... ‘LineStyle′,‘none′,... ′Marker′,′+ ′.... ‘ Tag′,′Axes1Une19′,... ‘XData′,mat21,... ′YData′,mat22); h2=line(′Parent′,h1,... ‘Color′,[0 01],... ′LineStyle′,‘none′,... ‘Marker′,′+ ′,... ‘ Tag′,‘AxesILine1S′,... ′XData′,mat23,... ‘YData′mat24); h2=line(′Parent′,h1,... ‘Coior′.[0 0 1],... ′LineStyle′/none′,... ′Marker′,′+ ′,... ‘ Tag′,′Axes1Line17′,... ′XData′,mat25,... ′YData′,mat26); h2=line(′Parent′,h1,... ‘0010′001],... ′UneStyle′,‘none′,... ′Marker′,′ + ′,... ‘ Tag′,‘AxesIUne16′,..- ′XData′,mat27,... ′YData′,mat28);h2=line(′Parent′,h1 ′0010′(0 01],... ′UneStyle′,‘none′,... ‘Marker′,′ + ′, ... ‘ Tag′,′Axes1Une15′,... ′XData′,mat29,... ‘YData′.matSO);h2=line(′Parent′,h1.... ′Color-.p01],... ′UneStyle′,‘none′,... ′Marker′,′ + ′,... ‘ Tag′,′Axes1Llne14′,... ′XData′.mat31,... ′YData′,mat32);h2=line(′Parenf,h1,... ‘Color′,[10 0],... ′UneStyle′,‘none′,... ‘Marker′,′,...′ ‘Tag′,‘Axes1Une1S′,... ‘XData′,mat33,... ′YData′,mat34);h2=line(‘ Parent′,h1,...‘ ‘Color-.t1 0 0],... ′UneStyle′,‘none′,... ‘Marker′,′,... ‘ Tag′,′Axes1Line12′,... ′XData′,mat35,... ′YData′,mat36);h2=line(′Parenf, h1,... ‘Co′or′,[10 0),... ′LineStyle′,‘none′,... ′Marker′.,... ‘ Tag′,‘Axes-IUnell′,... ′XData′,mat37,... ′YData′,mat38);h2==line(′Parent′,h1,... ′Color′,[10 0].... ′LineStyle′,‘none′,... ′Marker′,′*′,... ‘ Tag′,‘AxesILine1O′,... ‘XData′,iTiat39,... ‘YData′.mat40);h2=line(′Parent′,h1,... ‘Color′,[10 0],... - ′LineStyle′,‘none′,... ′Marker′,′*′,... ‘ Tag′,′Axes1Line9′,... ′XData′,mat41,... ′YData′,mat42),h2=lineCParent′.h1,... ′Color′,[ 10 0],... ′LineStyle′,‘none′,... ′Marker′,′*′,... ‘ Tag′,‘AxesILine8′,... ′XData′mat43,... ′YDate′,mat44);h2=line(′Parent′,h-1.... ′Color′,[10 0],... ′LineStyle′,‘none′,... ′Marker′,′*′,... ‘ Tag′,‘AxesI Line?′,... ′XData′,mat45,... ′YData′,mat46),h2=line(′Parent′,h1,... ′Color′,[10 0],... ′LineStyle′,‘none′,... ′Marker′,′*′,... ‘ Tag′,′Axes1Une6′,... ′XData′,mat47,... ′YData′,mat48);h2=line(′Parenf, h1,... ′Color′,[10 0],... ′LineStyle′,‘none′,... ′Marker′,‘*′,... ‘ Tag′,‘AxesILine5′,... ′XData′.mat49,... ′YData′,mat50);h2=line(′Parent′,h1,... ′ColorMI 0 0],... ′LineStyle′,‘none′,... ′Marker′,′*′,... ‘ Tag′,′Axes1Une4′,... ′XData′,mat51,... ′YData′,mat52);h2=line(′Parent′,h1.... ′Color′,[10 0],... ′UneStyle′,‘none′,... ′Marker′,,... ‘Tag′,‘AxesILines′,... ′XData′.matSS,... ‘YData′,mat54);h2=line(′Parent′,h1,... ′Color′,[10 0],... ′LineStyie′,‘none′,... ′Marker′,′*′,... ‘ Tag′,′Axes1Une2′,... ′XData′,mat55,... ‘YData′,mat56);h2=line(′Parent′,h-1,... ′Color′,(10 0],... ′LineStyle′,‘none′,... ′Marker′,′*′,.″ ‘ Tag′,‘AxesILinel′,-. ′XData′,mat57,... ′YData′,mat58);ifnargout>0,fig=h0;endfunction regsbarQ%这个程序跟regmod程序一起使用。%它应该跟角度唯一控制滑动棒一起使用。%获得值h=findobj(‘Tag′,′aslider′);a=get(h,Value′);h=flndobj(Tag′,′xoslider′);xo=06′,′106′);h=findobj(‘Tag′,′yoslider′);yo=get(h,Value′),h=flndobJ′(Tag′,′xsslide″)L_xs=06′,′106′);h=findobj(Tag′,′ysslide″);ys=get(h,Value′);h=findobj(Tag′,′nsslider′);ns=get(h,Value′);h=findobj(‘Tag′,′graphtype′);gt=ge′h.Value′);%滑出一种图形并且获得平均的和角落TPRifgt==1 axis equalend[mtpr ultpr urtpr lltpr Irtpr]=misreg(a,xo,yo,xs,ys,ns,gt);mtpr=round(100*mtpr)/100; ultpr=round(100*ultpr)/100; urtpr=round(100*urtpr)/100; 1ltpr=round(100*lltpr)/100; Irtpr=round(100*lrtpr)/100; tfgt==1 axis equal end %为图形类型正确地设置轴 %确定值供选择 deg=a*180/pi; deg=round(10000*deg)/10000; h=findob)′(Tag′,′angle′); set(h,′String′,deg) h=findobKTag′,‘xoffset′); set(h,′String′,10*xo) h=findobj(‘Tag′,′yoffset′); set(h,′String′,10*yo) h=findobj(‘Tag′,′xshrink′); set(h,′String′,10*xs) h=findobj(Tag′,′yshrink′); set(h,′String′,10*ys) h=findobj(‘Tag′,′noise′); set(h,′String′,10*ns) %Place output settings. h=findobj(‘Tag′,′AvgTPR′); set(h;′String′,mtpr) h=findobj(‘Tag′,′ulTPR′);set(h,′String′,ultpr)h=findobj(‘Tag′,′urTPR′);set(h,′String′,urtpr)h=findobj(‘Tag′,′IITPR′);set(h,′String′,lltpr)h=findobjCTag′,‘IrTPR′);set(h,′String′,lrtpr) ;]]>