应用代码(4)——基于ADS1110芯片的高精度温度(PT1000)采集

[1]ADS1110各个类型的地址

在这里插入图片描述

[2]配置寄存器:

在这里插入图片描述

bit7:
1-》单周期中:st/DRDY,写1开始转换,写入0无影响
1.1读取数据时,该位用来确认转换是否完成,0–寄存器中最新的数据
1–寄存器中的数据还在转换中
2-》在连续方式中:同样忽略写入的值,
2.1读取数据时,该位为0–还未被读取
1–已经被读取过 (寄存器中任意一位被读取就会置1)

[4]:SC 控制单周期转换(“1”)还是连续转换(“0”)
[3:2]:DR 控制速率
在这里插入图片描述

[1:0]:控制增益设置
在这里插入图片描述

[3]:读取的方法

简单的说就是输入一个读(slave Addr+R)命令,直接会接受到3个字节,且期间I2C不需要发送restart命令
在这里插入图片描述

[4]:写寄存器的方法(配置配置寄存器)

在这里插入图片描述

[5]计算方式:

以PGA为2为例:(文档中的例程,其实16sps对应的应该是32768)
在这里插入图片描述

[6]电路

在这里插入图片描述

在这里插入图片描述

[7]运算方式

有偿源码和电路采集部分的电路图点我(例程为高精度的温度检测方案,精度为0.1摄氏度)

关于I2C的读写和配置:

#include "myiic.h"

u16 WMC_CESHI_C = 0;

void IIC_INIT(void)
{
	IIC_CLK_SET_Q;
	IIC_SDA_SET_Q;
	SET_F3_IO;
	SET_F2_IO;
}
void IIC_STAR()
{
	
	IIC_SDA_1;
	IIC_CLK_1;
	
	IIC_DELAY;
	
	IIC_SDA_0;
	IIC_DELAY;
	IIC_CLK_0;
	IIC_DELAY;
}

void IIC_STOP()
{

	IIC_SDA_0;
	//IIC_CLK_0;
	
	IIC_DELAY;
	IIC_CLK_1;
	IIC_DELAY;
	IIC_SDA_1;
	IIC_DELAY;
	IIC_CLK_0;
}
u8 clock()
{
	u16 i;
	
 IIC_CLK_0;
 IIC_SDA_1;
 IIC_CLK_1;
 IIC_DELAY;

	i = 5000;
	while(i--)
	{
		if(IIC_SDA_READ==0) 
		{
				IIC_CLK_0;
	      IIC_DELAY;
				IIC_DELAY;
			return 1;
		}
	}
	IIC_CLK_0;
	IIC_DELAY;
	return 0;
}

void ACK()
{
 IIC_CLK_0;
 IIC_SDA_0;

 IIC_CLK_1;
 IIC_DELAY;
 IIC_CLK_0;
 IIC_DELAY;
}

void NACK()
{
 IIC_CLK_0;
 IIC_SDA_1;

 IIC_CLK_1;
 IIC_DELAY;
 IIC_CLK_0;
IIC_DELAY;
}
void IIC_W_Byte(u8 dat)
{
	u8 i,dat_tmp;
	dat_tmp = dat;
	for(i=0;i<8;i++)
	{
		IIC_CLK_0;

		if(dat_tmp&0x80)
		{
			IIC_SDA_1;
		}
		else
		{
			IIC_SDA_0;
		}
		dat_tmp<<=1;
		IIC_DELAY;
		IIC_CLK_1;
		IIC_DELAY;
	}
	
	IIC_CLK_0;
	IIC_DELAY;

}
u8 IIC_R_Byte()
{
	u8 i;
	static u8 dat_tmp;
	dat_tmp = 0;
	IIC_CLK_0;
	IIC_SDA_1;
	for(i=0;i<8;i++)
	{
		IIC_CLK_0;
		IIC_DELAY;
		IIC_CLK_1;
		
		IIC_DELAY;
		dat_tmp<<=1;
		if(IIC_SDA_READ!=0)
		{
			dat_tmp |= 1;
		}
	}
	IIC_CLK_0;
	return dat_tmp;
}
void ADS_WR_ADD(u8 add)
{
	IIC_STAR();
	IIC_W_Byte(IIC_ADD_R);
	clock();
	IIC_W_Byte(add);
	clock();
	IIC_STOP();
}

void ADS_RD_ADD(u16 *AD,u8 *peizhi)
{
	u8 tmp1,tmp2;
	IIC_STAR();
	IIC_W_Byte(IIC_ADD_R+1);
	clock();
	tmp1 = IIC_R_Byte();
	ACK();
	tmp2 = IIC_R_Byte();
	ACK();
	*peizhi = IIC_R_Byte();
	NACK();
	IIC_STOP();
	(*AD) = tmp1;
	(*AD)<<=8;
	(*AD) |= tmp2;
}
void AD_READ() //获取AD值
{
	u8 i;
	s32 Tmp;
	if(stAD1110.TimCnt>=50) //50ms读取一次
	{
		stAD1110.TimCnt = 0;
	//ST  :  0=新数据   1=不新鲜   
	//SC  : 0=连续     1=单次
	//DR  :  0=240SPS  1=60SPS  2=30SPS  !!3=15SPS  !!   
	//PGA :  !!0=1GAIN !!  1=2GAIN  2=4GAIN  3=8GAIN
	//#define  ADS1110PEIZHI  0x8C// ST  0  0  SC     DR1  DR0  PGA1   PGA0 
		ADS_WR_ADD(ADS1110PEIZHI);  //  1  0  0  0        1   1    0       0
	//s16 AD_Z_TMP[20];
	//u8  AD_Z_CNT=0;
	//前一个参数是16位数据,会取16次,存放进数组中
	//后一个参数是获取到的配置参数
		ADS_RD_ADD((u16*)(AD_Z_TMP+AD_Z_CNT),&(stAD1110.peizhi));
		if(++AD_Z_CNT>=16)  //获取到了16次
		{
			AD_Z_CNT = 0;
			Tmp = 0;
			for(i=0;i<10;i++)
			{
				Tmp+=AD_Z_TMP[i]; 
			}
			stAD1110.AD_ZHI = Tmp/10; //AD值 采样16个取10次的平均数
			//CODE = 16000*V   
			//获取差分电压值(单位:mv)
			stAD1110.dianya =stAD1110.AD_ZHI/16;  //根据公式:code =   32768 * 1 *[ (vin+) - (vin-)/2.048v  ]
			
			printf(" Tmp = %d, stAD1110.AD_ZHI = %d,stAD1110.dianya = %d\r\n",Tmp,stAD1110.AD_ZHI,stAD1110.dianya);
			//R_GET2();
			R_GET_bytomi();//讲电压值转换成电阻值,在转换成温度值
		}

	}
}
  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mhj258258

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值