【嵌入式硬件芯片开发笔记】4-2 mADAC芯片AD5421配置流程

news2024/10/6 22:26:48

【嵌入式硬件芯片开发笔记】4-2 mADAC芯片AD5421配置流程
16位、串行输入、环路供电、4 mA至20 mA DAC
可用于HART协议相关电路 同AD5700配合使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
AD5421的SPI和普通的不一样
回读时要发两段 CS中间拉高一次

数据在SCLK上升沿逐个输出,而且在 SCLK下降沿有效
固CPOL为低电平,CPHA为2 edge
可选择开启CRC校验

在这里插入图片描述
一般接的是4-20mA

在加载DAC、强制报警电流、复位、启动VLOOP/温度测量 或无操作命令字节后写入的16 Bits数据字为无关位
上电后寄存器复位,看门狗开启,默认值1s,在1s内没有收到SPI信号,则FAULT置高。

开始运行

  1. 发送RESET命令,延时50us
  2. 读写寄存器操作
  3. 最后开启功能

初始化

  1. 环路电流为4-20mA,通过读写DAC控制器可以输出环路电流大小,输出20mA就是写入0xFFFF
    在这里插入图片描述
  2. 写入控制寄存器,使其为0xFC00,禁用看门狗,不进行写入故障回读,检测到SPI故障时不将环路电流驱动至报警值,其他默认
    D8、D7可配置ADC测量功能
    在这里插入图片描述
  3. 故障寄存器只读,可以读取故障,同时FAULT引脚置高时为故障,读故障寄存器后,自动复位
  4. 失调、增益调整寄存器,用于配置偏移
  5. 发送加载DAC命令,输出电流
  6. 开启ADC,控制寄存器D7置1,,发送ADC读取命令,在故障寄存器内读ADC状态

代码例程

/*!
 * @brief       	操作AD5421
 *
 * @param 	[in]	hspi: AD5421对应的SPI
 *					[in]	add: 寄存器地址
 *					[in]	data: 数据(读数据可以不管)
 *					[in]	WriteNotRead: true为写,false为读
 *
 * @return				dat_16: 返回数据
 */
uint16_t Ctrl_AD5421(SPI_HandleTypeDef *hspi,uint8_t add,uint16_t data,bool WriteNotRead)
{
	uint16_t dat_16=0;
	uint8_t dat_buf[3];
	memset(dat_buf,0,sizeof(dat_buf));
	
	if(WriteNotRead)
	{
		dat_buf[0]=add&0x7F;
		dat_buf[1]=data>>8;
		dat_buf[2]=data&0x00FF;
		SPI_Send_x_Read_y(&hspi2,dat_buf,3,0,30,true);
	}
	else
	{
		dat_buf[0]=add|0x80;
		dat_buf[1]=0;
		dat_buf[2]=0;
		SPI_Send_x_Read_y(&hspi2,dat_buf,3,0,30,true);
		dat_buf[0]=AD5421_NOP;
		dat_16=SPI_Send_x_Read_y(&hspi2,dat_buf,1,2,30,false)&0x0000FFFF;
	}
	
	return dat_16;
}

/*!
 * @brief       	操作AD5421的DAC
 *
 * @param 	[in]	current_v: 要输入的电流值
 *					[in]	WriteNotRead: true为写入并加载DAC,false为读DAC并返回电流值
 *
 * @return				current: 返回的DAC寄存器中对应的电流值
 */
float Ctrl_AD5421_DAC(float current_v,bool WriteNotRead)
{
	float current=0.0f;
	current=current_v;
	uint16_t dat_16=0;
	if(WriteNotRead)
	{		
		if(current>19.9998f)
		{
			dat_16=0xFFFF;
		}
		else if(current<4.0f)
		{
			dat_16=0;
		}
		else
		{
			dat_16=(current-4.0f)*0x10000/16.0f;
		}
		Ctrl_AD5421(&hspi2,AD5421_DAC,dat_16,true);	
		Ctrl_AD5421(&hspi2,AD5421_Load_DAC,0,true);
	}
	else
	{
		dat_16=Ctrl_AD5421(&hspi2,AD5421_DAC,0,false);
		current=16.0f*dat_16/0x10000+4.0f;
		Ctrl_AD5421(&hspi2,AD5421_Load_DAC,0,true);
	}
	return current;
}

/*!
 * @brief       	操作AD5421的ADC
 *
 * @param 	[in]	adc_flag: 0 测量VLOOP,1 测量芯片温度
 *					[in]	EnableNotDisable: true为写入并加载DAC,false为读DAC并返回电流值
 *
 * @return				dat_float: ADC测量值
 */
float Ctrl_AD5421_ADC(uint8_t adc_flag,bool EnableNotDisable)
{
	float dat_float=0.0f;
	uint16_t dat_16=0;	
	if(EnableNotDisable)
	{
		dat_16=Ctrl_AD5421(&hspi2,AD5421_Control,0,false);
		Ctrl_AD5421(&hspi2,AD5421_Control,dat_16|(1<<7),true);
	}
	else
	{
		Ctrl_AD5421(&hspi2,AD5421_Control,dat_16&(~(1<<7)),true);
		return dat_float;
	}
	
	Ctrl_AD5421(&hspi2,AD5421_Load_ADC,0,true);
	delay_us(50);
	
	if(adc_flag)
	{
		dat_16=Ctrl_AD5421(&hspi2,AD5421_Control,0,false);
		Ctrl_AD5421(&hspi2,AD5421_Control,dat_16|(1<<8),true);
		dat_16=Ctrl_AD5421(&hspi2,AD5421_Fault,0,false);	
		dat_float= (-1.559)*(dat_16&0x00FF)+312;
		printf("[INFO] AD5421_TEMP: %0.4f\n",dat_float);
	}
	else
	{
		dat_16=Ctrl_AD5421(&hspi2,AD5421_Control,0,false);
		Ctrl_AD5421(&hspi2,AD5421_Control,dat_16&(~(1<<8)),true);
		dat_16=Ctrl_AD5421(&hspi2,AD5421_Fault,0,false);
		dat_float=2.5f/256.0f*(dat_16&0x00FF);
		printf("[INFO] AD5421_VLOOP: %0.4f\n",dat_float);
	}
	return dat_float;
}

/*!
 * @brief       	初始化AD5421
 *
 * @param 				None
 *
 * @return				None
 */
void Init_AD5421(void)
{	
	Ctrl_AD5421(&hspi2,AD5421_RESET,0,true);
	delay_us(50);
	
	Ctrl_AD5421(&hspi2,AD5421_Control,0xFC00,true);	
	
	Ctrl_AD5421_DAC(20,true);
	
	Ctrl_AD5421_ADC(0,true);
}

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

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

相关文章

微服务框架 SpringCloud微服务架构 26 数据聚合 26.2 DSL 实现Bucket聚合

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构26 数据聚合26.2 DSL 实现Bucket聚合26.2.1 DSL 实现Bucket聚合26.2.2 Buc…

【设计模式】享元模式(Flyweight Pattern)

享元模式属于结构型模式&#xff0c;主要解决系统需要使用大量相似对象&#xff08;细粒度对象&#xff09;而消耗大量内存资源的问题。享元模式运用共享技术有效地支持大量细粒度的对象&#xff0c;其通过提取对象共同的信息抽象出享元对象&#xff0c;实现共享功能&#xff0…

mysql详解之B树的查询时间复杂度

前言 本文是我在看了这篇文章之后&#xff08;这篇文章对b树的时间复杂度总结的很全面&#xff09;&#xff0c;关于B树&#xff08;或B树&#xff09;时间复杂度做的进一步思考&#xff08;如果对解题过程不感兴趣&#xff0c;可以直接看最后的总结&#xff09;。 正题 在这…

Java继承(extends)简明教程

继承是面向对象的三大特征之一。继承和现实生活中的“继承”的相似之处是保留一些父辈的特性&#xff0c;从而减少代码冗余&#xff0c;提高程序运行效率。 Java 中的继承就是在已经存在类的基础上进行扩展&#xff0c;从而产生新的类。已经存在的类称为父类、基类或超类&…

物联网和大数据可应用在哪些领域?

物联网和大数据可应用在哪些领域&#xff1f;物联网和大数据是近年来最受媒体和企业关注的两大宏观技术趋势。两者也并驾齐驱&#xff0c;物联网旨在特定组织或环境中创建一个互联网络&#xff0c;使用该网络来收集数据并集中执行特定功能。物联网部署会生成大量以前未开发的数…

【MR】C++ bullet客户端基于MR的动力学仿真

程序基于&#xff08;A minimal example showing how to use PyBullet from C over shared memory.一个展示如何在共享内存上从c使用PyBullet的最小示例。https://github.com/erwincoumans/pybullet_cpp_sharedmemory_example&#xff09;实现与pybullet服务器通信交互。加上MR…

MySql按条件插入数据,MySQL插入语句写where条件,MySQL在插入时做幂等

文章目录写在前面根据条件插入数据1、先准备测试数据2、正常的插入语句3、有条件的插入语句&#xff08;重点&#xff09;4、查看最终结果总结分析写在前面 使用MySQL的删、改、查功能时&#xff0c;我们都可以根据where条件来对指定数据进行操作。 插入语句如何通过where条件…

Git —— 关于创建多对非对称公钥时对不同服务器的匹配问题

Git —— 关于创建多对非对称密钥时对不同服务器的匹配问题 《工欲善其事&#xff0c;必先利其器》—— 既然点进来了&#xff0c;麻烦你看下去&#xff0c;希望你有不一样的收获~ 《 前言 》 大概是半年前&#xff0c;我写过一篇关于 git 连接托管平台提示 permission denied…

经典算法冒泡排序之标志位优化版

前言 今天总结一下优化版的经典算法——冒泡排序&#xff0c;不同于以往的暴力二重for循环&#xff0c;这里的冒泡排序增加了一个标志位。我们要理解该冒泡排序的概念&#xff0c;算法流程与算法思想&#xff0c;探讨时间复杂度。 冒泡排序算法解析 一、理解冒泡排序思想 1…

Selenium4+Python3系列(十一) - Page Factory设计模式

写在前面&#xff1a; Page Object模式&#xff0c;目的是将元素定位和元素操作分层&#xff0c;只接触测试内容&#xff0c;不写基础内容&#xff0c;便于后续对自动化测试用例体系的维护&#xff0c;这是中心思想&#xff0c;也是核心。 那么我们继续将简洁延续&#xff0c…

Allegro如何铺网格铜详细操作指导

Allegro如何铺网格铜的三种方法操作指导 在做PCB设计的时候,时常需要铺网格铜,尤其是对于绕性有要求的时候,Allegro可以快捷铺出网格铜,类似下图 具体操作如下 直接铺网格铜 选择Shape add Rect命令 Option Type选择Static Crosshatch 画出需要的图形 鼠标右击done,…

详解go语言包管理方式(go mod), 分析多目录多文件下的管理,不同工程下包的相互调用

先明白一个点&#xff0c; 想要成功运行一个go程序&#xff0c; 有两种模式 一&#xff1a; 以前的默认模式&#xff0c;必须将项目放在gopath/src下 二&#xff1a;使用go mod 包管理方式&#xff0c; 项目可以放到任意位置&#xff0c;这样目录下需要有go.mod文件 下边我会分…

毕业设计 stm32单片机的目标检测与跟踪系统 -物联网 openmv 嵌入式

文章目录0 前言课题简介设计框架3 硬件设计4 软件设计对被测物体的识别判断被测物体所在区域5 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年…

力扣(LeetCode)1812. 判断国际象棋棋盘中一个格子的颜色(C++)

数学 如果我们把国际象棋的横轴看做从 111 到 888 &#xff0c;那么每个棋子的坐标形如 a1(1,1)a1(1,1)a1(1,1) c4(3,4)c4(3,4)c4(3,4) &#xff0c;想想坐标之和有没有什么规律。 规律 : 黑子坐标之和为偶数&#xff0c;白子坐标之和为奇数。 横轴坐标是我们自定义的&#x…

基于蚁群算法的三维路径规划算法以及蚁群算法的优化计算——TSP优化(Matlab代码实现)

目录 1 概述 1.1简介 1.2 改进的蚁群算法 2 部分运行结果 2.1 三维路径规划算法 2.2 TSP优化算法 3 Matlab代码实现 4 参考文献 1 概述 1.1简介 当前社会, 很多用户需要在复杂的没有公路的山地地形, 快速、准确的规划出三维路径, 在避过障碍的同时达到某项指标最优。…

【C++笔试强训】第四天

文章目录选择题编程题选择题 #include<iostream> #include<cstdio> using namespace std; int main(){int m0123, n123;printf("%o %o\n", m, n);return 0; }程序运行后的输出结果是&#xff08;&#xff09; A 0123 0173 B 0123 173 C 123 173 D 173 1…

RabbitMQ基本使用

先会用&#xff0c;知道mq是干嘛的&#xff0c;怎么用RabbitMQ 再去考虑一系列深入东西 一&#xff1a;什么是MQ MQ消息队列详解、四大MQ的优缺点分析_从百草园杀到三味书屋&的博客-CSDN博客 理解什么是MQ MQ在企业/程序中的作用是什么&#xff1f; MQ&#xff0c;中文是…

Fluent的porous jump边界条件

1 porous jump简介 多孔介质指内部具有连通的空洞&#xff0c;可使流体穿过的固体。多孔介质具有以下特点&#xff1a; 流道极复杂&#xff0c;活性炭过滤器等随机排布的多孔介质甚至不存在可通过曲面和实体表征的确定流道多孔介质只是流场的一部分&#xff0c;通常不关注多孔…

DataSphere Studio数据应用开发管理集成框架【DSS基础】

https://github.com/WeBankFinTech/DataSphereStudio/https://gitee.com/WeBank/DataSphereStudio 基于插拔式的集成框架设计&#xff0c;及计算中间件 Linkis &#xff0c;可轻松接入上层各种数据应用系统&#xff0c;让数据开发变得简洁又易用。在统一的 UI 下&#xff0c;Da…

[附源码]Python计算机毕业设计Django中小学课后延时服务管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…