Using the VCC as voltage reference is ok only if
- you accept poor performances or
- you need to measure a ratiometric output.
Case 2 is because the output depends on VCC (so you compensate). For instance, if you want to get the value of position in a potentiometer, you have that the voltage you see is
Vo = Vcc * X (where 0<=X<=1 is the position), then the result you have on your ADC is
Y = Vi / Vcc * k = X * k (where k is the maximum value of the ADC reading - e.g. 1023). So you actually compensate the Vcc deviation.
If you want to measure an absolute voltage, however (case 1) you will have a lot of uncertainties. For instance, if your current varies during the time (for instance you turn on the LED), the Vcc voltage can vary quite a lot. This is why for precise measurements you always must use a voltage reference.
In your case, you can
- Use the internal reference - for the Atmega328 it is nominally 1.1V, but it can range from 1.0V to 1.2V
- Use an external reference
You have to keep in mind that the voltage reference is the maximum value you can read. For instance, if you use the internal reference and then try to measure a 2.3V, you will not be able to do it (you will read the maximum value of 1.1V)
In order to fix this, you can use a trick: use Vcc as reference, and then use a voltage reference to get a precise calibration every time you need to measure something. For instance, if you have to read values from ADC1 and ADC3, you can
- Read the value of the internal/external reference
- Read ADC1
- Read ADC3
- Use the reading in point 1 to be able to guess what ADC1 and ADC3 readings were
This way you compensate for variations in the supply.
Just note that, even if the internal reference is not very precise (it has a 10% deviation from the standard value), it is indeed stable, while the VCC varies (a lot) during time. So if you have to calibrate, calibrate against the internal reference and not the Vcc.
If you can afford an external voltage reference, these are usually very stable and have very little deviation from sample to sample, so you may assume their value is "fixed"