ADS1248 读出的AD值 一直在跳变 而且跳变的范围很大
最近在调ADS1248 读取K型热电偶的板子 寄存器都能配置, 就是读取的AD值一直在调 而且调的范围很大 不知道什么原因?还有 如何把AD值转换成温度值 有没有什么计算公式啊?
您好,这里有个参考代码,您参考一下,谢谢!
8117.ADS1148 Source Code.zip
你好,这个转换值和外部的电路、电源等均有一定关系,你可以上传你的电路以便更好分析。另外AD值转换温度值跟你的参考电压及采样得到的电压值有关
你好 我用的是stm32片上的SPI 按照现象寄存器是可以正常配置的 就是读取的AD值在跳变。附上程序
/*******************************************************************************
* Function Name : ADS1248SPI
* Description : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
* Input : u8 TxData 待发送的数
* Output : None
* Return : u8 RxData 收到的数
*******************************************************************************/
u8 ADS1248SPI(u8 TxData)
{
//等待发送缓冲区空
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){;}
//发一个字节
SPI_I2S_SendData(SPI1, TxData);
//等待数据接收
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){;}
//取数据
return SPI_I2S_ReceiveData(SPI1);
}
/**************************************************************************
* Function Name :ADS1248 写数据
* Description :
* Input :
* Output: :
* Return :
* 备 注 : 向ADS1248中地址为regaddr的寄存器写入一个字节databyte
***************************************************************************/
void ADS1248WREG(unsigned char regaddr,unsigned char databyte)
{
//向寄存器写入数据地址
ADS1248SPI(ADS1248_CMD_WREG+(regaddr & 0xF));
//写入数据的个数n-1
ADS1248SPI(0X00);
//向regaddr地址指向的寄存器写入数据databyte
ADS1248SPI(databyte);
}
/**************************************************************************
* Function Name :ADS1248 读数据
* Description :
* Input :
* Output: :
* Return :
* 备 注 : 向ADS1248中地址为regaddr的寄存器读一个字节databyte
***************************************************************************/
unsigned char ADS1248RREG(unsigned char regaddr)
{
//从ADS1248中地址为regaddr的寄存器读出一个字节
unsigned char r=0;
//写入地址
ADS1248SPI(ADS1248_CMD_RREG+(regaddr & 0xF));
//写入读取数据的个数n-1
ADS1248SPI(0X00);
//读出regaddr地址指向的寄存器的数据
r=ADS1248SPI(ADS1248_CMD_NOP);
return r;//返回数据
}
/*******************************************************************************
* Function Name : ADS1248ReadData
* Description : 读adc转换数据
* Input :
* Output : 24位 3个字节
* Return :
*******************************************************************************/
u32 ADS1248ReadData(void)
{
unsigned long r=0,ls=0;
ls=ADS1248SPI(0xff);
r=ls<<8;
ls=ADS1248SPI(0xff);
r=r+ls;
r=r<<8;
ls=ADS1248SPI(0xff);
r=r+ls;
return r;
}
/**************************************************************************
* Function Name :
* Description :
* Input :
* Output: :
* Return :
***************************************************************************/
void Ads1248_Result(void)
{
//发送单次读数据命令
ADS1248SPI(ADS1248_CMD_RDATA);
//读取ADC转换完成的数据
ads1248_results=ADS1248ReadData();
//发送空操作指令,强迫D_OUT变高
ADS1248SPI(ADS1248_CMD_NOP);
// CS_TEMP_REF1_HIGH;
}
/**************************************************************************
* Function Name :ADS1248 初始化程序1
* Description :
* Input :
* Output: :
* Return :
***************************************************************************/
void InitADS1248(void)
{
CS_TEMP_REF1_HIGH;
SPI2_NSS_LOW; //所有芯片复位 复位引脚
ddelay(90000);
SPI2_NSS_HIGH;
ddelay(ddelay_10ms);
cTEMP_REF_START1_LOW;
CS_TEMP_REF1_LOW; //片选1
ddelay(20);
ddelay(ddelay_10ms);
// 初始化MUX0多路复用控制寄存器
// 00 000 001 AIN0+ AIN1- 0x01
// 00 010 011 AIN2+ AIN3- 0x13
// 00 100 101 AIN4+ AIN5- 0x25
// 00 110 111 AIN6+ AIN7- 0x37
// Bit7-6:传感器电流源检测不使用 Bit5-3:正输入为AIN0 Bit2-0:负输入为AIN1
ADS1248WREG(ADS1248_REG_MUX0,0x01);
This_text[0] = ADS1248RREG(ADS1248_REG_MUX0);
if(This_text[0]==0x01) {GPIO_ResetBits(GPIOF,GPIO_Pin_6);} else{GPIO_SetBits(GPIOF,GPIO_Pin_6);}
// ddelay(600);
// 初始化MUX1多路复用控制寄存器
// 0 01 00 000
// Bit7:启用内部晶振 Bit6-5:内部基准一直打开 Bit4-3:输入基准为片上基准 00:REF0输入 01:REF1输入 Bit2-0:000普通模式 011 温控二极管
ADS1248WREG(ADS1248_REG_MUX1,0x30);
This_text[1] = ADS1248RREG(ADS1248_REG_MUX1);
if(This_text[1]==0x30) {GPIO_ResetBits(GPIOF,GPIO_Pin_7);} else{GPIO_SetBits(GPIOF,GPIO_Pin_7);}
// 延时等待10ms,等待内部基准稳定
ddelay(6*ddelay_10ms);
// 初始化VBIAS偏压寄存器
// 00000000
// Bit7-0:偏置电压选择关闭(默认)
ADS1248WREG(ADS1248_REG_VBIAS,0x00);
This_text[2] = ADS1248RREG(ADS1248_REG_VBIAS);
if(This_text[2]==0x00) {GPIO_ResetBits(GPIOF,GPIO_Pin_8);} else{GPIO_SetBits(GPIOF,GPIO_Pin_8);}
// ddelay(600);
// 初始化IDAC0控制寄存器
// 0000 0000
// Bit7-4:只读 Bit3:DRDY/DOUT功能复用Dout线 Bit2-0:关闭内部恒流源
ADS1248WREG(ADS1248_REG_IDAC0,0x00);
This_text[3] = ADS1248RREG(ADS1248_REG_IDAC0);
if(This_text[3]==0x90) {GPIO_ResetBits(GPIOF,GPIO_Pin_9);} else{GPIO_SetBits(GPIOF,GPIO_Pin_9);}
// ddelay(600);
// 初始化IDAC1控制寄存器
// 0000 0000
// Bit7-4:断开内部第一恒流源的连接 Bit3-0:断开内部第二恒流源的连接
ADS1248WREG(ADS1248_REG_IDAC1,0xff);
This_text[4] = ADS1248RREG(ADS1248_REG_IDAC1);
if(This_text[4]==0xff) {GPIO_ResetBits(GPIOF,GPIO_Pin_10);} else{GPIO_SetBits(GPIOF,GPIO_Pin_10);}
// ddelay(600);
// 初始化SYS0系统控制寄存器
// 0 000 1000
// Bit7:必须设置为0 Bit6-4:选择1倍增益 Bit3-0:1000: 1000SPS测量速度 1001-1111: 2000SPS测量速度
ADS1248WREG(ADS1248_REG_SYS0,0x08);
This_text[5] = ADS1248RREG(ADS1248_REG_SYS0);
ddelay(600);
CS_TEMP_REF1_HIGH; //芯片1失能
// cTEMP_REF_START1_LOW;
}
供电采用的 ACDD+5V AVSS 0V DVDD3.3V, 参考电压 为REFP0 +2.048 REFN0 0 (程序中用的内部参考) AIN0 AIN1 接热电偶正负两端。