多通道并行采集在Linux主板上的实现

 2022-8-4 16:22:35     作者:黄志超    

英创公司推出了支持多通道同步采样ADC的工控主板ESM7080,板载了8路16位同步AD,最高采样率可达200KSPS,关于具体的指标可以参考文章英创推出多通道同步采样ADC工控主板中的介绍。


这套方案利用了CPU i.MX7D的异构核心优势,使用Cortex-M4核心来控制8路AD,保证了数据读取的实时性,M4读取到数据后会通知Linux系统,再由Linux系统从缓冲区中将M4存放的数据一次性读出。为了方便客户的使用,英创公司提供了Linux系统上的专用驱动,将这8路AD作为了IIO子系统(Linux Industrial I/O Subsystem)中的设备,这样用户就可以通过标准的IIO接口操作来读取AD数据,而不必关心和Cortex-M4核心相关的交互操作。下面就来介绍在ESM7080主板上采集数据的相关设置。


因为是实现的同步采样,所以Linux系统中,将8路AD作为了一个整体的设备,设备目录为/sys/bus/iio/devices/iio:device0/,目录中的文件如下图

image.png


其中比较重要的几个文件的说明如下:


设备或目录名称简介
in_voltage_sampling_frequency设置或读取当前采样率
sampling_frequency_available读取in_voltage_sampling_frequency可以设置的有效值,具体见表2
in_voltage_scale设置或读取当前采样电压范围,有两个范围,0表示-5v~+5v,1表示-10v~+10v
in_voltage_scale_available读取in_voltage_scale可以设置的值,即0和1
scan_elements(目录)用于使能连续采样通道
trigger(目录)用于使能连续采样的trigger
buffer(目录)用于开启连续采样

表1

        

sampling_frequency_available可以读取出支持的采样率:


设备名称支持的采样率(Hz)
sampling_frequency_available20,40,100,200,400,1000,2000,4000,10000,20000,40000,100000,200000

表2


表1中文件的读取和写入都可以通过标准文件的读写操作来实现,也可以通过libiio库提供的函数接口来进行设置。


英创公司建议客户还是通过libiio库来实现连续采样,在之前的文章中我们已经做过详细的介绍《基于Linux IIO接口的波形采集》。因为ESM7080主板的AD也是基于IIO子系统提供的接口,所以程序是完全一致的,这里就不再赘述了。下面说明关于ESM7080的AD在使用的时候需要注意的一些地方。


因为将8个同步采样的AD通道作为了一个整体设备,所以一次读取出的数据是以16字节为单位的(一个通道16位为2个字节,一共8个通道),数据的具体排列方式如下:

字节偏移量对应数据
0通道1
2通道2
4通道3
6通道4
8通道5
10通道6
12通道7
14通道8
16通道0
......

表3


关于采集数据的时候负载情况,我们实际测试在100K和200K采样率下,连续采集并将数据写入到磁盘的过程中,系统负载的情况如下:


采样率负载情况
200K30%
100K15%

表4


根据表3的情况,可以看到在200K采样率的情况下,还留有足够的CPU资源给用户进行处理数据。


下面是在100K采样率下进行的一次波形采集测试。我们在通道1和通道2上分别接入了100Hz的正弦波和三角波,其余通道接入了一个固定电平信号,使用基于libiio实现的例程采样了16000个点(每个通道2000个点),然后利用gnuplot工具将采样值按照通道排列的格式绘制成曲线图,结果如下:

image.png



可以看到图中绘制每个通道采集的2000个点中,通道1和通道2刚好是2个周期。100K采样率下,100Hz的波形每个周期应该是采样1000个点,刚好是对应上的。另外6通道接入了固定电平信号,所以是一条直线。


对这套方案感兴趣的客户可以与英创公司的工程师联系,索取相关资料和例程.