This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

ADS1248: Constant drift in reading of sensor; ADS1248

Genius 3300 points
Part Number: ADS1248

1. I am using sensor datasheet attached, with ADS1248 as in schematic attached.

2. While measuring thermistor reading, issue is it keeps on drifting. I am not using any past reading filter. Take reading over 1 sec, average them and convert them. PFA=1 is used.

For example if initially reading is 25.70C, then overtime it keeps on drifting from 24.34C to 27.40C. 

Calibration device with same sensor dont move reading though.

3.  Removing C4 has some positive effect, but still readings keeps on drifting. Is my selection of R8,R9,R10,R11,C13 & C14 ok?  

R8 & R9 are used to put thermistor in CMR range, since PGA = 1 used. 

OTP-638D2_datasheet(R(0) and application(0-50) - Copy.pdf

3858.sch.pdf

  • Hi VT,

    The schematic looks fine to me. I think the values you chose will work for this application. 

    It is difficult to say what exactly would be causing this issue without additional information. A few things to try would be to probe the inputs of the ADS1248, to see if the voltage is stable, or if it is drifting, similar to the behavior you have described. 

    Another thing to consider is the resolution of the measurement. How much of the full-scale range is being used? If you increase the gain of the PGA to use the full input range, does the issue go away? It could be that simply this "drift" is actually just noise.

  • Hi,

    What is forumula to convert adc data to Volts?

    I am using PGA 32,64,128?

    Vref = 3.3V

    1. For PGA= 1 , Vmeasured = (3.3 * adc value)/(2^24-1)

    2. For PGA= 32 , Vmeasured = (3.3 * adc value)/((2^24-1)* 32)

    2. For PGA= 64 , Vmeasured = (3.3 * adc value)/((2^24-1)* 64)

    Isnt in 24 bit adc, 24th bit is sign bit? So effective conversion is 23 bits only?  So in above forumula is it (2^23-1) or (2^24-1)?

    Here is code I am using to convert adc result? Is it ok? Or better/right way to do it?

    int32_t get_burst_adc_result(void)
    {
        uint32_t adc_result;
        uint8_t temp;
        int32_t valueShifted;
        int32_t value;
           
        adc_result = ads1248_three_bytes();
        
        
        // the raw value coming from the ADC is a 24-bit number, so the sign bit now
        // resides on bit 23 (0 is LSB) of the uint32_t container. By shifting the
        // value to the left, I move the sign bit to the MSB of the uint32_t container.
        // By casting to a signed int32_t container I now have properly recovered
        // the sign of the original value    
        adc_result = adc_result << 8U;
        valueShifted = (int32_t)adc_result;
        value = valueShifted >> 8;
    
        
        
        return value;
    }

  • Hi VT,

    A reference voltage of 3.3V when using AVDD = 3.3V, AVSS = 0V is not valid for this device. The ADS1248 requires 1V of headroom for the reference voltage with respect to AVDD-AVSS. Are you using the internal reference voltage of 2.048V, or have you connected a reference externally? 

    If you have connected a reference externally, can you please provide an updated schematic? 

    If you have not seen it already, a basic guide to thermocouple measurements may help with your design: https://www.ti.com/lit/an/sbaa274/sbaa274.pdf?ts=1595449398737&ref_url=https%253A%252F%252Fwww.google.com%252F

    To convert output codes into volts, you must first calculate the least-significant bit size or LSB. One LSB represents the voltage weight of one code. In other words, the input voltage must change by one LSB size in order to increment/decrement the ADC output. The full-scale range (FSR) of the ADC divided by the total number codes gives you the LSB size:

    LSB = FSR / (2^n - 1), where 'n' is the ADC resolution.

    In the ADS1248, the differential input voltage to each ADC can range from -VREF to +VREF, so the full-scale range = 2 x VREF. Remember that there is a PGA in front of each ADC as well, so the differential input to each channel must be limited from (- VREF / Gain) to (+VREF / Gain). The LSB size is then calculated as:

    LSB = (2 x VREF)/ Gain / (2^24 - 1)

    Next, you must know the output data format for your ADC. The ADS1248 outputs data in binary two's complement, where 0x7FFFFF represents positive full-scale and 0x800000 represents negative full-scale.

    The most straightforward way to convert your output codes back into input voltage is to AND the data with 0x800000 and test the MSB (most-significant bit). If the MSB equals 0, simply multiply the decimal equivalent by the LSB size. If the MSB = 1, you must first subtract 2^n from the decimal equivalent, then multiply by the LSB size. 

    For example, using VREF = 2.5 V, N = 24 bits, and Gain = 4, we can calculate the LSB size as 74.506 nV. An output code of 0x147AE1 would correspond to an input voltage of +100 mV. Meanwhile, an output code of 0xD70A3D would correspond to an input voltage of -200 mV.

    I hope this helps answer your question.