Về bù trừ lỗ khoan trên bảng mạch in (PCB)

About PCB Drill Compensation

Không có cá nhân xuất sắc, chỉ có những đội ngũ xuất sắc. Với sự hợp tác của đội ngũ, dự án tự động hóa CAM cho PCB giai đoạn đầu tiên cho Xử lý mạngVận hành máy khoan Đã hoàn thành. Tiếp theo, chúng ta có thể chuyển sang công cụ quy tắc PCB. Ở đây, tôi sẽ nói về bù lỗ khoan trong kỹ thuật PCB. Với tư cách là một nhà phát triển kỹ thuật PCB, bạn nên hiểu rõ về khái niệm này và lý do tại sao nó hoạt động. Dưới đây là những điểm chính về bù lỗ khoan mà tôi muốn chia sẻ.


1. Tại sao chúng ta điều chỉnh kích thước mũi khoan?

Kích thước lỗ trong các tệp PCB mà khách hàng cung cấp thường có nghĩa là cuối cùng Kích thước lỗ. Trong quá trình sản xuất PCB, đồng được mạ bên trong các lỗ (hoặc các lỗ được phủ lớp hoàn thiện bề mặt như HASL, ENIG, OSP, v.v.). Điều này làm cho lỗ nhỏ hơn. Để đảm bảo kích thước lỗ cuối cùng đáp ứng yêu cầu, bước CAM điều chỉnh kích thước lỗ khoan. Đây là bù trừ lỗ khoan.

Ví dụ thực tế:
Kích thước lỗ cuối cùng: 1,00 mm. Bề mặt hoàn thiện: ENIG (độ dày niken 2,54 µm, độ dày vàng 0,0254 µm). Tuân thủ tiêu chuẩn IPC Class II và độ dày trung bình của lớp đồng mạ là 20 µm. Nếu chúng ta sử dụng 0,10 mm Với giá trị bồi thường, đội ngũ CAM sẽ lựa chọn một 1,10 mm mũi khoan.

Real example


2. Chúng ta thực hiện bồi thường khoan như thế nào?

Trước tiên, hãy làm rõ ba thông số chính cho việc bù trừ khoan:
(1) Bước tăng của mũi khoan,
(2) Giá trị bồi thường,
(3) Ngưỡng tăng (giá trị tăng).
Ba yếu tố này quyết định cách áp dụng bồi thường.

1) Bước tăng của mũi khoan

Điều này phụ thuộc vào loại mũi khoan mà công ty mua. Mức tăng thông thường trong ngành là 50 µm. Kích thước mũi khoan thông thường dao động từ 0,10 mm để 6,35 mm. Bước nhỏ nhất thông thường giữa các mũi khoan là 0,05 mm. Vì vậy, thư viện mũi khoan có các kích thước như 0,10 mm, 0,15 mm, 0,20 mm, 0,25 mm, và vân vân.

2) Giá trị bồi thường

Nhóm quy trình thiết lập các quy tắc bồi thường dựa trên kết quả thử nghiệm tại nhà máy. Giá trị bồi thường không có sự chênh lệch đáng kể trong ngành. Các quy tắc phổ biến:

  • Bảng mạch có lớp phủ HASL (chai xịt): Bù đắp 0,15 mm.

  • Bo mạch không có HASL (ENIG, mạ thiếc ngâm, OSP, v.v.): Bù đắp 0,10 mm.

3) Ngưỡng tăng (giá trị tăng)

Nhóm quy trình cũng xác định chiến lược lựa chọn mũi khoan, tương tự như quy tắc làm tròn. Ví dụ, khi bước nhảy là 20 µm, Nếu phần dư sau khi chia cho bước nhảy là ≥ 20 µm, Bạn làm tròn lên 50 µm; nếu không, bạn giữ nguyên kích thước nhỏ hơn.

Ví dụ:
Kích thước lỗ cuối cùng = 1,025 mm, bồi thường = 0,10 mm, do đó kích thước bù đắp = 1,125 mm. Nhưng không có 1,125 mm Thực hiện phép tính trong thư viện. Sử dụng quy tắc tăng dần. Phần dư 1,125 mm so với bước 0,05 mm là 25 micromet. Kể từ khi 25 µm > 20 µm, làm tròn lên 50 µm và chọn một 1,15 mm khoan.


Ví dụ về bồi thường cho việc khoan thực tế

Giả sử: bước khoan = 50 µm, ngưỡng tăng = 20 µm

Lỗ ban đầu Bồi thường Sau khi bồi thường Phần nguyên Phần còn lại Máy khoan được chọn
1,025 mm 0.10 1,125 mm 1.10 0,025 mm 1,15 mm
1,016 mm 0.10 1,116 mm 1.10 0,016 mm 1,10 mm

Cách tính kích thước mũi khoan đã chọn

Phân chia kích thước lỗ bù thành phần nguyên và phần dư bằng cách sử dụng bước tăng của mũi khoan:

Lấy 1,125 mm Ví dụ:
1.125 / 0.05 = 22.5 → làm tròn xuống 22 → phần nguyên = 22 × 0.05 = 1,10 mm.
Số dư = 1.125 % 0.05 = 0,025 mm.

Sau đó so sánh phần dư với ngưỡng tăng bước (ví dụ: 20 µm):

  • Nếu phần dư lớn hơn ngưỡng, kích thước mũi khoan = phần nguyên + 0,05 mm.

  • Nếu phần dư ≤ ngưỡng, kích thước mũi khoan = phần nguyên + 0,00 mm.


Tóm tắt về ngưỡng tăng cấp

Khi bước tăng của mũi khoan là 50 µm, Ngưỡng tăng kích thước là yếu tố quan trọng. Nó thực hiện điều chỉnh lần thứ hai cho kích thước mũi khoan đã được bù đắp. Nó quyết định liệu có “tăng kích thước” hay “giữ nguyên”. Việc thay đổi ngưỡng này sẽ trực tiếp thay đổi kích thước mũi khoan đã chọn.

Ví dụ thêm (bước khoan = 50 µm):

Lỗ ban đầu Bồi thường Sau khi hoàn thành. Số nguyên Phần còn lại Ngưỡng tăng cường Khoan
1,022 mm 0.1 1,122 mm 1.10 0,022 mm 0.02 1,15 mm
1,022 mm 0.1 1,122 mm 1.10 0,022 mm 0.025 1,10 mm

Quan điểm cá nhân về việc thiết lập ngưỡng tăng bước

Ưu điểm và nhược điểm: Sau khi bù trừ, nếu lỗ cuối cùng hơi lớn hơn, ít nhất bộ phận có thể được lắp vào. Nếu lỗ quá nhỏ, bộ phận không thể được lắp vào. Vì vậy, chúng ta thường đặt ngưỡng tăng bước lên là 20 µm thay vì 25 micromet. Lựa chọn chính xác phải phù hợp với từng quy trình và giá trị bồi thường.

Kết hợp với giá trị bồi thường: Đối với các bo mạch có HASL nơi cần bù đắp 0,15 mm, Bạn đã “bù đắp quá mức” một chút và các lỗ cuối cùng thường có kích thước hơi lớn. Trong trường hợp đó, ngưỡng tăng dần là 25 micromet Cũng có thể sử dụng. Sử dụng quy tắc “gần nhất” khi chọn mũi khoan.


3. Làm thế nào để đảm bảo kích thước lỗ cuối cùng đáp ứng yêu cầu sau khi bù trừ?

Phương pháp 1: Mua mũi khoan chuyên dụng

Bước tăng tiêu chuẩn của mũi khoan là 50 µm (Bước 0,05 mm như 1,00, 1,05, 1,10, 1,15 mm). Với độ dung sai PTH là ±3 mil, bộ mũi khoan 50 µm có thể đáp ứng độ dung sai này. Nếu độ dung sai nhỏ hơn, hãy sử dụng mũi khoan đặc biệt.

Ví dụ 1 — So sánh khoảng cách 50 µm so với 25 µm:
Lỗ ban đầu = 0,922 mm, bồi thường = 0,10 mm, Kích thước bù đắp = 1,022 mm.

Bản gốc Bồi thường Được bồi thường Tăng Máy khoan được chọn
0.922 0.10 1.022 0,05 (50 µm) 1.05
0.922 0.10 1.022 0,025 (25 µm) 1.025

Sự chênh lệch: 1.050 − 1.022 = 0.028 mm; 1.025 − 1.022 = 0.003 mm. Sự chênh lệch nhỏ hơn là tốt hơn, vì vậy 1,025 mm (tăng 25 µm) là tốt hơn.

Ví dụ 2 — 50 µm so với mũi khoan đặc biệt:
Lỗ ban đầu = 0,611 mm, bồi thường = 0,10 mm, được bồi thường = 0,711 mm.

Bản gốc Bồi thường Được bồi thường Tăng / Loại Máy khoan được chọn
0.611 0.10 0.711 0,05 (50 µm) 0.70
0.611 0.10 0.711 Bài tập đặc biệt 0.711

Sự chênh lệch: 0.700 − 0.711 = −0.011 mm; 0.711 − 0.711 = 0.000 mm. Sự chênh lệch nhỏ hơn là tốt hơn. Vì vậy, Mũi khoan đặc biệt 0,711 mm là tốt nhất.

Phương pháp 2: Nâng cao quy trình và thiết bị

  • Thêm một bước mạ bảng thứ hai để giảm độ dày không đều do phân bố mẫu.

  • Sử dụng phương pháp khắc trực tiếp bằng ảnh âm và mạ toàn bộ bảng mạch để giảm độ dày đồng không đều.

  • Giảm mật độ dòng điện (thông thường là 19 ASF); việc giảm nhẹ mật độ dòng điện có thể cải thiện độ đồng đều của quá trình mạ nhưng sẽ kéo dài thời gian mạ.

  • Nâng cấp lên dây chuyền mạ ngang. Dây chuyền mạ dọc thường tạo ra lớp đồng dày hơn ở viền lỗ và mỏng hơn ở trung tâm lỗ đối với các lỗ có tỷ lệ khía cạnh cao. Dây chuyền mạ ngang có thể giảm thiểu vấn đề đó.

Phương pháp 3: Nâng cao chiến lược CAM

  • Đối với các lỗ trên các vùng đồng cách ly, áp dụng thêm một mức bù. Các vùng cách ly có ít đồng hơn, do đó trong quá trình mạ, chúng có mật độ dòng điện cục bộ cao hơn và độ dày đồng lớn hơn; mức bù thêm sẽ bù đắp cho điều đó.

  • Đối với các thiết kế có đường mạch dày đặc ở một mặt và thưa thớt ở mặt kia (ví dụ: bảng mạch nguồn), hãy đặt mặt thưa thớt hướng vào trong và mặt dày đặc hướng ra ngoài, đồng thời sử dụng phương pháp chia bảng ngược. Trong quá trình mạ bảng, các khu vực gần mép bảng sẽ có mật độ dòng điện cao hơn và lớp mạ dày hơn. Phương pháp chia bảng ngược giúp cân bằng phân bố lớp mạ.

  • Khi diện tích đồng ở vùng TOP và BOTTOM chênh lệch lớn, hãy sử dụng tấm panel dương/âm (yin-yang). Diện tích đồng không đều gây ra các lỗ vias hình chuông; càng dày bảng mạch và càng nhiều đồng, hiệu ứng càng xấu; tấm panel yin-yang giúp cân bằng phân bố đồng.

  • Đối với các lỗ cách ly gần mép bảng mạch hoặc khe, hãy thêm các vùng đồng “pick-up” hoặc các pad đồng gần mép hoặc khe. Các lỗ cách ly có thể có độ dày mạ quá lớn và trở nên quá nhỏ; việc thêm đồng gần chúng giúp giảm mật độ dòng điện cục bộ và cân bằng quá trình mạ.


4. Cần bao nhiêu tiền bồi thường và cách tính toán như thế nào?

Giá trị bồi thường được xác định thông qua các thử nghiệm quy trình. Dưới đây là một bộ dữ liệu về sự thay đổi kích thước lỗ sau các bước khác nhau (dữ liệu từ báo cáo):

Quy trình: Khoan cơ khí → Mạ đồng ngâm → Mạ điện → Chuyển mẫu → Ăn mòn → Kiểm tra bằng máy AOI → Phim ướt → HASL

Thông số quy trình:

  • Mũi khoan: kích thước mũi khoan 0,95 mm, mài lại/mài lại 3 lần, bù trừ khoan 0,15 mm;

  • Plating: copper thickness ≥ 18 µm, average ≥ 20 µm;

  • HASL: final hole requirement 0.80 mm, tolerance ±0.08 mm (3 mil);

  • Test: 10 panels, corner trimmed, board thickness 2.0 mm.

Hole size changes by step

1) After drilling — hole sizes measured

  • Total 1920 holes tested (10 panels, 384 holes each). Sample: 200 holes (20 per panel). Hole range: 0.93–0.94 mm, average 0.931 mm.
    (Then a long list of sampled values, mostly 0.93 or 0.94.)

2) After patterned plating — copper thickness

  • For each panel, test 10 holes. Copper thickness range 18–31 µm, meeting ≥18 µm and average ≥20 µm.
    (Then many sample copper thickness values.)

3) After patterned plating — hole size

  • Total 1920 holes, sample 200. Hole range: 0.84–0.88 mm, average 0.858 mm.
    (Then many sample values, mostly 0.85–0.88.)

4) After HASL — hole size

  • Total 1920 holes, sample 200. Hole range: 0.82–0.86 mm, average 0.836 mm.
    (Then many sample values.)

Test summary

Step Hole range Average hole
After drilling 0.93–0.94 mm 0.931 mm
After copper plating 0.84–0.88 mm 0.858 mm
After HASL 0.82–0.86 mm 0.836 mm

Conclusion: For HASL boards the drill compensation of 0,15 mm is an “over-compensation” and causes final holes to be larger. The best compensation value in this test is 0.125 mm.


5. Drill compensation code implementation (rules)

  1. Compensation and step-up rules

Aspect Finished hole Bề mặt hoàn thiện Board thickness Ngưỡng tăng cường If via copper < 26 µm 26–37 µm 37–47 µm 47–67 µm 67–86 µm
thickness ratio < 12:1 ≤ 1.90 mm HASL (leaded or lead-free) ≥ 3.5 mm 0.01952 5 mil 6 mil 7 mil 8 mil 9 mil
thickness ratio < 12:1 ≤ 1.90 mm HASL (leaded or lead-free) < 3.5 mm 0.01952 4.5 mil 5.5 mil 6.5 mil 7.5 mil 8.5 mil
thickness ratio < 12:1 ≤ 1.90 mm Other finishes / 0.01952 4 mil 5 mil 6 mil 7 mil 8 mil
thickness ratio < 12:1 > 1.90 mm HASL / 0.0246 5.5 mil 6.5 mil 7.5 mil 8.5 mil 9.5 mil
thickness ratio < 12:1 > 1.90 mm Other finishes / 0.01952 4.5 mil 5.5 mil 6.5 mil 7.5 mil 8.5 mil
thickness ratio ≥ 12:1 all holes HASL / 0.0246 5.5 mil 6.5 mil 7.5 mil 8.5 mil 9.5 mil
thickness ratio ≥ 12:1 all holes Other finishes / 0.01952 5 mil 6 mil 7 mil 8 mil 9 mil
  1. Special drill sizes (if tolerance < 3 mil, use special drills or 25 µm increment, use nearest drill rule)

				
					List<double> ContainDrillToolList = new List<double>();
ContainDrillToolList.AddRange(new double[] { 610, 635, 711, 838, 914, 1016, 1320, 3120 });
				
			

3. Drill Compensation Code

				
					///<summary>
/// Calculate the drill bit diameter based on drill compensation parameters
///</summary>
///<param name="ToolInfo">Drill tool basic information</param>
///<param name="UpParam">Drill compensation parameters</param>
///<param name="ContainDrillToolList">Special drill bit diameter list</param>
///<returns>Return 1 if calculation is successful</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, 0);
    ToolInfo.min_tol = Math.Round(UpParamHole.Min_Tol, 0);
    if (ToolInfo.finish_size < 50)
    {
        ToolInfo.finish_size = ToolInfo.drill_size;
    }
    double DrillSlotLevel = (ToolInfo.shape == "slot") ? UpParam.SlotLevel : UpParam.DrillLevel;  //Drill step interval: Round holes have two levels (25/50μm), slot holes have one level (50μm)
    double UpLevel;
    if (UpParam.DrillLevel > 49) //When the step interval is 50μm, do not use special drill bits
    {
        ContainDrillToolList = new List<double>();
        UpLevel = UpParamHole.UpLevel;
    }
    else
    {
        UpLevel = UpParam.DrillLevel * 0.5;   //Select drill bit by half of the step interval
    }

    double Drillfinish_size = ToolInfo.finish_size + (ToolInfo.max_tol - ToolInfo.min_tol) * 0.5;  //Average the upper and lower tolerance
    int DrillLevelCount = (int)(Math.Floor((Drillfinish_size + UpParamHole.UpVal) / DrillSlotLevel)); //Drill step count
    double DrillsizeInt = DrillLevelCount * DrillSlotLevel; //Round down to the nearest drill step
    double DrillsizeFloat = (Drillfinish_size + UpParamHole.UpVal) % DrillSlotLevel;//Remainder of drill size after step division
    double DrillsizeLevel = (DrillsizeFloat > UpLevel) ? DrillSlotLevel : 0;//Determine whether to round up the remainder

    //Check if special drill bits are included
    int ContainDrillIndex = ContainDrillToolList.FindIndex(tt => (int)(Math.Floor(tt / DrillSlotLevel)) == DrillLevelCount);
    if (ContainDrillIndex > -1)
    {
        double ContainDrillFloat = ContainDrillToolList[ContainDrillIndex] % DrillSlotLevel;//Remainder of special drill bit size after step division
        if (DrillsizeFloat > UpLevel) // e.g. 38 > 20
        {
            double diff1 = Math.Abs(DrillsizeFloat - DrillSlotLevel);   //e.g. 40-50
            double diff2 = Math.Abs(DrillsizeFloat - ContainDrillFloat);  //e.g. 40-38
            DrillsizeLevel = (diff1 < diff2) ? DrillSlotLevel : ContainDrillFloat;
        }
        else //if (ContainDrillFloat < UpLevel)
        {
            double diff1 = Math.Abs(DrillsizeFloat - 0);  //e.g. 12-0
            double diff2 = Math.Abs(DrillsizeFloat - ContainDrillFloat);  //e.g. 12-16
            DrillsizeLevel = (diff1 < diff2) ? 0 : ContainDrillFloat;
        }
    }
    ToolInfo.drill_size = DrillsizeInt + DrillsizeLevel;

    double DiffDrillSizeUp = ToolInfo.drill_size - ToolInfo.finish_size;
    if (ToolInfo.shape == "slot") // Slot length compensation
    {
        if (UpParam.isSlotUpLevel) //Whether to round the slot length to step interval
        {
            Drillfinish_size = ToolInfo.slot_len + (ToolInfo.max_tol - ToolInfo.min_tol) * 0.5;  //Average the upper and lower tolerance
            DrillLevelCount = (int)(Math.Floor((Drillfinish_size + UpParamHole.UpVal + UpParam.SlotLengthUp) / DrillSlotLevel)); // Drill step count
            DrillsizeInt = DrillLevelCount * DrillSlotLevel; //Round down to the nearest drill step (50μm)
            DrillsizeFloat = (Drillfinish_size + UpParamHole.UpVal + UpParam.SlotLengthUp) % DrillSlotLevel;//Remainder of slot length after step division
            DrillsizeLevel = (DrillsizeFloat > UpParamHole.UpLevel) ? DrillSlotLevel : 0;//Determine whether to round up the remainder
            ToolInfo.slot_len = DrillsizeInt + DrillsizeLevel;
        }
        else
        {
            DrillsizeInt = Math.Floor((ToolInfo.slot_len + DiffDrillSizeUp) / 10) * 10; // Round down to the nearest 10μm
            ToolInfo.slot_len = DrillsizeInt;
        }
        ToolInfo.drill_size += UpParam.SlotEndNumber;  // Add suffix number for slot drill bit segmentation
    }
    ToolInfo.bit = Math.Round((ToolInfo.drill_size * 0.001), 3).ToString();
    return 1;
}

public class gToolUpParam
{
    /// <summary>
    /// Compensation parameters for VIA holes (in μm)
    /// </summary>
    public gToolUpParamHole Via { get; set; } = new gToolUpParamHole();
    /// <summary>
    /// Compensation parameters for PTH (Plated Through Hole) (in μm)
    /// </summary>
    public gToolUpParamHole Pth { get; set; } = new gToolUpParamHole();
    /// <summary>
    /// Compensation parameters for NPTH (Non-Plated Through Hole) (in μm)
    /// </summary>
    public gToolUpParamHole Npth { get; set; } = new gToolUpParamHole();
    /// <summary>
    /// Step interval for round drill holes (in μm)
    /// </summary>
    public double DrillLevel { get; set; } = 50;
    /// <summary>
    /// Step interval for slot drill holes (in μm)
    /// </summary>
    public double SlotLevel { get; set; } = 50;
    /// <summary>
    /// Suffix number for slot drill bit segmentation
    /// </summary>
    public int SlotEndNumber { get; set; } = 0;
    /// <summary>
    /// Additional compensation value for slot length (in μm)
    /// </summary>
    public double SlotLengthUp { get; set; } = 0;
    /// <summary>
    /// Whether to round the slot length to step interval
    /// </summary>
    public bool isSlotUpLevel { get; set; } = false;
}

public class gToolUpParamHole
{
    /// <summary>
    /// Compensation value (in μm)
    /// </summary>
    public double UpVal { get; set; } = 100;
    /// <summary>
    /// Step interval threshold for rounding up (in μm)
    /// </summary>
    public double UpLevel { get; set; } = 25;
    /// <summary>
    /// Upper tolerance (in μm)
    /// </summary>
    public double Max_Tol { get; set; } = 76;
    /// <summary>
    /// Lower tolerance (in μm)
    /// </summary>
    public double Min_Tol { get; set; } = 76;
}

///<summary>
/// Mod_tool: Drill tool attribute model
///</summary>
public class Mod_tool
{
    public int num { get; set; }
    public string type { get; set; } // Hole type: via/plate(nplate)
    public string shape { get; set; } // Hole shape: round/slot
    public double finish_size { get; set; } // Finished hole size (in μm)
    public double drill_size { get; set; } // Drill bit size (in μm)
    public double max_tol { get; set; } // Upper tolerance (in μm)
    public double min_tol { get; set; } // Lower tolerance (in μm)
    public double slot_len { get; set; } // Slot length (in μm)
    public string bit { get; set; } // Drill bit size (in mm, formatted string)
}
				
			

6. Why does board thickness affect drill compensation?

I did not understand this at first either. The main reason is the high thickness-to-diameter ratio (board thickness divided by hole diameter). A high ratio makes the copper at the hole center thinner and the copper at the hole edge thicker. To compute the thickness-to-diameter ratio you need the board thickness value. So board thickness enters the drill compensation rules. For high thickness-to-diameter holes, the compensation is larger.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Lên đầu trang