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

LabVIEW+FlexRIO实战:三个月搭建质谱分析信号采集系统

LabVIEW+FlexRIO实战:三个月搭建质谱分析信号采集系统 ★ FEATURED ARTICLE
1. 项目缘起与整体方案选型1.1 为什么是质谱分析这个方向三年前我接手了一个小型的质谱仪信号采集项目客户的需求很明确把离子探测器出来的微弱信号做高速采集、实时处理最后在上位机上出谱图。当时摆在面前的有几条路纯单片机方案、DSP方案、FPGA加软核方案以及NI的FlexRIO方案。前几种我都试过或者见同事做过各有各的痛点——单片机采样率上不去DSP做多通道并行处理时捉襟见肘纯FPGA开发周期又太长光是一个DDR控制器的调试就能耗掉两个月。最后选了LabVIEW加FlexRIO这套组合核心原因就一个开发效率。FlexRIO的FPGA模块可以直接用LabVIEW FPGA写逻辑不用碰VHDL或者Verilog对于我这种软件背景出身、硬件只是半路出家的人来说门槛低了一大截。而且FlexRIO的IO模块是现成的适配器模块插上去就能用省掉了自己画高速采集板的时间。质谱分析这个场景对信号采集的要求其实挺苛刻的。离子探测器输出的是纳秒级的脉冲信号峰值可能只有几毫伏带宽要求高同时还要做多通道并行采集。传统的数据采集卡要么采样率不够要么通道数太少要么就是价格离谱。FlexRIO的FPGA模块配合高速适配器采样率能做到几百兆甚至上G通道数也能灵活配置正好卡在这个需求点上。1.2 三个月的时间账怎么算很多人听到“三个月搭出质谱分析系统”第一反应是吹牛我一开始也这么觉得。但实际拆解下来时间账是这么算的第一周硬件选型、机箱和模块到货、环境搭建第二到第四周FPGA端信号采集逻辑开发包括ADC接口、触发逻辑、数据缓存第五到第七周上位机LabVIEW程序开发包括数据接收、谱图显示、参数配置第八到第十周联调、噪声测试、分辨率优化第十一到第十二周现场安装、客户培训、文档整理这个时间表的前提是硬件选型一次到位不返工。我见过太多项目卡在选型上今天觉得这个模块好明天觉得那个机箱合适来回折腾一个月就没了。所以选型阶段我花了整整一周把NI的FlexRIO产品线翻了个底朝天最后定的是PXIe-7975R FPGA模块配5732高速适配器。7975R的Kintex-7 410T FPGA资源够用5732的ADC采样率到250MS/s分辨率14位对于质谱脉冲信号来说绰绰有余。选型阶段的一个经验不要只看参数表一定要找NI的销售或者FAE要一份实际项目的参考配置。参数表上写的“最大采样率”往往是在理想条件下的理论值实际用起来受限于数据传输带宽、FPGA资源占用等因素能跑到七成就算不错了。1.3 整体架构长什么样系统的整体架构分三层采集层、处理层、显示层。采集层就是FlexRIO的适配器模块加FPGA。适配器负责模拟信号的调理和数字化FPGA负责高速数据流的接收、触发判断和初步缓存。这一层的关键是时序——ADC出来的数据是LVDS格式的FPGA要正确接收并做串并转换时序稍微偏一点数据就全乱了。处理层在FPGA内部完成包括数字滤波、峰值检测、数据打包。质谱信号的特点是脉冲窄、幅度小直接传原始波形数据给上位机的话数据量太大PXIe总线扛不住。所以在FPGA里先做一轮筛选只把超过阈值的脉冲数据打包上传数据量能降两个数量级。显示层就是上位机的LabVIEW程序负责接收FPGA上传的数据包做进一步的谱图重建、峰位标定、强度归一化最后在界面上显示出来。上位机还负责参数配置的下发比如触发阈值、采集时长、滤波参数这些。三层之间的数据流是单向的采集层到处理层到显示层。控制流是双向的上位机可以下发配置参数FPGA也可以上报状态信息。这种架构的好处是职责清晰每一层只关心自己的事调试的时候可以分层排查。2. FPGA端核心逻辑开发与实操要点2.1 ADC接口时序最容易翻车的地方FlexRIO的适配器模块和FPGA之间的接口是LVDSADC出来的数据是DDR双沿采样格式也就是说时钟的上升沿和下降沿各传一位数据。FPGA这边要用IDDR原语把双沿数据拆成单沿然后再做串并转换。LabVIEW FPGA里做这件事其实有现成的VI但坑在于时钟域的处理。ADC的随路时钟和FPGA的系统时钟是异步的直接跨时钟域传数据会出亚稳态问题。我的做法是用一个异步FIFO做时钟域隔离ADC数据先写入FIFOFPGA逻辑从FIFO里读读写时钟各用各的。ADC随路时钟 - IDDR - 串并转换 - 异步FIFO写端口 FPGA系统时钟 - 异步FIFO读端口 - 后续处理逻辑这个结构看起来简单但实际调试的时候我花了整整三天才把时序收敛。问题出在IDDR的约束上——LabVIEW FPGA的时序约束不像VHDL那么直观需要在项目文件里手动添加时序约束文件。我一开始没加综合出来的结果时序余量是负的数据偶尔会错位。实操心得LabVIEW FPGA的时序约束文件.xdc一定要在综合前就配好不要等综合报错了再补。ADC接口的约束主要是输入延迟和输出延迟具体值要查适配器模块的数据手册。5732的LVDS输入延迟典型值是1.2ns这个值直接写进约束文件里。2.2 触发逻辑设计从噪声里抓信号质谱信号的特点是脉冲窄宽度可能只有几十纳秒而且幅度小很容易被噪声淹没。触发逻辑的设计直接决定了系统能不能抓到有效的脉冲。我用的方案是双阈值触发一个高阈值用来确认有效脉冲一个低阈值用来做预触发。具体逻辑是信号超过低阈值时开始缓存数据如果后续超过了高阈值就把缓存的数据连同后续数据一起打包上传如果只超过低阈值没超过高阈值就丢弃。这样做的好处是能保留脉冲的前沿信息。质谱分析里脉冲的上升沿往往包含了重要的时间信息如果只从超过高阈值的那一刻开始采集前沿就丢了时间分辨率会变差。触发逻辑在FPGA里用状态机实现状态转换如下当前状态条件下一状态动作空闲信号 低阈值预触发开始写入预触发缓存预触发信号 高阈值触发锁定缓存继续采集预触发信号 低阈值空闲清空缓存触发采集够预定长度空闲打包上传这个状态机在LabVIEW FPGA里用While Loop加条件结构实现注意所有状态转换必须在同一个时钟域里否则会出现状态竞争。2.3 数据打包与DMA传输FPGA采集到的数据要传给上位机走的是PXIe总线的DMA通道。LabVIEW FPGA里做DMA传输有现成的FIFO VI但要注意几个点第一FIFO深度要算够。DMA传输是突发的上位机不是随时都在读如果FIFO太浅数据溢出就丢了。我的算法是FIFO深度 最大突发数据量 × 2。最大突发数据量取决于触发频率和每次采集的长度。假设触发频率最高10kHz每次采集1000个点每个点2字节那么最大突发是20MB/sFIFO深度至少要40MB。实际上7975R的Block RAM没这么大所以我在FPGA里先做了一级压缩把超过阈值的脉冲数据打包成事件格式每个事件只存时间戳和峰值数据量降到了原来的十分之一。第二DMA通道的仲裁。如果系统里有多个DMA通道同时工作PXIe总线的带宽是共享的。我的做法是给数据上传通道最高的优先级配置下发通道用低优先级避免配置数据把采集数据挤掉。第三超时处理。DMA传输偶尔会超时尤其是在系统负载高的时候。LabVIEW FPGA的DMA FIFO有超时输出超时后要重新初始化FIFO否则后续数据全丢。这个逻辑一定要加上我一开始没加现场调试的时候莫名其妙丢数据查了两天才发现是DMA超时后FIFO卡死了。3. 上位机LabVIEW程序开发与数据流设计3.1 生产者消费者架构的落地上位机程序的核心是生产者消费者架构这是LabVIEW里处理高速数据流的标准做法。生产者循环负责从FPGA读数据消费者循环负责数据处理和显示。两个循环之间用队列传递数据。队列的大小很关键。太小了生产者会阻塞太大了内存吃不消。我的经验值是队列长度 生产者循环一次读取的数据量 × 10。比如一次读1MB队列就设10MB。这样即使消费者循环偶尔卡顿也不会丢数据。生产者循环里用的是DMA Read VI这个VI是阻塞式的没数据的时候会等待。等待超时设成100ms超时后检查一下FPGA的状态寄存器确认FPGA还在正常工作。消费者循环里做三件事数据解析、谱图重建、界面刷新。数据解析是把FPGA上传的二进制包拆成时间戳和峰值谱图重建是把这些离散的点映射到谱图的横纵坐标上界面刷新是用波形图控件显示出来。注意界面刷新不要放在消费者循环里直接做因为波形图控件的刷新很耗资源会拖慢整个循环。我的做法是消费者循环只负责数据处理处理完的数据通过另一个队列传给显示循环显示循环用较低的频率刷新界面比如20Hz就够了。3.2 谱图重建的算法细节质谱谱图的横轴是质荷比m/z纵轴是离子强度。FPGA上传的是时间戳和峰值要转换成质荷比需要做标定。标定的原理是离子在飞行时间质谱仪里的飞行时间与质荷比的平方根成正比。公式是m/z A × (t - t0)^2其中A是标定系数t0是时间偏移。这两个参数需要通过已知质荷比的标定样品来测定。实际操作中用两个已知峰做两点标定就够了比如用钠离子和钾离子的峰。标定系数算出来之后在LabVIEW里就是一个简单的数学运算。但要注意浮点运算的精度LabVIEW默认是双精度浮点够用了。如果数据量特别大可以考虑用定点运算加速但质谱数据的点不会太多双精度完全扛得住。谱图的平滑处理也是必须的。原始数据有噪声直接画出来全是毛刺。我用的是Savitzky-Golay滤波这个算法在LabVIEW里有现成的VI参数选窗口长度11、多项式阶数3效果不错。窗口长度太短平滑效果不好太长会把真实的峰也抹平。3.3 参数配置与状态监控上位机还要负责参数配置的下发。配置参数包括触发阈值、采集时长、滤波参数、标定系数等。这些参数通过PXIe总线的寄存器读写通道下发给FPGA。配置下发的流程是用户在界面上改参数 - 点击应用 - 参数打包成二进制 - 写入FPGA寄存器 - FPGA返回确认 - 界面更新状态。这里有个坑参数下发的时机。如果FPGA正在采集数据突然改触发阈值可能会导致采集逻辑混乱。我的做法是加一个“采集使能”开关改参数前先停止采集改完再启动。虽然麻烦一点但稳定。状态监控是另一个重要功能。FPGA要定期上报状态信息包括当前采集状态、FIFO使用率、温度等。上位机把这些信息显示在状态栏上方便排查问题。我遇到过FIFO使用率一直很高的情况查下来是消费者循环处理太慢优化了算法之后降下来了。4. 联调阶段的典型问题与排查实录4.1 数据错位时序问题的排查思路联调第一天就遇到了数据错位的问题采集到的脉冲波形看起来是对的但时间戳对不上相邻两个脉冲的时间间隔忽大忽小。排查思路是这样的先确认FPGA端的时序约束是否正确再看ADC接口的IDDR有没有问题最后查DMA传输有没有丢包。第一步用LabVIEW FPGA的在线调试功能把ADC出来的原始数据直接引到一个Indicator上用示波器对比。结果发现原始数据是对的说明ADC接口没问题。第二步查DMA传输。在FPGA里加了一个计数器统计DMA写入的数据包数量在上位机里统计接收到的数据包数量两边一对发现上位机收到的包比FPGA发的少。说明DMA传输过程中丢包了。第三步查DMA FIFO的溢出标志。果然溢出标志置位了。原因是生产者循环的读取速度跟不上FPGA的写入速度。把生产者循环的优先级调高队列长度加大问题解决。这个问题的教训是联调一定要从源头开始查不要一上来就怀疑最复杂的部分。数据错位这种问题往往是传输环节的锅而不是算法本身的问题。4.2 噪声干扰接地和屏蔽的实操经验质谱信号本身很微弱对外界干扰特别敏感。联调的时候发现谱图上有一堆规律的尖峰间隔50Hz明显是工频干扰。解决工频干扰分几步首先检查接地信号地和机箱地要分开走最后单点接地。FlexRIO的适配器模块有专门的接地端子一定要接好。其次检查屏蔽信号线要用屏蔽线屏蔽层接机箱地。最后在FPGA里加一个数字陷波器把50Hz及其谐波滤掉。数字陷波器在LabVIEW FPGA里用IIR滤波器实现系数用LabVIEW的滤波器设计工具算。陷波器的Q值不要设太高否则会把附近的真实信号也滤掉。我用的Q值是10效果不错。除了工频干扰还有一类干扰来自PXIe机箱本身。机箱里的风扇、电源都会产生电磁噪声。我的做法是把适配器模块插在离电源最远的槽位上减少耦合。4.3 常见问题速查表现象可能原因排查方法解决方案数据错位DMA丢包对比FPGA发送和上位机接收的包数加大FIFO深度提高生产者循环优先级谱图有规律尖峰工频干扰观察尖峰间隔是否50Hz改善接地和屏蔽加数字陷波器脉冲幅度偏小触发阈值过高降低阈值看波形变化调整阈值或增加前置放大时间分辨率差预触发长度不够检查预触发缓存深度加大预触发缓存FPGA温度过高逻辑资源占用过高查看FPGA温度传感器优化逻辑降低时钟频率上位机卡顿界面刷新太频繁查看CPU占用率降低刷新频率数据处理和显示分离5. 三个月周期的项目管理与经验总结5.1 时间分配的实际复盘三个月听起来紧但实际做下来真正花在写代码上的时间大概只占一半另一半花在了调试、文档和沟通上。第一周选型我花了三天研究NI的产品线两天和销售确认货期和价格。这里有个经验FlexRIO的适配器模块货期往往比FPGA模块长因为适配器是模拟电路生产周期长。我那次5732适配器等了整整三周才到货差点影响进度。所以选型的时候一定要先确认货期适配器模块要提前订。第二到第四周写FPGA逻辑实际编码时间大概两周剩下两周全在调试时序。LabVIEW FPGA的综合和实现很耗时间一次完整的编译要40分钟到1小时。所以编译次数要省着用每次编译前先在仿真模式下验证逻辑确认没问题再综合。第五到第七周写上位机程序这部分相对顺利因为LabVIEW的G语言开发效率确实高。但界面美化花了不少时间客户对界面的要求比我想象的高。第八到第十周联调这是最耗时的阶段。问题一个接一个有时候一个问题查两天。但这也是最有成就感的阶段看着谱图从一团乱麻变成清晰的峰那种感觉挺好的。5.2 给后来者的几条实在建议第一不要跳过仿真。LabVIEW FPGA支持仿真模式可以在不编译的情况下验证逻辑。虽然仿真速度慢但比编译一次等一小时强多了。我后来的习惯是任何逻辑改动先在仿真里跑通再综合。第二版本控制要做好。LabVIEW的VI是二进制文件Git管理起来不太方便。我的做法是用LabVIEW自带的版本管理工具或者把VI保存为文本格式.vi转成.llb再转文本。项目文件、约束文件、配置文件这些文本文件用Git管理VI文件用LabVIEW自带的工具管理。第三文档要边做边写。不要等项目结束了再补文档那时候细节都忘了。我的习惯是每天下班前花十分钟记录当天解决的问题和踩的坑周末整理成周报。三个月下来文档自然就齐了。第四和客户保持沟通。质谱分析这个领域客户往往比我们更懂信号特征。联调阶段我每周和客户开一次会把谱图发给他们看他们提了很多有价值的建议比如某个峰的宽度异常、某个时间段的噪声偏大等。这些信息如果只靠自己看波形很难发现。5.3 这套方案还能怎么扩展这套系统的架构是通用的换一个适配器模块就能适配不同的信号类型。比如换成高速数字化仪适配器就能做雷达信号采集换成光学传感器适配器就能做光谱分析。FPGA端的逻辑也可以复用。触发逻辑、数据打包、DMA传输这些模块都是通用的换个项目只需要改参数配置不用重写代码。我后来做另一个项目的时候FPGA端代码复用了八成只改了两成两周就搭出了原型。上位机的谱图显示部分也可以扩展。现在只支持一维谱图如果要显示二维谱图比如质谱-色谱联用只需要改显示控件和数据处理逻辑架构不用动。最后分享一个小技巧LabVIEW FPGA的编译很慢但可以用增量编译来加速。如果只改了一小部分逻辑增量编译只重新综合改动的部分时间能省一半以上。在项目属性里开启增量编译选项就行但要注意增量编译偶尔会出bug如果结果不对还是要全量编译一次。
阅读完成 · 觉得有帮助?
咨询建站