没有优秀的个人,只有优秀的团队,在团队共同的协作下,PCB CAM自动化【net处理】与【钻孔处理】 第一阶段开发项完成了,,后续工作可以转向PCB规则引擎开发了。这里说说PCB工程钻孔补偿的那点事,身为一个PCB工程开发人员,有必要知其然,而且还要知其所以然,这里将钻孔补偿的知识点分享一下。

一.为什么对钻孔进行补偿?

客户来的PCB文件中的孔径一般指成品孔径,而PCB生产会在孔内镀上铜(或表面处理:喷锡,沉金,OSP,沉锡),这样一下来孔径就会缩小;为了满足成品孔径大小符合要求,工程CAM会进行钻孔补偿,进行孔径大小的校正.

实际例子:成品孔径是1.00mm,表面处理:沉金 (镍厚:2.54um,金厚:0.0254um),IPC标准II级(平均孔铜:20um),孔径按0.10mm补偿,那么工程会选取1.10mm钻刀钻孔

二.如何进行钻孔也补偿?

先得说说钻孔补偿3个关键参数【钻刀的进制】,【补偿值】,【进阶值】这3个参数决定了钻孔如何补偿了.

【钻刀的进制】---由公司采购钻刀决定,行业常规为50um进制

一般钻刀大小范围在:0.1mm到6.35mm之间,而常规钻刀最小相邻间隔是0.05mm,那么钻刀库钻刀为: 0.10mm,0.15mm,0.20mm,0.25mm  等等。。。。

【补偿值】---由工艺部结合工厂生产能力测试结果制定补偿值规则, 其实整个行业钻孔补偿值差了多少,大同小异

通常:喷锡板:补偿0.15mm, 非喷锡板(沉金,镀金,沉锡,OSP等):补偿:0.10mm.

【进阶值】---由工艺部结合工厂生产能力测试结果制定选取钻刀的策略.

进阶值类似四舍五入,比如:进制值按是20um,那么钻孔补偿后的余数是>=20um,则向上进50um,否则不进按0um 。

例如:成品孔径是:1.025mm,补偿值:0.10mm,钻孔补偿后是 :1.125mm,实际钻刀库中没有1.125mm,那得就得进阶值发挥作用了。

1.125mm余数为25um,此25um>20um,那么向上进50um,钻孔选取1.15mm

 实际钻孔补偿例子:

选取钻刀大小的计算过程,将补偿后的钻孔,分解为整数部份与余数部份

1.125mm整数部份: 1.125 / 0.05 =  22.5 向下取整为22,接着 22*0.05 = 1.10mm

1.125mm余数部份   1.125 % 0.05 = 0.025mm

通过判断:余数部份是否大于20um,如果大于那么按 整数部份+0.05mm,否则按:整数部份+0mm.

【进阶值】小结:

当钻刀进制为50um 【进阶值】对于钻刀选取至关重要,因为这个值是对钻孔补偿的又一个钻刀尺寸效正,【进阶值】决定是钻刀是进还是舍,

【进阶值】变化也决定了钻刀大小也发生了变化,看看下面这个例子

上面例子可见【进阶值】直接决定了钻刀大小的选择, 那么【进阶值】设为多少合适也是一个研究的课题了

对【进阶值】设定多少合适的个人看法:

1.通过利蔽分析:假如钻孔补偿,导致PCB成品孔径尺寸大了或孔径尺寸小了,可以评估对客户插件哪个影响最大,

成品孔径尺寸大了至少还是可以插件的,如果孔径尺寸小了插元件器插不进去.

所以:【进阶值】一般定在20um,而不是25um,当然这也得跟据不同工艺决定补偿值决定,

2.钻孔【补偿值】: 拿喷锡板工艺来说,钻孔补偿值为0.15mm,其实这个补偿值是多补偿了,会导致成品孔径尺寸大一点

比如:1.0mm孔,钻刀:1.15mm,那么这个孔会比实际客户要求孔径大一点,

所以:当钻孔【补偿值】存在本身多补偿了,那么【进阶值】可以设在25um也没问题,就近取刀

三.如何保证钻孔补偿后成品孔径符合要求

方法1.采购特殊钻刀

PCB钻孔进制常规是50um,即相邻钻刀间隔0.05mm, 如1.00mm,1.05mm.1.10mm,1.15mm

一般PTH公差+/-3mil公差采用50um进制钻刀可以保障成品公差要求了,但孔径公差小于这个值时,可以采用特殊钻刀。

例1:50um与25um进制选刀对比

原始孔径 0.922mm 钻孔补偿 0.10mm,补偿后是1.022mm

差值对比 1.050-1.022 =0.028mm

1.025-1.022=0.003mm

差值越小;钻刀选取越合理,那么这里选用1.025mm最佳

例2:50um与特殊钻刀 选刀对比

原始孔径 0.611mm 钻孔补偿 0.10mm,补偿后是0.711mm

差值对比 0.700-0.711 =0.011mm

0.711-0.711 =0.000mm

差值越小;钻刀选取越合理,那么这里选用0.711mm最佳

方法2.工艺与设备改进

1.增加二次板镀,减少图镀时间,减少图形分布不均造成电镀厚度不均的影响

2.改负片直蚀工艺, 全部采用整板镀铜,减少图形分布不均造成电镀厚度不均的影响

3.电流密度减少,通常电流密度 19ASF,适当降低电流密度电镀效果越好,但电镀时间延长了

4.更新更先进的水平电镀线,常规的垂直电镀线对于高厚径比,表面或孔边缘铜厚比孔壁中心铜厚要厚.

方法3.工程CAM改进

1..独立孔区域钻孔,钻刀多补偿一个进制钻刀

独立区域,铜比较少,电镀时是高电流区域,镀上铜会比其它区域的铜会厚一些,就会导致孔小了

2.一边密集线路,而另一边稀疏线路(记得电源板经常这样设计), 稀疏的线路朝板内,而密集的线路朝板外, 进行倒扣拼板

整个PNL电镀时,越靠近PNL板边单位电流密度越大,所以越靠近板边镀上去的铜厚越多.

3. TOP与BOTTOM面 铜面积相差大,进行阴阳拼板.

对钻孔的影响会行成喇叭孔,当板厚与孔铜越厚时,孔侧面形状越明显,采用阴阳拼板改善两边铜面积分布不均

4.独立区域钻孔,当靠近板边或锣槽较近的,可以在板边或锣槽中心,铺抢电铜皮或抢电铜PAD

独立区域钻孔会孔铜越厚,孔会变小, 允许的情况下周边增加铜皮或PAD,可以减少独立区域的高电流.

四.钻孔要补偿多少,如何得出来的.

经过测试结果评估得出来的,看一组钻孔补偿后,在经过各工序后;钻孔大小变化(报告摘自百度文库)

工艺流程:

工艺参数:

测试PNL数量与切边位置:

钻孔后---孔径变化:

图形电镀后---孔铜变化:

图形电镀后---孔径变化:

喷锡后---孔径变化:

孔径变化情况:

可以测试结果得出结论:

喷锡板钻孔补偿:0.15mm,是多补偿了,会导致成品孔径偏大一点,所以最佳补偿因该是补偿0.125mm

五.钻孔补偿代码实现.

1.补偿值与进阶值规则:

2.特殊刀径(公差小于3mil  采用特殊刀径与25um进制刀径,就近取刀原则)

    List<double> ContainDrillToolList = new List<double>();
ContainDrillToolList.AddRange(new double[] { , , , , , , , });

3.补偿钻孔代码

/// <summary>
/// 通过钻孔补偿参数计算钻孔刀径
/// </summary>
/// <param name="ToolInfo"></param>
/// <param name="UpParam"></param>
///<param name="ContainDrillToolList"></param>
/// <returns></returns>
public static int getDrillUpSize(Mod_tool ToolInfo, gToolUpParam UpParam, List<double> ContainDrillToolList)
{
if (ContainDrillToolList == null) ContainDrillToolList = new List<double>();
gToolUpParamHole UpParamHole = new G_Helper.gToolUpParamHole();
switch (ToolInfo.type)
{
case "via":
UpParamHole = UpParam.Via;
break;
case "plate":
UpParamHole = UpParam.Pth;
break;
case "nplate":
UpParamHole = UpParam.Npth;
break;
}
ToolInfo.max_tol = Math.Round(UpParamHole.Max_Tol, );
ToolInfo.min_tol = Math.Round(UpParamHole.Min_Tol, );
if (ToolInfo.finish_size < )
{
ToolInfo.finish_size = ToolInfo.drill_size;
}
double DrillSlotLevel = (ToolInfo.shape == "slot") ? UpParam.SlotLevel : UpParam.DrillLevel; //钻孔阶级距 圆孔有2类阶级25 50 槽孔有一类阶级:50
double UpLevel;
if (UpParam.DrillLevel > ) //进制为50时,不取特殊钻刀
{
ContainDrillToolList = new List<double>();
UpLevel = UpParamHole.UpLevel;
}
else
{
UpLevel = UpParam.DrillLevel * 0.5; //通过进制的一半取刀
} double Drillfinish_size = ToolInfo.finish_size + (ToolInfo.max_tol - ToolInfo.min_tol) * 0.5; //上限下限公差平分
int DrillLevelCount = (int)(Math.Floor((Drillfinish_size + UpParamHole.UpVal) / DrillSlotLevel)); //孔阶数
double DrillsizeInt = DrillLevelCount * DrillSlotLevel; //化整钻孔
double DrillsizeFloat = (Drillfinish_size + UpParamHole.UpVal) % DrillSlotLevel;//余数钻孔
double DrillsizeLevel = (DrillsizeFloat > UpLevel) ? DrillSlotLevel : ;//余数是否进舍
//包含特殊钻刀
int ContainDrillIndex = ContainDrillToolList.FindIndex(tt => (int)(Math.Floor(tt / DrillSlotLevel)) == DrillLevelCount);
if (ContainDrillIndex > -)
{
double ContainDrillFloat = ContainDrillToolList[ContainDrillIndex] % DrillSlotLevel;//特殊钻孔--余数钻孔
if (DrillsizeFloat > UpLevel) // 38 > 20
{
double diff1 = Math.Abs(DrillsizeFloat - DrillSlotLevel); //40-50
double diff2 = Math.Abs(DrillsizeFloat - ContainDrillFloat); //40-38
DrillsizeLevel = (diff1 < diff2) ? DrillSlotLevel : ContainDrillFloat;
}
else //if (ContainDrillFloat < UpLevel)
{
double diff1 = Math.Abs(DrillsizeFloat - ); //12-0
double diff2 = Math.Abs(DrillsizeFloat - ContainDrillFloat); //12-16
DrillsizeLevel = (diff1 < diff2) ? : ContainDrillFloat;
}
}
ToolInfo.drill_size = DrillsizeInt + DrillsizeLevel; double DiffDrillSizeUp = ToolInfo.drill_size - ToolInfo.finish_size;
if (ToolInfo.shape == "slot") //槽长补偿
{
if (UpParam.isSlotUpLevel) //槽长是否进制化
{
Drillfinish_size = ToolInfo.slot_len + (ToolInfo.max_tol - ToolInfo.min_tol) * 0.5; //上限下限公差平分
DrillLevelCount = (int)(Math.Floor((Drillfinish_size + UpParamHole.UpVal + UpParam.SlotLengthUp) / DrillSlotLevel)); //孔阶数
DrillsizeInt = DrillLevelCount * DrillSlotLevel; //化整钻孔 50
DrillsizeFloat = (Drillfinish_size + UpParamHole.UpVal + UpParam.SlotLengthUp) % DrillSlotLevel;//余数钻孔
DrillsizeLevel = (DrillsizeFloat > UpParamHole.UpLevel) ? DrillSlotLevel : ;//余数是否进舍
ToolInfo.slot_len = DrillsizeInt + DrillsizeLevel;
}
else
{
DrillsizeInt = Math.Floor((ToolInfo.slot_len + DiffDrillSizeUp) / ) * ; //化整钻孔 10
ToolInfo.slot_len = DrillsizeInt;
}
ToolInfo.drill_size += UpParam.SlotEndNumber; //Slot槽分刀 加尾数
}
ToolInfo.bit = Math.Round((ToolInfo.drill_size * 0.001), ).ToString();
return ;
}
public class gToolUpParam
{
/// <summary>
/// VIA孔补偿值参数
/// </summary>
public gToolUpParamHole Via { get; set; } = new gToolUpParamHole();
/// <summary>
/// PTH孔补偿值参数
/// </summary>
public gToolUpParamHole Pth { get; set; } = new gToolUpParamHole();
/// <summary>
/// NPTH孔补偿值参数
/// </summary>
public gToolUpParamHole Npth { get; set; } = new gToolUpParamHole();
/// <summary>
/// 钻孔阶级距
/// </summary>
public double DrillLevel { get; set; } = ;
/// <summary>
/// Slot槽孔阶级距
/// </summary>
public double SlotLevel { get; set; } = ;
/// <summary>
/// Slot槽尾数(用于分刀)
/// </summary>
public int SlotEndNumber { get; set; } = ;
/// <summary>
/// Slot槽多补偿值(微米)
/// </summary>
public double SlotLengthUp { get; set; } = ;
/// <summary>
/// Slot槽长是否进制化
/// </summary>
public bool isSlotUpLevel { get; set; } = false;
}
public class gToolUpParamHole
{
/// <summary>
/// 补偿值(微米)
/// </summary>
public double UpVal { get; set; } = ;
/// <summary>
/// 进制(微米)
/// </summary>
public double UpLevel { get; set; } = ;
/// <summary>
///正公差(微米)
/// </summary>
public double Max_Tol { get; set; } = ;
/// <summary>
/// 负公差(微米)
/// </summary>
public double Min_Tol { get; set; } = ; } /// <summary>
/// Mod_layer 层类型
/// </summary>
public class Mod_tool
{
public int num { get; set; }
public double finish_size { get; set; }
public double drill_size { get; set; }
public string bit { get; set; } = "";
public double slot_len { get; set; }
public double min_tol { get; set; }
public double max_tol { get; set; }
public int count { get; set; }
public string shape { get; set; }
/// <summary>
/// via 改via non_plated 改nplate plated 改plate
/// </summary>
public string type { get; set; }
public string type2 { get; set; }
}

六.为什么钻孔补偿和板厚有关呢

这个问题之前我也没明白,主要是因为高【厚径比】会导致孔中心的孔铜薄一些,而孔边缘铜厚厚一些,会形成如下图片所示效果,

要计算出【厚径比】需要板厚这个值,所以板厚也参与到了,钻孔补偿的规则中来了,当高【厚径比】(如12:1)的钻孔补偿会多补偿一些.

PCB 钻孔补偿那点事的更多相关文章

  1. PCB上过孔via钻孔的直径如何设置 是任意的吗 谈谈PCB钻孔工艺及规格

    PCB上过孔via钻孔的直径如何设置,是不是可以随便填入一个直径尺寸就行了?比如我的走线宽度是6mil,那我的via过孔直径也设置为6mil,节约布线空间岂不是更好?这样的设计板厂是否都能按照设计规格 ...

  2. PCB 围绕CAM自动化,打造PCB规则引擎

    AutoCAM自动化平台,前端管理订单,而后端执行任务,前端UIl界面有板厚,铜厚,板材,表面处理,层数等信息,而这些信息并不是后端最终所需要的信息后.拿钻孔补偿来说,后端需要的是钻孔补偿值,但前端并 ...

  3. PCB genesis 大孔扩孔(不用G84命令)实现方法

    PCB钻孔时,当钻刀>6.3mm时,超出钻孔范围,钻孔工序是没有这么大的钻刀,当这种情况,工程CAM会都采用G84命令用小孔扩孔的方式制作, 在这里介绍一种如果不用G84命令,用程序实现将大孔生 ...

  4. PCB genesis方槽加内角槽孔实现方法

    一.为什么方槽孔加内角孔 如下图,客户来的方槽或Slot槽有内角尺寸要求,通常直接钻一个Slot槽孔内角是不能满足客户要求的,这时我们做CAM的需采用小钻刀进行处理.加内角孔或内角槽的方式进行处理了. ...

  5. PCB genesis短槽加引导孔实现方法

    一.何为短槽 短槽通常定义:槽长小于2倍槽宽      如:槽长1.8mm,槽宽1.0mm 二.为什么要加短槽加引孔呢 短槽孔在钻孔时孔易偏斜导致槽长偏短, 当槽长宽比越小,则受力越不均匀,在钻第2个 ...

  6. STM32学习笔记之核心板PCB设计

    PCB设计流程 PCB规则设置 设计规则的单位跟随画布属性里设置的单位,此处单位是mil.导线线宽最小为10mil;不同网络元素之间最小间距为8mil;孔外径为24mil,孔内径为12mil;线长不做 ...

  7. PCB检查事项,生成钻孔表

    PCB检查事项 检查器件是否都放完, 检查连接线是否全部布完, 检查Dangling Line,Via, 查看铜皮是否孤立和无网络铜皮, 检查DRC, 1.选择菜单Display-Status,查看标 ...

  8. PCB genesis Slot槽转钻孔(不用G85命令)实现方法

    PCB钻Slot槽一般都采用G85命令钻槽孔,而采用G85命令工程CAM无法准确的知道Slot槽钻多少个孔,并不能决定钻槽孔的顺序,因为采用G85命令钻孔密度与钻槽顺序由钻机本身决定的.在这里介绍一种 ...

  9. PCB javascript解析钻孔(Excellon)格式实现方法

    解析钻孔(Excellon)格式前首先得了解此格式,这样才能更好的解析呀. 一个钻孔里面包含的基本信息如下: 1.单位:公式mm,英制inch 2.省零方式:前省零,后省零 3.坐标方式:绝对坐标,相 ...

随机推荐

  1. Spring事物不回滚

    今天发现个自己的bug,仔细排查后,发现根本原因我在service方法中抛出的异常被控制层的方法捕获了,所以后台页面也只是出现个错误提示,而数据却没有回滚. 解决方式:对自己抛出的异常使用try ca ...

  2. js之定时器操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. STM32F103移值FreeRtos笔记

    RTOS版本:FreeRTOS_V8.2.2 一.下载FreeRTOS源文件       这个可以在百度上下载,或者在官网上面下载http://www.freertos.org/a00104.html ...

  4. 关于 CMSIS 标准 及 STM32F10x的固件库

    CMSIS 标准英文全称是Cortex MicroController Software Interface Standard,翻译为中文意思就是 ARM Cortex 微控制器软件接口标准. 由于基 ...

  5. 【06】AngularJS 控制器

    AngularJS 控制器 AngularJS 控制器 控制 AngularJS 应用程序的数据. AngularJS 控制器是常规的 JavaScript 对象. AngularJS 控制器 Ang ...

  6. ACM数论常用知识完全解读

    此版本纯属扯淡....... 一个一个来起.

  7. - > 动规讲解基础讲解三——混合背包(背包模板)

    将01背包,完全背包,和多重完全背包问题结合起来,那么就是混合三种背的问题 根据三种背包的思想,那么可以得到混合三种背包的问题可以这样子求解 for(int i=1; i<=N; ++i) if ...

  8. java int怎么转换为string

    1.两种方法,一个是再int后面+“”,就可以转为字符串. 另一个, nt i=12345;String s="";第一种方法:s=i+"";第二种方法:s=S ...

  9. VM Workstation 虚拟机下如何安装VMtools

    不同版本Linux原理类似,这里以Debian为例. 1 根据提示点击Install Tools,CDROM中出现VmwareTools的安装包,在你的主文件夹下新建一个文件夹(随便叫什么都行,我新建 ...

  10. J2EE肌肉系统—四层模型

    J2EE是基于JAVA技术的一种标准.为什么会有这种标准呢? 主要是在企业级应用开发其中有一些需求.比如数据库连接,邮件服务.事件处理等,都是一些通用模块. 而这些模块假设由开发者来开发.势必添加开发 ...