Friday, October 23, 2015
ATmega328p bandgap voltage reference
All modern AVRs have a bandgap voltage reference that can be used with the ADC instead of AVCC. On most AVRs it is around 1.1V, and allows for improved ADC resolution when measuring voltages below 1V. The bandgap is also used as the reference for the internal temperature sensor. Although the datasheet says the bandgap can vary between 1.0 and 1.2V, I was curious to see how much it actually varied in practice. I found many other people posting in forums looking for information on real-world bandgap measurements, but couldn't find anyone who tested more than one MCU. Since I have several ATmega328p MCUs in my electronics collection now, I decided to take some measurements.
I used the technique mentioned on Martin's blog of setting the ADC reference to the internal bandgap reference, turning on ADC, and measuring the voltage at the AREF pin. Here are my results, taken at an ambient temperature of about 20C, and using my 0.1% calibrated meter.
Pro Mini #1 (qfn): 1.045V
Pro Mini #2 (qfn): 1.058V
Generic Uno (qfp): 1.055V
Nano (qfp): 1.089V
I also measured a Pro Mini 168pa, and found it had a much lower reference voltage of 0.994V. With the measurements being all much lower than the "typical" values from the datasheet, I wondered if I might be affecting the voltages by measuring them. Searches for information on the output impedance of the bandgap reference were fruitless, though I did find a stackexchange discussion about the 32KOhm pulldown for the ADC reference. So to get an idea of the output impedance, I measured the voltage with and without a 1.4KOhm external pulldown. The AREF voltage dropped by 6mV, so even a meter with 1MOhm input impedance would affect the voltage reading by less than 10uV.
While I only have four samples (five counting Martin's), I would say that typical bandgap reference voltages are a bit lower than 1.1V. I would also guess that if I had more samples, 9/10 would be within 3% of 1070mV. If anyone has done their own measurements, please post them in the comments.
I've read a couple forum and blog posts about calibrating the bandgap reference to a known VCC, but haven't seen any code. With oversampling, it would not be difficult to measure the bandgap within 1mV (0.1% accuracy). I could use the same technique of using init sections that I did with the internal temperature sensor, so this will likely find it's way on my list of projects to work on.