随着计算机技术与现代工业系统的发展,工业领域中对数据采集的精度和数据处理的实时性提出了更加苛刻的要求,以保证后续更加复杂的控制,而传统的数据采集系统一般采用A/D 芯片与主控芯片搭配的方法,处理速度慢、功能单一,当被测对象复杂且数据量较大时,很难满足对数据高精度的采样,而通过RS232 串口与上位机通信则更无法保证数据处理的实时性。针对这一实际情况,设计了基于FPGA 与ARM 搭配的数据采集系统,FPGA 负责保证数据采样的高精度和高速度,而ARM 作为主控芯片,嵌入Linux 内核,负责控制整个系统,并将数据通过USB高速上传到上位机中,借助上位机的强大运算能力,保证数据处理的实时性,同时根据不同的被测信号只需选择相应的数据采集卡,即可方便简单地组成一个用户自定义的数据采集系统,具备良好的通用性。
1 系统总体设计
数据采集系统的总体结构如图1 所示,主要由输入调理电路、A/D 转换电路、FPGA 和ARM控制电路组成。被采集的模拟信号经由调理电路输入到A/D 转换芯片,进行模数转换,在FPGA的控制下送入到FPGA 内嵌的FIFO 存储模块中并通知ARM 立即取走数据,最后通过USB 交由上位机进行实时处理。
2 FPGA 系统设计
FPGA 具有高集成度、高可靠性、低功耗及时序控制精确等优点,选用Xilinx Spartan3 系列的XC3S200 负责控制A/D 转换及数据的缓存,可以简化电路设计,缩短开发周期。ARM 选用Atmel公司的SAM9G45 芯片,工作频率达400MHz,能够保证实时高速地控制采集系统和上传数据。
2. 1 FPGA 与ADC 的连接与控制
数据采集芯片选用ADI 公司的AD7656,是一款六通道16 位逐次逼近型,低功耗,每路通道最大采集速度为250kS /s 的A/D 转换芯片,可实现较高的采样精度和速率。
FPGA 与AD7656 的连接如图2 所示,AD7656 的6 个采样通道被分为3 组,由CONV STA、CONV STB 和CONV STC 3 个信号启动对应的双通道同步采样,将该3 个引脚相连即可实现6个输入通道的同步采样,同时提供并行和串行接口两种模式,为了提高数据吞吐率,采用16 位( /B 引脚置低) 的并行接口( SER/引脚置低) 模式,以便与FPGA 的16 位数据线直接相连传输数据。
FPGA 中的A/D 控制模块通过将CONV ST引脚电平拉高,启动相应通道的采样,采样过程中BUSY 引脚为高电平,表示正在进行采样; 当采样完毕后,AD7656 自动将BUSY 置低; FPGA 中的A/D 控制模块检测到BUSY 信号为低后将CS 和RD 信号置低,读取并保存数据到FPGA 内部的FIFO 中。FPGA 对AD7656 的控制过程仿真如图3 所示。
2. 2 FPGA 与ARM 的连接
FPGA 与ARM 的连接如图4 所示,在与ARM的通信中,由于是跨时钟域通信,为了避免亚稳态、采样丢失及潜在逻辑错误等情况的发生,采用脉冲边缘检测法,对ARM 传来的控制信号首先进行内部时钟同步再做后续处理。
FPGA 收到ARM 的RST 命令后控制AD 芯片开始采样,检测到BUSY 引脚为低后FPGA 将数据取走并缓存到FIFO,然后改变INT 引脚上的电平,向ARM 产生一次中断; ARM 每判定一次中断,通过CLRINT 给予FPGA 反馈,FPGA 在CLRINT 有效期内将不再产生中断; ARM 使能NCS 和NRD 信号通过数据线D[15: 0]将数据完全取走后,清除CLRINT 信号,以使FPGA 可以继续向ARM 产生中断。
FPGA 中断控制模块的状态转移过程如图5所示,当BUSY 信号为低并且已将数据缓存到FIFO 中后, INT 引脚置位产生中断,同时启动一定时器。若在定时期间CLRINT 有效,则认为ARM 正常响应了中断; 若直到定时结束,CLRINT一直无效,则认为ARM 未能检测到中断或不能正常响应,FPGA 等待一小段时间后再次产生中断。
3 ARM 系统设计
ARM 芯片嵌入Linux 3. 0. 4 版本的内核,通过开发设备驱动程序,能够稳定高速地处理FPGA数据并通过USB 实时上传到主机中。
3. 1 FPGA 驱动程序
FPGA 驱动主要负责控制并读取FPGA 数据,并将数据缓存到KFIFO 等结构中工作:
a. 管理RST 信号线,控制FPGA 进行采样。
b. 根据硬件电路调用为FPGA 申请指定区域内存,由于芯片带有MMU 单元,不能直接访问申请的物理内存,需要将申请到的内存区重新映射到虚拟地址。当对该内存区进行读访问时,NCS 与NRD 信号会由内核负责置为低有效。
c. 为INT 信号申请中断线,注册中断处理例程。中断发生后,将CLRINT 置高有效,从映射的虚拟地址读取数据并保存在KFIFO 中。
d. 重新使能中断线,等待下次中断。
KFIFO 是由Linux 内核提供的先进先出队列,能够快速稳定地缓存数据。FPGA 驱动程序将KFIFO 符号导出,以使USB 驱动程序也可以直接访问然后将其上传到主机中。
3. 2 USB 驱动程序
Linux 内核为USB 设备侧驱动提供了USB Gadget 框架,提供了良好的上层接口,隐藏了底层USB 规范的具体实现。设备侧的USB 驱动程序需要提供一个读端点0x01,读取上位机的控制信息; 写端点0x82,向上位机报告当前采集系统的状态; 写端点0x83 将采集数据上传到上位机中。主要实现过程如下:
a. 配置3 个USB 端点描述符( 一个读端点0x01,两个写端点0x82 和0x83) 。
b. 从0x01 端点接收到上位机的采样命令后,进行初始化工作,通知FPGA 开始采样。
c. 为request 结构分配内存,将KFIFO 缓冲区的采样数据拷贝到request 包中。request 结构类似于Windows 下的URB( USB Request Block)请求包。
d. 向0x83 端点提交写请求,将request 包中的数据通过USB 上传到主机中。
e. 如果采样过程中发生错误,如缓冲区溢出等情况,通过0x82 端口向上位机汇报,请求重启。
上位机USB 驱动程序使用Driver Studio 工具,以Visual Studio 2010 作为辅助开发环境。上位机只需与数据采集设备配置同样的USB 端点,通过0x01 端口向ARM 发送控制命令,从0x82 端口读取采集系统的状态信息,将从0x83 端口接收到的数据缓存后待上层数据处理程序读取。
4 系统总体流程与试验
采集系统的工作流程如图6 所示,系统上电后ARM 引导Linux 启动,初始化内部寄存器及板卡上的RAM,向内核装载USB 驱动及FPGA 驱动,初始化FPGA 和配置AD7656 工作模式。初始化完毕并接收到主机采样命令后,A/D 开始进行采样,系统进入等待数据状态; 采样结束后拉低BUSY 引脚触发FPGA 通知ARM 来读取数据。ARM将FPGA传来的数据及系统状态信息通过USB 迅速上传到上位机中,上位机根据具体应用进行数据处理等操作,完成一次采集工作。
采集系统在实际试验中,AD7656 每次完成6通道的采集转换需3μs,FPGA 实际工作时钟频率为40MHz,ARM 的主时钟频率( MCK ) 为133MHz,因此数据从FPGA 上传到主机所需时间小于1μs,即4μs 内就可以完成一次采样,满足系统每周期采样256 次的需求。对50Hz 交流电信号每个周期采样128 个点,采样结果如图7 所示。
5 结束语
采用FPGA + ARM 芯片组合的数据采集系统,FPGA 负责采样控制,ARM 负责整个系统的逻辑控制,通过USB 总线上传到上位机处理。整个系统采样精度高,数据传送快,能够满足现代工业系统中对多通路、高精度、高速度、实时处理和易操控的复杂需求,同时借助Linux 内核,针对不同领域不同应用,可轻松进行二次开发,将有广阔的应用前景。