Go Down

### Topic: Uno Reference Voltage of 1.1v (Read 7194 times)previous topic - next topic

#### gggggggg

#15
##### Jan 18, 2013, 02:29 am

No my source is ~5v.   My reference voltage is 1.071v

So you'll be using the technique described in that post?  Using the battery voltage as a reference to measure the 1.071V bandgap?

Yes, it seems to be working.  The value I am getting off my battery with a multimeter though is 5.28v, but the value I am getting using the second technique in that post is 3.53v (I get 5.0v if I power it off USB).  Does that sound right?

Basically, I am trying to accurately log battery level for my project.  But as a side, I am trying to make sure my analogue values captured are accurate.

#### Coding Badly

#16
##### Jan 18, 2013, 02:40 am
The value I am getting off my battery with a multimeter though is 5.28v, but the value I am getting using the second technique in that post is 3.53v (I get 5.0v if I power it off USB).  Does that sound right?

Uh, no.  If you're using the correct code / method, you should be getting a value very close to 528.  Even if you're using 1.1V for the bandgap voltage you should be getting much much closer to 528 than 353.

Are you planning to power the processor directly from the battery?

How do you have the battery connected?

(I'll have some software questions when I'm in front of the other computer.)

#### gggggggg

#17
##### Jan 18, 2013, 03:16 am
I have 4 x AA batteries connected to the barrel connector.   And I have AREF connected to 5v.

Aside from that I am running a SD Logger, so I can see the values.

Here is my code:

Code: [Select]
const long InternalReferenceVoltage = 1071L;  // Change this to the reading from your internal voltage reference

void setup( void )
{
Serial.begin( 115200 );
Serial.println( "\r\n\r\n" );

// REFS1 REFS0          --> 0 0 AREF, Internal Vref turned off
// MUX3 MUX2 MUX1 MUX0  --> 1110 1.1V (VBG)
ADMUX = (0<<REFS1) | (0<<REFS0) | (0<<ADLAR) | (1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (0<<MUX0);
}

void loop( void )
{
int value;

// Start a conversion
ADCSRA |= _BV( ADSC );

// Wait for it to complete
while( ( (ADCSRA & (1<<ADSC)) != 0 ) );

// Scale the value
value = (((InternalReferenceVoltage * 1023L) / ADC) + 5L) / 10L;

Serial.println( value );
delay( 1000 );
}

Here is my output:
~350 is 4 x AA (5.28v on multimeter) connected to Barrel jack.  500 is USB connected from computer.
Code: [Select]

351
358
357
357
356
357
356
356

500
500
500
500
500
500
500
500
500

#### Coding Badly

#18
##### Jan 18, 2013, 06:23 am
I have 4 x AA batteries connected to the barrel connector.

With Vcc regulated to 5V, why aren't you: using Vcc as the reference, a voltage divider to get the battery voltage in range (I'd just cut it in half), and measuring that in the plain-ol-analogRead fashion?

The code you are trying to use was meant for a processor running directly from batteries.  I don't think it functions correctly the way you are trying to use it (AREF > Vcc).

#### Coding Badly

#19
##### Jan 18, 2013, 06:30 am

Time for a sanity check...

[font=Courier New]value = (((InternalReferenceVoltage * 1024L [font=Verdana]#[/font]) / ADC) + 5L) / 10L;

528 = (((1071 * 1024) / ADC) + 5) / 10
5280 = (((1071 * 1024) / ADC) + 5)
(5280 - 5) = ((1071 * 1024) / ADC)
ADC * (5280 - 5) = (1071 * 1024)
ADC = (1071 * 1024) / (5280 - 5)
ADC = 207.905971564
[/font]

The ADC value should be within a reasonable range.  Try printing it as well...

Code: [Select]
void loop( void )
{
int value;

// Start a conversion
ADCSRA |= _BV( ADSC );

// Wait for it to complete
while( ( (ADCSRA & (1<<ADSC)) != 0 ) );

// Scale the value
value = (((InternalReferenceVoltage * 1024L) / ADC) + 5L) / 10L;

Serial.print( ADC );
Serial.println( value );
delay( 1000 );
}

# The correct value is actually 1024.

#### gggggggg

#20
##### Jan 18, 2013, 06:47 am
Thanks for all your help.  I actually have no idea how I started down this path.  The main thing I want to do is log my voltage of my source batteries.  As such, a Voltage Divider (http://en.wikipedia.org/wiki/File:Resistive_divider.png    = 2 resiters of the same value).  Then send VOut to A0, and read the value, then double it.  Sound right?

Do I even need a reference value?

But then, since I know the reference value now anyway.  And my reference voltage is 2% out from 1.1v.  As such, should I treat any value coming into A0 to A5 as being 2% too low?    Its only 2%, I don't think I care that much as most of my connections are Digital anyway, and everything anyway seems to have different levels of accuracy.  More curious now.

#### Coding Badly

#21
##### Jan 18, 2013, 07:00 am
Then send VOut to A0, and read the value, then double it.  Sound right?

Yes.  You could optionally add some calibration to get a more accurate value.

Quote
Do I even need a reference value?

Technically, you always have a reference.  In this case you would use the default which is Vcc (regulated 5V).

Quote
And my reference voltage is 2% out from 1.1v.

The bandgap / 1.1V reference would no longer be involved.  You can forget about it.

The reference you would be working with is Vcc / 5V.

#### gggggggg

#22
##### Jan 18, 2013, 07:27 am

Quote
And my reference voltage is 2% out from 1.1v.

The bandgap / 1.1V reference would no longer be involved.  You can forget about it.

The reference you would be working with is Vcc / 5V.

Thanks.  So in theory, if my VCC drops to 4.8v, I should multiply every value in A0-A5 by 1.041 to get its real value, assuming that item is a 5v item ?

Is there a real way to test this?
What if I get my 5v battery power source, measure VCC @ I assume 5v.  Measure a 1.5v AA battery on A0.   Then let the arduino power batteries go flat.  When VCC gets to 4.8v, take a second reading from A0, and it should be 4% lower ?  Maybe?

How low can the source arduino power get before it will no longer function?

#### Coding Badly

#23
##### Jan 18, 2013, 08:52 am
How low can the source arduino power get before it will no longer function?

I have no idea.  Some folks claim just north# of 6V is required on Vin but your testing contradicts that.

Quote
So in theory, if my VCC drops to 4.8v,...

In theory, that would be impossible.  It's a 5V low dropout regulator so the cutoff should be at 5V.

Quote
Is there a real way to test this?

The first course of action is to get an opinion from someone who understands the switching circuit and voltage regulator (someone who isn't me).  If you don't get a reply in a reasonable amount of time, I suggest posing your question in the General Electronics section (or spend some time searching the forum; I believe the topic has been discussed).

# For those living in the Southern Hemisphere that would be "just above".

#### gggggggg

#24
##### Jan 21, 2013, 11:48 am
Thanks for all your help.

For anyone else looking, I think this gives me what I need:   http://arduinotronics.blogspot.com.au/2011/03/monitoring-voltage-of-dc-battery-supply.html

#### FigZ

#25
##### Jan 28, 2013, 10:04 pm
just want to add my two cents - I am researching how to measure battery voltage through the bandgap method

if you connect the batterys to the vin barrel - you are not going to get the same voltage on vcc - far from it. The battery voltage goes through the voltage regulator. If at all possible - hook up your battery pack to vcc. (assuming it is not over 5.5 volts and not reversed!)
So the results you measure may actually be correct

hooking up an arduino to usb does bypass the voltage regulator
however - this does not garantuee a clean 5v vcc
when I hook my arduino up to a usb 1.1 hub - I get around 4,3 volts on vcc
it took me quite some time figuring out why analog temperature sensors would give bad results. I finally figured out a simple trick, measure the 3,3v line on an analog pin and use that to calculate the voltage on Aref. This did cost me an analog pin. I am looking into the bandgap method for future projects.

Thanks to coding badly and lefty for some great posts on the subject.

May I point to another great source on this subject?

http://jeelabs.org/2012/05/04/measuring-vcc-via-the-bandgap/
http://jeelabs.org/2012/05/12/improved-vcc-measurement/

#### retrolefty

#26
##### Jan 28, 2013, 10:18 pm
Quote
when I hook my arduino up to a usb 1.1 hub - I get around 4,3 volts on vcc

That is quite low, and below the USB standards of I think 4.75 to 5.25. Try plugging directly into one of your PC's usb ports instead of that hub and see if you don't get a more normal Vcc value.

Lefty

#### FigZ

#27
##### Jan 28, 2013, 10:37 pm
way ahead of you there ...
when I use the computers usb ports all is fine!
just this usb 1.1 hub
I have not looked into it that much further - it doesnt bother me since I figured out a way to measure the vcc
which actually was a good idea since I need this when I want to run my arduino off batteries.

I just got fascinated by the whole bandgap idea because it doesnt involve sacrificing an analog pin.

thanks for your reply, and thanks for sharing your bandgap experiments

#### Coding Badly

#28
##### Jan 29, 2013, 12:34 amLast Edit: Jan 29, 2013, 02:53 am by Coding Badly Reason: 1
http://jeelabs.org/2012/05/04/measuring-vcc-via-the-bandgap/
http://jeelabs.org/2012/05/12/improved-vcc-measurement/

ARGH!  It's 1024!

Quote
if you connect the batterys to the vin barrel - you are not going to get the same voltage on vcc - far from it. The battery voltage goes through the voltage regulator.

It that situation, use the regulated 5.0V (or 3.3V) supply on the Arduino as a reference and a voltage divider on the battery to get the voltage in range.

Quote
however - this does not garantuee a clean 5v vcc

Use the regulated 3.3V as a reference.

Quote
when I hook my arduino up to a usb 1.1 hub - I get around 4,3 volts on vcc

Yikes!  You need to drop that thing for a powered hub.  In my experience, this one is well worth the money...
http://www.usbgear.com/computer_cable_details.cfm?sku=USBG-7U2ML&cats=104&catid=104%2C653%2C210%2C212

Quote
I finally figured out a simple trick, measure the 3,3v line on an analog pin and use that to calculate the voltage on Aref.

Or just use the 3.3 V as the reference.

Quote
Thanks to coding badly and lefty for some great posts on the subject.

You are welcome.

#### retrolefty

#29
##### Jan 29, 2013, 01:57 am

way ahead of you there ...
when I use the computers usb ports all is fine!
just this usb 1.1 hub
I have not looked into it that much further - it doesnt bother me since I figured out a way to measure the vcc
which actually was a good idea since I need this when I want to run my arduino off batteries.

I just got fascinated by the whole bandgap idea because it doesnt involve sacrificing an analog pin.

thanks for your reply, and thanks for sharing your bandgap experiments

Your welcome, and bandgaping was fun but CB did most of the heavy lifting. I just wanted to see if it could be useful or not and wouldn't stop bugging him for help and ideas. To tell the truth I almost never find my projects using all the analog input pins (and if so I just switch to the mega board or my 644P soon to be 1284P board, so just tying the 3.3v to a AI pin and using that as a compensation/refence value is simple enough. Heck on one of my boards I have a jumper from the anode of the power led wired to a AI pin as a reference, it works.

But for serious ADC results I just use I2C ADC chips, either the TI 12 bit ADS1015 for 16 bit ADS1115, they are what real ADC is be all about. Adafruit has some nice breakout boards for them and has support library all set to go.
http://www.adafruit.com/products/1083
http://www.adafruit.com/products/1085

Lefty

Go Up

Please enter a valid email to subscribe

### Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy