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Ω电阻,应用层的逻辑大概是:

  1. 调用驱动层,设置万用表为电阻测量模式
  2. 通过开关矩阵,将万用表连接到被测电阻两端
  3. 读取测量值,比如9.98kΩ
  4. 与上下限(9.5kΩ ~ 10.5kΩ)比较
  5. 输出PASS,记录结果

这里有个细节:测试顺序很重要。我习惯先做开路/短路测试,再做元件测试。为什么?因为如果板子有短路,直接上电可能会烧东西。先测开路/短路,相当于给板子做个“体检”。

2.2.3 UI层——让操作员看得懂

UI层是操作员直接面对的部分。好的UI设计,能让操作员一眼就知道当前状态。

UI层通常包含:

  • 主界面:显示测试进度、PASS/FAIL统计
  • 测试项列表:显示每个测试项的名称、结果、测量值
  • 参数设置:允许工程师修改测试上下限、测试模式
  • 日志窗口:显示实时调试信息

我个人对UI设计有个原则:绿色代表正常,红色代表异常,黄色代表警告。操作员不需要懂技术,看到绿色就放心,看到红色就知道有问题。别搞什么花里胡哨的颜色,容易让人混淆。

2.3 系统架构总览图

说了这么多,咱们用一张图把整个系统架构串起来。下面是我用SVG画的结构图,展示了硬件和软件各层之间的关系:

ICT测试系统架构总览 软件架构 UI层 测试界面 · 状态显示 · 参数设置 应用层 测试流程 · 算法 · 数据判读 驱动层 设备控制 · SCPI指令 · 数据采集 硬件架构 开关矩阵 通道切换 · 信号路由 电源 多通道 · 可编程 · 高精度 万用表 电压 · 电阻 · 电流测量 示波器 波形分析 · 时序 被测板 (DUT) 测试点 · 元件 · 电路网络

从这张图可以看得很清楚:驱动层向下控制硬件,应用层在中间处理逻辑,UI层向上展示结果。硬件部分,开关矩阵是核心枢纽,连接着电源、万用表、示波器和被测板。

2.4 避坑指南

最后,分享几个我踩过的坑,希望能帮你少走弯路:

坑1:开关矩阵的寿命

机械继电器的寿命通常只有10万次左右。如果你的产线一天测1000块板,每块板切换100次,那继电器3个月就挂了。我建议:定期更换继电器,或者用固态继电器替代

坑2:电源的纹波

有些便宜的电源,空载时纹波很小,一带负载就原形毕露。我建议:选电源时,一定要看满载纹波指标。别问我怎么知道的,说多了都是泪。

坑3:驱动层的兼容性

不同品牌的万用表,SCPI指令可能不一样。比如Agilent用"MEAS:VOLT:DC?",Keithley用":MEAS:VOLT:DC?"。我建议:在驱动层做一层抽象,把设备差异封装起来。这样换设备时,只需要改驱动层,应用层和UI层不用动。

好了,关于ICT测试系统的硬件组成和软件架构,今天就聊到这里。记住一句话:硬件是基础,软件是灵魂,架构是骨架。把这三样搞明白了,ICT测试系统对你来说就没有秘密了。


公众号:蓝海资料掘金营,微信deep3321