AD7124-4 精度

2023-10-27

AD7124芯片,是属于AD公司的较新产品,高达24位的精度,确实让人眼馋,究竟如何呢。

寄存器配置顺序
1、AD上电后,先关闭SPI片选
2、使能开启单片机的 SPI
3、复位设备及所有内部寄存器,发送64位的1,也就是8个0xFF
4、读Status Register寄存器,用于清除上电复位标志,否则对AD7124_ADC_Control的配置不起作用,AD7124-8似乎没有这个问题。非常重要!!
5、做好从 AD7124_ADC_Control 到 AD7124_Filter_7寄存器的配置清单、通道配置、滤波配置等。(在实际应用中,可以一次调零校准和满量程校准后,将该通道的失调寄存器的值和增益寄存器的值直接保存起来,下次上电后再直接写进去,就不用反复校准了,如果需要将失调寄存器和增益寄存器写入的话,记得把Control寄存器配置为低功耗或中功耗模式!!!我这里是直接将Control寄存器设置为低功耗、空闲模式,然后开始校准,所以没有写入失调寄存器和增益寄存器)
6、将从 AD7124_ADC_Control 到 AD7124_Filter_7ADC所有寄存器写入AD芯片,写入过程中,建议写一个寄存器,就延时20-30ms,另外,需要修改的才写,不需要修改的寄存器就不用写,浪费时间。
7、内部满量程校准,再写Control寄存器,设置内部满量程校准。
8、等待一下,确保校准完成。
9、读Status Register寄存器,用于清除该寄存器中上电复位标志。由于校准后会自动进入空闲模式,我在调试过程中,居然有出现上电复位标志被置位了,所以读一下为好,这个上电复位标志为1的话,功能都运行不了。。。
10、内部零电平校准,再写Control寄存器,设置内部零电平校准。
11、等待一下,确保校准完成。
12、读Status Register寄存器,用于清除该寄存器中上电复位标志。由于校准后会自动进入空闲模式,我在调试过程中,居然有出现上电复位标志被置位了,所以读一下为好,这个上电复位标志为1的话,功能都运行不了。。。
13、现在可以将Control寄存器设置为全功率、连续运行模式等等了。我是设置为 全功率、单次运行模式。
单次运行模式被设置后,AD进行一次转换,然后自动进入空闲模式,Status寄存器的RDY位为0,表示数据转换完成。读取数据后,再设置Control寄存器全功率、单次运行模式,等Status寄存器的RDY位为0了,就读写,依次循环…
下面上部分代码

int32_t AD7124_Setup(ad7124_device *device)
{
		int32_t ret;
		enum ad7124_registers regNr;
		
		if(!device)
			return INVALID_VAL;
			
		SPI1_CS_SET;		//关闭片选
		
		__HAL_SPI_ENABLE(&hspi1);		// 使能SPI1,开启

		AD7124_Reset();							// 复位设备及所有内部寄存器

		device->check_ready = 1;		// 使能检查设备准备好,使用开机/重置设置更新设备结构

		ret = AD7124_ReadRegister( device, &device->regs[AD7124_ID] );		//读ID寄存器
		if (ret < 0)
			return ret;	
		
		//读Status Register寄存器,用于清除上电复位标志,否则对AD7124_ADC_Control的配置不起作用,AD7124-8似乎没有这个问题。非常重要!!
		ret = AD7124_ReadRegister( device, &device->regs[AD7124_Status] );
		if (ret < 0)
			return ret;			
		
		// ADC所有寄存器初始化,从 AD7124_ADC_Control 到 AD7124_Offset_0
		for( regNr = AD7124_ADC_Control; (regNr <= AD7124_Offset_0); regNr++ )
		{
			HAL_Delay(30);
			
			if ( device->regs[regNr].rw == AD7124_RW )
			{
				ret = AD7124_WriteRegister( device, &device->regs[regNr] );
				printf("AD-write-%X---%X\n",regNr,device->regs[regNr].value);	//写入AD数据
				if (ret < 0)
						break;
			}
			// 获取CRC状态和设备SPI接口设置,
			// 根据初始化的寄存器数组ad7124_st_reg ad7124_regs[],确定是否需要CRC、检查设备准备好,并更新设置 
			if (regNr == AD7124_Error_En)
			{
				AD7124_UpdateCRCSetting(device);			
				AD7124_UpdateDevSpiSettings(device);
			}
			if ( regNr == AD7124_ADC_Control )
			{			//如果控制寄存器开启了DATA_STATUS位(读数据寄存器后将,将跟随一个字节的指示那个通道的值,再加CRC,即3+1+CRC)
						//那么读AD7124_Data字节数量将增加1个
					if ( device->regs[AD7124_ADC_Control].value & AD7124_ADC_CTRL_REG_DATA_STATUS )
					{		
							(device->regs[AD7124_Data].size)++;
					}
			}
		}
		if (ret < 0)
			return ret;		

		//
		// 内部满量程校准
		device->regs[AD7124_ADC_Control].value = 
							/* 控制寄存器 ADC_Control Register bits */
						//	  AD7124_ADC_CTRL_REG_DOUT_RDY_DEL  // (1 << 12),
						//	| AD7124_ADC_CTRL_REG_CONT_READ     // (1 << 11)
							  AD7124_ADC_CTRL_REG_DATA_STATUS   // (1 << 10),开启数据寄存器后跟随通道显示
						//	| AD7124_ADC_CTRL_REG_CS_EN         // (1 << 9)
							| AD7124_ADC_CTRL_REG_REF_EN        // (1 << 8),内部基准电压使能,1=内部使能,0=外部使能
							| AD7124_ADC_CTRL_REG_POWER_MODE(0) // (((x) & 0x3) << 6),电源模式,0-1-2-3,低、中、全、全功耗
							| AD7124_ADC_CTRL_REG_MODE(6)       // (((x) & 0xF) << 2),ADC工作模式,5=内部调零,6=内部满量程,7=系统零电平校准,8=系统满量程
							| AD7124_ADC_CTRL_REG_CLK_SEL(0)   // (((x) & 0x3) << 0),ADC时钟源选择
							;

		printf("nbmlc->W_Control=%0x \n",(device->regs[AD7124_ADC_Control].value));
	
		ret = AD7124_WriteRegister(device, &device->regs[AD7124_ADC_Control]);	//写入值,AD将会进入中功率,满量程校准模式,
		if (ret < 0)																														//校准完成后,自动进入空闲模式
			return ret;		
		
		HAL_Delay(5000);
		
		ret = AD7124_WaitForConvReady(device, 10000);
		if (ret < 0)		
			return ret;		
		
		//读Status Register寄存器,用于清除上电复位标志,否则对AD7124_ADC_Control的配置不起作用,AD7124-8似乎没有这个问题。非常重要!!
		ret = AD7124_ReadRegister( device, &device->regs[AD7124_Status] );
		if (ret < 0)
			return ret;			
		
		//
		
		// 内部零电平校准
		device->regs[AD7124_ADC_Control].value = 
							/* 控制寄存器 ADC_Control Register bits */
						//	  AD7124_ADC_CTRL_REG_DOUT_RDY_DEL  // (1 << 12),
						//	| AD7124_ADC_CTRL_REG_CONT_READ     // (1 << 11)
							  AD7124_ADC_CTRL_REG_DATA_STATUS   // (1 << 10),开启数据寄存器后跟随通道显示
						//	| AD7124_ADC_CTRL_REG_CS_EN         // (1 << 9)
							| AD7124_ADC_CTRL_REG_REF_EN        // (1 << 8),内部基准电压使能,1=内部使能,0=外部使能
							| AD7124_ADC_CTRL_REG_POWER_MODE(0) // (((x) & 0x3) << 6),电源模式,0-1-2-3,低、中、全、全功耗
							| AD7124_ADC_CTRL_REG_MODE(5)       // (((x) & 0xF) << 2),ADC工作模式,5=内部调零,6=内部满量程,7=系统零电平校准,8=系统满量程
							| AD7124_ADC_CTRL_REG_CLK_SEL(0)   // (((x) & 0x3) << 0),ADC时钟源选择
							;		
		
		printf("nbtl->W_Control=%0x \n",(device->regs[AD7124_ADC_Control].value));
		
		ret = AD7124_WriteRegister(device, &device->regs[AD7124_ADC_Control]);
		if (ret < 0)
			return ret;		
		
		HAL_Delay(5000);	
		
		ret = AD7124_WaitForConvReady(device, 10000);
		if (ret < 0)		
			return ret;		
		
		//读Status Register寄存器,用于清除上电复位标志,否则对AD7124_ADC_Control的配置不起作用,AD7124-8似乎没有这个问题。非常重要!!
		ret = AD7124_ReadRegister( device, &device->regs[AD7124_Status] );
		if (ret < 0)
			return ret;		
		
		printf("\n----AD AD7124_Setup(0=normal)= %d----\n",ret);			
		
		return ret;
}

下面来说说精度问题
我是使用了内部基准2.5V,AI1 和 AI2 引脚直接接信号发生器,由于只是测试,没有接任何电容电阻等其他元件,AI输入配置为缓冲,基准不缓冲,PGA放大16倍。

第一列数据:AD转换码, 第二列:转换为电压值(单位mV,图片中单位错误,见谅), 第三列:上次AD转换码与本次之差。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总体感觉,这个芯片的精度是还行的,但是抗干扰能力并不好。
我是用这个芯片测RTD电阻,用芯片本身的恒电流源,测试出来的AD数据,时好时不好,或者有时用手碰下RTD测量回路,都会芯片死机,重启或复位又好了,有时感觉就是外部干扰(甚至空气中干扰),都会影响AD数据跳动,然后我把板子装在机壳里面,用了很久,又很稳定。总体来讲,就是抗干扰能力不强。
但是,如果使用外部基准源(或内部基准源)2.5V,似乎抗干扰能力就强很多了,手摸测量回路,AD数据跳动都比较小,并能很快恢复数据,基本也不死机。
说明就是,基准的端子一定要稳!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AD7124-4 精度 的相关文章

随机推荐

  • 对数据库字符串定义

  • Python random库详解

    一 常用方法 在使用random 的时候需要先导入函数包 import random 以下是一些常用的方法 import random result1 random random 随机生成一个浮点数 0 1 result2 random r
  • 第37步 深度学习图像识别:CNN建模(Tensorflow)

    基于WIN10的64位系统演示 一 写在前面 1 深度学习图像识别的原理 我们思考一下 当你看到一张椅子的图片 你的大脑会告诉你这是个椅子 但你有没有想过 为什么你知道这是椅子 你的大脑是怎么做推论的 你可能会说因为椅子有腿 有座位 有靠背
  • 十四. Kubernetes 工作负载 之 Deployment

    目录 一 Deployment 基础解释 RC RS 解释 二 Deployment 的更新机制 版本回滚 滚动升级 三 资源限制与动态扩缩容 安装 Metrics server HPA 动态扩缩容 五 蓝绿部署与金丝雀部署 六 Deplo
  • mybatis报错lineNumber:31,columnNumber:17,元素类型为configuration的内容必须匹配解决方法

    在写一个mybatis测试demo时发现配置mybatis xml报错如下 org apache ibatis exceptions PersistenceException Error building SqlSession Cause
  • osx制作u盘安装盘

    官方教程 为了方便我直接把所需文件放在 目录 打开终端执行 cd sudo createinstallmedia volume Volumes hp x750w applicationpath Install OS X El Capitan
  • BP神经网络回归---房价预测

    xue 学 tu 途 Hello 各位小伙伴们大家早上好呀 这期 博主给大家分享如何用BP神经网络回归去拟合波士顿的房价数据 从而训练出一个可以预测波士顿房价的神经网络模型 神经网络回归 BP神经网络 回归
  • 第八章 linux系统引导过程及引导修复

    1 bios初始化 虚拟机可通过如下方法进入 调整默认启动 关闭selinux vim etc sysconfig selinux 2 磁盘引导 mbr 主引导记录 0磁道1扇区446 作用 记录grub2引导文件的位置 当mbr数据丢失系
  • Mybatis 只返回特定字段的方法

    参考地址 https blog csdn net menghuannvxia article details 82906341 mybatis中如果返回对象集合的话 会把对象中的所有字段都返回 如果表中字段很多而我只需要部分字段 有几种解决
  • mysql及sql基础语法笔记

    一 mysql初始工作 安装卸载 服务启动停止 登陆退出 dos里面 mysql u root p 123321 quit 语言规范 1 SQL 语言大小写不敏感 数据大小写是敏感的 2 SQL 可以写在一行或者多行 3 关键字不能被缩写也
  • Python复习

    类似 xxx 这种格式的变量是特殊变量 允许被直接引用 但是会被用作特殊用途 比如 author name 就是属于特殊变量 hello模块定义的文档注释也可以用特殊变量 doc 访问 我们自己编程定义的变量一般不会用这种变量名 类似 xx
  • MyBatis总结(3)---映射文件的元素配置

    MyBatis 1 简介 映射文件是MyBatis框架中十分重要的文件 可以说 MyBatis框架的强大之处就体现在映射文件的编写上 映射文件的命名一般是实体类名 Mapper xml 例 Student类对应的映射文件是StudentMa
  • 删除PostgreSQL数据库中的所有表

    1 使用navicat建立连接 代码中的配置 jdbc driverClassName org postgresql Driver jdbc url jdbc postgresql localhost 5432 postgres jdbc
  • Python程序运行出现TypeError: run() missing 1 required positional argument: ‘test’

    TypeError run missing 1 required positional argument test 文章目录 源代码 错误类型 解决办法 源代码 import unittest from app import BASE DI
  • 积木画-蓝桥杯(dp)

    试题 G 积木画 问题描述 小明最近迷上了积木画 有这么两种类型的积木 分别为 I 型 大小为 2 个单位面积 和 L 型 大小为 3 个单位面积 同时 小明有一块面积大小为 2 N 的画布 画布由 2 N 个 1 1 区域构成 小明需要用
  • CSS布局-解决flex布局下多行元素既可以均匀对齐最后一行也可以从左到右排列

    首先 你有没有遇到过这种情况 你既想让它均匀分布 还想让最后一行从左向右排列 此时你的代码应该是这样的 box display flex justify content space evenly flex wrap wrap box inf
  • 在工作中学习,在学习中工作

    2011年八月第二周 时间还是和以前一样过的那么快 一周的时间转眼就过去了 这一周 对工作中所需的知识点进行了两天的培训 其余的时间都是Flex及其开源框架Caringorm的学习 因为之前没有接触过Flex 所以现在的学习是一种 即学式
  • 自定义注解注入属性值(基于类构造方法)

    本文将举例说明如何通过构造方法来处理注解 实现属性注入 自定义注解Name 实现超类 定义注解处理方法 子类使用注解 自定义注解Name 定义一个注解 Name Name注解可以接收一个String类型的属性 并且可以使用在类或者属性上 T
  • 机器学习——入门

    机器学习算法分类 监督学习 目标值是类别 gt 分类问题 k 近邻算法 贝叶斯分类 决策树与随机森林 逻辑回归 目标值是连续型的数据 gt 回归问题 线性回归 岭回归 无监督学习 没有目标值 gt 无监督学习 聚类k means 机器学习开
  • AD7124-4 精度

    AD7124芯片 是属于AD公司的较新产品 高达24位的精度 确实让人眼馋 究竟如何呢 寄存器配置顺序 1 AD上电后 先关闭SPI片选 2 使能开启单片机的 SPI 3 复位设备及所有内部寄存器 发送64位的1 也就是8个0xFF 4 读