Go Down

Topic: Lowest AREF value (Read 1 time) previous topic - next topic


Feb 25, 2011, 10:33 pm Last Edit: Feb 25, 2011, 10:41 pm by oilburner Reason: 1
I'm trying to measure very small signals (under 500mV) with the ADC of my Duemilanove board and I need precision around 0.1mV.
So that means I need a small ADC reference. With 2 resistive dividers I obtained 120mV and 60mV. 120mV is the AREF input and 60mV is the ADC input. Logically that should mean I always read 512 from the ADC pin but no mn the reference.
What did I do wrong ?
What is the lowest AREF value I can use ? Documentation says between 0 and 5V, 120mV is in that interval last time I checked   XD

Here is the code:
Code: [Select]

#include <LiquidCrystal.h>
#define inputPin A0

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int adInput = 0;

void setup()
 lcd.begin(16, 2);

void loop()
 adInput = analogRead(inputPin);

And these are my resistive dividers


The minimum reference voltage is 1V. This is indicated in Table 28-16 "ADC Characteristics" of the ATmega328P datasheet.

That's one problem. The second problem is that 0.1mV signals are going to get lost in the noise on a "hobbyist" system like an Arduino. It is just not a precision analog measurement system. Noise induced from lights, cell phones, radios, etc. are going to be interfering with signals as low as 0.1mV and it will take a careful analog front end design to discriminate signals that are only 0.1mV apart from each other.

The Arduino Drum Machine: 14-track MIDI drum machine sequencer / groove-box


Feb 25, 2011, 10:54 pm Last Edit: Feb 25, 2011, 10:59 pm by oilburner Reason: 1
Thanks for the quick reply. I missed that characteristic in the datasheet. It will give me a 0.96mV resolution.

I'll have to find a GOOD voltmeter and re-do my measurements, something tells me my Oscilloscope is not accurate and my values were higher than what my o-scope measured in DC mode...So I'll be back with some more accurate measurements.
Signal amplification with active components is not a solution in my case.

From what I can gather there aren't any options to get more resolution out of the ADC, correct ?


From what I can gather there aren't any tricks to get more resolution out of the ADC, correct ?

Assuming your noise is normally distributed (doubt it) you can increase resolution (precision) by averaging: take 1024 samples and divide the sum by 1024 (shift right by 10), but that really helps only a little bit because of other inaccuracies in the A/D. Also in that table they show the *typical* absolute accuracy, which is +/-2LSB's. So even if your reading is precise to 0.96mV it won't be accurate to better than +/-1.92mV. Regardless of averaging. And those are *typical* numbers in the datasheet -- they don't dare specify worst-case ;)

It's just not a precision instrument and what you are measuring definitely lands in the domain of "precision".

The Aussie Shield: breakout all 28 pins to quick-connect terminals


You need to amplify your signal with a good low noise op amp prior to conversion.  The on-chip noise on the 328p will definitely prevent 0.1mV measurements - high precision analog circuitry doesn't happen on the same piece of silicon as a processor, and since the Arduino commons the digital ground and analog ground it can't even achieve the figures in the datasheet.

The ideal solution will be to use a separate board with an instrumentation amplifier - depends on your accuracy requirements.  There are much better ADC chips available too if you want more resultion.  If your signal is 0..500mV then a gain of 10 would be ideal - but a rail-to-rail op amp would be needed to run from a single +5V supply.  Since the signals are small you will want a low-pass-filter to reduce noise.
[ I will NOT respond to personal messages, I WILL delete them, use the forum please ]

Go Up

Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

via Egeo 16
Torino, 10131