问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

AD7606芯片使用详解:串行和并行采集方案及FPGA实现

创作时间:
作者:
@小白创作中心

AD7606芯片使用详解:串行和并行采集方案及FPGA实现

引用
1
来源
1.
https://www.jindouyun.cn/document/industry/details/244278

AD7606是一款16位8通道同步采样模数转换器(ADC),支持±10V和±5V真双极性输入信号,采样率可达200 kSPS。本文将详细介绍AD7606的数据手册解读、串行和并行输出采集的时序和代码实现,以及Vivado仿真和上板调试验证。

1、前言

AD7606是一款非常受欢迎的AD芯片,因为它支持8通道同时采集数据,采样深度16位,虽然采样率只有200 kSPS,但对电压等低速数据源的采集而言已经完全足够了。该芯片在电压检测等项目中有着广泛应用。

本文详细描述了设计方案,工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于AD数据采集领域;

提供完整的、跑通的工程源码和技术支持;

工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

2、AD7606数据手册解读

AD7606英文原版数据手册只有37页,但真正看懂的兄弟却很少,下面解读一下这个手册:

DAQ7606 是 16 位 8 通道同步采样模数数据采集系统(DAS)。

AD7606 内置模拟输入箝位保护、二阶抗混叠滤波器、跟踪保持放大器、16 位电荷再分配逐次逼近型 ADC、灵活的数字滤波器、2.5V 基准电压源、基准电压缓冲以及高速串行和并行接口。AD7606 采用 5V 单电源供电,可以处理±10V 和±5V 真双极性输入信号,同时所有通道均能以高达 200 kSPS 的吞吐速率采样。输入箝位保护电路可以耐受最高达±16.5V 的电压。无论以何种采样频率工作,AD7606 的模拟输入阻抗均为 1 MΩ。它采用单电源工作方式,具有片内滤波和高输入阻抗,因此无需驱动运算放大器和外部双极性电源。AD7606 抗混叠滤波器的 3 dB 截止频率为 22 kHz;当采样速率为 200 ksps 时,它具有 40 dB 抗混叠抑制特性。灵活的数字滤波器采用引脚驱动,可以改善信噪比(SNR),并降低 3 dB 带宽。

写了这么多你看懂了吗?

我猜你应该是云里雾里,下面举例说人话,让你听得懂:

AD7606芯片框图如下:

红线即是信号输出输出的数据通路;

输入信号采集范围

AD7606可以处理±10V 和±5V 真双极性输入信号,即输入信号可以是±10V 和±5V,由RANGE引脚上下拉决定;

下拉处理±5V 信号;

上拉处理±10V 信号;

一旦选择了输入信号范围,就别乱给信号源了,否则烧板子了。。。

原文如下:

输出模式选择

红线以通道1为例:

输入数据位单端模拟数据,进过复杂的转换后可输出串行数字信号或者并行数据信号;

如果你的板子设计引脚资源有限,则选择串行输出;串行输出的优点是节约IO,缺点是采集时序复杂些;

如果你的板子设计引脚足够多,则选择并行输出,并行输出数据线占用16个IO口,并行输出的优点是采集时序简单,缺点是费IO;可自行选择;

输出模式选择通过PAR/SER/BYTE SEL引脚的上下拉决定;

上拉选择串行输出;

下拉选择并行输出;

具体的时序细节放在后面的章节;

原文如下:

过采样率设置

过采样率设置由OS的三个引脚上下拉决定,可以固定用电阻上下拉,这种模式就定死了,除非飞线,也可以用FPGA引脚给高低电平配置,具体配置模式如下图:

作为FPGA开发者,需要知道这些就行了,具体的时序细节放在后面的章节;

3、AD7606串行输出采集

AD7606串行采集时钟的范围要求如下:

这里我们选择16.666MHz时钟,不高也不低;

系统参考时钟选择100M,那个1个时钟周期就是1000÷100=10ns;

采集时钟是16.666M,那个1个时钟周期就是1000÷16.666=60ns;

记住这两个时钟周期,很重要;

串行输出流程时序图如下:

这张图采用边转换边读取的方式,还有转换完成后再读取的方式,既然可以边转换边读取,为何还要等转换完成后再读取呢?所以我们直接用这种方式。

并行采集使用的则是转换完成后再读取的方式。

第一步:拉高RESET引脚至少至少50ns,数据手册规定如下:

第二步:拉低CONVSTA或者CONVSTB持续最多0.5ms(500ns),注意这里是最多,所以在代码里只需一个参考时钟周期足以,比如你用的100M,一个参考时钟周期就是10ns,当然,CONVSTA和CONVSTB也可同时拉低,这样就是8个通道同时采集,时间由数据手册得知,如下:

CONVSTA开启V1-V4通道的转换;

CONVSTB开启V5-V8通道的转换;

原文如下:

第三步:等待BUSY为高后,拉低CS,这个BUSY是AD7606输出给用户的,表征AD转换正在进行,他有一个最大时间,我们一定要满足他的最大时间,不然人家还没转换完你就结束采集了,岂不唧唧了;那么,CS在什么时刻拉低呢?既然前面我们已经选择了边转换边读取的方式,所以在BUSY拉高的期间CS拉低,数据手册最大推荐4.15us,代码里直接设置5ms,由数据手册得知,如下:

流程看完了,来看具体的采集时序:

采集时序如下:

首先用户拉低CS,并给出SCLK到AD7606,AD7606在CS为低期间,在SCLK的上升沿输出数据(但根据时序图,我感觉是SCLK高电平期间输出的),一个通道一次转换后输出16位采样数据;

既然AD7606是在SCLK上升沿输出,那么FPGA就应该在SCLK下降沿采集(或者低电平采集);

AD7606有8个模拟输入通道,串行输出模式下只有两个数字输出通道,每个输入通道输出16位采样数据;

DOUTA对应CH1、CH2、CH3、CH4四个输出通道;

DOUTB对应CH5、CH6、CH7、CH8四个输出通道;

因为每个输入通道输出16位采样数据,需要16个SCLK周期,所以4个输入通道输出16位采样数据,需要64个SCLK周期;那个我们需要一个计数器,计数到64时输出64位的采集数据,呢么采集到的每个通道数据对应如下:

wire [15:0] ad_ch1 = ad_out_a[63:48];
wire [15:0] ad_ch2 = ad_out_a[47:32];
wire [15:0] ad_ch3 = ad_out_a[31:16];
wire [15:0] ad_ch4 = ad_out_a[15: 0];
wire [15:0] ad_ch5 = ad_out_b[63:48];
wire [15:0] ad_ch6 = ad_out_b[47:32];
wire [15:0] ad_ch7 = ad_out_b[31:16];
wire [15:0] ad_ch8 = ad_out_b[15: 0];

转换状态机部分源码如下:

always @(posedge i_sys_clk) begin
    if(o_ad_rst||!i_rstn) begin
        ad_convst <= 1'b1;
        AD_S <= 2'd0;
    end
    else begin
        case(AD_S)
            2'd0: begin
                if(p_ad_sclk) begin
                    //开启8通道转换
                    ad_convst <= 1'b0;
                    AD_S <= 2'd1;
                end
            end
            2'd1: begin
                if(p_ad_sclk)begin
                    //转换时间最大500ns,这里60ns即可
                    ad_convst <= 1'b1;
                    AD_S <= 2'd2;
                end
            end
            2'd2: begin
                if(p_ad_sclk&&i_ad_busy) AD_S <= 2'd3; //BUSY拉高,进入采集数据状态
            end
            2'd3: begin
                if(cycle_end) AD_S <= 2'd0;
                //转换结束,重新采集
            end
            default: ;
        endcase
    end
end

串行采集代码顶层接口代码如下:

module helai_ad7606_ser#(
    parameter SYS_CLK = 100_000_000,  //系统时钟
    parameter SPI_CLK = 16_666_666    //AD采集时钟
) (
    input          i_sys_clk   ,  //系统时钟
    input          i_rstn      ,  //系统复位,低有效
    input          i_ad_cha    ,  //AD7606串行输出通道A
    input          i_ad_chb    ,  //AD7606串行输出通道B
    input          i_ad_busy   ,  //输入BUSY
    output [2:0]   o_ad_os     ,  //输出采样率配置
    output         o_ad_cs     ,  //输出片选
    output reg     o_ad_sclk   ,  //输出采样时钟
    output         o_ad_rst    ,  //输出复位
    output         o_ad_convsta,  //输出开启V1-V4通道采集
    output         o_ad_convstb,  //输出开启V5-V8通道采集
    output         o_ad_range  ,  //输入信号范围配置
    output [15:0]  o_ad_ch1    ,  //输出通道1
    output [15:0]  o_ad_ch2    ,  //输出通道2
    output [15:0]  o_ad_ch3    ,  //输出通道3
    output [15:0]  o_ad_ch4    ,  //输出通道4
    output [15:0]  o_ad_ch5    ,  //输出通道5
    output [15:0]  o_ad_ch6    ,  //输出通道6
    output [15:0]  o_ad_ch7    ,  //输出通道7
    output [15:0]  o_ad_ch8    ,  //输出通道8
    output         o_ad_rxdone         //输出数据有效信号,高有效
);

4、AD7606并行输出采集

并行采集时序,由于官方画的图太繁琐,我直接重画了一个图来表示,如下:

第一步:拉高RESET引脚至少至少50ns,和串行采集一样;

第二步:拉低CONVSTA或者CONVSTB持续最多0.5ms(500ns),和串行采集一样;

第三步:等待转换完成再读取数据,即采用转换完成后再读取的方式;

第四步:拉低CS片选信号;

第五步:拉低RD信号,在RD和CS同时为低时即可依次读取V1-V8通道的数据;

相应的时间问题也是重要的,具体查看手册;

并行采集代码顶层接口代码如下:

module helai_ad7606_par(
    input                        clk          ,  //系统时钟,100M
    input                        rst_n        ,  //系统复位,低有效
    input [15:0]                 ad_data      ,  //输入并行数据
    input                        ad_busy      ,  //输入BUSY
    input                        first_data   ,  //未用到此信号
    output [2:0]                 ad_os        ,  //输出采样率配置
    output reg                   ad_cs        ,  //输出片选
    output reg                   ad_rd        ,  //输出读数据
    output reg                   ad_reset     ,  //输出复位
    output reg                   ad_convstab  ,  //输出开启V1-V8通道采集
    output                       ad_data_valid,  //输出数据有效信号,高有效
    output reg [15:0]            ad_ch1       ,  //输出通道1
    output reg [15:0]            ad_ch2       ,  //输出通道2
    output reg [15:0]            ad_ch3       ,  //输出通道3
    output reg [15:0]            ad_ch4       ,  //输出通道4
    output reg [15:0]            ad_ch5       ,  //输出通道5
    output reg [15:0]            ad_ch6       ,  //输出通道6
    output reg [15:0]            ad_ch7       ,  //输出通道7
    output reg [15:0]            ad_ch8        //输出通道8
);

5、vivado仿真

仅提供了串行采集的仿真,文件如下;

vivado仿真如下:

6、上板调试验证

请参考我之前写的基于zynq7100使用AD7606进行电压监测的文章点击查看:AD7606工程

7、福利:工程代码的获取

福利:工程代码的获取

代码太大,无法邮箱发送,以某度网盘链接方式发送,

这里代码分为两个文件夹:

AD7606串行和并行采集源码及仿真:包含串行和并行采集源码和串行仿真模型,没有建工程,需要自己建工程,然后把源码加进去;

AD7606电压采集工程:这是我做好得电压采集得项目工程;

AD7606串行和并行采集源码及仿真下载链接:https://download.csdn.net/download/qq_41667729/87767250

AD7606电压采集工程源码下载链接:https://download.csdn.net/download/qq_41667729/87767253

网盘资料如下:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号