16bit ADC for arduino nano

I am currently exploring the possibility of attaching a redox electrode to an arduino nano for a lab application. I have noticed, however, that the analog input ports on arduino are merely 10 bit, which offers a rather low sensitivity for what I had in mind (1024 steps per 5V, which should be about 4.88 mV per step).

It seems I will have to attach an external 16bit ADC (analog to digital converter) to my arduino and use that as an input. Can you suggest me a decent low price 16bit ADC chip for my application? The input voltage should probably be the same (0 to 5V, though it can be higher as well - up to 10 volts), as I'll regulate the incoming voltage by using an external instrumental opamp. The optimal analog reading speed should be in range of 100 to 1K readings per second. Faster speed doesn't hurt I guess.

Last thing is that I am unsure how to interface an ADC with an arduino. I'll likely want to avoid a parallel connection with more than 4 data wires because a number of digital ports are already used, and I don't want to run out of ports. Arduino nano has one serial tx/rx port, which will be used to communicate with a computer over USB. There's I2C or 2wire and ISP port.


Regards, Tritium

I'm trying to do something very similar, so would love to keep in touch with you on this project.

You probably saw this post from the arduino blog*:


It details the basics of addressing an external IC serially for a >10bit ADC, though at a rather slow rate (for our application).

I've been looking at more suitable IC's, this look like a go'er:

TI ads1213

It costs around $20, is widely available in a decent package for prototyping, and will give 16bit resolution @1kHz (so says the datasheet if I've read it correctly).

A second potential solution (I don't know if this would work well!) would be to couple two ADC's from the Arduino's board. Take your signal, run it through an ADC to get a 10bit approx. of it. Run this through a 10bit DAC and subtract this from the original signal. Amplify the result by 2^8 say and pass it through a second 10bit ADC. You now have a 18bit ADC.

Now I think this works in principle and is used in some applications, but I don't think the ADC in the Arduino would work very well running at 1KHz (may be wrong here) and it needs as external IC anyway (no DAC).

For my application I want to build an self-contained data-logging box, with a graphic LCD indicating a portion of the sample history for two channels of data and with the data streaming to an SD card. 16bits over a 5V range @1kHz is my target.

I'm using a mega-board as I will definitely run out of i/o's on an Uno.


*sorry, first post so not allowed to post links!

Link to the blog post:

Link to the TI ADC IC:


…or ads1212 if you only want one channel.

So, one 16bits ADC gives your a resolution of 0,0000762939453125 v/bit, is your circuit designed so well that it is so immune to noise that it wont affect your reading, an 12bit seems a smart move, more than that will almost only read noise in its lower bits..

Senso, personally yes, I’d love to measure <µV/bit or better if possible. The device is for measuring biological systems that are quite noisy, but the noise and its physical origin are very important, so in our experiments we need to record it as faithfully as possible

If this works then I’ll spend more money on a more expensive ADC. If you read TI’s PDF on its 22bit ADC you’ll see it’s only really a 16bit @1kHz… I’d imagine you’d have a similar problem with a cheap 12bit ADC, when read at a fast rate its LSB’s will be noisy. I haven’t characterised the Arduino’s ADC’s but I’d be surprised if they’re truly 10bit when run hard… even if they are, they’re not good enough for my experiments.

This project’s aim is to improve upon results measured with a USB 12bit 2-channel ADC (costing ~£100 and requiring a computer).

The electrode in question has an internal impedance of a few hundred mega ohmsh, and as a range of -2000 mV to 2000 mV according to the specs. That's 4 volts total range, but most measurements I'll be doing don't need the whole range. Most will focus only on a narrower band let's say 0mV to 1000mV, but this isn't the problem.

The electrode is connected over a low-noise cox cable to a BNC connector on the PH meter. I'll connect the electrode to my own circuit and regulate the incoming signal by using a sensitive instrumental opamp to map the voltage to an appropriate range for the ADC after manual calibration. My question is what ADC chip to use here I don't have any particular need to go over 1KHz, but the sensitivity is vital here. Arduino isn't sensitive enough to measure decimals of millivolts.

I also need some digital pins on arduino to connect extra devices i.e. a stepper motor controlled micro-liter pump that I'll be using to pump chemicals to the mixture where the redox potential is being measured. The arduino board will act as a controller for the whole device and will transmit the data back to a PC over the USB port. I'm basically building an automated titrator here.

Could you give me a link to the electrode in question please?

The basic principle of communicating with a better ADC via serial is shown here:


...so the only real question or difficulty is in picking the right ADC, and there are loads to choose from. I've got samples of a few different ones on the way, I'll update this thread when I have them in hand and have had chance to play with them.


That's just one of them. I'll also use a standard combined glass electrode for pH measurement.

EDIT: Looks like I've got some reading to do on interfacing.

Thanks for the electrode link... we've got a nice cross between chemistry, biology and physics going on here.

I think the intra-IC serial interface sounds pretty straight forward, but you do have to pay attention to the individual spec sheets as standards aren't maintained.

I'm really looking forward to my components arriving so I can get cracking, I guess logging at 1KHz and updating a parallel LCD might be too much for the Arduino... may need a display with memory and a serial interface.