Related to averaging, you can also use oversampling with the 10bits ADC.
Read - http://www.atmel.com/Images/doc8003.pdf
4 samples gives you 1 bit extra
16 samples gives you 2 bit extra
64 samples => 3 bit extra
256 samples => 4 bit extra
1024 samples => 5 bit extra
the price is time ...
Well its more than that, you have to ensure there's enough Gaussian noise in the
system before you average, otherwise you just average 16 identical samples,
or 256 identical samples. Just enough noise allows the actual voltage to affect
the probability of the value being read as N or N+1 or N-1 counts on the ADC.
Then the averaging process effectively measures this probability as a proxy for
To get accurate linearity in averaging lots of readings you, alas, have to inject more
noise to make the relationship between probability and voltage linear enough.
Furthermore you cannot improve upon the existing imperfect linearity of the ADC
response staircase function, so in practice don't expect to get more than 1 or 2 bits more.
If there is existing noise you have to worry about whether its correlated to the signal
or not, since correlated noise cannot be removed by averaging...
I feel averaging 8 or 16 samples is probably worth it, more is not, get a sigma-delta
20 bit ADC or similar instead.