Skip to main content

LTC2499 / LTC2493 24-bit ADC library for Arduino

Published: 03 March 2020
Last updated: 30 August 2024

Nathan D. Holmes and Michael D. Petersen have made a combined library (Ard2499) for two devices:

  • LTC2499 24-bit ADC
  • 24AA025E48 EEPROM

From this, I have distracted a separate 24-bit ADC library. See the 16-Channel 24-Bit ADC Data Acquisition Shield for Arduino from Iowa Scaled Engineering.

This library is compatible with both ADCs:

  • LTC2493: 2/4 channel 24bit ADC
  • LTC2499: 8/16 channel 24bit ADC

GitHub

Download the library at GitHub.

ADC conversion time

The LTC2499 will start a conversion after a read(). A conversion will take about 150 milliseconds in 1X mode or 75 milliseconds in 2X mode. But this doesn't mean that you have to wait during the conversion time. If you let the Arduino perform a task of for instance 150ms after read(), then the ADC value is immediately available at the next read(), so that the conversion time takes no extra CPU time. This behavior is explained in the example.

LTC2493 example

#include <Metro.h>
#include <Streaming.h>
#include "LTC2499.h" // https://github.com/IowaScaledEngineering/ard-ltc2499

Ltc2499 ltc2493; 

#define _ <<" "<<

void setup() 
{ Serial.begin(115200);
  Wire.begin();
  byte status = ltc2493.begin(ADDR_0ZZ); 
  if(status)
  { Serial <<"\nError LTC2493" _ status;
    while(1);
  }

  Serial << "Setup\n"; 
  ltc2493.changeConfiguration(CONFIG2_60_50HZ_REJ);  
  ltc2493.changeConfiguration(CONFIG2_SPEED_2X); // 75ms
  ltc2493.changeChannel(CHAN_SINGLE_0P); // ADC starts converting now .............
  //ltc2493.changeChannel(CHAN_DIFF_0P_1N);
  
  delay(80); // run tasks here during the 75ms ADC conversion time
  
  unsigned long t1 = millis();
  long adc = ltc2493.read(); // read takes no time since the result is available already, a new conversion starts now .................
  Serial << adc _ millis()-t1 _ "ms" _ endl; 
  
  t1 = millis();
  adc = ltc2493.read(); // read takes 75ms, a new conversion starts now .................
  Serial << adc _ millis()-t1 _ "ms" _ endl; 
  Serial << "Loop\n"; 
}

void loop() 
{ delay(1000); // run tasks here during the 75ms ADC conversion time
  unsigned long t1 = millis();
  long adc = ltc2493.read(); // a new conversion starts now .................
  Serial << adc _ millis()-t1 _ "ms" _ endl; 
}

Ultra−low noise regulators

With high resolution ADCs, a common regulator will not work, it will contain too much noise.
I made the noise-free supply with a LT1761 and 470uF capacitors.

Ultra−low noise regulator with LTC1761Ultra−low noise regulator with LTC1761

Why most low voltage drop regulators hate ceramic bypass capacitors

A problem that you encounter when choosing a regulator, is that ceramic output capacitors can causes instability. Note that you sometimes can't see this on an oscilloscope. Just with highly sensitive ADCs of 24-bit and more it causes trouble.

The LT1761 has a nice graph where you can see when the regulator is stable:

LT1761 stability vs bypass capacitorsLT1761 stability vs bypass capacitors

Here is an extensive article about the problem of ceramic bypass capacitors used with regulators.

LTC2493 24-bit ADC noise histogram

If your design is ok then you must be able to make the following noise histogram in Excel with the ADC values.
The SD is calculated in Excel, which is 4.7. If you calculate it all back then the values are according to the datasheet.

LTC2493 24-bit ADC noise histogram LTC2493 24-bit ADC noise histogram

LTC2493 24-bit ADC noise histogram LTC2493 24-bit ADC noise histogram

Other articles from Interfacing with hardware