ADS1247: 测量100欧姆电阻,有恒定误差.

Part Number: ADS1247

你好,我使用四线PT100测温,使用ADS1247,用100欧姆,5ppm,0.01%的电阻模拟,看测得的电阻是否正确.恒流源为500uA,PGA增益8,

出现的问题是有一个恒定的误差,本来测得的电阻应该在99.99-100.01欧姆之间.但实际测得的电阻永远在100.28-100.29之间徘徊.

不知道是否万用表的关系,VrefOut测得的电压是:2.043V,

void ADS1247_Init(void)
{
// unsigned char i=0;
// uint8_t Dataw[10]={0};
uint8_t Cmd = 0;
uint8_t ReadData = 0;
/*对ADC进行复位*/
ADS1247_Reset();
Delay_ms(20);
/*配置MUX0寄存器AIN0为正输入,AIN1为负输入*/
// Cmd = 0x08;/*0000 0001*/
// ADS1247_WriteReg(ADS1247_MUX0,&Cmd,1);
/*打开AN0/AIN1偏置电压*/
// Cmd = 0x03;/*0000 0001*/
// ADS1247_WriteReg(ADS1247_VBIAS,&Cmd,1);
//0010 0000 内部电压总是启动,REF0
Cmd = 0x20 ; /*0 01 00 000*/
ADS1247_WriteReg(ADS1247_REG_MUX1, &Cmd, 1);
ADS1247_ReadReg(ADS1247_REG_MUX1, &ReadData, 1);

//ADS1247_RWSYSReg();
//0011 0001 系统控制寄存器,PGA增益为8,ADC的输出数据率为5SPS
Cmd = 0x30 ; /*0110 0010*/
ADS1247_WriteReg(ADS1247_REG_SYS0, &Cmd, 1);
ADS1247_ReadReg(ADS1247_REG_SYS0, &ReadData, 1);
//设置恒流源IDACs的输出电流 0000 0100 电流为500微安
Cmd = 0x04 ; /*0000 0000*/
ADS1247_WriteReg(ADS1247_REG_IDAC0, &Cmd, 1);
ADS1247_ReadReg(ADS1247_REG_IDAC0, &ReadData, 1);
//0000 0000 恒流源输出通道,选择通道0
Cmd = 0xF0; /*1111 1111*/
ADS1247_WriteReg(ADS1247_REG_IDAC1, &Cmd, 1);
ADS1247_ReadReg(ADS1247_REG_IDAC1, &ReadData, 1);
//0001 0001 通道选择,Pos:AIN2 Neg:AIN1
Cmd = 0x11;
ADS1247_WriteReg(ADS1247_REG_MUX0, &Cmd, 1);
ADS1247_ReadReg(ADS1247_REG_MUX0, &ReadData, 1);
/*配置FSC0为00*/
Cmd = 0x00; /*0010 0000*/
ADS1247_WriteReg(ADS1247_REG_FSC0, &Cmd, 1);
ADS1247_ReadReg(ADS1247_REG_FSC0, &ReadData, 1);
/*配置FSC1为00*/
Cmd = 0x00; /*0000 0000*/
ADS1247_WriteReg(ADS1247_REG_FSC1, &Cmd, 1);
ADS1247_ReadReg(ADS1247_REG_FSC1, &ReadData, 1);
/*配置FSC2为40,在公式中需要除以常数0x400000*/
Cmd = 0x40; /*0000 0100*/
ADS1247_WriteReg(ADS1247_REG_FSC2,&Cmd,1);
Delay_ms(20);
/*拉高START准备ADC转换*/
O_ADS1247_Start = 1;
ADS1247_WriteCommand(ADS1247_CMD_SYSOCAL);
Delay_ms(20);
// ADS1247_WriteCommand(ADS1247_CMD_SYSGCAL);
Delay_ms(20);
ADS1247_WriteCommand(ADS1247_CMD_SELFOCAL);
Delay_ms(20);
/*启动连续转换命令*/
ADS1247_WriteCommand(ADS1247_CMD_RDATAC);
Delay_ms(20);
}

float Get_adsTemp(void)//得到当前温度值
{
int32_t adc_raw;/* -8388608 至 8388607 *///2的23次方
float value_of_res; /* 阻值 */
float Temp=0;
// DRDY数据转换完成标志
if (ADS1247_Wait() == 0)
{
adc_raw = ADS1247_Read(); // read the value from the selected channel
// printf("adc_raw:%x\r\n", adc_raw);
value_of_res = (float)adc_raw / 8388608.f * 2000.f / 8.f; //参考电阻为2000Ω,PGA增益为8
__breakpoint(0);
// printf("value_of_res:%f\r\n", value_of_res);
// Temp = TEMP_ADS1247(value_of_res);
// printf("Temp:%f\r\n", Temp);
}
return Temp;
}