【STM32L496】AD5421读取片内ADC(读VLOOP与芯片温度)

本文详细介绍了AD5421芯片的手册原理,包括如何通过内置ADC测量温度和VLOOP电压,以及使用控制寄存器进行配置和读取故障寄存器的步骤。还提到了编程实现中的注意事项,如芯片复位后的延迟和读取VLOOP/温度数据的方法。
摘要由CSDN通过智能技术生成

AD5421芯片了解

首先了解一下该芯片手册中对测量芯片温度和VLOOP的基本原理。

片内ADC
AD5421内置一个片内ADC,用于测量芯片温度或VLOOP与COM引脚之间的电压,并将其反馈给故障寄存器。控制寄存器的选择ADC输入Bit(Bit D8)选择要转换的参数。命令字节00001000(仅当自动故障回读禁用时才需要)启动转换,该命令字节会使ADC上电并执行转换。读取故障寄存器可返回转换结果。如果要求自动回读故障寄存器,则首先必须将控制寄存器的片内ADC Bit(Bit D7)置1,以使ADC上电。
由于FAULT引脚可在长达30μs的时间内保持高电平,在回读VLOOP电压后执行芯片温度测量时必须小心。从VLOOP测量切换到芯片温度测量时,不应在切换后30 μs内读取FAULT引脚,因为可能出现误触发(故障寄存器内容不受影响)。

在读取片内ADC时,代码配置步骤如下:
1.芯片复位(芯片复位后需要等待50us才可以进入下一指令)
2.写入控制寄存器
3.开启VLOOP或芯片温度测量
4.读取故障寄存器数据
地址字节表
本次的输入数据没有用到带CRC校验,即为24为传输数据。
输入移位寄存器
从芯片手册可以看到计算电压的公式和温度的公式如下:
片内ADC传递函数公式_Vloop
片内ADC传递函数公式_temp
这里的八位数字代码从故障寄存器的bit0至bit7中获得,在代码中可以利用位与获取。
查看控制寄存器的内容,它是一个读写寄存器,可以控制芯片的工作模式(控制读或写)。实现本文功能时,需要禁用看门狗定时器,所以看门狗的超时时间可以默认给1;自动故障回读位置1,即故障寄存器内容不通过SDO引脚输出;SPI故障时报警位置1,即检测到SPI故障时不将环路电流驱动至报警值;bit7置1,使能片内ADC;bit6和bit5给0,内部基准电压源上电且当VLOOP − COM电压降至约0.3 V时,FAULT引脚不置1。bit8按照自己要测量的内容给值,读Vloop置0,读temperature置1。
控制寄存器
最终要读取Vloop或temperature的值时,数据来自故障寄存器,这是一个只读寄存器,这里只用到了bit0至bit7,其余数据位可以通过芯片手册了解。
故障寄存器

HAL库配置及初始化

部分代码

在这里需要注意一下,打开读temperature或Vloop的控制寄存器后需要添加延时函数再去读故障寄存器的数据,不然数据读不到。

float ad5421ReadTemperature(void)
{
	uint16_t dat=0;
	ad5421_write(0x07,0);//send reset signal
	delay_ms(55);
	dat = ad5421_read(0x82);
	ad5421_write(0x02,dat|(1<<7));//open re-read
	//ad5421_write(0x02,dat|(1<<8));
	ad5421_write(0x02,0xFD80);//write in control register (send data)
	ad5421_write(0x08,0);//open temperature measure
	delay_ms(50);
	dat = ad5421_read(0x85);//get temp data
	float temp = (-1.559f)*(dat&0x00FF)+312.0f;
	printf("temp = %0.4f\n",temp);
	return temp;
}

float ad5421ReadVloop(void)
{
	uint16_t dat = 0;
	float datafl = 0.0f;
	dat = ad5421_read(0x82);
	ad5421_write(0x02,dat|(1<<7));//open re-read
	//ad5421_write(0x02,data16|(1<<8));//open read temp pin
	ad5421_write(0x02,0xFC80);
	//ad5421_write(0x02,data16&(~(1<<8)));//open read vloop pin
	ad5421_write(0x08,0);//open vloop measure
	delay_ms(50);
	dat = ad5421_read(0x85);
	datafl = 2.5f/256.0f*(dat&0x00FF);
	printf("Fault_Register = 0x%X\n",dat);//可以通过dat读出故障寄存器的值,由此判断AD5421是否有什么问题
	printf("AD5421_VLOOP = %0.6f\n",datafl);
	printf("Real_VLOOP = %0.4f\n",datafl*21.0f);
	return datafl;
}

这里的ad5421_write函数就是控制寄存器的函数,ad5421_read就是读故障寄存器的函数,读取故障寄存器存至dat,到后来与0x00FF获其bit0到7的数据,再根据公式进行计算。

遇到的问题

说实话一开始写这个的时候一点头绪都没有,虽然现在看起来好像挺简单的,手册也写得很详细,但是在当时是一点都写不出来。
在这里要记得芯片复位修改了片内ADC的工作模式之后一定要延时,不然会读到一些奇怪数据,当时还以为是公式计算出问题了,怀疑自己很久。
ad5421_write函数和ad5421_read函数的不详细介绍在

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值