2. 测试系统架构:ICT测试系统硬件组成与软件架构
大家好,我是老张。今天咱们聊聊ICT测试系统的骨架——系统架构。
很多人一上来就盯着测试程序怎么写,其实这是本末倒置。你想想看,硬件平台都没摸透,软件写得再好也是空中楼阁。我个人习惯是,拿到一个新项目,先花半天时间把系统架构图捋清楚。
2.1 硬件组成:四个核心模块
ICT测试系统的硬件,说白了就是四个大块:开关矩阵、电源、万用表、示波器。它们各司其职,缺一不可。
2.1.1 开关矩阵——系统的“交通枢纽”
开关矩阵是ICT系统里最容易被忽视,但也是最容易出问题的部分。
它的作用很简单:把测试资源(电源、万用表、示波器)切换到被测板的各个测试点上。你可以把它想象成一个巨大的继电器阵列,每个继电器控制一条通道的通断。
关键参数:
- 通道数:常见的有128、256、512通道,甚至更多
- 切换速度:机械继电器约5-10ms,固态继电器可达μs级
- 最大电流:通常2A-5A,大电流通道需要特殊设计
我在项目中遇到过一件事:某次量产测试,良率突然从98%掉到85%。排查了三天,最后发现是开关矩阵里一个继电器触点氧化了,接触电阻从50mΩ飙到了2Ω。嗯,从那以后,我每次做维护都会用万用表测一遍所有通道的接触电阻。
2.1.2 电源——系统的“心脏”
ICT测试用的电源和普通实验室电源不太一样。它需要具备以下特点:
- 多通道独立输出:至少4-8路,每路可独立设置电压电流
- 快速响应:负载变化时,电压恢复时间<100μs
- 高精度:电压精度0.1%+5mV,电流精度0.1%+1mA
- 可编程:支持SCPI指令远程控制
举个例子,测试一个3.3V的LDO输出,电源需要提供5V输入,同时还要能拉载100mA电流。如果电源纹波太大,测出来的电压值就不准。我建议选电源时,纹波指标至少要比被测器件的要求高一个数量级。
2.1.3 万用表——系统的“眼睛”
万用表在ICT系统里主要干三件事:测电压、测电阻、测电流。但这里有个坑——不是所有万用表都适合ICT。
为什么?因为ICT测试要求速度快。普通6位半万用表一次测量要100ms,但ICT系统要求单点测试时间<10ms。所以,ICT系统里用的都是高速数字化万用表,采样率至少100kS/s以上。
我的经验:
测小电阻(<1Ω)时,一定要用四线法(Kelvin连接)。我曾经吃过亏,用两线法测0.5Ω的电阻,结果测出来0.8Ω,白白浪费了两天排查时间。
2.1.4 示波器——系统的“放大镜”
示波器在ICT系统里不是标配,但遇到时序问题、信号完整性问题时,它就是救命稻草。
ICT系统里的示波器通常要求:
- 带宽:100MHz-500MHz
- 采样率:1GS/s以上
- 通道数:4通道
- 触发功能:支持边沿、脉宽、逻辑触发
我记得有一次,一个客户说他们的板子上电后偶尔不工作。用万用表测电压都正常,但用示波器一看,发现上电瞬间有个200mV的毛刺,刚好触发了复位芯片。这就是示波器的价值——看到万用表看不到的东西。
2.2 软件架构:三层结构
硬件搭好了,软件就是灵魂。ICT测试系统的软件架构,我习惯分成三层:驱动层、应用层、UI层。
为什么要分层?说白了就是解耦。驱动层只管和硬件打交道,应用层只管测试逻辑,UI层只管人机交互。哪一层出了问题,改哪一层,互不影响。
2.2.1 驱动层——和硬件“对话”
驱动层是软件的最底层,负责直接控制硬件设备。它通常包含:
- 设备初始化:打开设备、设置参数、自检
- 指令发送:通过GPIB、USB、LAN等接口发送SCPI指令
- 数据采集:读取测量结果,解析数据格式
- 错误处理:超时重试、异常恢复
这里我分享一个代码片段,演示如何通过VISA库控制万用表:
// 驱动层示例:控制万用表测量电压
#include <visa.h>
ViSession defaultRM, instr;
ViStatus status;
// 初始化VISA资源管理器
status = viOpenDefaultRM(&defaultRM);
if (status != VI_SUCCESS) {
printf("无法打开VISA资源管理器\n");
return -1;
}
// 打开万用表设备(假设地址为GPIB0::22::INSTR)
status = viOpen(defaultRM, "GPIB0::22::INSTR", VI_NULL, VI_NULL, &instr);
if (status != VI_SUCCESS) {
printf("无法打开万用表\n");
return -1;
}
// 发送SCPI指令:配置为直流电压测量,量程10V
viPrintf(instr, "CONF:VOLT:DC 10\n");
// 触发测量
viPrintf(instr, "READ?\n");
// 读取结果
char buffer[256];
viScanf(instr, "%t", buffer);
printf("测量结果:%s V\n", buffer);
// 关闭设备
viClose(instr);
viClose(defaultRM);
注意:驱动层代码一定要做超时处理。我曾经见过一个系统,万用表没接好,程序卡在viScanf那里整整5分钟,直到操作员手动重启。加个3秒超时,问题就解决了。
2.2.2 应用层——测试逻辑的核心
应用层是测试工程师最常打交道的地方。它负责:
- 测试流程管理:定义测试步骤、执行顺序
- 测试算法:开路/短路测试、元件值计算、边界扫描
- 数据判读:将测量值与上下限比较,给出PASS/FAIL
- 结果记录:生成测试报告,保存到数据库
举个例子,测试一个10kΩ电阻,应用层的逻辑大概是:
- 调用驱动层,设置万用表为电阻测量模式
- 通过开关矩阵,将万用表连接到被测电阻两端
- 读取测量值,比如9.98kΩ
- 与上下限(9.5kΩ ~ 10.5kΩ)比较
- 输出PASS,记录结果
这里有个细节:测试顺序很重要。我习惯先做开路/短路测试,再做元件测试。为什么?因为如果板子有短路,直接上电可能会烧东西。先测开路/短路,相当于给板子做个“体检”。
2.2.3 UI层——让操作员看得懂
UI层是操作员直接面对的部分。好的UI设计,能让操作员一眼就知道当前状态。
UI层通常包含:
- 主界面:显示测试进度、PASS/FAIL统计
- 测试项列表:显示每个测试项的名称、结果、测量值
- 参数设置:允许工程师修改测试上下限、测试模式
- 日志窗口:显示实时调试信息
我个人对UI设计有个原则:绿色代表正常,红色代表异常,黄色代表警告。操作员不需要懂技术,看到绿色就放心,看到红色就知道有问题。别搞什么花里胡哨的颜色,容易让人混淆。
2.3 系统架构总览图
说了这么多,咱们用一张图把整个系统架构串起来。下面是我用SVG画的结构图,展示了硬件和软件各层之间的关系:
从这张图可以看得很清楚:驱动层向下控制硬件,应用层在中间处理逻辑,UI层向上展示结果。硬件部分,开关矩阵是核心枢纽,连接着电源、万用表、示波器和被测板。
2.4 避坑指南
最后,分享几个我踩过的坑,希望能帮你少走弯路:
坑1:开关矩阵的寿命
机械继电器的寿命通常只有10万次左右。如果你的产线一天测1000块板,每块板切换100次,那继电器3个月就挂了。我建议:定期更换继电器,或者用固态继电器替代。
坑2:电源的纹波
有些便宜的电源,空载时纹波很小,一带负载就原形毕露。我建议:选电源时,一定要看满载纹波指标。别问我怎么知道的,说多了都是泪。
坑3:驱动层的兼容性
不同品牌的万用表,SCPI指令可能不一样。比如Agilent用"MEAS:VOLT:DC?",Keithley用":MEAS:VOLT:DC?"。我建议:在驱动层做一层抽象,把设备差异封装起来。这样换设备时,只需要改驱动层,应用层和UI层不用动。
好了,关于ICT测试系统的硬件组成和软件架构,今天就聊到这里。记住一句话:硬件是基础,软件是灵魂,架构是骨架。把这三样搞明白了,ICT测试系统对你来说就没有秘密了。
公众号:蓝海资料掘金营,微信deep3321