I'm using one of the analog inputs on an Arduino Uno to read the output voltage from a photodiode. I understand the inputs are 10 bit, which is not enough for my application in detecting small changes in the photodiode voltage. I'm aware that the External Reference function allows the bits to be allocated over a range smaller than the default 0-5V, such as 0-1.3V, however I'm unsure whether this is a true allocation which achieves 10 bit resolution over the 0-1.3V range, or if it simply outputs a maximum 2^10 value when the voltage reaches 1.3V.
Any advice on the underlying mechanism would be greatly appreciated. If the External Reference can't be used to optimise the resolution, it looks like it will have to be an external ADC solution!
The ADC is ratiometric between GND and AREF. The datasheet suggests 1V as a lower practical limit for AREF to maintain ADC accuracy/performance. So you can get to about 1mV resolution this way.
If you apply a voltage to AREF its imperative that the sketch calls analogReference(EXTERNAL) in setup() before any use of analogRead().
Keep in mind that there is an optional INTERNAL reference voltage available for selection that spans the ADC counts of 0-1023 for a 0-1.1vdc (nominal value but constant). If selected any voltage present on the pin higher then 1.1vdc will just return a 1023. Electrical safety limit for the pin will remain +5.5vdc.
Here is the reference page for the various internal and external ADC ranges: