本帖最后由 emouse 于 2013-12-29 19:09 编辑
设计思路+电路设计+程序设计+测试与仿真结果
更新中……
2#程序代码
3#个人设计的一些心得体会
其他内容根据回复适当更新。
希望各位支持,也希望指点交流。
如果您觉得此帖内容对你有所帮助,欢迎点击右下角评分。
内容简介 ADS8364是TI应用非常广泛的一款具备6个通道采样的高速AD,多应用与电机控制、电力系统检测等应用。在很多高速采样系统中,为了能够完成数据的实时采集与处理,可以使用FPGA控制完成数据采集与处理,由于FPGA的并行处理优势,相对于传统的通过MCU或者DSP的控制采集方式,这种方式有着更好的实时性。
这个帖子就以ADS8364为例,给大家谈谈在应用FPGA控制并行AD的采集与处理方面的一些设计心得。这样的设计相对于其他芯片一样是通用的。这个只是我设计的一些方法,如果有更好的方法,欢迎各位指教。
ADS8364简介
这个片子用的非常广泛,因此我先来简单介绍下。
ADS8364是美国TI公司的一款单5V供电的16位高速、低功耗、6通道同步采样模数转换器,片上带有2.5V电压基准信号,可用作ADS8364的参考电压。ADS8364输出总线为16位,无误码采样精度为14bit,可以较好地满足有源电力滤波器测量的精度需要。ADS8364实际上由3个最高转换速率为250KSPS(最高输入时钟为5MHz)的逐次逼近式ADC单元构成,每个ADC单元有两个模拟输入通道(称为一组),因此可以很灵活地同时采1~3组模拟信号。6个输入通道都有带宽为300MHz的采样保持器,由于6个通道可以同时采样保持后被采样,ADS8364很适合用于需要同时采集多种信号的场合。
硬件设计 ADS8364内部有一个+2.5V的参考电压源,可以直接作为AD的参考电压,也可以使用外部的参考电压源,使用外部参考电压源的电压范围为1.5V-2.6V。在本设计中使用内部的参考电压源,由于内部参考电压源的驱动电流只有10μA,因此设计了两级电压跟随电路,保证内部参考电压源有足够的驱动能力。
ADS8364的模拟部分电源和数字部分可以分开供电,这样可以很灵活的适应不同系统的需求,在本课题中由于CPLD使用的是3.3V电平信号,而模拟信号的输入范围是0-5V,因此本课题中使用两个不同的电源对ADS8364供电,AVDD、DVDD使用5V的电源,而和总线缓冲器相关的BVDD使用3.3V电源,同时不同电源之间加入去耦和滤波电路保证ADS8364能够稳定工作。
ADS8364具有六个差分输入通道,但是在本课题中采样信号为单端输出,因此需要将ADS8364接成单端的方式,在本设计中每个差分通道的负输入端接到参考电压上,这样0-5V的输入相对于参考电压实际上就变成了-2.5V-2.5V的参考输入,不仅充分利用了AD的输入范围,也方便软件部分的数据处理。电路图如图所示。
程序设计 ADS8364的数据通信格式 ADS8364采用的是并行总线的通信方式,由于内部有3个ADC转换单元,因此在硬件上对应的有3个启动转换信号HOLDA-HOLDC,对应的启动转换信号给出低电平就会启动对应ADC转换单元的转换。在转换完成后ADS8364会自动输出半个时钟周期的EOC信号,CPU可以根据此信号开始数据的读取。ADS8364的读取时序图如图所示。
ADS8364 的时钟信号由外部提供,模数转换时间为20个时钟周期,最高频率为5 MHz,此时ADS8364的转换时间为3.2 μs,相应的数据采集时间为0.8 μs,每个通道的总的转换时间仅为4 μs,在A/D转换完成后产生转换结束信号/EOC(低电平信号)实际测量到的信号如图所示。
基于状态机的ADS8364读写程序根据ADS8364的信号时序在FPGA中设计读写时序,实际发现在FPGA中的程序要比在DSP、ARM等芯片中略有麻烦,主要有以下两个原因:
(1) 和单片机类的控制器相比FPGA中没有硬件的外部中断信号,虽然可以使用电平触发来实现但是由于EOC信号只有半个时钟周期的宽度,在一ADC时钟为时钟的进程中无法捕捉到这半个周期的信号。通过其他方式可以实现,但是逻辑实现上要稍微麻烦一点。 (2) FPGA并行执行的特点和进程的限制可以保证程序高速的执行,但是在程序设计时就相对不是那么方便。
基于以上两点,这里采用状态机的方法实现ADS8364部分的程序设计。仔细阅读ADS8364的手册发现,虽然在FPGA中无法方便的获取EOC转换结束信号,但是ADS8364的转换一定会在16.5个时钟周期内完成,因此在程序设计上转换信号发出后固定等待17个ADC时钟周期,然后进行数据的读取。读取流程如图所示。
按照ADS8364的读取时序,在程序中使用了st0-st2223个状态,每个状态对应一个12位的数据,定义如下: constant st0 :std_logic_vector(11 downto0):="000000100000";
在这12位的状态标志中有高至低依次为转换启动信号位HOLDA-C(11-9),地址位ADC A-C(8-6),读信号位RD(5),状态机状态位(4-0)。 在ADS8364的读取进程中,根据状态机状态位对23个状态依次切换,从而完成了一个完成读取时序,仿真波形如图所示。
数据处理由于ADS8364为差分输入AD,其数据输出为补码形式,按照2.5V的参考电压源输出的数据范围为-32768~+32768,如果AIN- 连接到VREF(2.5V),那么当AIN+ 输入为0时输出的数据为0x8000,如果AIN+ 输入为2.5V则输出数据为0x0000,AIN+ 输入为5V时输出数据位0x7F,具体表示如图所示。
在本设计中,采用的是单端的方式连接,即AIN- 连接到VREF(2.5V),因此为了方便数据的读取需要对数据做一个格式转换,转换后0-5V对应0x0000~0xFFFF。VHDL实现程序如下: adc_data_buf(14downto 0) <= adc_d(14 downto 0); adc_data_buf(15)<= not adc_d(15);
这样补码输出的数据格式就转换成了常用的0x0000-0xFFFF格式,便于计算和处理。由于采集到的数据波动比较大,为了是测量更加准确,需要在不影响采样精度和速度的基础之上进行相应的数据处理,由于ADS8364在高速采样的情况下数据量比较大,为了保证采样数据的充分应用首先对数据进行求平均处理。然而由于CPLD没有硬件乘法器,如果直接进行累加求平均会消耗大量的片内资源,甚至无法完成,因此在程序设计中定义一个23位的变量对16位的采样数据进行累加,累加了128次后,舍弃低七位,得到的数据便是128次的平均值,这种方式有效节省了片内资源。
|