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.

How to read ADS1120 various MUX input in single-shot mode and why "zero" is then "full scale"?

Other Parts Discussed in Thread: ADS1120, ADS1220

I have two issues with ADS1120.

First, I don't know what is a proper procedure to read two different MUX input using single-shot mode. I was thinking that sending new value of reg 00h is sufficient but it seems that all four register have to be set.

Second, is even more confusing. When "zero" is present  on the selected input I'm receiving almost "full scale" value (i.e. 0xFFE8). Why is that? Please find below an Arduino code that I'm using for testing. U_MON value is present on ADS1220's Ch#1 and  I_MON on Ch#2. Polling instead of interrupt is used, with lowest sampling rate 20SPS with additional 500ms delay between two consecutive conversions (U_MON first then I_MON).

Thanks in advance for any suggestion what I'm doing wrong.

#include "SPI.h" // necessary library
const byte ADC_RESET = B00000110;
const byte ADC_RDATA = B00010000;
const byte ADC_START = B00001000;
const byte READ_U_MON = B10010001;
const byte READ_I_MON = B10100001;
unsigned int dmsb;
unsigned int dlsb;

SPISettings ADS1120(SPI_CLOCK_DIV4, MSBFIRST, SPI_MODE1);

void setup()
{
  // Initialize serial communication  
  Serial.begin(9600);
  // wait until the serial stream is not open
  while (!Serial);
  Serial.println("Serial com ready");

  // Initialize ADS1120
  pinMode(ADC1_SELECT, OUTPUT); // define CS pin as output
  pinMode(CONVEND1, INPUT);  // define DRDY pin as input
  SPI.begin(); // wake up the SPI bus.
  SPI.beginTransaction(ADS1120);
  // Send RESET command
  digitalWrite(ADC1_SELECT, LOW);
  SPI.transfer(ADC_RESET);
  delayMicroseconds(100); // Guard time
  digitalWrite(ADC1_SELECT, HIGH);
}

void loop()
{
    SPI.beginTransaction(ADS1120);
    // read U_MON
    digitalWrite(ADC1_SELECT, LOW); // select ADS1120
    SPI.transfer(B01000011); // Write four bytes starting at configuration register 00h
    SPI.transfer(READ_U_MON); // Register 00h: Read U_MON
    SPI.transfer(B00000000); // Register 01h: 20SPS, 256KHz modulator clock, Single shot, disable temp sensor, Current sources off
    SPI.transfer(B01100000); // Register 02h: External Vref, 50Hz rejection, PSW off, IDAC off
    SPI.transfer(B00000000); // Register 03h: IDAC1 disabled, IDAC2 disabled, dedicated DRDY
    // Start conversion (single shot)
    SPI.transfer(ADC_START);
    while (digitalRead(CONVEND1)) // Wait for DRDY signal
        ;
    // Read conversion data
    SPI.transfer(ADC_RDATA); // Send RDATA command
    delayMicroseconds(50);   // Guard time
    dmsb = SPI.transfer(0);  // read MSB value
    dlsb = SPI.transfer(0);  // read LSB value
    // Display received result
    Serial.print("u_mon=");
    Serial.print(dmsb, HEX);
    Serial.print(dlsb, HEX);
    
    // read I_MON
    SPI.transfer(B01000011); // Write four bytes starting at configuration register 00h
    SPI.transfer(READ_I_MON); // Register 00h: Read I_MON
    SPI.transfer(B00000000); // Register 01h: 20SPS, 256KHz modulator clock, Single shot, disable temp sensor, Current sources off
    SPI.transfer(B01100000); // Register 02h: External Vref, 50Hz rejection, PSW off, IDAC off
    SPI.transfer(B00000000); // Register 03h: IDAC1 disabled, IDAC2 disabled, dedicated DRDY
    // Start conversion (single shot)
    SPI.transfer(ADC_START);
    while (digitalRead(CONVEND1)) // Wait for DRDY signal
        ;
    // Read conversion data
    SPI.transfer(ADC_RDATA); // Send RDATA command
    delayMicroseconds(50);   // Guard time
    dmsb = SPI.transfer(0);  // read MSB value
    dlsb = SPI.transfer(0);  // read LSB value
    digitalWrite(ADC1_SELECT, HIGH); // deselect ADS1120
    SPI.endTransaction();
    
    // Display received result
    Serial.print(" i_mon=");
    Serial.print(dmsb, HEX);
    Serial.println(dlsb, HEX);
    
    delay(500);  // delay until next cycle
}




  • Hi Denis,

    With the ADS1120 you can write each register independently.  You don't need to write all four registers to change a setting.  However, the command must be issued correctly.  To change just the MUX setting you would need to send the WREG command for register 0 (0100 0000) followed by the byte of data.

    As far as the returned data results, the value returned is in the binary two's complement and is explained in the datasheet on page 34 in section 8.5.2.

    Best regards,

    Bob B

  • Thanks Bob, for ultrafast response. Sorry, but it looks that sometimes one need to connect the source to instantly realize what was an error in the code. You make my day (and save another trying to constantly looks at the wrong place).

    Best regards,
    Denis