Tool/software:
Hi,
We have made a design using the ADS122U04 just like the reference TIDA-01526E1 following the guide and using the example software.
Everything is working and it seems quite precise but now we have tested the influence of changes in ambient temperature and it looks like the ADS122U04 is very dependent.
Using a climate chamber for the board and high precision resistors (1K - 0.00C & 1K5 - 130.44C) (Not PT1000) as sensors outside the chamber gives
- Initial calibration
- Ambient 21.35C - Sensor 1 0.00C - Sensor 2 130.46C - diff 130.46C
- Cooling for 60min
- Ambient -1.00C - Sensor 1 0.08C - Sensor 2 130.58C - diff 130.50C
- Heeting for 60min
- Ambient 47.47C - Sensor 1 -0.34C - Sensor 2 129.95C - diff 130.29C
- Max diff 0.21C
the temperatures are not stable as you can see. Can you explain why and can we make it better changing away from internal reference or using another mode?
Best regards Peter
Init
ADS122X_reset(); // send UART command
__delay_cycles(8 * 150); // 1 * 150 = 17,44 us, measured with Saleae 23. Oct'18
ADS122X_writeReg(1, 0x0A); //Normal mode, 90 SPS, Single shot, REFP/N as Reference
//__delay_cycles(8*300); // 8 * 300 = 153.6 us
ADS122X_writeReg(2, 0x04); //Conversion Counter off, 250 uA IDAC
// __delay_cycles(8*600); // 8 * 600 = 455 us
ADS122X_writeReg(3, 0xA1); //IDAC2 to REFP pin thru External Ref. Resistor., IDAC1 off, Autoread
ADS122X_writeReg(4, 0x30); //Configure GPIO0/1 as output low
Sample
//Measure RTD2
//ADS122X_writeReg(0, 0x63); //AIN2/3, Gain=2, PGA Bypassed --> see TechNote SBAA235.pdf Gain=4 for 0x65
ADS122X_writeReg(0, 0x65); //AIN2/3, Gain=4, PGA Bypassed --> see TechNote SBAA235.pdf
__delay_cycles(8 * 200); // 100 us after /RESET rising edge @ 8 MHz
ADS122X_start(); // send START command to ADS122X04
__delay_cycles(8 * 200); // 100 us after /RESET rising edge @ 8 MHz
ADS122X_getConversionData(&convDataRTD2); //ignore 1st data, IDAC settling
ADS122X_start(); // send START command to ADS122X04
__delay_cycles(8 * 200); // 100 us after /RESET rising edge @ 8 MHz
ADS122X_getConversionData(&convDataRTD2); //use 2nd data set
if (convDataRTD2 & 0x800000) { // check if result is negative
convDataRTD2 ^= 0x00FFFFFF; //invert and make
convDataRTD2 += 1; // two's complement
}
convDataRTD2 -= ADS122X_RTD2OffsetCorrection;
convDataRTD2 = (long)((long long)(convDataRTD2) * ADS122X_RTD2GainCorrection / 100000);
//Measure RTD1
ADS122X_writeReg(0, 0x35); //AIN/0, Gain=4, PGA Bypassed --> see TechNote SBAA235.pdf
// ADS122X_writeReg(0, 0xE5); //AIN/0, Gain=4, PGA Bypassed --> see TechNote SBAA235.pdf
//using internal REF results are stable
__delay_cycles(8 * 200); // 100 us after /RESET rising edge @ 8 MHz
ADS122X_start(); // send START command to ADS122X04
__delay_cycles(16 * 800); // 100 us after /RESET rising edge @ 8 MHz
ADS122X_getConversionData(&convDataRTD1);
if (convDataRTD1 & 0x800000) { // check if result is negative
convDataRTD1 ^= 0x00FFFFFF; //invert and make
convDataRTD1 += 1; // two's complement
}
convDataRTD1 -= ADS122X_RTD1OffsetCorrection;
convDataRTD1 = (long)((long long)(convDataRTD1) * ADS122X_RTD1GainCorrection / 100000);
//Measure RTD1 "chopped" (AINx/AINy inverted)
ADS122X_writeReg(0, 0x05); //AIN0/1, Gain=4, PGA Bypassed --> see TechNote SBAA235.pdf
__delay_cycles(8 * 200); // 100 us after /RESET rising edge @ 8 MHz
ADS122X_start(); // send START command to ADS122X04
__delay_cycles(8 * 200); // 100 us after /RESET rising edge @ 8 MHz
ADS122X_getConversionData(&convDataRTD1chop);
if (convDataRTD1chop & 0x800000) { // check if result is negative
convDataRTD1chop ^= 0x00FFFFFF; //invert and make
convDataRTD1chop += 1; // two's complement
}
convDataRTD1chop -= ADS122X_RTD1OffsetCorrection;
convDataRTD1chop = (long)((long long)(convDataRTD1chop) * ADS122X_RTD1GainCorrection / 100000);
//Measure RTD2 "chopped" (AINx/AINy inverted)
ADS122X_writeReg(0, 0x75); //AIN3/2, Gain=2, PGA Bypassed --> see TechNote SBAA235.pdf; Gain=4 for 0x75
__delay_cycles(8 * 200); // 100 us after /RESET rising edge @ 8 MHz
ADS122X_start(); // send START command to ADS122X04
__delay_cycles(8 * 200); // 100 us after /RESET rising edge @ 8 MHz
ADS122X_getConversionData(&convDataRTD2chop);
if (convDataRTD2chop & 0x800000) { // check if result is negative
convDataRTD2chop ^= 0x00FFFFFF; //invert and make
convDataRTD2chop += 1; // two's complement
}
convDataRTD2chop -= ADS122X_RTD2OffsetCorrection;
convDataRTD2chop = (long)((long long)(convDataRTD2chop) * ADS122X_RTD2GainCorrection / 100000);
ADS122X_powerdown(); // Powerdown to ADS122x04
//calculate mean value RTD1
convDataRTD1 = (convDataRTD1 + convDataRTD1chop) / 2;
RTDtemperature1 = interpolateRTDTemperatureValue(convDataRTD1); // Get the RTD temperature and convert into millidegrees C
//calculate mean value RTD2
convDataRTD2 = (convDataRTD2 + convDataRTD2chop) / 2;
RTDtemperature2 = interpolateRTDTemperatureValue(convDataRTD2); // Get the RTD temperature and convert into millidegrees C
/* Result in RTDtemperature1 & RTDtemperature2 */
// uart_putLong(RTDtemperature1);
// uart_putLong(RTDtemperature2);