使用CNC制作PCB

这一篇博客将展示我如何使用KiCad制作PCB工程文件并使用FlatCAM生成G-Code,最后使用CNC在覆铜板上雕刻出电路。这一篇博客还会讨论我所遇到的一些问题和我的解决方案。

--by Captdam @ Aug 31, 2024

[en] Here is the English version of this article

一般来说,制作PCB分为在电脑或图纸上设计走线与制作PCB实物两个步骤。我们可以使用电脑软件(例如KiCad)来将电路原理图转换为PCB走线图,然后导出PCB生产使用的Gerber文件或在菲林片(透明胶片)打印用于光蚀刻的掩模版。当然,“硬核玩家”也可以选择手搓菲林。而对于实际制作PCB,我们可以将Gerber文件发送给PCB厂家制作专业的PCB,也可以自己在家用菲林与化学药水来光蚀刻PCB。

以上作为非常广泛使用的方法,相信互联网上有很多写的比我好也比我详细的文章,我也不想浪费我的时间与读者的时间来制造互联网流量垃圾。在这里我想要分享我使用的小众方法:使用CNC,用铣刀覆铜板上雕刻出电路,再使用钻头钻孔。我将在这一篇博客介绍我的操作步骤与制作中碰到的一些问题和经验。

相较于光蚀刻,使用CNC雕刻的优点是不需要使用化学药品,能保持工作环境的干净,也不需要控制时间与光线,而且电路与钻孔都可以被CNC完成;但缺点是速度慢且CNC切割会产生长时间噪音与大量粉尘。我认为CNC雕刻的方法很适合小规模生产,例如PCB打样。

我的PCB制作
我的PCB制作

设计

使用电子设计自动化(EDA)软件将电路原理图转换为PCB走线图并进行设计规则验证(DRC)

首先,我们需要使用EDA软件设计电路。我使用的是免费且开源的软件:KiCad。KiCad提供了PCB设计的几乎所有流程,我们可以首先使用这个EDA软件画出电路原理图,接下来再将原理图转换为PCB设计图并导出业界通用的Gerber文件并发送给工厂进行生产。

KiCad软件界面
如图为KiCad软件界面,左边是电路原理图编辑器,右边是PCB编辑器

当然也可以使用其他软件,我是用KiCad完全是因为它是免费且开源的,适合个人开发者。目前,KiCad仍在维护并推出新版本。

KiCad也不是完美的。KiCad是围绕PCB的设计软件,最终目的是生成“一张”“PCB”。因此,KiCad不适合制作拥有多张PCB的系统。举一个例子,在狭窄空间内,我们想要把一个系统切分为多张层叠的PCB并使用排针相互连接。我们将必须手动将系统切割为多个子系统并分别创建工程,并需要手动保证每一张PCB的尺寸符合规定,并手动将排针与插座对其。

KiCad有一个相对完整的元件库,但是我们在面对小众元件(例如一些国产IC)时将需要自己创建元件库来告诉KiCad这个元件的引脚在原理图上该如何分布以及在PCB上该如何排布,或使用引脚差不多的元件代替。

第一步 - 设计电路

电路原理图设计
电路原理图设计

让我们来画一个简单的单片机系统。

我们首先将需要的元件放进电路图中,然后再将它们连接起来。在库里选择元件时,我们也需要选择究竟使用哪种封装。有的元件,例如单片机,型号包括了封装(比如选择ATtiny441-SSU时就是SOIC封装,选择ATtiny441-MU时就是MLF封装)。有的元件,例如基本的电阻电容,我们需要手动指定封装类型。部分元件在插入时没有封装选项列表,我们需要根据电路图中引脚的编号手动选择封装库。

虽然PCB的安装孔不属于电路原理的部分(当然某些安装孔也参与了接地的功能),出于软件限制,我们需要在电路原理图编辑器里插入对应数量的安装孔。如果我们只在PCB编辑器里面插入安装孔的话,当我们同步电路原理图到PCB时,我们就会失去这些安装孔,因为软件无法再原理图里面找到它们。

在插入元件时,如果KiCad并没有给元件编号(元件显示为R?这种格式),我们需要先给他们编号。可以选择横向顺序,也可以纵向顺序,全看个人喜好。

接下来,我们可以进行DRC。这里的DRC主要是为了验证画图时有没有连线没连上的问题,并不能检查设计中的错误(出门右转使用电路仿真)。这里要注意的是KiCad需要在供电上放置PWR_FLAG,我不爱用选择忽略这一个报警。另外需要注意的就是如果有引脚空置,我们需要放一个X上去表示不连接。

我的偏好

对于像是排线针脚这样结构强度要求高的元件,我倾向于使用插件元件,因为使用贴片可能导致外力将铜箔扯下来,而插件元件的金属针脚和背面焊锡可以像铆钉一样咬住PCB基板。

非结构元件我会尽量使用SMD,因为SMD元件更小更便宜,而且在之后制作PCB时可以免去打孔的工序。我一般使用0805(0.8*0.5-inch 2.0*1.2mm)的电阻与电容元件,这个尺寸比较方便手工焊接。

同尺寸但不同类型的元件有不同的引脚库,虽然胡乱选择不影响PCB走线,但是在(作为观察使用的)PCB渲染界面会有不同的渲染结果。例如为0805的电容选择了0805的电阻的封装,那么渲染出来的模型/图片也会是一个电阻而不是我们想要的电容,但是最后做出来的PCB是没有问题的。当然,如果我们的元件没有合适的封装又不想费力去制作或者下载新的库文件,那么随便选一个类型的但是引脚相同的封装也不是不行。

第二步 - 设计PCB

PCB设计
PCB设计

我们使用KiCad的同步功能,就可以将电路原理图同步到PCB设计器。KiCad会提示我们哪些元件的哪些引脚应该被相互连接,同时,当我们选中电路原理图编辑器或PCB编辑器中的某个元件时,另外一个编辑器里面的对应元件也会高亮显示。

如果发现电路原理图需要修改,我们可以回到电路原理图编辑器并修改走线或封装,加入新的元件或删除旧的元件。完成后,重新同步电路原理图到PCB编辑器。

首先我们需要定义我们所会用到的线径。建议一次性加入所有可能会用到的线径,因为每次更新线径列表for some random reason巨慢无比。

接下来开始走线。我们使用页面的左上角(0,0)作为基点,这也会是我们生成的Gerber文件中线路的基点。我们需要确定元件摆放的面。对于单面电路板,我们可以把电路和SMD放在正面,把插件元件放在背面,也可以反过来。需要注意的是,如果电路在PCB背面,在CAM中准备PCB时需要左右翻面(下一步)。

我们可以定义填充区域,这样就会将在区域内没有走线的地方作为一个电极,比较常见的操作是整个电路板定义为GND的填充区域。我们也可以把不同的地方定义不同的填充区域,例如双面PCB正面是供电,背面是GND。我们也可以定义某些地方不能被Filled,对于高频或者高压电路来说这很重要。如果我们定义了GND填充区域,那么在走线时我们可以暂时忽略GND。待完成其他信号的走线时,使用DRC功能,KiCad就会将填充区域内没有走线的地方填充。如图我们可以看到的阴影部分就是填充区域构建的供电与GND。

使用DRC后,KiCad会提示我们哪些元件还没有被连接或是有误,或是哪些元件放置的位置冲突了。我们还可以使用3D浏览器看看这个电路板长什么样。因为我是手工焊接,一些关于原件放置位置冲突的错误可以被忽略,因为这个主要是确保机器可以放置元件,我们的人手显然比机器灵活。

一切无误后,我们就可以导出工程文件了:grb文件包括了走线信息,drl文件包括了打孔信息。

我的偏好

因为放置元件时鼠标会吸附到网格,我喜欢使用0.025-inch的网格,也就是DIP元件的引脚宽度(0.1-inch 2.54mm)的1/4。

如果修改了电路原理图,在给新加入的元件编号时,尽量不要给已编号的元件重新编号。因为KiCad根据元件编号来对应电路原理图与PCB内的元件,重新编号会导致错乱并需要重新走线。这点对强迫症很不友好。

对于供电,电流决定最低线径,而线径越粗则越稳定。我一般会使用1mm以上线径作为供电,动力电使用更高线径或直接设置填充区域。

对于信号,我会使用0.45mm或更高的线径,如果走线距离长那么也需要适当提高线径。这是因为我的CNC使用的是V型铣刀,考虑PCB在床上不一定完全平整,切割出来的线径也会有误差。对于导线之间的净空,我会设置为0.2mm(略大于之后在CAM中设置的0.007-inch的刀头尺寸)。0.45mm的线径与0.2mm的净空可以做到0.65mm的feature size(工艺),也就是说我们可以在SOIC封装引脚之间(1.27mm pitch)走一条线。

对于焊盘与Via,最大1mm穿孔,最小1.3mm焊盘注意应对大部分插件元件并提供足够的空间上锡,同时也允许DIP封装的引脚之间可以额为走一到两条线。另外,我们也可以对部分焊盘使用长方形焊盘而不是圆形来方便走线与提高焊接面积。而对于填充区域的焊盘,如果一个焊盘位于填充区域,KiCad会将这个焊盘与填充区隔开后放置一个“X”型的连接。我倾向于设置间隔大小为0.18mm,“X”连接的粗细为0.7mm,这样既能保证低电阻,也能良好的放置焊锡溢出焊盘,特别是我们不涂绿油(树脂)时。

因为我使用CNC雕刻覆铜板,因此我只能制作单面或双面PCB。而双面PCB又需要对准正反两面,很麻烦,所以我一般都制作单面PCB。我们可以在一面走线,使用另一面走线作为需要连接两条线路的搭桥,这样就不用特地插入特定长度的金属丝元件了。对于连接正反面的的Via,我会将其调整为我使用的最小焊盘参数。

因为我只制作单面PCB,所以在导出文件时我只需要电路走线所在那一面的gerber和打孔的drl文件。在KiCad中,只要选择File > Fabrication Outputs > Gerbers在弹出来的窗口点一下Plot和Generate Drill Files就能生成我所需要的两个文件了。而用作搭桥的另一面的走线的Gerber不需要特意导出,我一般在焊接PCB时直接看电脑屏幕。另外对于PCB的边界,可以导出在PCB编辑器里画的Edge.Cuts,也可以在下一步CAM中自动生成边界。

导出文件
导出文件

准备

将PCB文件转换为CNC使用的G-code

我们需要使用计算机辅助制造(CAM)软件将PCB工程文件转化为CNC能读的G-code。这里我使用的仍然是开源软件:FlatCAM。这个软件的安装不太方便。我使用的是8.5版本,更新的8.6版本我觉得不好用。

FlatCAM软件界面
FlatCAM软件界面

第一步 - Isolation

首先导入ger与drl文件,如果Gerber文件是PCB背面的走线,我们需要将其反转,因为我们在CNC上面加工时是正面。

在这一步中,最重要的的Isolation,即用铣刀分隔开不同的电路。如果在设计PCB时线路之间留的空间太窄,就会导致铣刀无法完全分割电路,也就会造成短路。如果只是很少的部分短路的话,我们可以后期再用美工刀手动修理。如果很多地方都不能分割的话,后期加工显然并不现实,我们只能回到KiCad中重新走线了。

我使用的工艺数据是:

Isolation结果
Isolation结果

完成后,我们就可以看到铣刀会走的路径,我们需要确保所有的电路走线(绿色)被铣刀路径(红色)完全分离。如果我们细看的话,其实可以发现有的地方并没有被切开,不过并不影响我们的电路所以可以忽略。

接下来,我们打开Isolation项目并设置下刀切割时(Cut)与移动刀头到其他位置时(Travel)刀头的深度/高度与移动速度。

我使用的工艺数据是:

Isolation结果
Isolation结果

最后生成CNC使用的G-code。另外我们可以在这里多加上一个G21指令让CNC在完成任务后回到mm模式。

第二步 - Drill

我们需要给PCB钻孔才能安装插件元件。

因为我们的CNC非常简单,不具备自动换刀的功能,因此我们使用一个小尺寸钻头来钻出所有的孔。对于某些引脚很大的的插件元件,我们后期手动使用更大的钻头。我使用的是0.3mm的钻头,这个尺寸适合大部分插件元件。

我使用的工艺数据是:

第三步 - Cutout

现在,我们要把已经做好的PCB从一整张覆铜板上取下来。我们可以让FlatCAM帮我们自动生成一个边框,也可以使用我们在KiCad里画的Edge.Cuts

如果使用自动生成的,我们需要告诉FlatCAM我们需要多大的边距,这非常直接。

如果使用KiCad导出的Edge.Cuts,就需要一些窍门了。因为导出的Edge.Cuts也是Gerber文件,所以FlatCAM会认为这也是PCB上面的一条走线。我们可以通过Isolation相同的方式,但是先将铣刀直径设置为负数,并将下刀深度设置为PCB的厚度,这样就可以让铣刀行走在这条线的正中间而不是外围。

我使用的工艺数据是:

CNC雕刻

使用CNC在覆铜板上面雕刻出电路并为插件元件打孔

终于,我们可以开始制作PCB了。

首先将覆铜板放置在CNC床上并用夹具固定,我们要尽可能让床平整并防止夹具挤压覆铜板导致中部鼓起。我一般会在安装夹具时按压PCB中部使其贴合基板(床),并在安装完成后测试其是否紧贴基板。

错误的安装
错误的安装

如图展示了一种错误的安装。在这种安装方式下,夹具将会产生向内的力并挤压覆铜板导致其中部隆起,如下图分析:

错误的安装分析
错误的安装分析

正确的安装方式如下,我们需要垫高夹具另一侧防止其横向挤压覆铜板:

正确的安装
正确的安装

同时,因为我们的铣刀是V型的,如果基板不平,也将会导致最后生成的电路板在不同位置的电路宽度不一:

基板不平分析
基板不平分析

下面就是不平整的例子。可以看到左上角部分铣刀无法完全贯穿覆铜层并造成了短路问题:

基板不平导致短路
基板不平导致短路
基板不平导致短路
基板不平导致短路

而对于基板不平的问题,如果无法调整基板的话,只能修改G-code增加Z轴信息或是设计尽可能小的PCB以降低误差带来的影响。这也是我倾向于使用贴片元件制作小型PCB的原因之一。

接下来对刀,将刀头移动到覆铜板的左上角的上空并为刀头和夹具留出一定的净空,这个地点就是我的的基点(0,0)了。慢慢地(一定要非常慢,不然会怼坏刀尖)下降刀头直到刀头接触覆铜板。因为覆铜板和刀头都是导体,我们可以通过测量刀头与覆铜板之间的电阻的方式来测试;我们也可以启动刀头电机,并用手感受通过刀头传递到覆铜板上的电机震动来确认刀头与覆铜板接触。然后,再下降0.1mm即可做到足够切开1-2oz覆铜板。

因为此时铣刀位于PCB的左上角原点,这里是PCB的边界所以没有电路,我们可以在这附近小范围移动铣刀的XY轴来看看当前下刀深度的效果。下刀的深度当然是在完全切割覆铜的基础上越浅越好,这既能提供更宽的导线线径(也就是更良好的线路),也能降低铣刀的磨损。但是,考虑基板和覆铜板可能不平,适当增加下刀深度可以避免在某些地方下刀太浅导致的短路问题。当然,如果真的发生了有些地方下刀太浅的问题,我们可以加大下刀深度并再走一遍。

下图展示了三种不同的下刀深度,从左到右依次由浅入深,可以看到最左边的样本下刀深度完全满足需求,中间的样本下刀深度更深更保守更适合尺寸更大的PCB,最右侧的样本下刀就太深了:

不同下刀深度对比
不同下刀深度对比

我们将按照一下顺序完成PCB的制作:

  1. Isolation:这一步对下刀深度要求严格,需要我们在干净的覆铜板上对刀(如上文所阐述)。同时,因为这一步是最重要的,它的质量决定了最终PCB的质量。如果这一步没做好,那么就没必要进行之后的步骤了。
  2. Drill:如果没有插件元件,可以跳过这一步。我们需要更换为钻头,并重新对刀。不过,下刀深度要求不高,简单对刀即可。完成后,切换回铣刀。可以看到,因为要更换两次刀头,很是麻烦,所以我们倾向于设计只是用贴片元件的PCB。
  3. Cut out:切割以取出PCB。

完成

安装元件,焊接

来看看成品图吧:

最终成品
最终成品

下面是我做的一些其他PCB的正反面:

最终成品
最终成品
最终成品
最终成品