Precision voltmeter using Arduino

I am newbie, I need to measure precise voltage in range 0.00-0.80V, two digits precision.

The voltage will not be greater than 1V-1.2V.

I wonder if I need divider or not, I am sure that voltage won't rise above 1.2V.

Can I connect the point to measure directly to analog input, or I still need to use divider? Please explain why.

A divider is used to (as the name suggests) reduce a higher voltage to a lower voltage. Using a divider on a small voltage will only make it smaller and harder to measure.

To get the most out of your measuring you need to have the reference voltage as close to the highest voltage you want to measure as possible. The highest voltage that can be applied is not dependent on the reference voltage, but the supply voltage, and as 1.2V is way less than 5V (or 3.3V on a 3.3V board) you have no worries there.

So you need to change the reference voltage - the voltage that the ADC uses as its upper measurement voltage. That's simple enough, since many of the Arduino boards include an internal 1.1V analog reference voltage generator that you can switch to (see: analogReference())

So when you have switched to the 1.1V analog reference the ADC is capable of measuring 0-1.1V in 1024 steps. That's 1.1/1023=0.00107V per bit of precision.

The formula is:

``````V = ADC / 1023 * Vref
``````

So a reading of 1 would give you 0.00107V - a reading of 2 would be 0.00215V, etc. That's plenty of resolution to meet your 2 decimal places requirement.

One thing to note though is that the internal 1.1V reference isn't that stable or accurate (or not even there on some chips). If you need better stability and accuracy then it could pay to use an external voltage reference chip. These are like a linear voltage regulator but are far more accurate and stable (and can't provide lots of current). Pick one that is greater than your upper measurement voltage but as close to it as you can get (so just above 0.8V) and feed the output into the external ARef pin and switch the analog reference to the `EXTERNAL` mode.

You could use a voltage divider on the external ARef pin to provide a low reference voltage, but the stability and accuracy will be no better (and probably worse) than the internal 1.1V voltage reference, so there really is no point.

• Great answer, Majenko! Just to add to it, see my post about ADC conversion on the Arduino - in particular the part about setting up reference voltages. That link takes you to the post about the TL431 voltage reference chip. Commented Jan 24, 2016 at 20:56
• Majenko, do you have any documentation or rationale for your claim that “the internal 1.1V reference isn't that stable or accurate” ? Per spec sheet, the 1.1V reference is an “internal bandgap reference... through an internal amplifier” which does not suggest instabiliry or inaccuracy. Commented Jan 25, 2016 at 0:17
• @jwpat7 Well, table 29-11 lists the voltage as between 1.0 and 1.2 with a typical of 1.1. That's a variance of as much as 20% in the actual voltage, and no practical way of measuring it. When you're working with voltages as low as 0.8V max that variance can have a big effect on your readings. Commented Jan 25, 2016 at 0:22
• @jwpat7 Also you might like to take a look at figure 31-318 which shows the variation in bandgap voltage at different levels of Vcc and different temperatures. Commented Jan 25, 2016 at 0:24