基于ADS1247的PT100测温设计

基于ADS1247的PT100测温设计总结


前言

本人做嵌入式开发,之前很多资源都是从博客上看到,本次因为工作项目涉及到ADS1247设计的温度采集,需要设计硬件开发,网上找了很多资料走了不少弯了,现在项目完成,关于ADS1247的设计使用做一个简单的总结,并公布原理图和原代码,供有需要的人参考。第一次写文,写的不好勿喷


一、ADS1247测量Pt100的原理图

采用ADS1247组成的AD转换器,通过SPI与单片机通讯,采集ADC转换的PT100两端的电压值,然后通过公式计算出温度。
在这里插入图片描述
           ADS1247测温原理图
原理分析:
ADS1247是一款高集成、高精度、24位模数转换器。本设计就是利用的它内置的可编程的电流源输出经过PT100,然后在PT100的两端分别将ADS247的差分输入引脚接入,从而采集到PT100两端的电压值;同时让电流经过一个高精度的电阻,用ADS1247的参考REFP和REFN采集电阻的电压作为内部ADC转换参考电压值,PT100两端的电压经过PGA放大转成24位数字量存在ADS1247的寄存器里。然后外部再通过SPI通讯读取出来。

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、ADS1247程序设计

1.SPI通讯寄存器配置

ADS1247采集PT100需要配置的寄存器:
ADS1247_REG_MUX0 0x00 多路复用控制寄存器0 ADS1247_REG_VBIAS 0x01 偏置电压寄存器
ADS1247_REG_MUX1 0x02 多路复用控制寄存器1
ADS1247_REG_SYS0 0x03 系统控制寄存器
ADS1247_REG_CFC0 0x04 漂移系数校准寄存器0
ADS1247_REG_CFC1 0x05 漂移系数校准寄存器1
ADS1247_REG_CFC2 0x06 漂移系数校准寄存器2
ADS1247_REG_FSC0 0x07 满量程标准系数寄存器0
ADS1247_REG_FSC1 0x08 满量程标准系数寄存器1
ADS1247_REG_FSC2 0x09 满量程标准系数寄存器2
ADS1247_REG_IDAC0 0x0a IDAC控制寄存器0
ADS1247_REG_IDAC1 0x0b IDAC控制寄存器1
ADS1247_REG_GPIOCFG 0x0c GPIO配置寄存器
ADS1247_REG_GPIODIR 0x0d GPIO方向寄存器
ADS1247_REG_GPIODAT 0x0e GPIO数字寄存器

ADS1247初始化代码:

void ADS1247_Init()
{
uint8_t Cmd;
ADS_NSS6(0);
ADS1247_WriteCmd(ADS1247_CMD_RESET);
HAL_Delay(20);

  Cmd=0x0A;  //00 001 010
	ADS1247_WriteReg(ADS1247_REG_MUX0,&Cmd,1);
  Cmd=0x00;  //0000 0110
  ADS1247_WriteReg(ADS1247_REG_VBIAS,&Cmd,1);
  Cmd=0x20;  //0 01 10 000 
	ADS1247_WriteReg(ADS1247_REG_MUX1,&Cmd,1);																								
	Cmd=0x22;  //0 010 0010                                      
	ADS1247_WriteReg(ADS1247_REG_SYS0,&Cmd,1); 

	Cmd=0x06;  //xxxxx 110 
	ADS1247_WriteReg(ADS1247_REG_IDAC0,&Cmd,1);
	Cmd=0x03;  //0000 0011 										               
	ADS1247_WriteReg(ADS1247_REG_IDAC1,&Cmd,1);	
		
	Cmd=0x00;  //GPIO3-AIN3 GPIO2-AIN2  GPIO1-REFN0 GPIO0-REFP0
	ADS1247_WriteReg(ADS1247_REG_GPIOCFG,&Cmd,1);	
	Cmd=0x00;  //
	ADS1247_WriteReg(ADS1247_REG_GPIODIR,&Cmd,1);
	Cmd=0x00;  //
	ADS1247_WriteReg(ADS1247_REG_GPIODAT,&Cmd,1);
	
	ADS_NSS6(1);

}

2.单次读取ADC转换数据

代码如下(示例):

uint32_t ADS1247_ReadData_RTD(void)
{
uint8_t Cmd[4]={ADS1247_CMD_RDATA,ADS1247_CMD_NOP,ADS1247_CMD_NOP,ADS1247_CMD_NOP};
uint8_t Buf[4];
uint32_t Data=0;

ADS1247_WaitBusy();

// if(ADS_RDY6<=0)
// {
ADS_NSS6(0);
HAL_SPI_TransmitReceive(&hspi2,Cmd,Buf,4,1000);
ADS_NSS6(1);
// }
Data=Buf[1];
Data=(Data<<8)|Buf[2];
Data=(Data<<8)|Buf[3];
return Data;
}

温度计算:
根据传感器的标定的温度范围,查表找到对应的阻值判断Rt阻值是否超过温度范围,超过范围停止计算,因为可能不准了。
float ADS1247_GetTempture(float ReadTemp)
{
float Z1, Z2, Z3, Z4, Rt,temp;
uint32_t Rtcode;
Rtcode=ADS1247_ReadData_RTD();
Rt=(1.64
Rtcode/0x7FFFFF)/4*1000.0;
// Rt=100;
if(Rt>=100&&Rt<390)
{
Z1 = -RTD_A;
Z2 = RTD_A * RTD_A - (4 * RTD_B);
Z3 = (4 * RTD_B) / RNOMINAL;
Z4 = 2 * RTD_B;
temp = Z2 + (Z3 * Rt);
temp = (sqrtf(temp) + Z1) / Z4;
*ReadTemp=temp;
}
else if(Rt>18&&Rt<100)
{
float rpoly = Rt;
temp = -242.02f;
temp += 2.2163f * rpoly;
rpoly *= Rt; // square
temp += 2.8541e-3f * rpoly;
rpoly *= Rt; // ^3
temp -= 9.9121e-6f * rpoly;
rpoly *= Rt; // ^4
temp -= 1.7052e-8f * rpoly;
*ReadTemp=temp;
}
else
{
temp=0xFFFF;
}
Float_Hex(*ReadTemp,nowtemp);
return *ReadTemp;
}
详细代码工程会上传的本人主页供下载参考。


总结

1、本设计原理上让ADS247的START脚直接接到+3.3V,使ADC一直处于工作状态,不会进入休眠模式,实验的时候有让START悬空和拉低,会有点问题,仿真看到的寄存器有些会变化,或者转换的数据不准确。 2、Dout和DRDY分开使用,当ADC数据转换完成后DRDY输出一个低电平,提示一次转换完成可以采集,可以做外部中断使用。也可以直接用查询的方法一直采集数据,,DRDY转换速率很快,防止频繁中断,影响单片机运行,需要的时候通过SPI采集就能获取最近一次最新的转换数据。 [源代码和工程下载地址](https://download.csdn.net/download/qq_38126035/14613791)
  • 3
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值