[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();//讲电压值转换成电阻值,在转换成温度值
}
}
}