尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AI Agent自动化硬件调试:开源方案让BMS板卡测试不再熬夜

AI Agent自动化硬件调试:开源方案让BMS板卡测试不再熬夜 半夜蹲在实验室盯着示波器上跳动的波形手里攥着万用表等某个参数掉下来——这种场景只要是做过嵌入式硬件调试、尤其是碰过BMS板卡的老哥多少都有点条件反射式的心酸。那不是能力问题是大量重复性的守候和判断真的在消耗人的精力。所以当我把这个开源项目跑通让AI Agent替我在夜里自动完成一轮又一轮的板卡测试时第一反应不是新鲜而是这东西早就该有人做了。这个项目解决的问题很直接把硬件调试里那些“需要人盯着”的重复工作交给AI来执行。你不用再半夜守着电流值不用一遍遍地重复“设置电压、读寄存器、判断是否通过、写日志”这套动作。AI能听懂自然语言指令自己调用仪器、读取数据、做阈值判断、生成测试报告甚至能根据异常数据给出初步诊断方向。它适合任何做嵌入式、电源管理、BMS、电机驱动这类需要反复上电验证的硬件工程师尤其适合那些测试流程长、判定规则明确、熬夜多的场景。我先说结论这套方案不是遥不可及的实验品它用的都是现成的开源工具和技术栈核心就是一个“大模型 仪器控制框架 安全机制”的组合。这篇文章我会从项目思路、架构设计、实操配置到踩坑记录把整个链路完整拆一遍尽量让你看完就能在自己的板子上跑起来。1. 别急着上AI先看看“人肉调板子”到底痛在哪1.1 三类最让人崩溃的重复劳动先说一个我自己的真实经历。去年做一个BMS从控板的小批量验证光是一个“待机功耗测试”就折腾了一周。测试要求很简单板子处于休眠模式用万用表串联测静态电流记录10分钟看电流有没有异常波动。听起来不难但问题是板子有时候要等很久才进入休眠电流值又小示波器和万用表各有各的脾气一个晚上可能只跑出两组有效数据。这种活儿最大的问题不是难度而是反人性。你需要长时间保持注意力却又不做什么高难度操作。我总结下来嵌入式硬件调试里最常见的重复劳动有三类反复执行同一套测试流程比如“上电—等稳定—读电压—读电流—记录—断电”一天循环几十次。跨仪器协同操作数字电源设置输出电压、电子负载设置电流、示波器抓波形、串口读日志每一步都要手动切过去操作。异常判断靠经验什么波形是正常的、什么寄存器值是合理的、哪个参数飘了可以接受这些规则全在工程师脑子里换个人就得重新教。这三类工作的共性是什么流程确定、判定规则明确、操作频繁。这恰恰是AI最擅长替代的活儿。1.2 为什么这事适合AI来干而不是写个普通脚本你可能想这些测试流程固定那我直接用Python写个自动测试脚本不就完了为什么非要上AI我的回答是脚本当然能解决一部分问题但有两个硬伤。第一硬件调试的流程经常要改。今天测待机电流明天测充电效率后天又要测过压保护每次都要去改脚本逻辑时间成本不低。第二异常情况太多。脚本只能按预设路径走遇到设备没响应、数据超范围、连接断开这些意外很容易直接崩掉最后还是得人来处理。AI Agent不一样。它的核心能力是“理解意图 动态决策”。你跟它说“测一下板子在12V输入下的静态电流等进入休眠后再开始记录”它能自己拆解成操作步骤先设电源电压、打开输出、等待电流下降到某个值、用万用表连续采样、判断是否稳定、生成报告。中间如果某一步异常它可以尝试重置设备、延长等待时间甚至换一种测试方式。这种灵活性是传统脚本很难实现的。而且大模型对“模糊指令”的理解能力特别适合硬件调试场景。工程师说话本来就是半自然语言半术语比如“把电源拉到12V量一下DSG引脚波形看看有没有毛刺”这种话你很难写成硬编码规则但AI可以理解并转换成具体的仪器操作。1.3 现有的开源方案能到什么程度在跑通这个开源项目之前我也调研过不少同类工具。市面上有些商业测试软件能自动化控制仪器但价格不便宜配置也重。开源方案里单纯用Python控制仪器的库倒是很成熟比如PyVISA、pylablib、pyserial但这些只是底层驱动缺少“智能大脑”。这个开源项目的巧妙之处是把两层东西拼在了一起。底层是用PyVISA/PySerial去控制仪器这层逻辑是硬编码的保证精度和稳定性上层是接一个大模型负责解析自然语言指令、规划执行步骤、处理异常分支。两层之间用一套“工具函数”对接AI只能调用我们暴露给它的命令不能乱来。这样设计的好处很实在硬编码的部分保证了操作准确不会出现AI“想象”出一个不存在的寄存器地址大模型的部分保证了灵活性能应对流程变化和突发状况。既不会失去控制又能获得智能。2. 项目架构拆解AI是怎么“接管”测试仪器的2.1 四大模块各干各的活整个项目的逻辑其实不复杂核心就是四块用户交互层、AI决策层、仪器控制层、数据记录层。每一层各司其职层与层之间用清晰的数据结构通信。用户交互层是给工程师用的。可以是命令行也可以是一个简单的Web界面甚至接入企业微信机器人。你在上面输入一句话比如“给板子加12V电等5分钟看看DSG引脚温度是否异常”交互层把这句话原样丢给AI决策层。AI决策层是整个系统的核心。它通过预设的系统提示词知道自己是一个“测试助理工程师”手里有一堆可调用的工具。它收到用户指令后会拆解成一步步的JSON格式操作命令比如先调用“set_power(12)”再调用“wait(300)”再调用“read_temperature_pin()”。仪器控制层就是真正的“手”。每个工具函数对应一台仪器或一种测量方式底层通过SCPI指令、串口指令或USB通信去控制实际的设备。这一层是硬代码实现的所以AI再怎么天马行空最终都得落到这个层里被约束。数据记录层负责把每次操作的时间、参数、测量结果存下来生成结构化的日志和报告。这个层很关键因为最终要靠这些数据来判断测试是否通过出了问题也能回溯。2.2 为什么把AI决策和仪器驱动分开这一点特别重要。一开始我想偷懒直接让大模型自己生成Python代码去控制仪器结果发现非常不靠谱。大模型可能会生成一个“正确但危险”的命令比如自己猜一个SCPI指令去读取某个未知寄存器也可能因为对设备协议不熟调用了一个存在但参数错误的方法。你白天盯着还好晚上睡觉时让AI自己跑心里完全不踏实。所以后来我改成“工具函数白名单”模式大模型不能直接写代码只能从我提供的几十个工具函数里选比如set_power_voltage()、read_multimeter_current()、capture_waveform()。每个函数都经过测试、带参数校验、有限流保护等安全机制。大模型要做的是在这些工具里做组合和排序相当于一个现场指挥而不是自己亲自动手搞仪器。这个过程有点像给实习生安排任务。你不让他自己去焊板子只告诉他“你负责按这个清单做记录遇到情况按流程上报”。上手快、出错少、还能随时叫停。2.3 大模型该怎么选云端API还是本地部署这个项目对硬件要求其实不高关键是模型要有较好的函数调用能力。我试过几类方案简单分享一下感受。云端API方案最省事国内的DeepSeek、文心、通义国外的GPT-4、Claude只要支持函数调用function calling或工具调用都可以直接用。优点是不用自己配置显卡模型能力强理解复杂指令更靠谱缺点是测试现场可能是内网环境不能把板卡测试数据传到外部API这一点对很多公司来说是硬伤。本地部署方案我用过Qwen系列和Llama系列的量化版本。好处是数据不出内网离线也能跑延迟低适合长时间无人值守。坏处是需要一台像样的服务器显存最好大于12GB不然模型推理速度会很慢。实测下来一个简单的任务拆解在本地7B模型上几百毫秒到一两秒就能完成对于硬件调试这种场景完全够用。我的建议是如果你只是自己玩、验证想法直接用云端API开发效率最高如果你要在公司环境落地或者测试内容涉及机密就老老实实部署本地模型。3. 从零开始搭建让你的AI今晚就能上岗3.1 硬件设备和基础环境准备先说说需要哪些硬件基础。我们的目标场景是自动化测试嵌入式板卡尤其是BMS这类电源板。最基础的配置如下一台可编程数字电源比如ITECH、是德、固纬的用于给板子供电。一块数字万用表或电子负载用于测量电流、电压。一个示波器带USB或LAN接口用于抓波形可选。一个串口模块用于读取板子日志、控制板子状态。一台电脑安装Python 3.9以上版本。仪器连接方面大部分设备通过USB转串口、USB-GPIB或网口连接到电脑。Python里我最常用的库是pyvisa它封装了VISA协议能统一控制大多数支持SCPI指令的仪器。对于纯串口设备直接用pyserial就行。环境配置也很简单一条命令装基础依赖pip install pyvisa pyvisa-py pyserial python-dotenv requests如果你用云端API还需要安装对应SDK比如OpenAI官方库pip install openai3.2 核心工具函数先让仪器“透出接口”在接入AI之前我们要先手动写好仪器控制函数并一个个验证可用。这一步不能省因为AI再聪明底层函数如果不稳所有操作都会翻车。以我用的“数字电源 万用表”组合为例核心工具函数长这样import pyvisa import time rm pyvisa.ResourceManager() class DCPower: def __init__(self, address): self.dev rm.open_resource(address) self.dev.timeout 5000 def set_voltage(self, voltage): # 安全范围校验防止AI乱设参数损坏板子 if voltage 0 or voltage 60: raise ValueError(fVoltage {voltage} out of safe range!) self.dev.write(fVOLT {voltage}) def set_output(self, on: bool): state ON if on else OFF self.dev.write(fOUTP {state}) def read_current(self): return float(self.dev.query(MEAS:CURR?))这些函数本身不复杂但需要注意几个细节。安全校验必须放到工具函数里比如电压范围、电流上限这样就算AI误操作底层也会拦截。超时时间要设置合理有的仪器响应慢超时太短会直接报错太长则可能导致整个流程卡住。每个函数都要单独测试一遍比如set_voltage(12)后真的用万用表确认输出是12V不能只看仪器面板显示。3.3 给AI写“岗位说明书”系统提示词与工具定义这一步是整个项目里最有技术含量、也最容易被忽略的地方。大模型刚接进来时就像一张白纸你要告诉它“你是谁、你手里有什么工具、你要遵守什么规则”这就是系统提示词。我实践的提示词结构一般包含这几部分角色定义你是BMS板卡自动测试助理工程师负责根据用户指令执行测试流程。工具列表你有以下工具可用每个工具的名称、功能、参数、返回结果是什么。操作规范所有操作必须遵循安全流程设置电压前先确认范围测试结束后关闭输出遇到异常必须先报告不要自作主张。输出格式请以JSON格式输出操作序列每个动作包含“tool”和“params”字段。下面是一个工具定义的示例我用的是OpenAI function calling的格式{ name: set_power_voltage, description: 设置可编程电源输出电压单位V安全范围0-60V, parameters: { type: object, properties: { voltage: { type: number, description: 目标输出电压单位V } }, required: [voltage] } }你觉得这一步只是让AI好看一点吗不是。提示词写得好不好直接决定AI会不会乱来。我见过一个同事没写清楚“设置电压前先确认当前状态”结果AI直接把电源从0V拉到60V差点烧板子。后来我在提示词里加了一条铁律任何电压设置操作之前必须先调用read_power_status()确认当前输出状态再执行下一步。加了这个约束后再没出过类似问题。3.4 一个完整的BMS待机电流测试流程理论说了不少用一个实际案例把整个链路串起来。假设用户输入指令“给板子上12V电等3分钟让系统进入休眠然后测静态电流记录10分钟每隔5秒采一次数最后判断电流是否低于200uA并生成报告。”这个指令扔给AI后它会输出一串工具调用序列。为了让你更直观地理解我模拟了AI的思考过程与实际动作对应表AI计划步骤实际调用的工具函数说明1. 设置电源电压并打开输出set_power_voltage(12),set_power_output(True)给板卡供电等待系统启动2. 等待一段时间让系统休眠wait(180)等待3分钟具体时间可以配置3. 循环采样静态电流read_dmm_current()x 120次每隔5秒采样一次持续10分钟4. 判断是否满足条件judge_current_below(threshold0.0002)检查120个采样点是否均小于200uA5. 完善报告并保存数据save_report(),save_csv()生成Markdown报告和CSV原始数据6. 关闭电源输出set_power_output(False)测试完成安全收尾AI执行完这些动作后会生成一段自然语言总结比如“测试完成共采样120次电流最大值为185uA、最小值为162uA、平均值为171uA均低于200uA阈值待机电流测试通过。”看到这句话你就能直接判断板子是否合格而不需要再去看那一大堆原始数据。3.5 让Agent真正跑起来的循环代码如果你不想依赖大模型的function calling功能也可以自己写一个“Agent循环”让大模型每次只返回一个JSON动作然后由代码执行并返回结果再让大模型决策下一步。这种方式更可控也更容易调试。简化后的核心循环如下import json from openai import OpenAI client OpenAI(base_urlhttp://localhost:8000/v1, api_keyEMPTY) def run_agent(user_instruction): messages [ {role: system, content: SYSTEM_PROMPT}, {role: user, content: user_instruction} ] for step in range(20): # 最多执行20个步骤防止死循环 resp client.chat.completions.create( modelqwen2.5:7b, messagesmessages, response_format{type: json_object} ) action json.loads(resp.choices[0].message.content) if action.get(type) finish: return action.get(report, ) tool_name action[tool] params action.get(params, {}) result execute_tool(tool_name, params) # 调用真实仪器控制函数 # 把工具执行结果回传给大模型让它决定下一步 messages.append({role: assistant, content: json.dumps(action)}) messages.append({role: user, content: f工具返回结果: {result}, 请决定是否继续或结束})这段代码是整套方案的骨架实际使用中你还会加上异常处理、超时保护、日志记录等。但核心思想就是让大模型“看一步走一步”而不是一次性生成所有步骤。这样有个好处就是当某一步执行结果不符合预期时AI可以根据实际返回值动态调整不会一条道走到黑。4. 踩坑实录那些只会在实战中遇到的大坑4.1 仪器连接不稳定你的AI在“空转”却不报错我最开始跑这套方案时遇到了一个特别磨人的问题有时AI明明调用了read_current()返回的数据却是旧的缓存不是实时测量值。排查下来发现问题出在PyVISA的超时设置和仪器的通信模式上。有的仪器默认开启了“连续采样”你发MEAS:CURR?过去它返回的是缓存值而非真实值。解决办法是在测量前先强制触发一次采样或者使用CONF:CURR手动配置测量模式再READ?获取实时数据。另外USB转串口的驱动也是个大坑。Windows系统某些CH340芯片的驱动版本老长时间高频率读写后会出现缓冲区错乱导致读回来的数据偶尔多一个字节。我的解决方法是每次读取前清空缓冲区并且对返回的数据做正则校验去掉非数字字符。这些细节在白天人工操作时可能无所谓但晚上让AI无人值守跑12小时任何一个微小的不稳定都会被放大成一次失败任务。4.2 AI的“幻觉”会让板子冒烟关于AI幻觉导致误操作这个必须单独拎出来讲。AI在处理不熟悉的指令时可能给出看似合理但实际错误的参数。比如有次我测试时问它“给板子上一个2.5V的偏置电压检查一下VREF引脚”结果AI真的把电源电压设成了2.5V——但那是给主电源12V的通道偏置电压应该从另一个通道输出。幸好底层工具函数限制了通道和电压范围不然板子大概率当场报废。面对这种问题三层防护缺一不可工具函数里的参数硬校验电压电流超范围直接抛异常。系统提示词里写清楚“接口通道与用途映射关系”让AI知道哪个通道是主供电、哪个是偏置、哪个是信号源。执行过程中的“操作确认”开关对于高危动作如设置超过12V的电压或打开输出强制要求额外确认一次。你可能会觉得操作确认会拖慢速度但实际用下来也还好。白天有人值守时关闭确认模式晚上无人值守时打开高危确认模式牺牲一点效率换来安全非常值得。4.3 无人值守时的卡死看门狗和超时机制必须有长时间测试最怕的就是半夜3点整个流程卡住等到早上才发现白白跑了几个小时。卡死的原因很多网络连接断开、仪器无响应、大模型推理服务崩溃、某个脚本丢了个异常没被捕获。我的做法分两层。第一层是全局超时机制每一步工具调用的超时时间都显式设定比如dev.timeout 5000超过5秒就触发try...except重试重试3次还不行就上报错误并安全退出。第二层是看门狗线程每30秒检查一次整体流程是否还在推进如果超过5分钟没有任何新动作就强制重启测试流程并把异常状态写入日志。这里有个实战经验不要只依赖大模型自己的判断来结束任务它会因为“主动结束”而忘记做清尾动作。比如最后一步关闭电源输出AI很容易忽略。所以我把“测试结束前必须关闭所有输出”写成了一个独立的清理函数在Agent循环的finally块里强制调用不依赖AI自觉。4.4 BMS板卡调试的特有注意事项既然这个项目大量应用在BMS方向多说几句BMS硬件调试里让人特别头疼的事。BMS板卡上有高压和低压混合区域做自动化测试时一定要把采样点和控制通道分清楚。AI控制电源前我建议先把“防反接保护”做到硬件层面。比如在供电回路里串联一个二极管或者使用带OVP/OCP功能的可编程电源一旦电压或电流超限立即切断。这层保护不依赖软件是最底线的安全网。通信电平也是个深坑。BMS的UART和I2C引脚往往工作在3.3V甚至1.8V有些调试板为了图省事直接拿5V的USB转串口怼上去短时间没事长时间会把板子烧掉。所以接AI自动测试平台前一定要先用万用表确认主板通信接口的电平再选择合适的电平转换模块。另外BMS的静态电流往往是用uA级精度去测的一般的万用表低频采样还行但如果要抓瞬态电流脉冲就得用示波器加电流探头。我的建议是如果是做长时间的功耗统计用万用表串联采样如果是看动态电流波形用示波器电流探头两个工具都暴露给AI让它在不同的测试步骤里按需调用。5. 一些我踩过之后才明白的补充建议5.1 日志比AI本身更重要刚开始我太关注AI能不能正确执行操作后来发现真正决定这套系统能否长期跑下去的是日志系统够不够完善。我要求每一步工具调用都记录“时间戳、调用的函数、输入参数、返回结果、耗时”并用结构化的JSON格式存下来。这样一旦测试异常我可以直接回溯是AI规划错了还是工具执行出错还是仪器本身出了问题。日志还能反过来优化提示词。当AI反复在某个环节出错时把错误日志喂给它自己看它往往能指出是哪个约束没写清楚导致的。这个“AI反馈闭环”的思路比你自己一遍遍试提示词高效得多。5.2 测试任务不要一开始就贪多求全这个项目刚跑通时我特别兴奋恨不得把所有测试项都交给AI。结果就是提示词越来越长模型经常搞混不同测试的差异错误率飙升。后来我学乖了每个测试场景单独写一套提示词类比自己给新员工写SOP一份SOP只讲一件事。比如“待机电流测试”的提示词里只讲待机电流相关的操作步骤和判断标准其他充电效率、均衡功能的说明一句都不提。这样模型决策简单、准确率高以后再扩展新测试项也只是加一套提示词不用动底层代码。5.3 从“AI执行”到“AI判断”的演进方向目前这套方案已经能稳定让AI执行测试流程、分析数据、生成报告但我还在试一个更进阶的方向用AI做根因分析。当BMS测试失败时传统做法是工程师看着日志去猜是硬件问题、软件问题还是测试环境问题。如果我们把历史测试数据、原理图、芯片数据手册喂给大模型它可以做初步的故障定位把排查范围从几十个可能性缩小到两三个这对缩短调试周期非常有帮助。我建议你跑通基础功能后也可以往这个方向探索。成本不高只是多接几个数据源但带来的效率提升是质的飞跃。最后分享一个我的个人体会这套系统最让我满意的不是它能省多少人力而是它把很多我想做但没时间做的长时间测试比如72小时的老化测试、连续100个循环的充放电测试都变成了“下班前设置好、第二天上班看报告”的事。它不会让AI替代你思考但它能让你从那些本不该占用脑力的重复劳动里解放出来把精力放在真正需要硬件工程师经验和判断力的地方。
返回列表