我是靠谱客的博主 完美小蝴蝶,最近开发中收集的这篇文章主要介绍基于ADS1247的PT100测温设计前言一、ADS1247测量Pt100的原理图二、ADS1247程序设计总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

基于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)

最后

以上就是完美小蝴蝶为你收集整理的基于ADS1247的PT100测温设计前言一、ADS1247测量Pt100的原理图二、ADS1247程序设计总结的全部内容,希望文章能够帮你解决基于ADS1247的PT100测温设计前言一、ADS1247测量Pt100的原理图二、ADS1247程序设计总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(81)

评论列表共有 0 条评论

立即
投稿
返回
顶部