徐 胜,顾 俊,赵 蔚,黄媛媛,邢 强
(1.国电南京自动化股份有限公司,江苏南京 210026;2.南京国电南自电网自动化有限公司,江苏南京 210026;3.南通大学机械工程学院,江苏南通 226019)
随着生物行为研究被广泛关注,研究者主要针对生物行为的生物电信号及行为数据,包括肌电信号、行为方式以及空间力等展开研究[1-3]。为了更好地揭示出生物行为特征、预测生物行为、揭示生物行为机制,对大范围场景下的高实时的海量数据采集系统的要求也越来越高[4-6]。
目前主流数据采集系统为多通道同步采集系统,具有多路信号的同步采集、采样速度快、精度高等优点。常见的多通道同步采集系统可分为:基于嵌入式的数据采集系统、基于FPGA的数据采集系统以及虚拟采集系统[7-9]。基于嵌入式的数据采集系统通常采用模块化设计方式,将微型控制器、模数转换模块和传输模块相结合。张宝群利用DSP芯片作为主控模块,搭建了一款通道可选、采集速率可变的采集系统[10]。贺龙对于生理信息领域的需求,利用STM32和ADS8322芯片,搭建了一款可用于生理信息采集的数据采集系统[11]。基于FPGA的数据采集系统采用的是硬件编程的方式,在数据处理方面速度快于嵌入式设备:史恒吉针对于水声工程领域对采集系统的需求,利用FPGA和DSP搭建了具有自检功能的数据采集系统[12];苏徐利用FPGA搭建了一套32路的数据采集系统[13]。而虚拟采集系统是基于计算机技术的仪器设备[14],用户通过自行添加或删减软硬件设备来满足需求,缺点是价格昂贵:刘海东等[15-16]利用基于PCI总线的高速数据采集模块和LabVIEW搭建了虚拟仪器采集系统,能够实现数据采集、存储、显示、频谱分析等功能;文献[17]利用嵌入式系统和USB构建的虚拟仪器系统,实现了传统虚拟采集系统所不具有即插即用,即插即拔功能的功能。
为了满足生物行为研究和仿生行为研究的科研需求,本文搭建了一种基于STM32和LabVIEW的低成本多通道数据采集系统。
该数据采集系统主要包括下位机设计和上位机设计2部分。其中,下位机选用STM32F407作为主控模块控制4块ADS8528模数转换芯片对32路信号同步采集,并采用基于ALK8266芯片的无线传输模块实现下位机采集信号的实时传输;上位机部分选用LabVIEW图形化编程语言进行设计,通过采用网络传输的方式实现对下位机采集数据实时处理与显示。下位机包括模数转换模块、主控单元、无线传输模块以及传感器组,模数转换模块将前端的传感器所采集的模拟信号转换为数字信号,主控单元通过无线传输模块以网络传输的方式传输到上位机中,最后上位机将对下位机所传输的数据进行分析处理。多通道数据采集系统的整体结构框图如图1所示。
图1 系统硬件框架图
为了实现32路光电传感器的模拟电压信号同步采集,系统选用4块模数转换芯片ADS8528对主控模块的模数转换通道进行扩展[18]。ADS8528不仅具有高采样率,且每块芯片提供8路同步采样端口,并且能够支持±12 V范围模拟电压输入;其具有2种数据传输方式:并行输出和串行输出。并行数据输出实现简单且采样率高达650 kSPS,但会占据主控模块大量的GPIO资源。串行输出模式是通过SPI全双工同步串行总线将数据输出,虽然相较于并行输出模式采样率只有480 kSPS,但该模式下只需占用主控模块4根通讯线,节省了硬件资源。因此本文采用串行通讯的方式,并将模数转换后的信号输出至主控。由于STM32的SPI资源有限,4个ADS8528共用一根SPI总线,通过片选芯片的方式决定哪个芯片占用总线[19]。为了保证切换的流畅性,提高多路信号采样的速度,主控通过模数转换芯片的BUSY/INT引脚知晓模数信号是否转换完成。当该引脚由高电平转变为低电平时表示该芯片数据转换完成,可以切换至下个ADS8528继续进行转换。主控模块与数据采集模块间的电路示意图如图2所示:其中控制总线包含了片选信号、BUSY/INT引脚输出信号以及配置信号线。
图2 多通道数据采集电路示意图
为了方便数据的分析和处理,采用ALK8266无线WiFi模组为主控芯片进行数据的传输。ALK8266内置了丰富的组网模式,可实现与上位机间的TCP/UDP的高速通信:通过SPI接口连接至主控模块,有效数据吞吐量可达1 MB/s,适用于高速采集场合。除此之外,为保证数据的安全性和完整性,采集系统还配有SD卡,可以将采集的数据实时保存,避免无线传输时的数据丢失。
在ADS8528芯片电源设计部分,设计了多种电压等级输出以保证各芯片的正常工作。通过LM7805为ADS8528内部的模数转换器提供5 V电源。通过LM7815和LM7915为ADS8528内部的模拟输入提供+15 V和-15 V的正、负电源,多通道数据采集电路示意图如图2所示。
软件部分主要分为下位机和上位机软件设计,数据采集系统的程序流程图如图3所示。其中下位机程序包含多通道模数转换、数据存储以及无线传输程序。多通道模数转换程序主要用于对ADS8528芯片的转换参数进行初始化配置,并且根据初始化配置的参数将前端多路传感器所采集的模拟信号转换为数字信号进行输出。数据存储模块主要通过移植FATFS文件操作系统,将前端采集的传感器的信号值存储到SD卡中。无线传输模块主要对ALK8266的工作模式和组网方式进行配置,通过设计数据帧格式将前端采集的数值进行格式化,并基于UDP的通讯方式传输到上位机中。上位机程序利用LabVIEW进行搭建,通过调用软件自带的网络通讯模组来实现接收下位机所采集的数据,并对其进行处理和分析。
图3 整体程序处理流程图
模数转换模块程序主要分为ADS8528芯片初始化和模数转换2部分。ADS8528芯片初始化用于配置SPI通讯和模数转换的相关参数,模数转换模块根据初始化中配置的参数,将前端32路模拟信号同步转换为数字信号。
在ADS8528芯片初始化程序中,首先需要配置初始化芯片与STM32的SPI通讯接口以及用于监视芯片BUSY管脚的接口。当BUSY管脚由低电平转换为高电平状态时,表示芯片正处于工作状态;由高电平转换为低电平后,表示模数转换完成。STM32的SPI通讯口,通过拉低芯片对应的片选CS引脚来选中芯片读取数据。
ALK8266无线WIFI模组不仅内置TCP/IP协议栈,而且可以通过SPI协议实现主控模块与WIFI模组的通讯。ALK8266模组包含多种组网模式:STA模式、AP模式和STA+AP混用模式。STA模式可将模组自身的网络接入路由器中,其他设备只需接入该路由器即可实现和模组间数据通讯。AP模式为热点模式,以模组自身作为热点来创建局域网,其他设备通过接入该局域网实现数据通讯。STA+AP混用模式是前两种模式的组合,可以基于实际的使用要求来灵活进行切换。在本系统中组网模式选择为AP模式,通过创建热点的方式来和上位机进行连接。
模组的通讯协议分为TCP和UDP 2种,TCP是一种需创建连接,通讯稳定可靠的通讯方式,适用于对传输稳定性要求较高的场景。而UDP是一种无须创建连接,通讯速度快的通讯方式,适用于对实时性要求较高的场景。根据数据采集系统在实时性方面的要求,选用UDP通讯方式来提高数据的传输速度。此外,为了防止数据在传输中出现错乱的情况,本文采用数据帧的格式来将前端多路数据进行打包。数据通讯格式分为3部分:帧头、数据位和帧尾。帧头用于定位数据包数据读取位置,数据位为多通道的模数转换值,占据数据包多字节,而帧尾部分用于定位数据读取结束的位置。
为保证数据安全性,除了将数据无线传输至上位机,主控模块还会通过实时存储本地的方式将数据存储在SD卡中。为了方便计算机直接读取SD卡中的数据,系统通过FATFS文件管理系统将SD卡写入的数据保存成文件格式。FATFS是专门为小型嵌入式系统设计的文件管理模块,其文件模块结构分为3层:应用层、FATFS模块层和存储介质层。应用层用于给使用者提供文件模块的接口函数,来实现对SD卡进行读写操作;FATFS模块层用于存储文件系统的读写协议;存储介质层用于实现存储介质初始化、数据读写等操作[20]。系统首先初始化SD卡,并检测其工作电压以及卡组类型。之后申请FATFS变量内存,并挂载SD卡。然后分别调用打开文本和写入文本函数来创建文本文件,并将数据写到文件中。最后调用关闭文件函数停止数据写入。
为了优化数据采集系统的程序和提高系统运行速度,通过移植实时操作系统RT-Thread来搭建多线程的程序框架[21]。RT-Thread具备的高实时性、较小的体积和易于移植等特点使得该操作系统能够在更多场合使用。
在RT-Thread操作系统中采用基于生产者/消费者的多线程模式,整个程序分为生产者线程、消费者线程、共享缓存区以及信号量。生产者线程用于采集数据,消费者线程用于对采集的数据进行处理,共享缓存区作为生产者和消费者线程数据存放的载体,用于实现生产者和消费者的数据传递。信号量作为访问权限用于保护共享缓存区中数据的读写操作。在共享缓存区中,采用3个信号量作为访问权限。其中两个信号量用于分别控制生产者线程和消费者线程在共享缓存区溢出或空状态下无法对共享缓存区进行数据的读写操作,互斥信号量用于控制多线程无法同时对共享缓存区进行数据的读写操作。
程序主要是包括线程初始化、数据采集线程以及无线传输存储线程3部分。线程初始化部分用于创建数据采集线程和无线传输存储线程,并且设置这两个线程的优先级,即数据采集线程优先级高于无线传输线程优先级。该部分还创建和初始化3个信号量:互斥信号量access(初始值为1)、缓存区空状态信号量empty(初始值为n,n表示缓存区大小)以及缓存区满状态信号量full(初始值为0)。数据采集线程通过获取access信号量和full信号量来获取共享缓存区的访问权限,将采集的数据写入到共享缓存区中。而无线传输模块通过获取access和empty信号量来获取共享缓存区的控制权,并且按照数据帧的方式将采集的数据打包通过网络传输发送到上位机中,图4为多线程的流程图。
(a)生产者线程
(b)消费者线程
在上位机程序设计中,采用图5所示的基于事件触发机制的状态机结构。
图5 状态机结构图
在LabVIEW程序中,事件触发机制的状态机结构主要由循环结构、条件结构、事件结构和枚举常量组成。在该状态机结构下,必须等待外部事件触发后,才会执行相应的程序。状态机中的状态设定为上位机和下位机所约定的命令,命令格式为0Xdd,dd表示各种命令。根据所约定的命令,将整个程序划分为7个不同的状态:等待、初始化、设备状态、初值校准、数据采集、停止采集和退出。其中初始化状态用于检测下位机和上位机间的网络通信状态;设备状态主要用于检测下位机各模块间的连线状态;设备检测用于对所采用的传感器进行输出值的校准。表1为所设定的不同状态。
表1 命令格式
在上位机程序中,采用UDP的无线通讯方式和下位机进行连接,采用LabVIEW中的网络传输模块来进行设计。在LabVIEW中,网络通讯流程图如图6所示,首先根据下位机中配置的网络参数,设置上位机以及接收目标的IP地址和端口号。之后根据和下位机约定的命令格式,将命令转换为ASCII码值后通过UDP发送到下位机中。然后设置接收的UDP数据包大小,并且将接收的数据进行格式化转换为十进制数。最后调用UDP关闭函数,结束UDP通讯,节约端口资源。
图6 网络通讯流程图
以STM32为主控模块,在数据采集端连接ADS8528模数转换模块,其数据采集端采用TSL250光电传感器作为输入信号,采用ALK8266模块将采集信号传递给上位机,各模块间的实物连接如图7所示。
在测试过程中,设计的数据采集系统分别针对采集信号分别1路、8路、16路、24路、32路的情况进行测试。在STM32中通过定时器触发中断的方式记录数据采集系统在1 s中转换的次数,并进行4次实验,结果如表2所示。
图7 多通道采集系统实物图
表2 采样率测试
实验结果表明:系统在1路时转换速率能达到630 kSPS,8路时达到370 kSPS,16路时能达到203 kSPS,24路时能达到140 kSPS,32路时能达到106 kSPS,所设计的多通道采集系统可以实现高采样率的信号实时采集与传输。
采用M8853直流电源对数据采集系统的模数转换精度进行测试。直流电源分别设置为0~5 V电压输出,利用数据采集系统和电流表对电源的输出值进行测量。为了防止在测试过程中采集的电压受到干扰而产生波动的情况,对每个采样点进行多次采集,取平均值后将电压输出。通过比较数据采集系统的输出电压值和电流表所测得的电压值,来分别计算转换误差,误差计算公式为
(1)
式中:U为电流表测得电压输出值;Uc为采集系统多次测量后所得的电压值。
数据采集精度实验结果如表3所示,实验结果表明系统的采集电压值的平均相对误差在0.3%以内,能够满足实际使用需求。
表3 采集精度实验结果
数据采集系统采用基于UDP的无线网络的方式和上位机进行连接,在进行数据测试前需要将PC端连入模组所创建的无线网络中,并且在PC端上利用LabVIEW软件搭建上位机程序来接收数据采集系统传输的数据。网络通讯功能测试如下:将系统的32路输入端分别连接到光电传感器上,并且设置数据采集系统的采样率为106 kSPS,无线网络传输模块ALK8266的IP地址设置为192.168.4.1,端口号为1234。在LabVIEW程序端设置IP地址为192.168.4.2,端口号为4321。然后分别点击上位机网络连接状态和设备检测按钮来检测和查询下位机的运行状态。待检测完成后,发送数据采集命令,同时利用抓包软件检测模组的传输速度,图8为抓包软件所测的模组传输速度图,图9为LabVIEW的上位机测试图。由图可知,所搭建的无线传输模块可以完整接收下位机的采集数据,且无线网络传输模块的传输速度平均速度为6 Mbit/s,硬件选型符合后续实验要求,网络通讯功能正常。
图8 模组传输速度图
图9 上位机测试程序图
基于生物行为研究和仿生行为研究的需求,采用模块化的方式搭建了32通道的数据采集系统。系统选择以STM32作为主控核心,ADS8528芯片作为多通道模数转换模块,ALK8266作为无线传输模块。根据所选的芯片手册对芯片进行硬件电路和软件程序设计,并且在软件程序方面通过移植RT-Thread多线程操作系统来提升系统的运行速度。通过实验验证,该数据采集系统能够实现单路630 kSPS,32路106 kSPS转换速率,模数转换误差在0.3%以内,无线网络传输功能正常,能够满足使用需求。