Go Down

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

oilburner

Feb 25, 2011, 10:33 pm Last Edit: Feb 25, 2011, 10:41 pm by oilburner Reason: 1
Hello.
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);
 analogReference(EXTERNAL);
}

void loop()
{
 adInput = analogRead(inputPin);
 lcd.setCursor(1,0);
 lcd.print(adInput);
 delay(500);
}


And these are my resistive dividers

RuggedCircuits

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

oilburner

#2
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 ?

RuggedCircuits

Quote
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

MarkT

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 won't respond to messages, use the forum please ]

Go Up