首页 / 资讯中心 / 文章详情

搭建电子测试自动化平台:从仪器选型到SCPI控制与数据采集实战

搭建电子测试自动化平台:从仪器选型到SCPI控制与数据采集实战 ★ FEATURED ARTICLE
上周我在调一块电源板示波器、台式万用表、电子负载三台仪器摆在桌上各自为战示波器只看波形、万用表测电压、负载给电流数据全靠手动抄进Excel调了一个参数就得重新测一轮半天时间全耗在重复劳动上。那天晚上我就在想如果把所有仪器用一个统一的平台管理起来让测试流程自动化、数据自动落盘、报告自动生成是不是就不用再做“人肉数据库”了。这个想法最后落地成了我们团队内部的HNU电子测试工具与平台项目这篇就当整个项目经验的引言部分把我从选型、搭软件、接仪器、采数据到跑完整测试流程踩过的坑和想明白的事一次性讲清楚。这套东西适合谁看硬件工程师、测试工程师、实验室管理员以及所有准备搭自动化测试环境但不知道从哪下手的人。我没打算写得像教科书就是实打实地聊聊我怎么做、为什么这么做以及哪些地方是文档里不会写的经验。1. 从散装仪器到平台化测试我们到底在解决什么问题1.1 散装测试的三个痛点先说痛点。很多实验室的测试现状是仪器买得不少但每台都是信息孤岛。我在上一家公司做个简单的高低温和负载测试一台直流电源、一台电子负载、一台记录仪要同时记录电压、电流、温度三个参数。结果呢电源屏显一个值负载屏显一个值记录仪导出一份CSV三个数据源时间戳还对不齐最后只能手动画曲线硬凑。第一个痛点是数据割裂。单台仪器只能看到它自己那一个维度跨仪器的关联分析基本靠人肉。第二个痛点是重复劳动。测试流程稍微变动比如把负载从1A调到2A所有测量都要重新来一遍没人告诉你哪些数据能复用。第三个痛点是复现困难。仪器参数都是手动拨的过两周再测没人记得清当时具体设了什么更别说别人来复现你的结果。这些痛点在单次测量中不明显但一旦你开始做批次测试、环境试验、来料检验效率差距就出来了。HNU平台最初要解决的核心问题就是把“测量”从“手动看屏”变成“自动采集”把“仪器”从“孤岛”变成“节点”把“数据”从“Excel手工表”变成“结构化存储的测试资产”。1.2 平台化测试的四个核心模块我后来把平台拆成四个模块这个划分很重要因为直接决定了代码怎么写、仪器怎么接。第一个模块是仪器层就是物理设备本身直流电源、电子负载、示波器、万用表、信号源、数据采集卡DAQ。第二个是通信层负责让电脑和仪器对话常见方式有GPIB、USB、LANLXI、RS-232或者直接用仪器的VXI-11、SCPI over TCP。第三个是软件控制层这一层才是平台的大脑负责下发指令、读取数据、控制流程。第四个是数据与应用层做数据存储、波形分析、报告生成和可视化。四层结构不是拍脑袋想出来的是从一次简单自动化测量里自然长出来的。刚开始我只想写个Python脚本控制电源和万用表后来发现要处理设备枚举、超时重试、数据格式解析再后来又发现测试流程要参数化、报告要模板化层就慢慢分出来了。1.3 什么时候该上平台什么时候不需要这里必须泼一盆冷水。不是所有测试场景都值得搭平台。如果你只是偶尔量一个电压、看一个波形直接用手动挡没问题搭平台反而浪费时间。我的判断标准有几个被测对象是否会反复测多轮有没有多台仪器协同的需求数据要不要追溯和对比测试项将来会不会变成重复性工作如果四问里有三问是“是”那就值得投入。如果全是否老老实实拿手持万用表就挺好。HNU平台上马前我们也做了这个判断。团队当时正好有批DC-DC电源模块需要做全参数测试几十片板子、每片十几项指标手动测一片要两小时平台化之后单片压到二十分钟以内这个ROI算下来很值项目才真正立项。2. 测试仪器的选型逻辑先把需求翻译成参数2.1 需求拆解被测对象和测量目标很多人选仪器是先看预算、再看品牌最后才想测什么这个顺序其实反了。正确的路径是先用一句话说清被测对象是电压信号还是电流信号是直流还是交流频率多高幅度多大需要同时测多少通道这些答案直接决定你需要的核心指标。以最常见的“测一块电源板的输出电压纹波”为例目标是mV级交流分量频率范围通常在20MHz以内幅度很小。于是你需要示波器至少60MHz带宽、不低于250MSa/s采样率探头要能测得动mV级信号最好用同轴电缆或差分探头而不是普通夹子。这些需求翻译成参数选型表就出来了。2.2 常用仪器的关键指标与避坑参数我按试验中最常用的几类仪器列了张表标出重点看的参数和容易踩的坑仪器类型关键指标容易忽视的坑台式万用表位数6位半起步、基本精度、采样速率采样率远低于示波器测快速变化信号会失真示波器带宽、采样率、存储深度、通道数存储深度不足时高采样率只能维持极短时间窗直流电源输出精度、纹波噪声、编程分辨率负载调整率差的电源大电流下电压会掉电子负载工作模式CC/CV/CR/CP、最小导通电压低压大电流下可能无法正常拉载信号源带宽、波形内存、相位噪声只看最大频率忽略波形重建率DAQ采集卡通道数、ADC位数、最大采样率、量程输入范围与传感器不匹配需外接调理电路拿示波器存储深度举个例子。很多初学的朋友只看带宽买了100MHz示波器结果想看一段完整的上电时序波形采样率一高存储深度不够波形窗只能维持几十微秒根本抓不到完整的启动过程。这就是典型的需求没翻译到位。存储深度最好不低于1Mpts能上10Mpts更好。2.3 接口协议选型GPIB/USB/LAN不该拍脑袋定仪器的通信接口直接影响后续自动化开发的难度。我把几个常用接口的脾气讲一下。GPIB是老牌标准仪器端八字脚、电脑端基本要配转接卡或USB-GPIB适配器。它的优点是稳定、时延确定缺点是线缆贵、速率一般新仪器已经越来越少自带GPIB了。USB接口现在最普遍但有个坑驱动兼容性。很多仪器在Windows下插上就认Linux下就得装私有驱动或走usbtmc内核模块稍有不慎就掉线。我做HNU平台时吃过这个亏一台进口示波器用USB连接跑长测试中途断连后来换成LAN才消停。LANLXI接口是最推荐的自动化首选。现代仪器几乎都带网口支持SCPI over TCPPython里用pyvisa一接一个准没有驱动地狱。如果条件允许新购仪器优先选带LAN口的省下的时间比多花的预算值多了。RS-232在老旧仪器上还在用控制低速仪表如老款温箱时够用但波特率、流控都要仔细配串口竞争也是麻烦事。2.4 关于预算、二手仪器与校准的实话预算有限的团队没必要全上新设备。二手市场里靠谱的商科仪器比如若干年前的安捷伦、泰克中端机只要校准证书健全完全可以胜任平台主力。我自己就淘过一台二手台式万用表用了两年状态依然稳定。但有两个地方不能省一是探头和线缆二手探头往往老化严重噪声特性已经劣化换新探头是值得的二是校准仪器一旦接手送计量院校准一遍是必须的否则平台测出来的数据没人敢信。校准周期我一般定一年一次关键设备半年一次。3. 软件层是整个平台的灵魂分层架构与SCPI通信3.1 仪器通信的基石VISA与SCPI仪器通信这件事听起来玄拆开了就两个概念VISA和SCPI。VISAVirtual Instrument Software Architecture是仪器通信的统一API层你可以把它理解成仪器世界里的“插座标准”。不管仪器背后是USB、GPIB还是LANVISA把底层差异封装掉应用程序只跟VISA打交道。Python里最常用的库是PyVISA它背后还需要厂商提供的VISA实现最典型的是NI-VISA和Keysight VISA。Windows下装好厂商驱动再装PyVISA基本就通了。SCPIStandard Commands for Programmable Instruments是仪器的“命令语言标准”。比如你要让万用表测一个直流电压发送MEAS:VOLT:DC?它会返回类似3.3000E00的字符串。SCPI命令树有清晰的层级MEAS是测量子系统VOLT是电压DC是直流?表示查询。记命令不需要死记硬背绝大多数仪器都支持*IDN?命令查询身份你可以先发这个确认通信正常。3.2 平台软件的四层结构我写了这么多年的自动化脚本最深刻的体会是别把所有代码堆在一个文件里平台软件一定要分层。HNU平台的软件结构大致长这样第一层设备抽象层。每类仪器封装成一个Python类对外暴露统一的接口。比如电源类都有set_voltage()和set_current()示波器类都有get_waveform()但内部实现各调各的SCPI命令。这样做的好处是换一台电源只需要改类内部的命令测试流程代码一行都不用动。第二层流程控制层。负责编排测试流程比如“上电-等待-加载-测量-记录-断电”。这层只跟设备抽象层打交道不碰具体指令。用简单的状态机或者顺序执行就行。第三层数据管理层。所有测量结果统一收口写入数据库或文件附带时间戳、仪器ID、测试参数等元信息。这层做得好以后追溯数据不用翻聊天记录。第四层报告与可视化层。从数据管理层拉数据生成PDF或HTML报告绘制曲线。需求简单时这层可以很薄但必须有因为报告是测试项目的最终交付物。3.3 一段能跑通的Python控制代码很多人卡在第一步不知道怎么连上仪器。我贴一段实测可用的最小示例至少能帮你把电源和万用表同时控制起来import pyvisa # 建立VISA资源管理器 rm pyvisa.ResourceManager(py) print(rm.list_resources()) # 列出所有可用仪器地址 # 连接电源假设LAN地址是192.168.1.100 psu rm.open_resource(TCPIP0::192.168.1.100::INSTR) psu.timeout 3000 # 毫秒 print(psu.query(*IDN?)) # 查询仪器身份验证通信 # 连接万用表假设USB地址是USB0::0x2A8D::... dmm rm.open_resource(USB0::0x2A8D::0x1301::MY59001234::INSTR) dmm.timeout 3000 print(dmm.query(*IDN?)) # 设置电源输出5V限流0.5A psu.write(APPL 5,0.5) psu.write(OUTP ON) # 读取万用表直流电压 voltage float(dmm.query(MEAS:VOLT:DC?)) print(fMeasured voltage: {voltage:.6f} V) # 关掉电源输出 psu.write(OUTP OFF)这段代码有几点值得说明。list_resources()必不可少很多朋友在open_resource时地址写错其实先列一下资源再复制地址是最稳妥的。timeout一定要设默认的几秒可能不够有些仪器响应但设太长也会让脚本卡在故障设备上。query()是“发送命令读取回复”的组合操作比先write()再read()更不容易出状态错乱。3.4 配置、日志与数据存储的规范平台跑起来之后配置管理比代码逻辑更容易让人崩溃。我踩过的坑是测试参数硬编码在脚本里换一个项目就得改源码改完又忘了改的是哪份。后来自查了很多开源项目的做法决定用YAML做配置测试流程完全参数化。# test_config.yaml device: psu_address: TCPIP0::192.168.1.100::INSTR dmm_address: USB0::0x2A8D::0x1301::MY59001234::INSTR test_params: output_voltage: 5.0 load_current: 1.0 settle_time_ms: 500 measurement_samples: 10日志方面库选用内置的logging按时间滚动文件每个任务一个日志ID。别觉得麻烦平台跑起来后大部分排障靠的就是日志。数据存储我用了两种结构化指标存SQLite原始波形存CSV或numpy的.npy。SQLite轻量、单文件、查询方便对测试平台这种单机规模的应用完全够用没必要上MySQL这种重型方案。4. 数据采集与信号分析最容易翻车的几个环节4.1 采样率、带宽与存储深度的关系硬件平台搭好了软件能通信了大部分人以为这就完了其实这才到测试数据质量的深水区。先讲采样率、带宽、存储深度这组关系。奈奎斯特采样定理说采样率至少是信号最高频率的两倍但在工程实践中两倍只是理论底线。我用示波器测信号通常要求采样率是信号频率的5到10倍才能保证波形轮廓可读。比如测一个10MHz的时钟信号采样率至少50MSa/s100MSa/s以上才看得舒服。示波器带宽决定了前端模拟通道能通过的最高频率。带宽不够信号幅度会被衰减波形边缘变圆。测量高频纹波时尤其明显一个50MHz带宽的示波器去测20MHz纹波读数值已经不可信了。经验法则信号最高频率约等于所需带宽的三分之一到五分之一。存储深度则是个反直觉的参数。高采样率和长时间窗口是矛盾的存储深度采样率×采集时长。如果你的示波器存储深度只有1Mpts在1GSa/s采样率下只能采1ms的波形想抓一个几十毫秒的上电时序就必须降采样率而降采样率又会让细节丢失。这也是为什么现在买示波器我优先看存储深度而不是只看带宽。4.2 一个纹波测量的完整纠错案例下面分享一个我实际踩过的坑这个案例后来被我写进了团队的新人培训文档。当时要测一块12V转3.3V电源板的输出纹波我用普通示波器探头直接夹在输出电容两端出来的波形惨不忍睹几十毫伏的纹波里夹杂着几百毫伏的高频毛刺怎么调都消不掉。我以为是电源板设计问题折腾了半天想改善环路后来才意识到是测量方法错了。问题出在几个叠加因素上普通探头的地线夹子形成了一根“地线天线”在开关电源的强电场下拾取了大量共模噪声探头衰减和电容效应又影响了高频分量的还原。正确做法是把探头换成同轴电缆或者使用短地弹簧探头示波器设置成AC耦合滤掉直流偏置打开20MHz带宽限制把高频噪声排除在测量带宽之外测量点选在输出电容两端尽量靠近负载端。改完之后波形立刻干净了纹波读数从几百毫伏降到三十几毫伏这才是真实值。这个案例的教训是测试平台再自动化测量链路的物理连接不到位采进来的数据就是垃圾。自动化只是让数据采集变快不代表数据质量自动变高。4.3 数据处理流水线从原始波形到指标报告原始波形拿到手下一步是把波形变成指标。纹波测量要算峰峰值、有效值上电时序要算上升时间、过冲、建立时间。这些计算不能靠肉眼在示波器屏幕上估平台里要用代码统一算。我习惯的处理流水线是先用Python的numpy读入CSV或二进制波形做必要的滤波比如滑动平均或数字带通滤波但要注意滤波本身会改变波形特征通常只在明确知道噪声频段时才用然后用scipy.signal找波形的关键点位置比如10%到90%的上升沿再计算目标指标最后连同原始波形的缩略图一起写入报告数据。import numpy as np from scipy.signal import find_peaks # 假设data是采集到的波形数组sample_rate是采样率 data np.loadtxt(waveform.csv) sample_rate 250e6 # 计算峰峰值 vpp np.ptp(data) # 计算有效值去除直流分量后 ac_rms np.sqrt(np.mean((data - np.mean(data)) ** 2)) # 找出峰值位置用于时序分析 peaks, _ find_peaks(data, heightnp.mean(data) * 1.1)这段代码看着简单但实际项目里数据量大、格式乱预处理往往占掉六成工时。我建议把“加载不同格式数据”统一封装成函数比如load_scope_csv()、load_daq_npy()后续接新仪器只需加一个加载函数算法层不需要改。5. 一次完整的上电测试复盘DC-DC电源板的平台化流程5.1 测试计划与工位布置理论讲再多不如跑一次完整流程。我用一块常见的DC-DC降压电源板做例子走一遍HNU平台从计划到报告的完整流程。被测对象是输入12V、输出3.3V/2A的降压模块。测试计划包括输出电压精度、负载调整率、纹波、效率、上电时序五项。工位布置上直流电源接模块输入端电子负载接输出端示波器用同轴电缆接输出电容测纹波万用表和示波器并联测电压。所有仪器通过LAN接入同一个小交换机电脑做控制端。工位布置有个细节所有仪器共地。不同仪器如果各自接地地电位差会在测量回路中产生环路电流导致测量值漂移。我经历过一次万用表读数莫名其妙偏大排查到最后发现是电子负载和电源地电位不一致。字段“共地”这俩字在测试平台里比什么高级滤波器都管用。5.2 自动化流程脚本的关键细节测试流程脚本的核心结构用伪代码表示就是这样加载YAML配置文件连接所有仪器并逐一*IDN?验证电源输出置为0V电子负载置为CC模式0A电源上电至12V等待500ms稳定逐档加载0.5A、1A、1.5A、2A每个负载档位下采集输出电压、电流、纹波计算效率并记录下电生成报告每个负载档位下要在设置完成后等待一个稳定时间再采集多次取平均。这个稳定时间不能拍脑袋通常用示波器观察负载调整后的瞬态响应持续多久取它的两三倍作为settle time。我踩过坑稳定时间设太短采集到的电压还在爬升过程中测出来的调整率全都偏大。5.3 实测数据与判据跑完一轮测试表格数据大概长这样负载电流输入电压输出电压输出纹波效率0.5A12.010V3.312V28mV87.2%1.0A12.008V3.301V32mV89.5%1.5A11.995V3.287V35mV90.1%2.0A11.982V3.271V38mV90.6%对照判据输出电压在3.267V到3.333V之间3.3V±1%纹波不超过50mV效率不低于85%。这些数据全部合格。这套判据在脚本里用unittest风格的断言逐项核验任何一项超差就会在报告中标红不需要人眼逐个对。5.4 一次波动异常的全链路排障真正有价值的经验来自一次异常排查。当时第二片电源板测试时输出电压读数跳来跳去从3.30V到3.45V之间乱飘看起来像模块不稳定。我一开始怀疑是电源板问题换了一片新的还是飘才意识到问题出在测量链路或测试环境。按链路顺序排查先看软件日志里读到的原始电压数据也跟着跳排除是显示或计算问题再看仪器万用表换到手动挡、单独测一个标准参考电压读数稳定排除万用表故障再查连接发现电子负载的电流线有一段是飞线线径偏细在大电流下压降变化导致模块输入端电压波动进而输出跟着动。换粗线后读数立刻稳定。这次排障的启发是遇到数据异常优先级一定是“测量链路优先于被测物”。先确认仪器本身没问题、连接没问题再怀疑板子有问题。测试平台多了几十次自动化循环之后这种“误报”会非常多建立标准的排障SOP能让团队少走无数弯路。6. 平台跑起来之后运维、协作与继续生长6.1 仪器地址与配置管理平台运行时间长了第一个麻烦就是仪器地址混乱。今天这台示波器占了192.168.1.105明天另一台插上来变成.106脚本里写死的地址就会失效。解决方法是给每台仪器设置静态IP并在交换机上做MAC绑定同时在配置文件里按工位命名而不是按IP命名。我的习惯是在仪器身上贴标签、在配置文件中写别名比如scope_main、dmm_station2代码里永远引用别名。换仪器时只需要改配置文件一处测试流程完全无感。6.2 报告自动生成与数据可追溯测试报告我建议用模板引擎自动生成而不是事后手写。HNU平台用的方案是Python生成HTML再转PDF模板里预留测试条件、设备列表、测试数据表格、波形图占位。整个平台跑完一轮报告在一分钟内生成。数据可追溯方面每个测试任务分配一个UUID所有配置、原始数据、日志、报告都以这个UUID为前缀归档。再过半年有人问“这批板子当时的纹波数据是多少”一条命令就能调出全套资料这在面对客户审计时尤其重要。6.3 常见故障与排查思路平台运行中我遇到最多的故障按照频次排序是仪器通信断开、GPIB/USB驱动冲突、设备地址冲突、超时未设置好导致脚本卡死、数据格式解析异常。通信断开的解决思路是写重试机制SCPI指令发送失败后自动重连并重新查询*IDN?确认状态。驱动冲突通常出现在同时装了几家VISA之后此时拔掉所有外设、按厂商文档彻底清理驱动只保留一套VISA。数据格式解析异常多见于不同仪器的数值返回格式不一致比如有的返回3.300000E00有的返回3.3统一用正则或浮点解析函数据掉别让人手去处理。6.4 下一步扩展方向从实验室到产线平台从实验室搭好后下一步就是往产线方向扩展。实验室的松耦合结构到产线就得考虑无人值守、异常自动报警、测试结果上传MES这些事。HNU平台目前已经把测试数据写入SQLite将来接MES只需要把数据同步模块换成API调用即可。代码分层的好处这时候体现得淋漓尽致设备层和流程层不动只改数据层。我个人认为最值得投入的方向是AI辅助的数据分析比如用历史数据训练一个异常检测模型在测试过程中实时判断波形是否异常而不是等报告出来后人眼找问题。这算远期展望但数据底座已经打好了。最后再分享一条我个人经验搭建电子测试工具与平台技术难点不在某台仪器有多难控制而在于你愿不愿意把“测量”当成一个系统工程来对待从仪器、通信、软件、数据四个层面一起考虑。先把地基打牢后面加设备、加测试项都是水到渠成的事。
阅读完成 · 觉得有帮助?
咨询建站