Go Down

Topic: Arduino voltmeter calculations (Read 2300 times) previous topic - next topic

neepie

I'm trying to use arduino with LCD as car voltmeter. I've got R1=33kohm and R2=15kohm resistors as voltage divider. So if voltage stays below 15V from alternator it wont break arduino by going over 5V(it is the Vmax for inputs?)

But i cant figure out the how to make it show voltage correctly. I've got R1 and R2 in A0.

I tried to do it with this http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1292921201 but i dont know the right formula for me.


I've got now
Code: [Select]
value = analogRead(A0);
vout = (value * 3.4)/1024.0;  //voltage coming out of the voltage divider
vin = vout / (R2/(R1+R2));  //voltage to display


But i think i need the right value to replace 3.4?

AWOL

Quote
But i think i need the right value to replace 3.4?

Whatever value is connected to Vref.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

neepie


AWOL

"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

neepie

I've tried that. But when fluke shows 6.9V at resistors, arduino shows 6.6V. Is it possible to make it accurate or do i just need to finetune that value? Or are 1% resistors just not right for it?

AWOL

I'd leave the 5V as it is (assuming the supply voltage really is 5V) , and check that the values of resistors plugged into the potential divider equation are correct.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Senso

Arduino adc is max rated for 5.5v, so 6.9v is good to kill it.

AWOL

He's right - I assumed when you wrote "at the resistors", you meant across the potential divider.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

robtillaart

#8
Jun 02, 2011, 10:16 am Last Edit: Jun 02, 2011, 07:07 pm by robtillaart Reason: 1
15Volt  over 33K and 15K gives  max 4.7 volt over the 15K resistor.
As Vref is not connected it uses 5Volt from the Arduino Power supply - you need to measure this as between 4.9 and 5.1 reference voltage = 4% difference!

raw = analogRead(A0);

// raw = 0..1024    representing 0..Vref  volt

vout = 5.00 * raw / 1024.0;  // as Vref = 5.0 Volt (to be measured)

convert to car voltage;

voltageCar = (vout  / 15.000) * (15.000 + 33.000);  // or in short voltageCar = vout * 3.2:

Please fill in the resistors measured values .

The final code could become

Code: [Select]

// these defines have to be measured
#define VREF  5.10
#define R1 32767.0
#define R2 15140.0

float raw = analogRead(A0);
float vout = VREF  * raw / 1024.0;
float carVoltage = vout / R2 * (R1 + R2);  

// or in a oneliner
// float carVoltage = analogRead(A0) * VREF / 1024.0 / R2 * (R1 + R2);
// as VREF / 1024.0 / R2 * (R1 + R2); are all constants one could compact this to

carVoltage = analogRead(A0) * 0.01576; // used sample constants above.  

-- updated layout --
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

neepie

I tried to add measured values from resistors but its still off. Can this even be very accurate? I've changed a bit of R1 and R2 values and now im tenth off comparing to fluke. I think im satisfied with this :P

Thanks guys!

robtillaart

#10
Jun 02, 2011, 07:24 pm Last Edit: Jun 02, 2011, 07:29 pm by robtillaart Reason: 1
The precision of tha ADC of the Arduino is 10 bit, in practice the last bit may be inaccurate. That means you have approx 500 steps for 0..15 volt ==> at best 1/30 volt precission = 0,2% . Assume the resistors have an accuracy of 1% . suppose VREF has an accuracy of 2%.

Then - float carVoltage = analogRead(A0) * VREF / 1024.0 / R2 * (R1 + R2); - would give an max accumalate error of
                                                   0.2% +     2%  +    0%     + 1% + 1% + 1%  = 5.2%

=> 15V * 5.2% = 0.8 Volt max error => so one tenth of is indeed very good.

Disclaimer not official error math, just an first order approximation.

One can improve the measurement by doing the AnalogRead multiple times:
Code: [Select]

float readVoltage()
{
 #define SAMPLES 3.0
 float rv = 0;
 for (int i=0; i< SAMPLES ; i++) rv += analogRead(A0);
 rv /= SAMPLES;
 return rv * 0.01576;   // average of 3 reads times the calculated constant.
}


If time is not an issue one can take more samples ...
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

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