Skip to content

PCB板检测电阻有无

工程背景

测量背景

随着电子制造业的发展,电子产品趋于多功能化、智能化和小型化。而PCB板上元器件作为电子产品中的重要精密部件,其质量直接影响了产品的性能。因此,质量的把控变得尤为重要。

本地图片

相机选型

Hypersen-DBL

测量项

检测PCB板上贴片是否安装到位,同时检测指定区域电阻是否存在漏焊。

检测要求

测量精度 ≤ 0.01mm 测量重复性 ≤ 0.01mm 测量周期 ≤ 1s

解决方案

使用AI-Vision软件,首先拟合基准平面并调整将其作为零平面,然后通过贴片与电池表面的平面度检测是否装贴完毕,然后通过斑点工具,查找指定区域的电阻个数,通过检测到的实际个数与标准个数进行对比判断。运行速度快,精度高,同时流程简单,模块化,方便搭建。

设计思路

本地图片

执行效果展示

  • 工程结果展示

    • 高度结果:

      本地图片

    • 直径结果:

      本地图片

项目流程

一、初始化

[00] 使用Lua脚本工具,生成用于保存电阻有无判断结果的全局变量“ResultPlane1”、“ResultPlane2”;生成保存数据的csv文件“Plane”、“Resistance”、“Battery”。

lua

-- 设置用于判断电阻有无的全局变量

SetVariable("ResultPlane1",true)
SetVariable("ResultPlane2",true)

-- 生成保存数据的csv文件

write = ""

--判断该文件是否存在,若不存在生成该文件,若存在跳过生成。
if FileSize("./Plane.csv") <=0 then
   write = write .. "Time," 
   for i =1,5,1 do
       write = write .. "Plane" .. i .. "," .. "OK/NG" .. ","
   end
   write = write .. "ResultAll" .. "\n"
end
write = write .. os.date("%Y_%m_%d %H:%M:%S") .. ","
fprint("./Plane.csv" , write)

write = ""

--判断该文件是否存在,若不存在生成该文件,若存在跳过生成。
if FileSize("./Resistance.csv") <=0 then
   write = write .. "Time," 
   for i =1,2,1 do
       write = write .. "ResultPlane1" .. i .. "," 
   end
   write = write .. "\n"
end
write = write .. os.date("%Y_%m_%d %H:%M:%S") .. ","
fprint("./Resistance.csv" , write)

write = ""

--判断该文件是否存在,若不存在生成该文件,若存在跳过生成。
if FileSize("./Battery.csv") <=0 then
   write = write .. "Time," .. "Battery," .. "OK/NG" .. "\n"
end
write = write .. os.date("%Y_%m_%d %H:%M:%S") .. ","
fprint("./Battery.csv" , write)

[01] 使用加载点云工具,加载点云。

本地图片

二、初定位

[02-05] 使用3D方形探针工具3D几何交点工具输出BGA板左上侧顶点坐标并推送至寄存器中;同时使用3D位置调整工具,以该点作为新原点,调整X轴Y轴的位置。

本地图片

[06-07] 使用3D区域工具3D平面工具选择区域并拟合零平面,同时调整Z轴位置。

本地图片

[08] 使用3D裁切工具,将BGA球截取至IM2中,便于后续处理。

三、贴片是否安装到位

[09-13] 连续五次使用3D平面度工具,分别测量五块贴片的平面度。(3D平面度工具中选择的区域为客户要求制定的区域,在实际项目应用中,需要根据实际情况进行修改)

本地图片

本地图片

本地图片

本地图片

本地图片

[14] 使用Lua脚本工具,将测量得出的贴片平面度与标准值进行对比,进行结果判断,同时将结果显示在IM上。

lua

-- 设置一个Bool类型的变量Judge用于判断结果
Judge = true

write = ""

-- 循环判断
for i = 4 , 0 , -1 do
   Result = GetMeasure(i)
   if Result > 0.05 then
       write = write .. string.format("%.3f,",Result) .. "NG" .. ","
       -- 当结果不满足条件时,将Judge的值修改为false
       Judge = false
   else
       write = write .. string.format("%.3f,",Result) .. "OK" .. ","
   end
end

-- 进行结果判断后将结果显示在IM上
if Judge == true then
   write = write .. "OK" .. "\n"
   DrawOverlay(2,-33,30,3,24,"green","贴片贴合完毕")
else
   write = write .. "NG" .. "\n"
   DrawOverlay(2,-33,30,3,24,"red","贴片未贴合完毕")
end

-- 将结果保存在csv文件中
fprint("./Plane.csv",write)

四、电池是否安装到位

[15] 使用3D平面度工具,测量电池的平面度。(3D平面度工具中选择的区域为客户要求制定的区域,在实际项目应用中,需要根据实际情况进行修改)

本地图片

[16] 使用Lua脚本工具,将测量得出的电池平面度与标准值进行对比,进行结果判断,同时将结果显示在IM上。

lua

-- 设置一个Bool类型的变量Judge用于判断结果
Judge = true

write = ""

-- 读取测量的电池平面度的值
Result = GetMeasure(0)

if Result > 0.05 then
    write = write .. string.format("%.3f,",Result) .. "NG" .. "\n"
    Judge = false
    -- 进行结果判断后将结果显示在IM上
    DrawOverlay(2,-50,20,3,24,"red","电池未贴合完毕")
else
    write = write .. string.format("%.3f,",Result) .. "OK" .. "\n"
    DrawOverlay(2,-50,20,3,24,"green","电池贴合完毕")
end

-- 将结果保存在csv文件中
fprint("./Battery.csv",write)

五、区域1电阻有无

[17] 使用3D裁切工具,将指定检测电阻有无的区域裁切至IM3中,便于后续测量。

本地图片

[18] 使用3D斑点工具,根据点数输出电阻位置与个数。

本地图片

[19] 使用Lua脚本工具,通过对当前检测电阻数量进行判断,同时将结果显示在IM上。

lua

-- 设置一个Bool类型的变量Judge用于判断结果
Judge = true

for i = 0,13,1 do
    a,b,c = GetPoint(i)
    if a == nil then
        Judge = false
    end
end

SetVariable("ResultPlane1",Judge)

a,b,c = GetPoint(0)

-- 进行结果判断后将结果显示在IM上
if Judge == true then

    DrawOverlay(2,a,b,3,24,"green","电阻无漏焊")
else
    DrawOverlay(2,a,b,3,24,"red","电阻有漏焊")
end

六、区域2电阻有无

[20] 使用3D裁切工具,将指定检测电阻有无的区域裁切至IM4中,便于后续测量。

本地图片

[21] 使用3D斑点工具,根据点数输出电阻位置与个数。

本地图片

[22] 使用Lua脚本工具,通过对当前检测电阻数量进行判断,同时将结果显示在IM上。

lua

-- 设置一个Bool类型的变量Judge用于判断结果
Judge = true

for i = 0,13,1 do
    a,b,c = GetPoint(i)
    if a == nil then
        Judge = false
    end
end

SetVariable("ResultPlane2",Judge)

a,b,c = GetPoint(0)

-- 进行结果判断后将结果显示在IM上
if Judge == true then
    DrawOverlay(2,a,b,3,24,"green","电阻无漏焊")
else
    DrawOverlay(2,a,b,3,24,"red","电阻有漏焊")
end

[23] 使用Lua脚本工具,保存电阻是否有漏焊的结果至csv文件中。

lua

ResultPlane1 = GetVariable("ResultPlane1")
ResultPlane2 = GetVariable("ResultPlane2")
write = ""

if ResultPlane1 == true then
    if ResultPlane2 == true then
        write = write .. "OK" .. "," .."OK" .."\n"
    else
        write = write .. "OK" .. "," .."NG" .."\n"
    end
elseif ResultPlane1 == false then
    if ResultPlane2 == true then
        write = write .. "NG" .. "," .."OK" .."\n"
    else
        write = write .. "NG" .. "," .."NG" .."\n"
    end
end

fprint("./Resistance.csv",write)

AI-Vision,让3D测量更简单