1、综述
ETA108是英创公司推出的一款低成本高性能的AD采集模块,相比英创公司的其他数据采集扩展模块,ETA108的一个主要特点是支持硬件周期脉冲触发AD采集,因此ETA108非常适合应用于要求高精度采样间隔的波形数据采集。ETA108波形数据采集模块可广泛应用于多通道波形记录仪、电力谐波分析、故障录波、振动信号分析、瞬态信号采集、通用数据采集等多种应用领域。现ESM335x Linux已支持ETA108数据采集模块。
ETA108性能:
• 8通道单端输入或4通道差分输入
• 输入量程0~4.096V
• 每通道具有独立的高阻抗增益放大器(PGA),可实现各种传感器之间的直接接口连接,并支持用户配置通道增益Gain=1/2/4/8)
• AD转换精度12bit
• AD最高采样速度100ksps
• 可选择多种平均操作模式,使输出AD精度达到14bit。其中有快速平均和精确平均两种模式可以选择。快速平均模式:对4,8或16次采样结果做平均,可增加AD分辨率到14bit,快速平均模式适用于输入到PGA的信号比较稳定的情况。精确平均模式:对4,8或16次采样结果做平均,可得到比快速平均模式更精确的采样结果。此模式在输入信号不太稳定的情况下适用。
使用4次平均模式总采样速率不得高于20ksps,使用8次平均模式总采样速率不得高于10ksps,使用16次平均模式采样速率不得高于5ksps。当用户采用默认设置进行采样时,我们的驱动会根据用户设置的采样速度进行设置,使用能够达到的最高平均模式以提高采样精度。用户也可自行设置。
关于ETA108更详细的参数以及设置方法请参考《ETA108数据采集模块应用手册》(Linux)。
2、应用程序接口
1、驱动程序
在使用ETA108之前,需要在系统中先加载ETA108的驱动程序。我们提供eta108.ko驱动模块,用户使用insmod /(目录)/eta108.ko 命令就可以加载驱动。
为了实现ETA108的高速数据采集,在其驱动程序中,充分利用了ESM335x的高性能DMA技术,从而保证了ETA108与ESM335x主板之间仅靠简单的4线制SPI接口就实现了硬件连接,同时,DMA技术的引入,也将数据采集对系统性能的影响降到最低。考虑到实际应用,ESM335x ETA108驱动程序支持单次采样模式和连续采样模式,两种模式下驱动每采集到512个点的数据(1kB数据大小)或者采样结束就会通知用户程序,建议应用程序中select函数和read函数一起使用尽快读出数据,以避免驱动维护大量的数据缓存。
连续采样处理流程
驱动程序中进行设置的eta108_config结构体。
eta108_config结构体是ETA108的配置数据结构体,包含了采样率,采样长度,采样通道设置,通道寄存器配置等参数。其定义如下:
struct eta108_config
{
unsigned int rate;
unsigned int count;
unsigned int channel;
void *config;
unsigned int config_len;
};
在我们提供的驱动程序中,eta108_config结构体即可用为函数的输入参考,其结构体成员含义说明如下:
ADS_CONFIG结构体定义
成员 | 定义 / 输入参数 |
rate | 设置总的采样率,每通道采样率= rate/通道数 |
count | 设置每个AD通道的采样次数>0:单次采样=0:连续采样 |
channel | 设置需要采样的通道,对应位置1 |
config | 指向AD通道配置的buffer,此参数用于设置ETA108的寄存器,config =NULL时,系统将使用默认配置 |
config_len | config指向buffer的长度 |
ETA108单通道采样时采样速度可以达到100ksps,如果多通道采样,由于内部通道转换需要时间,最高只能达到50ksps,rate设置需要满足此限制。channel的低8bit(bit0~bit7)依次对应AD通道0~通道7,如果要采集某个通道的数据,需要将其对应的位置为1。比如要采集通道0、通道1和通道7的数据,则应设置channel=0x83;差分模式下只需设置差分通道中的一个通道的对应位为1,比如通道0、通道1在差分模式下工作,只需将0通道位置1,设置channel=0x1。
2、ETA108驱动输入输出数据格式:
用户可以对ETA108的进行设置以改变ETA108工作模式,eta108_config中config指向的buffer格式为:
bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
data | 1 | 0 | A3 | A2 | A1 | A0 | 0 | 0 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
寄存器写
允许的设置及其意义详见《ETA108数据采集模块应用手册》(Linux)。
读取采样数据的格式如下(unsigned short):
bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
data | D13 | D12 | D11 | D10 | D9 | D8 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 0 | 0 |
ETA108转换结果
其中第0、1位总是0,第2、3位为平均模式下增加的2位分辨率,如没有采用平均模式则此两位为0,第3-15位为12bit的AD数据。多通道采样模式下,应用程序从驱动中读得的AD数据是按通道依次存放的,低通道在前,比如应用程序同时连续采集CH1,CH2,CH5三个通道,read()函数读得的AD数据存放为CH1、CH2、CH5、CH1、CH2、CH5、CH1………,每个通道16bit。
ETA108的量程为0~4.096V,则可得D13~D2这12bit的数据对应的转换关系如下表,用户可据此换算数值:
理想情况下的AD转换结果
描述 | 模拟量输入 | 数字量输出 | |
满量程范围 | 4.096VREF | 二进制 | 十六进制 |
最小分辨率(LSB) | VREF/4096 | ||
满量程 | VREF-1LSB | 1111 1111 1111 | FFFF |
1/2量程 | VREF/2 | 1000 0000 0000 | 8000 |
1/2量程 - 1 LSB | VREF/2-1LSB | 0111 1111 1111 | 7FFF |
零 | 0V | 0000 0000 0000 | 0000 |
3、接口函数
1)加载设备驱动:
#:insmod /(目录)/eta108.ko
会自动创建设备文件 /dev/eta108
2)打开设备文件-open:
int fd = open ( "/dev/eta108", O_RDWR, S_IRUSR | S_IWUSR );
3)设置采样参数-write:
struct eta108_config transfer;
memset ( &transfer, 0, sizeof(transfer) );
transfer.rate = 100000; //采样速率
transfer.channel = 0x1; //采样通道
transfer.count = 10000; //每通道采样次数
//自定义设置,此处为0通道设置GPA放大2倍,设置为NULL时采用默认设置
unsigned short cmd[1] = {0x8004};
transfer.config_len = 2; //2字节
transfer.config = cmd;
if(write ( fd, &transfer, sizeof(transfer) )<0)
{
printf ( "WRONG!!!!!!!!!!!!!!!!\n" );
exit ( 1 );
}
4)启动采样:
if(ioctl ( fd, ETA108_START, &transfer )<0)
{
printf ( "START WRONG!!!!!!!!!!!!!!!!\n" );
exit ( 1 );
}
5)停止采样:
if(ioctl ( fd, ETA108_STOP, &transfer )<0)
{
printf ( "STOP WRONG!!!!!!!!!!!!!!!!\n" );
exit ( 1 );
}
6)读取采样数据-read:
驱动内部每采集512个点(1kB)的数据或者采样结束就会通过select函数通知应用程序,建议应用程序中尽快读出数据,进行存储或者计算,read函数返回实际读取的字节数。
int count_in_byte = 0;
int read_count=0;
char read_buf[transfer.count*2*1]; // 1个通道,每个数据2个字节
char *real_read = read_buf;
for ( i=0; count_in_byte
{
FD_ZERO(&fdRead);
FD_SET(fd,&fdRead);
aTime.tv_sec = 2;
aTime.tv_usec = 0;
ret = select ( fd+1, &fdRead, NULL, NULL, &aTime );
if ( ret<0 )
printf( "select, something wrong!\n " );
if ( ret>0 )
{
if ( FD_ISSET(fd, &fdRead) )
{
read_count = read(fd, real_read, 1024);
if ( read_count<0 )
{
printf ( "READ WRONG!!!!!!!!!!!!!!!!\n" );
exit ( 1 );
}
real_read += read_count;
count_in_byte += read_count;
}
}
}
7)关闭设备文件:
close ( fd );
用户如需使用ETA108数据采集模块,请和我们联系。
-
Linux
+关注
关注
87文章
11292浏览量
209322 -
嵌入式主板
+关注
关注
7文章
6085浏览量
35295
发布评论请先 登录
相关推荐
评论