【嵌入式硬件芯片开发笔记】4-2 mADAC芯片AD5421配置流程
创始人
2024-03-26 05:43:01
0

【嵌入式硬件芯片开发笔记】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);
}

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...