12795| 1
|
使用CNC制作雕刻电路板 |
我还是在描述过程之前,先上一段实际应用的视频吧: 在研发的工作中,我们经常会遇见需要制作测试用电路板的情况。尤其是在机电结合的工程项目中,很多传感器和驱动设备尚处于整体调试整合的过程中,我们需要稳定的电路来提供支持。这里会遇见一个矛盾,为了做暂时的电路而不得不去委托制作商做印刷电路的价格以及周期和电路板本身就是暂时性的矛盾。我们不需要这个电路多久,然而有时候却不得不发钱去做好几个电路板来测试。当然,有钱确实可以任性。可是,就算是有钱,也不一定有时间去等制作商制作电路板的时间周期。 稳定的开发中的电路板除了让制作商去印刷电路板之外呢,还有另外一个方法——使用CNC机械加工机床做雕刻电路板。 CNC机械加工机床通常是用来对机械零件做车削,车铣加工用的加工中心。它的刀具相对于加工平台一般有三个方向的自由度。刀具高速旋转,且由程序控制(G代码)其移动。只要提前根据要加工的零件做好刀具的移动路线(toolpath)就可以把零件做出来。使用CNC机械加工机床来做雕刻电路板原理很简单。在一层铜面上(PCB板的铜表面)把所有导通的电路与其他铜面隔离开来就可以了。只要让刀具在恰好的高度(刚刚切入铜面),沿着铜面精确走位,就可以把连接用的电路和外面的铜隔离开。 由于工作需要,前一段时间,较深入的应用过这个技术,觉得其非常适用于产品研发过程。因此准备写下整个流程的总结与心得。 由于整个流程所有涉及到的资源都采用开源软件,因此整个过程,从使用kicad准备导出PCB文件开始写起。本文分为5个部分:1,使用freerouting-master做自动布线。2,导出工艺文件。3,使用LineGrinder_0104生成隔离电路(isolatedcircuit)G代码。4,Grbl项目与Arduino。5,铜面的自平衡算法和现存软件。 1,使用freerouting-master做自动布线。 这一节主要是用来介绍这样一款开源自动布线软件。它的源代码可以在开源社区找到,由最开始与kicad配合使用网络在线自动布线网站是同一个起源。由于该网站不再工作,所以该网站的作者将其源代码开放。再后来被整理成了freerouting-master这个自由软件。软件使用非常简单,只要将kicad导出的DSN文件导入,再按工具栏的说明去做就行了。最后把线好的文件,重新导入Kicad就完成kicad中的PCB板布线。另外,需要有一点特别注意。那就是由于采用雕刻工艺做电路板,每一个引脚的焊盘需要特别的扩大。因为没有通孔的导体,而且由于雕刻电路板表面没有涂绝缘层,小的焊盘会非常难于焊接。 虽然使用freerouting-master可以自动布线。但是,对于做双层雕刻电路板而言,这不是最好的办法。自动布线往往不会考虑到雕刻完成后的焊接难易程度。由于雕刻电路板没有导通双面的通孔(via),因此如果通孔的位置不好,可能会导致很难焊接。尤其是大电流流过的地方,最好避开通孔。我连接两面通孔的方法,是采用细铜线将两面连接起来,这样也不影响芯片引脚的插入。 2,导出工艺文件 PCB电路板的工艺文件是用来指导工艺生成的文本文件。这些文本文件记录了PCB板上各个点线的坐标,线宽,孔径,孔中心坐标等等。需要注意的一点是单位问题。一般有电路板导出的单位有英制单位(英寸)和国际单位(毫米)两种。另外需要注意的是,导出文本文件的小数点位置。由于导出文件是文本文件,浮点数的文本书写形式可以定义为好几种。有的是没有小数点,而是规定前几位为整数数字,后几位为小数点后的位数。 由于后文用的一款在线自动水平软件只能使用国际单位制度,因此,这里需要把所有的单位都导出成毫米。但是,kicad这款软件有一个BUG,除了钻孔工艺文件(.drl)外,其他的文件无法导出毫米单位。无法导出没关系,后文将提到我要用python写了一段简单的G代码修改程序,自动修改G代码文件的单位。 3,使用LineGrinder_0104软件生成隔离电路(isolatedcircuit) LineGrinder也是一个自由软件,在网络上可以免费下载,免费使用。支持对PCB的翻转操作。支持参考点的自动匹配。其余的就是设置各种参数了。这里需要介绍几个重要的参数和问题: 1,雕刻深度。这个参数非常的重要。不能浅,不能深。太浅的雕刻深度会导致雕刻的痕迹不清晰,或者还会有铜丝牵连着。尤其是,在后面焊接的时候,会非常困难。而太深的深度,会导致线路变窄。刀具一般成锥形,上头要大一些。所以如果雕刻太深,会导致刀具轨迹宽度变宽,从而使隔离的线路变窄。经过一定时间的经验总结,我觉得最合适的深度,是刀具在雕刻时,恰好能够看到铜板中间白色粉末被雕刻出来。注意,不是刚刚把表面的铜片雕刻出去,而是要再深一点,让刀具直接雕刻到中间的塑料层。从直观上来讲,是白色粉末被雕刻出来,而不是黑色,红色粉末。 2,刀具轨迹宽度。LineGrinder会根据设定的刀具轨迹宽度来生成G代码。这个参数最好是越接近现实越好。而现实中,不推荐用的刀具太小,因为太小的轨迹,不宜于焊接。当然,太大了是不行的,太大的轨迹会超过线路之间的间距。从而影响到旁边的线路宽度。 3,进给速度。这个参数对于电机的控制是非常重要的。一般的CNC采用步进电机来驱动,在雕刻作业中,速度设定得过快,会发生失步,这是非常危险的事情。但是过小的速度会极大的减小工作效率。 4,参考引脚。参考引脚的存在是用于两面PCB雕刻的定位。雕刻两面PCB板的时候,需要使用翻转操作。而翻转的参考就是位于PCB四个角的四个参考引脚。除此之外,在实际作业中,也要通过这四个参考点来判断两面是否吻合。参考点的G代码会分开生成。所以通过背面和正面的参考点的G代码执行,就可以判断,两面的原点是否重合。或者,如果不重合,也可以通过两面参考点的误差来调整原点。 最重要的是以上提到的四个问题,除此以外还有其余的安全高度参数等就不做详细说明了。 4,Grbl项目与arduino arduino是使用8位AVR单片机的开源硬件。而Grbl是致力于在arduino上实现CNC机床控制的开源软件项目。Grbl的当前最新版本是0.9版,支持一个关键的指令——G38.2指令。在这一节中,我最想提的就是0.9版本支持G38.2指令。G38.2是G代码中的probe指令。正如字面意思,这是个“探针”指令。它的会把刀具当作一个探针向某一个指定方向移动,直到收到脉冲中断。在收到脉冲中断后,会有机器当前刀具的位置信息读取。举一个例子:G91G38.1Z-10。这是一条G代码,G91代表本指令使用相对坐标,G38.2代表执行探针指令,Z-10表示探针(刀具)沿Z的负方向探索10个单位长度(可以通过G20/G21将单位设置为英寸/厘米)。如果探针(刀具)在移动过程中,收到了脉冲信号,则停止移动,并记录当前位置。如果在整个10个单位的移动过程中都没有收到脉冲信号,则返回探测 失败。这一个指令对于本项目而言,可以用来探测将要被雕刻的电路板的平面信息。由于刀具通常是导体,而将要被雕刻电路板的表面也是导体。当刀具碰到电路板表面时,刀具和电路板表面将处于导通状态。于是,将电路板表面接地,刀具接中断引脚。这样,当刀具碰到电路板表面时,将会产生一个脉冲信号。 于是,凭借G38.2这个指令,就可以实现根据电路板的平面信息,对电路雕刻G代码做补偿修正。 5,铜面的自平衡算法和现存软件 让探针(刀具)在电路板平面的多个点做探测指令(G38.2),探测出多个点的具体位置信息,再根据这些点的位置信息,计算出平面上任意点的位置信息。最后,根据这些位置信息,对隔离电路G代码文件的所有指令做Z轴上的补偿。这就是铜面实现自平衡算法的基本思路。 下面按步骤来介绍整个实现自平衡算法的软件。 1,生成被探测点平面坐标。微观的角度看,世界上不存在真正的理想平面。我们的电路板,看起来平,但事实上也不是完美的平面。而是凹凸不平的。在追究零点几毫米一下精度的加工中,我们需要刀具能够更完美的帖着表面走。我们知道,确定一个平面只需要3个点。那么我们在这个电路板上找无数个不重合的3个点,就可以把整个电路板的表面信息获取了。当然,我们不可能做到取那么多,但是可以朝这个方向前进。有这样一种方法,我叫它矩形分割法。把电路板表面分割成很多个小矩形。就像是棋盘一样,把电路板表面分成纵横好几排的矩形。每个矩形再分割成两个三角形。我们把每个三角形看成一个完美的平面(当然不可能完美,这里是取近似)。这个三角形面积越小,也就是铜面分割的矩形越多,所测得平面的误差就越小。用探针(刀具)去探测每一个矩形的顶点(也就是每一个三角形的顶点),根据顶点的坐标高度,来计算该顶点围成的三角形面积内任意顶点的高度。 2,计算任意三个点确定的平面内的任意一点的坐标。平面的坐标方程如下: |x - x1 y - y1 z - z1 | |x2 - x1 y2 - y1 z2 - z1 | = 0 |x3 - x1 y3 - y1 z3 - z1 | 以上行列式表示通过P1(x1,y1,z1),P1(x2,y2,z2)和P3(x3,y3,z3)的平面方程。 如果已知P1,P2,P3的坐标,又知道需要被确定点的x,y坐标上的值,那么就可以求出该点的z坐标值。在现实工程中,确实可以做到获取这些已知条件。通过第一步矩形分割,可以确定每个矩形顶点的横纵坐标。再对每个顶点做G38.2指令,就可以获得每个顶点的z坐标。于是,上述方程中的P1,P2,P3点的坐标确定。再读G代码文件,解析G代码的每一条指令,就可以获取当前刀具在执行当前一条指令后的刀具位置。也就是能够解析出刀具的x,y和z坐标值。刀具的x,y坐标是不需要变化的,因此,目的坐标的x,y的值确定。将将确定的值,代入上述方程,就可以求出此G代码执行后刀具所在点对应的平面高度。如果平面比原点(0,0,0)坐标高出0.1mm,那么修改这条G代码,将G代码的目的坐标的Z值加上0.1mm。这里给出实现方程计算的参考伪代码: ZcompensationValue= (x-x1)*(y2-y1)*(z3-z1) - (x-x1)*(z2-z1)*(y3-y1) ZcompensationValue+= (y-y1)*(x3-x1)*(z2-z1) - (y-y1)*(x2-x1)*(z3-z1) ZcompensationValue= ZcompensationValue/((y2-y1)*(x3-x1) - (x2-x1)*(y3-y1)) ZcompensationValue+= z1 通过以上伪代码,就可以计算出由P1,P2,P3三个坐标围成三角形内,任意点的Z轴补偿值。 当然要完全实现铜面的高度自动补偿,还需要至少一下功能:1,与Grbl的简单通讯协议(包括发送G代码和读G38.2指令的返回值);2,解析G代码(计算刀具的位置)。 在现实中,你可以用很大语言来实现这个算法。而且也存在一个叫作chilipepper.com的网站提供在线自平衡服务。其自平衡算法,与本文所述基本一致。但是,这个网站提供的在线软件仍然存在Bug。比如,其生成的矩形无法全部包括指定区域,无法解析inch为单位的G代码,并生成自平衡路径。 下面展示一些我采用以上方式做成双层PCB板: |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed