多通道AD采样同步设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
64 | 电子制作 2019年02-03月
变,也可进行试验过程中所需电压、电流等物理量的测量。在数据测量过程中,如果采集通道数量较多,采集速度要求较高时,如何保证多个测量点的测量数据保持同步性是如今数据采集系统设计中需要解决的问题。保持多块采集板卡之间的同步性,可以使用时钟同步线,或者以太网同步时间戳等方式完成。基于单块采集板卡多通道之间的同步设计问题是本文的研究内容。
在具体介绍本文的设计之前需要解释两个问题:①为了保证单块板卡多通道同步问题,采集板卡的硬件设计显然不
能使用单一AD 芯片加多通道切换方式,因为通道切换产生
的时间间隔就已经使得各通道之间不能保持同步;②多个AD 芯片寄存器的同步读写可以使用FPGA 作为很好的解决方案,但是考虑到FPGA 使用门槛较高,并且在完成数据采集系统其他功能,例如:CAN 总线通讯、以太网通讯、触摸屏显示等方面不是那么的方便快捷。所以本文采用飞思卡尔的i.MX6Q 处理器加多路AD7734作为硬件结构,在此基础
上完成多通道的同步采集设计。
作为转换芯片,每一个AD7734芯片有四路采样输入通道可供切换,可以满足每一个测量通道三路不同种类模拟信号的采集。具体AD 转换电路见图1。
AD7734数模转换芯片共有4个模拟输入口AIN0~
AIN3,可以通过操作相应寄存器进行四个通道的切换采样。最高可接受10V 单极或双极电压输入,并具有超量程或欠
量程检测功能。与主控芯片连接的通讯口共6个管脚功能如表1所示。
表1 AD7734 IO管脚定义
管脚功能
SCLK 寄存器操作时钟DOUT
寄存器读取管脚DIN 寄存器写入管脚C _____
S
片选
R ________D Y
数模转换完成标志位管脚
R ____________
E S E T
复位管脚为了能够保证采集模块中8个AD 转换芯片的同步操作,
硬件设计示意图如图2所示(图中只示意性的画了4个AD 芯片)。
图1 AD 转换电路图
信息工程
图2 多路AD7734硬件设计示意图
本设计将8个AD芯片的R____________ESET管脚合并为一个管脚,8个SCLK管脚也合并为一个管脚,分别与i.MX6Q处理器的IO口相连接。这样可以尽量的减少芯片之间控制的延时,并且节省CPU的IO资源。在SCLK信号从置位状态变换为复位状态后,每一位的写入和读出都同时操作8个DIN管脚与8个DOUT管脚,保证了8路AD转换的同步性。
2 软件设计介绍
本文项目在i.MX6Q处理器和Liunx操作系统下开发,对AD7734芯片的操作以AD驱动模块的形式完成,在驱动程序中,可以完成AD设备的注册、AD设备的初始化、AD 设备的读和写操作、AD设备的注销等操作。
在驱动程序中,对寄存器读写程序如下所列:static ssize_t spi0_read(struct file*filp,char__user *buf,size_tsz,loff_t*off) //AD7734读操作
{
unsigned char value[8]={0},data[8]={0},value1[8]= {0};
int i,j;
gpio_set_value(SABRESD_ADC01_DIN,0);
//八通道AD片选使能,输入管脚复位
gpio_set_value(SABRESD_ADC01_CS,0); gpio_set_value(SABRESD_ADC02_DIN,0); gpio_set_value(SABRESD_ADC02_CS,0); gpio_set_value(SABRESD_ADC03_DIN,0); gpio_set_value(SABRESD_ADC03_CS,0); gpio_set_value(SABRESD_ADC04_DIN,0); gpio_set_value(SABRESD_ADC04_CS,0); gpio_set_value(SABRESD_ADC05_DIN,0); gpio_set_value(SABRESD_ADC05_CS,0); gpio_set_value(SABRESD_ADC06_DIN,0);
gpio_set_value(SABRESD_ADC06_CS,0); gpio_set_value(SABRESD_ADC07_DIN,0); gpio_set_value(SABRESD_ADC07_CS,0); gpio_set_value(SABRESD_ADC08_DIN,0); gpio_set_value(SABRESD_ADC08_CS,0);
for(i=0;i<8;++i)
{
gpio_set_value(SABRESD_ADC_SCLK,0);
//SCLK信号复位
data[0]=gpio_get_value(SABRESD_ADC01_ DOUT);//读DOUT管脚值
data[1]=gpio_get_value(SABRESD_ADC02_DOUT); data[2]=gpio_get_value(SABRESD_ADC03_DOUT); data[3]=gpio_get_value(SABRESD_ADC04_DOUT); data[4]=gpio_get_value(SABRESD_ADC05_DOUT); data[5]=gpio_get_value(SABRESD_ADC06_DOUT); data[6]=gpio_get_value(SABRESD_ADC07_DOUT); data[7]=gpio_get_value(SABRESD_ADC08_DOUT); gpio_set_value(SABRESD_ADC_SCLK,1);
//SCLK信号置位
for(j =0;j<8;j++)
{ value[j]|= data[j];
if(i<7)
value[j]<<=1;//将读取的值写入value数组
} }
if(sz!=1)
//因为AD使用16位精度,需要读取两次共16位{ for(i=0;i<8;++i)
{ gpio_set_value(SABRESD_ADC_SCLK,0);
//SCLK信号复位
data[0]=gpio_get_value(SABRESD_ADC01_ DOUT);//读DOUT管脚值
data[1]=gpio_get_value(SABRESD_ADC02_DOUT); data[2]=gpio_get_value(SABRESD_ADC03_DOUT); data[3]= gpio_get_value(SABRESD_ADC04_DOUT); data[4]=gpio_get_value(SABRESD_ADC05_DOUT); data[5]=gpio_get_value(SABRESD_ADC06_DOUT); data[6]=gpio_get_value(SABRESD_ADC07_DOUT); data[7]=gpio_get_value(SABRESD_ADC08_DOUT); gpio_set_value(SABRESD_ADC_SCLK,1);
//SCLK信号置位
for(j=0;j<8;j++)
www�ele169�com | 65