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:
#define inputPin A0
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int adInput = 0;
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
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.