PCB 钻孔补偿那点事
没有优秀的个人,只有优秀的团队,在团队共同的协作下,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 钻孔补偿那点事的更多相关文章
- PCB上过孔via钻孔的直径如何设置 是任意的吗 谈谈PCB钻孔工艺及规格
PCB上过孔via钻孔的直径如何设置,是不是可以随便填入一个直径尺寸就行了?比如我的走线宽度是6mil,那我的via过孔直径也设置为6mil,节约布线空间岂不是更好?这样的设计板厂是否都能按照设计规格 ...
- PCB 围绕CAM自动化,打造PCB规则引擎
AutoCAM自动化平台,前端管理订单,而后端执行任务,前端UIl界面有板厚,铜厚,板材,表面处理,层数等信息,而这些信息并不是后端最终所需要的信息后.拿钻孔补偿来说,后端需要的是钻孔补偿值,但前端并 ...
- PCB genesis 大孔扩孔(不用G84命令)实现方法
PCB钻孔时,当钻刀>6.3mm时,超出钻孔范围,钻孔工序是没有这么大的钻刀,当这种情况,工程CAM会都采用G84命令用小孔扩孔的方式制作, 在这里介绍一种如果不用G84命令,用程序实现将大孔生 ...
- PCB genesis方槽加内角槽孔实现方法
一.为什么方槽孔加内角孔 如下图,客户来的方槽或Slot槽有内角尺寸要求,通常直接钻一个Slot槽孔内角是不能满足客户要求的,这时我们做CAM的需采用小钻刀进行处理.加内角孔或内角槽的方式进行处理了. ...
- PCB genesis短槽加引导孔实现方法
一.何为短槽 短槽通常定义:槽长小于2倍槽宽 如:槽长1.8mm,槽宽1.0mm 二.为什么要加短槽加引孔呢 短槽孔在钻孔时孔易偏斜导致槽长偏短, 当槽长宽比越小,则受力越不均匀,在钻第2个 ...
- STM32学习笔记之核心板PCB设计
PCB设计流程 PCB规则设置 设计规则的单位跟随画布属性里设置的单位,此处单位是mil.导线线宽最小为10mil;不同网络元素之间最小间距为8mil;孔外径为24mil,孔内径为12mil;线长不做 ...
- PCB检查事项,生成钻孔表
PCB检查事项 检查器件是否都放完, 检查连接线是否全部布完, 检查Dangling Line,Via, 查看铜皮是否孤立和无网络铜皮, 检查DRC, 1.选择菜单Display-Status,查看标 ...
- PCB genesis Slot槽转钻孔(不用G85命令)实现方法
PCB钻Slot槽一般都采用G85命令钻槽孔,而采用G85命令工程CAM无法准确的知道Slot槽钻多少个孔,并不能决定钻槽孔的顺序,因为采用G85命令钻孔密度与钻槽顺序由钻机本身决定的.在这里介绍一种 ...
- PCB javascript解析钻孔(Excellon)格式实现方法
解析钻孔(Excellon)格式前首先得了解此格式,这样才能更好的解析呀. 一个钻孔里面包含的基本信息如下: 1.单位:公式mm,英制inch 2.省零方式:前省零,后省零 3.坐标方式:绝对坐标,相 ...
随机推荐
- block教程
http://pernghh.pixnet.net/blog/trackback/eac87d412e/33563409 本文来自台湾的某开发人员的博客,被墙,感觉讲的比较易懂,所以引过来.文字简体化 ...
- UVA - 11212 Editing a Book (IDA*搜索)
题目: 给出n(1<n<10)个数字组成的序列,每次操作可以选取一段连续的区间将这个区间之中的数字放到其他任意位置.问最少经过多少次操作可将序列变为1,2,3……n. 思路: 利用IDA* ...
- Java对象序列化为什么要使用SerialversionUID
1.首先谈谈为什么要序列化对象 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通 ...
- 10 Minutes to pandas中文版
本文是对pandas官方网站上<10 Minutes to pandas>的一个简单的翻译,原文在这里.这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook .习惯 ...
- 用php生成HTML文件的类
目的 用PHP生成HTML文档, 支持标签嵌套缩进, 支持标签自定义属性 起因 这个东西确实也是心血来潮写的, 本来打算是输出HTML片段用的, 但后来就干脆写成了一个可以输出完整HTML的功能; 我 ...
- 08.C语言:特殊函数
C语言:特殊函数 1.递归函数: 与普通函数比较,执行过程不同,该函数内部调用它自己,它的执行必须要经过两个阶段:递推阶段,回归阶段: 当不满足回归条件,不再递推: #include <stdi ...
- 洛谷 3979 BZOJ 3083 遥远的国度
[题解] 这道题除去根操作就是普通的树链剖分了.但是有换根操作怎么处理呢? 我们可以发现如果现在的根不在查询的点的子树里,那么对本次查询没有影响.如果现在的跟在查询的点x的子树里,那么答案将变为整棵树 ...
- Hdu 5806 NanoApe Loves Sequence Ⅱ(双指针) (C++,Java)
Hdu 5806 NanoApe Loves Sequence Ⅱ(双指针) Hdu 5806 题意:给出一个数组,求区间第k大的数大于等于m的区间个数 #include<queue> # ...
- BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)
题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/probl ...
- 【Lqb T336】Cowboys
[链接] 我是链接,点我呀:) [题意] 出现AB就要交换一下 给你结果序列 问你原序列有多少种可能 首尾可以交换. [题解] 设 dp[i][0]表示i和i-1不交换,达到前i个字符序列的状态的方案 ...