Is the ARD-LTC2499 as Accurate as an Agilent 34401A?

The ARD-LTC2499 was designed from the beginning with the intent to get as close to perfect accuracy as one could with an out-of-the-box Arduino Shield, while still keeping the cost affordable for mere mortals like us.  We chose one of the best 16-channel ADCs on the market and matched it up with a high-performance voltage reference.  To see what the accuracy really was, I borrowed Nathan’s 34401A meter and put them both to the test.

For this experiment, the ARD-LTC2499 was configured for differential input mode.  An LT1004 1.2V shunt reference was connected between the input terminal and biased with a 1k resistor from the 4.096V output of the shield.


At the same time, the Agilent 34401A meter was connected to the same terminals.  A short sketch (Source Code) was written to measure the input voltage and present it on a VFD display.


That result is pretty good!  The readings differ by just ~70uV.  Is this what you can expect every time?  Let’s look at the numbers…

Error Calculations

From the LTC2499 datasheet, under the Normal Speed section, we find:

Offset Error = 2.5uV
Positive Full-Scale Error = 25ppm of VREF
Integral Nonlinearity (INL) = 10ppm of VREF

How do we make sense of this?  Well, first of all, you might have noticed that I chose the maximum numbers and not the typical ones listed in the EC table.  This is because the maximums (and minimums) are the only ones tested and guaranteed by the manufacturer.  The typical numbers shouldn’t be used for error budget calculations.

The total error due to the ADC will be its offset contribution + gain error + INL.  The maximum offset error is easy: 2.5uV.  The gain error can be found from the Positive Full-Scale Error spec.  In this case, 25ppm.  Multiply that by the actual measurement, 1.235V and the maximum expected gain error for the measurement above should be 31uV.  Finally, the INL can contribute up to 10ppm * 4.096V = 41uV of error.  Note, the INL cannot be scaled to the measurement value since you don’t really know where the maximum deviation of the transfer function occurs.  Adding all these up gives a maximum expected error from the ADC of 2.5uV + 31uV + 41uV = +/-75uV.

Hmmm…  We just measured an error of 70uV.  Are we really this close to the maximum expected error?  Is our shield bad?  Maybe not.  We forgot to include the contribution of the 4.096V voltage reference feeding the ADC.  The LT6654 specifies a maximum 0.1% initial accuracy for the B-Grade reference (B-Grade is used by default on the ARD-LTC2499 shield for cost reasons – A-Grade is available by special request).  This additional error (1.235V * 0.1% = 1.235mV) needs to be added into the error calculation above.  After doing so, the 70uV we measured is well within the +/-1.31mV maximum error of the design.

So, now you might be asking if the 70uV we measured above is too good to be true, given a maximum error of 1.31mV?  The VREF output of the particular ARD-LTC2499 shield used in this experiment measures 4.09618V.  This results in an additional 44ppm (4.09618 / 4.096) gain error due to the reference.  Since VREF is larger than expected by the software, this causes any measurements to appear smaller by a proportionate amount, which matches what we saw above.  Multiplying our measurement above (1.235324V) by the VREF gain factor (4.09618 / 4.096) gives us a corrected output of 1.235378V, only 10-20uV different from the 34401 reading!  This is nicely within the expected 75uV maximum error due to the ADC.  Phew!


Here’s a homework problem…  what is the expected error if using the 2x Speed mode of the ADC?  What’s the reason for the difference?  (Hint, read page 18 of the LTC2499 datasheet, and refer to the appropriate section of the EC Table)


With some simple calculations, determining error budgets for an analog-to-digital conversion is easy.  The ARD-LTC2499 makes an affordable, yet accurate, measurement system for the Arduino platform.


    1. The library provides functions that take care of the details of using the ADC, returning either an integer ADC code or floating point voltage. What you do with those measurements is then up to you and determined by the application.

  1. How can I enable the 2X sampling rate mode for the ADC? I understand it has both a 7 HZ mode and a 15 HZ mode.

      1. Thank you so much!

        Last question. If I’m using the board in the differential mode, each differential (ex 1P 0N) is considered a sample right? In other words running at 15 Hz, I can theoretically take 15 differentials every second? Or is it 7.5 differentials where each differential channel is considered to be 2 samples?

        1. In the 2x mode, you can take 15 differential measurements per second. The 7.5Hz mode actually does 2 conversions for each sample and automatically cancels any internal offsets in the process.

  2. Some of these measurement deviations can, and should be nulled out, either in software or elsewhere, correct?
    (Isn’t that what you do when you calibrate – for example – a drifted 34401A?)

    1. That’s correct. The residual errors can be nulled out in software if you have a trusted reference to which you can calibrate the system.

  3. Could this product (in combination with arduino mega 2560) be used with Dasylab? I am currently using IO Tech Personal DAQ/56. I would love to be able to use this instead.

    1. If DASYLab can talk to the Arduino, then I don’t see a reason why the shield couldn’t be used, assuming you write the proper interface between the ARD-LTC2499 library and what DASYLab expects from the Arduino.

  4. Will a 5V internal reference voltage be used if you leave the REF input open (like in the arduino’s adc), or do you have to use an external reference anyway?

    1. The shield has a 4.096V precision reference onboard. The REF pin just provides that voltage for use when biasing certain sensors.

Leave a Reply

Your email address will not be published. Required fields are marked *