FPGA采集AD7606全网最细讲解 提供串行和并行2套工程源码和技术支持

news2024/11/6 7:08:28

目录

  • 1、前言
  • 2、AD7606数据手册解读
    • 输入信号采集范围
    • 输出模式选择
    • 过采样率设置
  • 3、AD7606串行输出采集
  • 4、AD7606并行输出采集
  • 5、vivado仿真
  • 6、上板调试验证
  • 7、福利:工程代码的获取

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、福利:工程代码的获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/380659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CFT Show 信息收集篇

CFT Show 信息收集篇1.CFT Show 信息收集篇1.1.WEB-11.1.1.打开靶场1.1.2.寻找Flag1.2.WEB-21.2.1.打开靶场1.2.2.寻找Flag1.3.WEB-31.3.1.打开靶场1.3.2.寻找Flag1.3.2.1.F12查看器1.3.2.2.查看源码1.3.2.3.抓包1.4.WEB-41.4.1.打开靶场1.4.2.寻找Flag1.4.2.1.robots介绍1.4.2…

10个黑客基础教程!简单有效

如果你的电脑运行缓慢&#xff0c;请使用下面介绍的方法来帮助加速、优化和提高电脑的性能。 1.关闭启动时自动运行的应用程序 计算机上安装的许多应用程序都可以将自己配置为在启动期间自动启动并继续在后台运行&#xff0c;但是&#xff0c;如果不是每天都使用这些应用程序…

基于vscode创建SpringBoot项目,连接postgresql数据库 2 更简单

1、Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 2、Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目_水w的博客-CSDN博客 3、基于vscode开发vue项目的详细步骤教程_水w的博客-CSDN博客 4、基于vscode开发vue项目的详细步骤教程 2 第三方图标库FontAw…

Spark RDD持久化

RDD Cache缓存 RDD通过Cache或者Persist方法将前面的计算结果缓存&#xff0c;默认情况下会把数据以序列化的形式缓存在JVM的堆内存中。但是并不是这两个方法被调用时立即缓存&#xff0c;而是触发后面的action时&#xff0c;该RDD将会被缓存在计算节点的内存中&#xff0c;并供…

杂记——14.git在idea上的使用及其实际开发介绍

这篇文章我们来讲一下git在idea上的使用&#xff0c;以及在实际开发过程中各个分支的使用及其具体的流程 目录 1.git在idea上的使用 1.1 idea上的git提交 1.2 idea上的分支切换 2.git在实际运用时的分支及其流程 2.1分支介绍 2.2具体流程 3.小结 1.git在idea上的使用 …

GraalVM-云原生时代的JVM(Java)

文章目录一、GraalVM是什么&#xff1f;二、GraalVM有哪些特点&#xff1f;2.1、高性能2.2、多语言支持2.3、互操作性2.4、安全性三、GraalVM的应用效果3.1、提高性能3.2、简化开发3.3、降低成本3.4、节省资源3.5、支持云环境四、使用GraalVM编译springboot应用程序4.1、下载并…

网络应用之表单提交

表单提交学习目标能够知道表单的提交方式能够知道表单中action属性的作用1. 表单属性设置<form>标签 表示表单标签&#xff0c;定义整体的表单区域action属性 设置表单数据提交地址method属性 设置表单提交的方式&#xff0c;一般有“GET”方式和“POST”方式, 不区分大小…

嵌入式之ubuntu终端操作与shell常用命令详解

目录 文件和目录列表 基本列表功能 显示列表长度 过滤输出列表 浏览文件系统 Linux 文件系统 遍历目录 处理文件 创建文件 复制文件 制表键自动补全 重命名文件 删除文件 处理目录 创建目录 删除目录 ​编辑其他常用命令与操作 Uname命令 clear命令 返回上一级命令 显…

Netty学习(一):Netty概述

一、原生NIO存在的问题 NIO 的类库和API繁杂&#xff0c;使用麻烦:需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。需要具备其他的额外技能:要熟悉Java 多线程编程&#xff0c;因为NIO编程涉及到Reactor 模式&#xff0c;你必须对多线程和网络编程…

buu刷题(第一周)

目录 [DDCTF 2019]homebrew event loop action:trigger_event%23;action:buy;5%23action:get_flag; [CISCN2019 华东南赛区]Web4 [RootersCTF2019]babyWeb [GWCTF 2019]mypassword [NESTCTF 2019]Love Math 2 [BSidesCF 2019]Pick Tac Toe [RootersCTF2019]ImgXweb [SW…

2023 年网络安全漏洞的主要原因

​  网络安全漏洞已经并将继续成为企业面临的主要问题。因此&#xff0c;对于企业领导者来说&#xff0c;了解这些违规行为的原因至关重要&#xff0c;这样他们才能更好地保护他们的数据。 在这篇博文中&#xff0c;我们将概述 2023 年比较普遍的网络安全漏洞的主要原因。 云…

OpenCV4.x图像处理实例-道路车辆检测(基于背景消减法)

通过背景消减进行道路车辆检测 文章目录 通过背景消减进行道路车辆检测1、车辆检测思路介绍2、BackgroundSubtractorMOG23、车辆检测实现在本文中,将介绍如何使用简单但有效的背景-前景减法方法执行车辆检测等任务。本文将使用 OpenCV 中使用背景-前景减法和轮廓检测,以及如何…

这篇教你搞定Android内存优化分析总结

一、内存优化概念1.1 为什么要做内存优化&#xff1f;内存优化一直是一个很重要但却缺乏关注的点&#xff0c;内存作为程序运行最重要的资源之一&#xff0c;需要运行过程中做到合理的资源分配与回收&#xff0c;不合理的内存占用轻则使得用户应用程序运行卡顿、ANR、黑屏&…

QT之OpenGL帧缓冲

QT之OpenGL帧缓冲1. 概述1.1 帧缓冲的创建与删除1.2 帧缓冲的数据来源1.2.1 数据源与帧缓冲的关系1.2.2 纹理Attachment1.2.3 渲染缓冲对象Attachment1.2.4 两者的区别1.2.5 关于两者的使用场景2. Demo3. 后期处理4. 参考1. 概述 OpenGL管线的最终渲染目的地被称作帧缓冲(fram…

【代码随想录训练营】【Day28】第七章|回溯算法|93.复原IP地址|78.子集|90.子集II

复原IP地址 题目详细&#xff1a;LeetCode.93 这道题与上一道练习题分割回文字符串十分详细&#xff0c;一样是涉及到分割字符串、判断字符串、递归与回溯的问题&#xff0c;所以这道题要解决的难点在于&#xff1a; 如何分割IP地址字符串如何判断分割的IP地址是否合法递归的…

Kafka基本概念

什么是Kafka Kafka是一个消息系统。它可以集中收集生产者的消息&#xff0c;并由消费者按需获取。在Kafka中&#xff0c;也将消息称为日志(log)。 一个系统&#xff0c;若仅有一类或者少量的消息&#xff0c;可直接进行发送和接收。 随着业务量日益复杂&#xff0c;消息的种类…

2.单例模式

基本概念 单例模式&#xff1a;保证一个类只有一个实例&#xff0c;并提供一个访问该实例的全局访问点 常见应用场景 读取配置文件的类一般设计为单例模式网站计数器应用程序的日志应用&#xff0c;因为共享日志文件一直处于打开状态&#xff0c;只能有一个实例去操作Spring…

新C++(11):unordered_map\set的封装

"假如可以让音乐停下来"一、unordered_map\unordered_set简介在C98中&#xff0c;STL底层提供了以红黑树封装的关联式容器map\set&#xff0c;其查询效率可以达到LogN(以2为底)。而在C11中&#xff0c;STL又提供了unordered(无序)容器&#xff0c;其使用方式与map\se…

企业对不同形态CRM系统价格需求不同

很多企业在选型时关心CRM客户管理系统的价格&#xff0c;有人对CRM的价格完全没有概念&#xff0c;也有的人先问价格再看其他。CRM价格在系统选型中到底有多重要&#xff1f;不同类型CRM系统的价格是否有所不同&#xff1f; CRM的不同产品形态也会影响价格 通常情况下&#x…

十五、MyBatis使用PageHelper

1.limit分页 limit分页原理 mysql的limit后面两个数字&#xff1a; 第一个数字&#xff1a;startIndex&#xff08;起始下标。下标从0开始。&#xff09; 第二个数字&#xff1a;pageSize&#xff08;每页显示的记录条数&#xff09; 假设已知页码pageNum&#xff0c;还有每页…