My buddies Francis Lau and Wayne Yamaguchi read my recent article about the 12-bit ADCs in the new Atmel SAM D20 ARM chip.
They both had some good tips. Francis has worked for a famous Silicon Valley brain-wave sensor company. He writes:
I was trying to squeeze out more resolution out of a 10-bit adc on an Atmel AVR in the brainwave sensing module. Along with power synchronization you can do couple other firmware level tricks. One thing is to over sample and then do a simple average. You could do curve fitting but then that’ll take more computing power rather than just drop some bits. If the signal is repeating, you can also just sample it multiple times over different cycles and average those.
The Atmel datasheet also tell you that in order to get those 10-bits rather than the 7.5bits ENOB (effective number of bits) you typically get, you really need to turn off the other digital clocks in the chip and let it rest a bit before doing the acquisition. I tried this and it does make these little 2 bits of noise quiet down.
My buddy Wayne, who I met at HP years ago before they split off Agilent, has worked on all kinds of analog signal chains. He designs LED lighting that is controlled by Atmel AVR parts. Wayne writes:
For the ATtiny series the A/D resolution is not that bad and noise in general should not be an issue. I have several boards that the uP is on the bottom side or adjacent to the DC/DC driver that drives up to 3A to the LED off a battery pack.
Of special note is the bit resolution. If you use the internal 1.1V reference, then the resolution is 1.1V/1024 or approximately 1mV. By using a precision voltage reference for VCC of the MCU you can use the supply as the A/D reference instead of the internal reference. A 2.5V reference changes the bit resolution to 2.5mV and is less noise sensitive. I have tested the single reading under these conditions and have found that the voltage read back is very stable with just one reading with the DC-DC converter running. On my GDuP board the uP is directly under the converter and switching inductor. The converter is on the top side of the board (components) and the bottom side components are for the uP. The board is 0.55″ round and can drive up to 1.5A constant current to the LED. The GDuP is a 2 layer board with standard 1 oz copper foil. Of course the final code does not rely on a single reading. Personally, I typically average 4 readings. For one customer I was consulting for, I had to increase the resolution to monitor the battery drain more accurately. There I averaged more readings to extend the range to 12 bits.
So there you have some good examples from experienced engineers who battle such analog issues every day. The important thing to remember is that if you really want 10 or 12 bits, you have to do the system design to remove noise, and maybe oversample or average or dither or a bunch of tricks to get the nominal bit depth of the ADC. Please understand, Atmel and our competitors are not lying when we say we have 10 bit ADCs yet they only give 7.5 ENOB. You really do get 10 bits at low sample rates under noise-free conditions. We cannot estimate how fast you are sampling in your particular system nor how much noise you have in your environment. All a chip manufacturer can do is measure the performance under ideal conditions, both at DC and at a sample rate where we can tell you the ENOB. It is up to you to make sure you design has the margins and error budget to deliver the accuracy you need. Remember, the rated ADC bit are a resolution, not an accuracy. It is not trivial to insure a measurement accuracy, just read the Keithley low-level measurement handbook.