admin 发表于 2021-1-25 16:21:58

【ACX720】ACM7606 数据采集FIFO存储UART数据发送实验

2022年10月4日重新上传,添加了仿真代码,修改了ad7606_driver中采样率设置的一个小bug

附件为在ACX720开发板上配合ACM7606型8通道16位同步采样ADC模块设计的数据采集传输系统。
该系统基于UART串口实现指令的下发和采集数据的接收,支持调整AD7606的采样速率,支持设置AD7606的8个通道中哪些数据被传输,支持设置一次采样多少个数据。更多详细介绍,后补吧,困了。:(


AD7606_Driver控制器模块应用说明

设计名称:ad7606_driver.v
设计功能:控制AD7606型8通道ADC芯片执行数据转换并读取每一个通道的结果输出。

功能简介:
该控制器实现了对AD7606型8通道16位ADC的数据转换控制并输出。使用该控制器时,用户无需关心AD7606的具体控制时序,一切都在控制器内部完成,用户只需要像使用并行ADC一样取用数据即可。我们为该模块分别提供了基于Verilog的数据采集方案和基于NIOS II CPU的应用方案。

接口说明:该控制器接口分为四个类,第一类为时序逻辑模工作所必须的时钟和复位信号(Clk、Reset_n),第二类是AD7606控制器与AD7606芯片管脚相连的各种功能控制和数据信号,第三类是设置控制器工作状态/工作数据的用户控制接口,第四类是控制器的结果输出接口。对于用户来说,只需要关注第三类和第四类接口的使用,即可快速高效的使用该控制器来控制AD7606芯片完成数据转换。



类信号名位功能简介

Clk1系统时钟,为了让采样速率准确,要求为50MHz
Reset_n1系统复位,低电平复位
控制信号Go1采样使能信号,为高电平就使能采样,低电平则在已经开始的一轮采样结束后,停止下一次采样。
Speed_Set25采样速率控制端口,Speed_Set= 1000000000/20/speed - 1
Conv_Done1一次采样完成标志信号,单时钟周期脉冲信号。每次8个通道结果都输出后,产生一个高脉冲信号。
数据结果输出端口和标志信号data_flag8转换结果有效标志信号,因为AD7606有8个通道,转换结果是依次输出,并非同时的,所以设置8个Flag信号,每个通道的结果就绪之后,就产生一个Flag信号,通知外部可以取用。另外,如果只关心其中的部分通道,则只需要关心data_flag中对应的位即可。
data_mult_ch16多通道数据输出端口,该通道16位,在不同的时刻,输出不同通道的转换结果,使用时,与data_flag信号配合,data_flag的哪一位出现高脉冲,则代表当前data_mult_ch的值为该通道的转换结果。该端口设计的目的是用于往FIFO、RAM等存储器中存储结果时使用。
data1..8168个通道的采样结果输出端口,每个端口分别对应一个模拟通道的采样结果,使用时与data_flag信号配合,每当data_flag中的某一位为1时,则对应的通道上的16位采样结果已经就绪,可以使用。这些端口主要用于每个通道的数据需要分别应用的场合。
ADC芯片控制信号
ad7606_cs_n_o1ad7606芯片选中控制信号,可以从AD7606中读取转换结果时,需要使该信号为低电平。
ad7606_rd_n_o1ad7606转换结果读取信号,该信号的下降沿, AD7606将特定通道的采样结果送到16位数据线上,供外部读取。外部可以在rd_n信号的上升沿读取16位数据线上的结果。
ad7606_busy_i1ad7606转换状态标志信号,为高电平则表明ad7606当前仍处于转换状态,结果没有更新,如果此时读取,读取的结果就还是前一次的采样转换结果。需要待该信号变为低电平之后,再读取ad7606中的数据。
ad7606_db_i16ad7606的15位数据线,读取时,输出对应通道的转换结果。
ad7606_os_o3ad7606过采样控制信号,使用过采样可以进一步提高ad7606的采样精度,使用过采样会降低ad7606的有效转换速率,关于过采样的功能和使用方法,可以参考ad7606的datasheet,默认为0,则表示不使用过采样。能够运行在最高的转换速率(200Ksps)
ad7606_reset_o1ad7606的复位信号,复位ad7606内部各个功能单元的工作状态。
ad7606_convst_o1ad7606转换开始信号,该信号的上升沿启动ad7606内部的采样转换逻辑开始新一轮的采样转换。





典型使用案例。
1、      使用data_flag和data_mult_ch进行多通道连续数据采集。
如果一个案例,需要以特定的采样速率多次采样一个或多个通道的数据,则可以使用这两个接口实现。每当data_flag中任意一位为1,则将data_mult_ch中的值写入FIFO或者RAM中。由于FIFO和RAM等存储器,只有一个数据输入接口,所以这个时候用一个data_mult_ch端口分时输出不同通道的采样结果,就比使用data1~data8这8个16位的数据端口分别输出各自通道的采样结果要方便。
例如, 将通道1、2、5、8的采样结果存入FIFO。就可以使用下面的写法。

module adc_wr_fifo(    input Clk,    input Reset_n,    input [7:0]data_flag;    input [15:0]data_mult_ch;    output reg fifo_wrreq,    output reg [15:0]fifo_data);     always@(posedge Clk or negedge Reset_n)    if(!Reset_n)begin      fifo_wrreq <= 0;      fifo_data <= 0;    else if(data_flag == 8'b1001_0011)begin      fifo_wrreq <= 1'd1;      fifo_data <= data_mult_ch;    end    else begin      fifo_wrreq <= 0;      fifo_data <= fifo_data;              end endmodule


2、      将控制器当做一个MCU的ADC控制器外设。
转换结果得到后,由CPU(8051或者NIOS II)以寄存器形式的方式读取。这种情况,每个通道的采样结果是按照实际需要由寄存器分别读取的,所以这种情况,适合将8个通道的结果分别存放,以寄存器的形式存在,然后由CPU在需要的时候去读取该寄存器的值,以得到对应结果即可。针对此应用案例,我们也提供了一个可以参考的程序,该程序我们将这个控制器封装成了一个Avalon接口的IP,供NIOS II CPU使用。该案例我们有在论坛提供,大家只需要www.corecourse.cn论坛搜索“AD7606”关键词即可。

Go信号使用:
      对于AD7606_Driver来说,什么时候可以执行转换,什么时候停止转换,最好是能够控制。例如在收到某些采样使能信号之后,开始连续采样转换过程,而在采样数据过程达到一定的次数之后,停止采样转换。这就需要有一个控制信号来控制该模块的转换与否。Go信号正是这样一个控制信号,

基于AD7606的数据采集系统
系统介绍
该采集系统能够控制AD7606型ADC芯片采集模拟电压信号,并将选定通道的转换结果存入FIFO中。待指定长度的数据采集完成后,使用串口将数据发送到电脑端。用户就可以在电脑上使用串口接收数据并进行进一步的数据处理分析了。同时,让ADC以多少的采样速率采集哪些通道的总共多少个数据发送,也是可以在电脑上通过发送指令实现的。
功能详解:
1、      用户可以在电脑上发送特定格式的串口数据帧来设置FPGA中与控制功能相关的寄存器。FPGA中共设计了4个寄存器。以下为寄存器介绍:


名称
地址
位宽
功能简介

RestartReq
0
1
重新开始采集请求寄存器,向该寄存器写入任意值即可启动新一轮的采样存储传输。

ChannelSel
1
8
通道设置寄存器,共8位,对应了8个通道的数据存储开关,如果某通道对应的设置位为1,则该通道的采样结果就会被存入FIFO并通过串口发送。

DataNum
2
16
数据个数寄存器,设定总共采集传输多少个数据。注意,该寄存器设置的是总共采集的数据个数,假设设置采集100个数据,而且设置了ChannelSel为0000_0011b,则实际每个通道采样的次数就是50,2个通道的数据加起来是100个。假设设置采集100个数据,而且设置了ChannelSel为0011_0011b,则实际每个通道采样的次数就是25。4个通道加起来采集100个数据

ADC_Speed_Set
3
32
ADC采样速率设置寄存器。该寄存器用来设置ADC每多久执行一次转换。由于ADC的最大采样速率为200Ksps,所以可以通过设置该寄存器的值来让ADC的采样速率在1~200Ksps范围内调整,以适应不同的应用场景。该寄存器的值与采样速率关系为:ADC_Speed_Set = 1000000000/20/speed – 1,其中speed就是实际要设置的采样速率。



串口一次发送的数据内容为1个字节,为了实现通过串口修改这些寄存器的值,需要发送多个字节才能实现,为此,设计了简单的串口数据帧,该帧一帧数据共8个字节,包含帧头、帧尾、地址段、数据段。帧格式如下所示:

数据D0D1D2D3D4D5D6D7
功能帧头0帧头1地址datadatadatadata帧尾
值0x550xA5xxxxxxxxxx0xF0

每帧数据共8个字节,分别用D0~D7表示,其中,D0和D1两个数据作为帧头,其值分别为固定的0x55、0xA5,D7作为帧尾,其值为固定的0xF0。D2则为要操作的寄存器地址,D3为要写入寄存器的数据的24~31位,D2为要写入寄存器的数据的16~24位,D2为要写入寄存器的数据的8~15位,D0为要写入寄存器的数据的0~7位。
例如,PC端要设置采样数据个数(DataNum寄存器,地址为2)为16000(0x3E80)个,则发送的数据帧内容为:0x55 0xA5 0x02 0x00 0x00 0x3E 0x80 0xF0。
例如,PC端要设置采样速率(ADC_Speed_Set寄存器,地址为3)为100K,则对应的ADC_Speed_Set值为1000000000/20/100000– 1 = 499(0x000001F3)个,则发送的数据帧内容为:0x55 0xA5 0x03 0x00 0x00 0x01 0xF3 0xF0。当上述设置都设置完成后,就可以向0号寄存器写入任意值,来开始一次采样传输了。数据帧内容可以为0x55 0xA5 0x00 0x00 0x00 0x00 0x00 0xF0。
下图为使用串口猎人工具的高级发码功能,将需要设置的寄存器的值预先在发码列表中填入好,然后点击启动自动发码按钮,就能将这些数据帧自动下发。就能实现以5K的采样速率,对8个通道全部采样,共采集64个数据(每个通道能采样8次)

下图则是发送完指令后FPGA传回的数据,共128个字节(每个数据16位,占2个字节)。





Xruii 发表于 2023-12-7 11:48:02

博主,为什么串口给串口助手发不出来数据呢?

Xruii 发表于 2023-12-11 16:23:59

博主,这个解码正确吗,我的tx发布出来数据,求帮助:'(:'(:'(
页: [1]
查看完整版本: 【ACX720】ACM7606 数据采集FIFO存储UART数据发送实验