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.

ADS1147 sensor detection (burnout current)

Other Parts Discussed in Thread: ADS1147

Hello,

I have a question concerning the IC ADS1147. I am using this chip to measure the resistance of different temperature sensors. For that, an ARM microcontroller is controlling it over an SPI bus. The purpose of the application is to detect different ranges of sensors (i.e. sensors in different resistance ranges), so my application should be able to switch between three different configurations, to maximize the resolution I get.

The three configurations are:

 * "Range 0": current through sensor of 2*1.5mA, 3V external reference by means of a 1KOhm shunt in series with the sensor, Gain=4, sensor to detect between 0 and 200 Ohm. MUX0 =0x11, VBIAS=0x00, MUX1=0x20, SYS0=0x29, IDAC0=0x07, IDAC1=0x33.

* "Range 1": current through sensor of 500uA, 2.048V internal reference, Gain=2, sensor to detect between 200 and 2000 Ohm. MUX0 =0x11, VBIAS=0x00, MUX1=0x30, SYS0=0x19, IDAC0=0x04, IDAC1=0x3F.

* "Range 2": current through sensor of 50uA, 2.048V internal reference, Gain=1, sensor to detect between 2000 and 40000 Ohm. MUX0 =0x11, VBIAS=0x00, MUX1=0x30, SYS0=0x09, IDAC0=0x01, IDAC1=0x3F.

The measurement for each sensor type (i.e. each configuration of the ADS1147) works well enough by itself, and when I read the codes over the SPI connection I obtain correct codes from the ADS1147. For example, I can see that the returned code is linear with the resistance of the connected sensor, and I can obtain a resistance value close to the sensor by taking into account the reference voltage, the current and the gain I programmed each configuration with.

However, for the switching between configurations I intend to use the "sensor detection" feature, by means of a burnout current, in particular 10 uA (because in the application it is also possible that no sensor is connected). If I configure the ADS1147 for this case and test it with a sensor, I do not get correct  codes from the chip: they are not linear with the sensor resistance value, and I cannot obtain the resistance value the sensor has. However, I see with a multimeter that the voltage drop over the sensor is very stable, which I take to mean that the current over it is also stable and constant, but does not seem to match the expected 10 uA.

The values I have loaded into the registers are the following (I am able to read back the registers from the device so I am sure it is programmed with the correct values):

MUX0 =0xD1: 10uA burnout current, positive input AIN2, negative input AIN1.

VBIAS=0x00

MUX1=0x30: internal oscillator in use, internal reference always on, onboard (internal) reference, normal operation.

SYS0=0x29: Gain=4, 2000 samples per second.

IDAC0=0x00: DOUT is only data output pin, disabled excitation current(s).

IDAC1=0xFF: Disconnected excitation current(s).

I cannot find in the datasheet if those values would be correct, or I should change anything.

Thank you very much in advance, and kind regards,

Juan Antuna

  • Juan,


    I can basically see what you're doing, but it still helps to have a schematic or a portion of one. If you don't want to share that on the forum, I can contact you through email and we can take the reply off the forum.

    Typically, the burnout current source is used with more with thermocouples, because the measurement depends only on the thermouple voltage, which may have only a minimal resistive component. Even then, I'd only use it intermittently to check on the sensor. It really only helps to find open circuits.

    As for the source of your error, I only have a couple of things to point out. First, it might help to have the data that you retrieved and the expected values. I think the output hex would be best instead of the converted voltage reading. That way we can quantify the error that you're seeing.

    I would also note that the burnout current sources may not be completely matched with the amount of current going in and coming out of the positive and negative inputs. This might be part of your error, though I would imagine this to be moderately small. The burnout current sources are used to pull the positive and negative inputs apart, showing a full scale reading with an open circuit.

    Lastly, I would consider and input filtering that you have. By forcing currents in and out of the analog inputs, you add extra voltage with any series resistance and add more error to the measurement. Again, a schematic would point that out.

    Let me know if you want me to review a schematic, and see if you can get me the output data that is in error. If you have any other questions, let me know.


    Joseph Wu

  • Joseph,

    First of all, thank you for your response. Please find attached the piece of schematic relevant to the ADS1147.

    I am also attaching a table with the HEX codes retrieved from the ADS1147 for different resistance values in each of the configurations described above. In every configuration, the voltage is calculated in the firmware as 

    V = [HEX_code] * [V_ref] / ([PGA_gain] * (215 -1)). This voltage calculation is verified by measuring with an external multimeter, except for the configuration with the burnout current, but in this configuration even the codes do not seem to go linearly with the resistor value, which they do for each range (as long as the resistor is within the FS).

      Range 0 (0-200 Ohm) Range 1 (200 - 2000 Ohm)
    Sensor resistance (Ohm) Code (HEX) Voltage(mV) Code (HEX) Voltage(mV)
    18.96 93C 54.08643 120 9.000275
    161.9 52A2 484.191406 A14 80.627464
    243.4 778B 700.468445 F2A 121.3162
    1807 7FFF 750 70D1 902.558777
    2171 7FFF 750 7FFF 1024
    36450 7FFF 750 7FFF 1024
    Open circuit 7FFF 750 FFFF 1024
      Range 2 (2000 - 40000 Ohm) Sensor burnout
    Sensor resistance (Ohm) Code (HEX) Voltage(mV) Code (HEX) Voltage(mV)
    18.96 D 0.812525 606 24.094486
    161.9 7E 7.87524 62A 24.657003
    243.4 BD 11.81286 63F 24.985138
    1807 589 88.565201 7CC 31.188452
    2171 6A6 106.37825 82C 32.688499
    36450 6FA4 1786.304565 2A05 168.083252
    Open circuit 7 0.31251 7FFF 512

    Actually, what I want to use the burnout detection for is to detect open circuits. I can see that with that configuration the open circuit is detected, but the resistance estimation when a sensor is connected is completely wrong.

    I also find strange that for the "Range 2 " configuration, the code the ADS1147 returns for an open circuit is so low. Could this have something to do with the input filter?

    Thank you again,

    Juan

  • Juan,


    I'm not sure exactly what is happening, but I have a few guesses and suggestions.

    First I would start by removing the protection diodes that you have on the input D18-D21 and start your debugging there. These diodes may have some leakage that may both be affecting your measurement. In general, it's not enough current to overcome the burnout current sources, but if they're not on, it's possible that may pull both inputs to a low voltage. keeping the inputs close together.

    Second, I would not only take the measurement of the ADC (which you've done well), but I would also measure the voltage that the ADC sees with a precision meter. Measure TP157 to TP154, then measure these voltages to ground to see if the inputs are where you expect them to be. As an example on Range 2, with an open circuit you get a hex code of 0007. Measure from TP157 to TP154 and verify that the voltage is 0.312V. If it is,

    Third, I would also measure the reference at each point to make sure that there isn't something wrong with that. It looks like R183 is a 1k resistor with 3mA of current as a reference for a ratiometric measurement. Verify at each point that this is correct. Also, at high sensor resistances, the IDAC current may drop because it will force the IDAC output high and voltage and degrade the current source as voltage rises.

    Also, what are you using to simulate your sensor resistance? Is it a real resistor, or are you using some simulator (if so, what model)? Are there any other elements connected to your header?


    Joseph Wu