AD7606调试笔记_ad7606问题汇总-程序员宅基地

技术标签: stm32  嵌入式  

由于训练电赛,需要选取一块测量速度快,精度更高速度更快的外部ADC,所以选了一块AD7606。

AD7606是一块八通道,双极性输入,同步采样16位ADC。内置2.5V基准电压。由于AD7606没有内部的寄存器,需要直接利用引脚配置ADC的模式,所以AD7606的控制原理也是很简单,但是需要占用的I/O口的资源很多。

AD7606接线图

AD7606 SPI的串行接口接线图:在这里插入图片描述
AD7606 16位并口接线图:
在这里插入图片描述
由这两张图可见除了必须要连接的一些控制线一样之外不同的是数据线的连接,SPI串行通讯用的数据总线的数量只需要一根,而并行通讯的数据总线的数量为16根,对于I/O口不是非常多的单片机还是推荐使用串行通讯。(注:根据数据手册需要把芯片的6脚SER接到高电平上,选择芯片工作在串口模式)

AD7606SPI通讯接口说明

AD7606 必须使用单5V供电。
AD7606 和MCU之间的通信接口电平由VIO引脚控制。也就是说 VIO必须接单片机的电源,可以是3.3V也可以是5V。
OS2 OS1 OS2 : 的组合状态选择过采样模式。
000表示无过采样,最大200Ksps采样速率。
001表示2倍过采样, 也就是硬件内部采集2个样本求平均
010表示4倍过采样, 也就是硬件内部采集4个样本求平均
011表示8倍过采样, 也就是硬件内部采集8个样本求平均
100表示16倍过采样, 也就是硬件内部采集16个样本求平均
101表示32倍过采样, 也就是硬件内部采集32个样本求平均
110表示64倍过采样, 也就是硬件内部采集64个样本求平均
(注:过采样倍率越高,ADC转换时间越长,可得到的最大采样频率就越低。)
CVA,CVB : 启动AD转换的控制信号。CVA决定1-4通道,CVB决定5-8通道。可以将CVA和CVB接到一起用同一个引脚控制。(若想控制转换速率可以将引脚设置为PWM输出的模式以控制转换速率)
RAGE : 量程范围选择。0表示正负5V, 1表示正负10V.
RD : SPI总线时钟信号
RST : 复位信号
BUSY : 忙信号
CS : 片选信号
FRST : 第1个通道样本的指示信号(可不接)
VIO : 通信接口电平
DB7 : 数据总线
DB15:接地

AD7606时序图

图一在这里插入图片描述图二在这里插入图片描述
图三在这里插入图片描述
(个人认为只需要这三张图就可以完全利用SPI总线将AD7606用起来)

AD7606时序图讲解

图一是整体的一个时序框图,大体的逻辑就是在使用AD7606之前要先复位一下,复位信号是高电平有效,时间至少为50ns。然后就是对采样速率和量程的配置,也就是对OS0,OS1,OS2和RANGE脚的配置,然后再对一些引脚进行一些初始化(也可以直接在GPIO配置的时候进行初始化)。之后就是发送启动信号,也就是将CVA,CVB拉低至少25ns后再拉高(启动信号上升沿有效)。之后AD7606开始转换,BUSY信号线拉高,如果BUSY信号线拉低则表明转换已经完成。转换完成后将CS片选信号线拉低才可以进行数据读取,读取完成后将CS片选信号线拉高即可。(还有一种是在转换时进行数据读取的,由于对于采样速率要求并不是特别的高,所以也没有深入研究)

图二是串行通讯对数据进行读取的时序框图,讲的是在AD7606转换完成后将CS片选信号拉低后的操作。转换完成后CS片选信号拉低,开始读取数据。由于是16位8通道ADC,一次读取一个字节,所以一个通道需要读取两次数据。因为是高位在前低位在后所以就是先读取的是MSB,后读取的LSB,数据需要SCLK下降沿有效。经过16*8 = 128个SCLK读取后已经全部将ADC转换的数据全部读取完了,之后就可以将CS片选信号拉高了(由于串行通讯FRSTDATA数据线可以不接,所以并没有用到这个脚)。

图三是对一个字节的读取,顺序也就是现将时钟线拉高后拉低然后读取一下当前的值然后拉高,重复八次就是一个字节的读取。(MSB的最高位为符号位,若为1则数据为负数,若为0则数据为正数

AD7606 STM32引脚配置

用的MCU是STM32F103ZET6,系统时钟是72MHz。
在这里插入图片描述
RANGE,OS0,OS1,OS2若是需要选择量程和速率的话可以接到单片机引脚上,要是不需要的话可以直接接到地或VCC上(自己选择)。RST,RD,CVA, CVB,CS需要设置为OUTPUT输出模式,GPIO电平和模式默认就可以(我在AD7606初始化的时候对IO口也进行了初始化),DB7数据线接的INPUT脚要设为INPUT模式,需要内设上拉电阻。BUSY信号脚就设置为外部中断,下降沿触发,一定要把中断使能(下降沿触发说明ADC转换已经结束)。

AD7606 程序模块

程序我也是根据提供的例程进行的修改。

我对所有需要调用的函数都进行了宏定义,以方便在程序中调用

#define OS0_1 HAL_GPIO_WritePin(OS0_GPIO_Port,OS0_Pin,GPIO_PIN_SET);//AD速率控制引脚
#define OS0_0 HAL_GPIO_WritePin(OS0_GPIO_Port,OS0_Pin,GPIO_PIN_RESET);

#define OS1_1 HAL_GPIO_WritePin(OS1_GPIO_Port,OS1_Pin,GPIO_PIN_SET);
#define OS1_0 HAL_GPIO_WritePin(OS1_GPIO_Port,OS1_Pin,GPIO_PIN_RESET);

#define OS2_1 HAL_GPIO_WritePin(OS2_GPIO_Port,OS2_Pin,GPIO_PIN_SET);
#define OS2_0 HAL_GPIO_WritePin(OS2_GPIO_Port,OS2_Pin,GPIO_PIN_RESET);

#define RAGE_1 HAL_GPIO_WritePin(RAGE_GPIO_Port,RAGE_Pin,GPIO_PIN_SET);//量程选择
#define RAGE_0 HAL_GPIO_WritePin(RAGE_GPIO_Port,RAGE_Pin,GPIO_PIN_RESET);//0为+-5 1为+-10

#define CVB_1 HAL_GPIO_WritePin(CVB_GPIO_Port,CVB_Pin,GPIO_PIN_SET);
#define CVB_0 HAL_GPIO_WritePin(CVB_GPIO_Port,CVB_Pin,GPIO_PIN_RESET);

#define CVA_1 HAL_GPIO_WritePin(CVA_GPIO_Port,CVA_Pin,GPIO_PIN_SET);//启动AD转换的控制信号
#define CVA_0 HAL_GPIO_WritePin(CVA_GPIO_Port,CVA_Pin,GPIO_PIN_RESET);//CVA决定1-4通道 CVB决定5-8通道

#define RD_1 HAL_GPIO_WritePin(RD_GPIO_Port,RD_Pin,GPIO_PIN_SET);//时钟线
#define RD_0 HAL_GPIO_WritePin(RD_GPIO_Port,RD_Pin,GPIO_PIN_RESET);

#define RST_1 HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_SET);//复位信号
#define RST_0 HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_RESET);

#define CS_1 HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET);//片选信号
#define CS_0 HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET);

#define More_Rst RST_1;RST_1;RST_1;RST_1;RST_1;RST_1;//持续最少25ns高电平复位信号

#define Read_Dat HAL_GPIO_ReadPin(INPUT_GPIO_Port,INPUT_Pin)//读取数据引脚状态

对速度进行选择的函数

void AD7606_SetSpeed(uint8_t mode)//AD7606过采样选择
{
    
	switch(mode)
	{
    
		case 0: OS0_0 OS1_0 OS2_0;
		case 2: OS0_0 OS1_0 OS2_1;
		case 4: OS0_0 OS1_1 OS2_0;
		case 8: OS0_0 OS1_1 OS2_1;
		case 16: OS0_1 OS1_0 OS2_0;
		case 32: OS0_1 OS1_0 OS2_1;
		case 64: OS0_1 OS1_1 OS2_0;
		default: OS0_0 OS1_0 OS2_0;
	}
}

量程进行选择的函数

void AD7606_SetRange(uint8_t range)//设置量程
{
    
	if(range == 1)
	{
    
		RAGE_1;
	}
	else RAGE_0;
}

复位信号函数

void AD7606_Reset()//AD7606复位
{
    
	RST_0;
	More_Rst;
	RST_0;
}

初始化函数

void AD7606_Init()//AD7606初始化
{
    
	AD7606_SetRange(0);
	AD7606_Speed_Set(0);
	AD7606_Reset();
	CVA_1;
	CVB_1;
	CS_1;
	AD7606_ReadData();
}

起始信号函数

void AD7606_Init()//AD7606初始化
{
    
	AD7606_SetRange(0);//设置采样量程
	AD7606_SetSpeed(0);//设置采样速度
	AD7606_Reset();
	CVA_1;
	CVB_1;
	CS_1;
	AD7606_ReadData();
}

读单个字节函数

uint8_t AD7606_ReadByte(void)//读一个字节
{
    
	uint8_t usData = 0;
	uint8_t i; 
	for (i = 0; i < 8; i++)
	{
    	
		RD_0;
		AD7606_Delay();
		usData = usData << 1;
		if(Read_Dat)
		{
    
			usData++;
		}
		RD_1;
		AD7606_Delay();
	}
	return usData;		
}

读八个通道数据函数(BUSY拉低后进中断,进中断后就开始读取数据)

void AD7606_ReadData()//读八个通道的数据
{
    
	CS_0;
	for (uint8_t i = 0; i < 8; i++) 
	{
       
		adc_now[i] = AD7606_ReadByte();
		adc_now[i] <<= 8;
		adc_now[i] = adc_now[i] | AD7606_ReadByte();
	}
	CS_1;
	AD7606_Start();//读取数据结束后立马开始下一次转换
}

量程转换和数据处理函数

			for(uint8_t i=0;i<8;i++)
			{
    
				if(adc_now[i] >> 15 == 1)//判断最高位是否为1
				{
    
					fushu_flag = 1;//负数标志位置1
				}
				adc_now[i] &= 0x7fff;//将最高位屏蔽掉
				s_volt[i] = (adc_now[i] * 5.0) / 32767;//5V量程 将数据转换为电压
				if(fushu_flag == 1)//对正负数进行判断
				{
    
					fushu_flag = 0;
					s_volt[i] = -s_volt[i];
				}
			}

遇到的问题以及总结

在调试过程中我发现和AGND连接在一起的脚一直都在0XFFFC到0X0001之间浮动,转换成十进制数也就是在0的上下浮动,所以我刚开始一直以为是错误的,所以就一直在对着一个正确的程序找错误,直到后来我接往引脚上接了一个3.3V的电压,它返回回来的数据不再是这个范围内的值,并经过换算是一个正确的电压值。后来才知道这个浮动是正常的,是AGND和采样时有的一点干扰使他有一些小范围的浮动,对于ADC来说这些都是正常的。

在测量过程中,由于AD7606的模拟电压参考点是2.5V,所以我输入3.3V的电压经过换算后得到的电压值为0.8V,所以这个需要双极性输入测电压,也就是一个通道接地,另一个通道测待测点电压,之后待测点电压就是被测电压值与地的被测电压值之间的差值,也称伪差分输入,双极性输入。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/CYXYuanyuan/article/details/118344123

智能推荐

多媒体教室与计算机教室区别,多媒体学习环境和网络化学习环境的区别-程序员宅基地

文章浏览阅读1.9k次。你浅笑我痴醉新兵答主11-30TA获得超过9852个赞随着计算机技术、多媒体技术、通讯技术、网络技术等在教育领域的广泛应用,使现代教育技术进入信息化发展新阶段,成为21世纪教育发展的“制高点。作为重要的教学资源——多媒体教学环境,也受到教育界的普遍重视。近年来,国内高校先后建立了各种各样的多媒体教学环境。由于投入不同,配置各异,功能不一,因此模式、名称也五花八门。但是,无论如何千变万化,归纳起来,..._学校电教室和计算机教室的区别

python填充空值_python缺失值填充的几种方法-程序员宅基地

文章浏览阅读8.1k次。常见的数据缺失填充方式分为很多种,比如删除法、均值法、回归法、KNN、MICE、EM等等。R语言包中在此方面比较全面,python稍差。python目前已有的两种常见的包,第一个是impyute,第二个是fancyimpute。比如fancyimpute中集成了很多方式,包括均值、众数、频数填充,KNN填充、MCMC填充等。一、直接填充0值/-1值填充data = pd.read_csv(path..._python实现缺失值填充

Unity3D实践系列04, 脚本的生命周期-程序员宅基地

文章浏览阅读89次。Unity3D脚本生命周期是指从脚本的最初唤醒到脚本最终销毁的整个过程。生命周期的各个方法被封装到了MonoBehaviour类中。具体来说如下: 1、In Editor Mode 编辑模式 当在编辑器中把脚本绑定到某个GameObject的时候,调用了MonoBehaviour类的Reset方法。 2、Startup 开始运行阶段 如果脚本所绑定的GameObject是存在的..._unity3d脚本从唤醒到销毁有一套比较完整的生命周期,列出系统自带的主要生命周

原生Spring API接口实现AOP-程序员宅基地

文章浏览阅读66次。场景还是举增加用户和删除用户的栗子, 我要在增加或删除的前后做一些方法增强, 先看一下整个结构:导入关键依赖:对AOP提供支持<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId></depend...

第一课计算机的软件教案,信息技术第一课教案设计-程序员宅基地

文章浏览阅读64次。信息技术第一课教案设计教学目标:信息处理过程的主要环节有信息输入、信息处理和信息输出。教学重点:计算机是一种信息处理工具,它通过硬件和软件的支持,对鼠标和键盘等输入设备输入的信息进行加工和运算,转换成人们所需要的信息,通过显示器等输出,本课安排了“摸、看、听”,“涂涂画画”和“敲敲打打”三个活动,充分调动学生的视觉、听觉、触觉等多种感官认识计算机,感受计算机信息处理的过程,激发学生的活动兴趣。教学...

SpringBoot 之@Transactional事务回滚_spring transactional 部分回滚-程序员宅基地

文章浏览阅读1.1k次。目录事务回滚要点回滚方式1. 手动回滚(try/catch)2.自动回滚(直接抛出,不try/catch)3.部分回滚事务回滚在开发过程中,经常会出现一个接口多表插入的情况,当其中一张表插入失败时就需要进行事务回滚了,SpringBoot为我们提供了@Transactional注解来进行事务回滚要点1.需要将使用事务注解的方法设置为public;2.如果没有在注解后做异常配置,只会对手动..._spring transactional 部分回滚

随便推点

大厂资深程序员零基础教你一步一步上手swift语言(原创)-程序员宅基地

文章浏览阅读378次,点赞9次,收藏4次。对于许多大厂资深程序员来说,尽管拥有丰富的开发经验,但面对新的编程语言和开发环境时,也需要一步一步地学习和适应。安装Xcode后,尝试创建一个新的Swift项目,这将是你进行Swift学习的起点。对于大厂的资深程序员来说,学习Swift是一个新的挑战,但也是一个掌握未来开发趋势的好机会。首先,在你的开发环境中创建一个新的Swift文件,比如`StockMarketPrediction.swift`。通过以上步骤的学习和实践,我相信你将能够顺利掌握Swift语言,开启苹果平台上应用开发的新旅程。

龙芯比赛vivado调试试错手记_golden trace文件-程序员宅基地

文章浏览阅读5.2k次,点赞13次,收藏43次。第一个阶段:除掉所有的语法错误刚开始在文件夹里加了我的CPU文件但是在工程里面没添加,然后报错:找不到你的的CPUIP核没更新到最新版本,由于我的是2019.2的vivado,但用的是2019.1的工程和IP核,所以打开工程时IP核都上着锁。解决办法是:Reports->Report IP Status;然后点击upgrade->OK报错:[VRFC 10-3180] cannot find port 'en_exception_pc' on this module ["C:/Use_golden trace文件

PHP+MySQL编写人事公司员工工资管理系统_php人事系统源码-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏8次。职称信息管理比如某一个员工是管理人员,还是普通的开发人员,用于职称区分,可以与员工进行关联,包含对职称的添加,修改删除。新闻咨询管理对于当下热门关于公司管理相关的新闻,可以转载供内部学习,或者领导分享等等,可以对新闻进行增加,修改,删除。部门信息管理公司一般分为很多的部门,比如公共部,设计部,开发部,人事部等等,可以添加部门,修改部门,删除部门。员工的考勤奖惩管理首先是员工的打卡记录,以及当月的表现,比如表现好进行奖励,对奖励记录的添加,修改删除。可以添加,修改,删除员工。..._php人事系统源码

2.4_多元正态分布-程序员宅基地

文章浏览阅读831次,点赞20次,收藏23次。设随机向量x服从多元正态分布,即x∼NμΣ, 其中x表示d维的向量,μ也表示d维的向量,Σ表示dxd维的协方差矩阵。随机向量xfx2πd/2∣Σ∣1/21​e2−1​x−μTΣ−1x−μ1其中Σ−1是Σ的逆矩阵,∣Σ∣为其行列式。μEx2ΣE[(x−μx−μT3可知μμ1​μ2​μd​xx1​x2​xd​μi​是μ的第i个分量,σij。

【理解归纳】tensorflow-gpu 1.14.0版本安装与anaconda包与环境的管理_tensorflow-gpu==1.14.0-程序员宅基地

文章浏览阅读5k次。一开始我用的是cpu版本的tensorflow2.0.0,直接调模型的语法非常简洁,再者我的笔记本是有gpu的(现在哪台笔记本还能没gpu。。。)于是想充分利用gpu来提速,再延续tensoflow2的简洁语法,装一个tensoflow-gpu 2.0.0结果10小时过去了,愣是没弄成功!import tensorflow要么还是cpu版本,要么就直接导入失败,说找不到模块。装失败的原因非常多,有配件版本不匹配,显卡驱动没装上,不懂环境管理的操作等等后面想着,也不管什么简洁语法了,只要是te_tensorflow-gpu==1.14.0

Virtualbox 与VMWare中网络模式区别_vmbox 可以和vmvare的net模式一样么-程序员宅基地

文章浏览阅读4.9k次,点赞3次,收藏10次。之前一直在VMWare上玩儿虚拟机,对其上的网络模式还算熟悉,可是这几天切换到virtualbox上之后,发现不是那么回事儿了,查了资料才发现这两个虚拟在某些模式上还是有区别的。我们先来看Virtualbox,它支持5种网络模式:NATNAT NetworkInternalHost-OnlyBridged而VMWare呢,则支持3种:NAT Host-Only BridgedHo_vmbox 可以和vmvare的net模式一样么

推荐文章

热门文章

相关标签