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为传输数据。
从芯片手册可以看到计算电压的公式和温度的公式如下:
这里的八位数字代码从故障寄存器的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
函数的不详细介绍在这。