Forum: Mikrocontroller und Digitale Elektronik Arduino Spannungsmessung


von Filth _. (filth)


Lesenswert?

Hi,

ich will die VIN an meinem Arduino messen. Es liegen max 5v an.

VIN --> 44k --> A0 --> 22k --> GND
1
float mess = analogRead(A0);
2
float spannung = (mess * 3.3 / 1023) * 3;

Es kommen falsche Werte raus, stimmt mein Code nicht?

Danke

von Joachim B. (jar)


Lesenswert?

welche Spannungsreferenz gewählt ? (es gibt mehr als eine)
was misst du mit dem Multimeter am AREF Pin ?
welcher Arduino ? (es gibt mehr als einen und jeder kann verschiedene 
interne REF)

was misst du mit dem Multimeter am Teiler zwischen 44k und 22k nach GND 
?
was gibt mess aus ?

meine Glaskugel ist zur Wartung :-)

von utzjufutz (Gast)


Lesenswert?


von Mike (Gast)


Lesenswert?

Filth __ schrieb:
> Es kommen falsche Werte raus, stimmt mein Code nicht?

Dann tue nicht so geheimnisvoll und verrate, was du da machst, i.e. was 
bei welcher Spannung als Wandlungsergebnis rauskommt und was für 
Gerätschaften unter welchen Betriebbedingungen du vor dir hast.

von Filth _. (filth)


Lesenswert?

Also am Teiler messe ich 1.61v gegen GND.
VIN gegen GND 4.82v

Es handelt sich um einen Micro Pro 3.3v.

Als Spannung bekomme ich 4.68v, also müsste mess = 483 sein

von Joachim B. (jar)


Lesenswert?

Filth __ schrieb:
> also müsste mess = 483 sein

schon wieder räts du ?

du schliesst aus deiner Berechnung was mess liefern sollte aber prüfst 
das nicht durch Ausgabe derselben nach ? und sagst aber auch nicht ob du 
die interne AREF nutzt oder die VCC und ob der Chip überhaupt auf 3,3V 
oder 5V läuft ?

ich dachte meine Fragen waren verständlich ....

welche Spannungsreferenz gewählt ? (es gibt mehr als eine)
was misst du mit dem Multimeter am AREF Pin ?
was gibt mess aus ?

: Bearbeitet durch User
von Filth _. (filth)


Lesenswert?

Das der Chip läuft auf 3.3v.
Mess gibt aus: 489

Wie kann ich rausfinden, was als Spannungsreferenz gewählt wurde?
Welcher ist der AREF pin? Ich glaube der ist beim Pro Mini nicht 
rausgeführt.

: Bearbeitet durch User
von Bernhard F. (bernhard_fr)


Lesenswert?

Filth __ schrieb:

> Wie kann ich rausfinden, was als Spannungsreferenz gewählt wurde?

Arduino Hilfe... irgendwo gibts sicher ne Anleitung zu AnalogRead()
Default ist die Betriebsspannung. Bei dir anscheinend 3.3V.

> Welcher ist der AREF pin?

Gab es keine Art von Datenblatt dazu, wo du das Teil gekauft hast?
Sonst hilft auch die Arduino-Website.
http://arduino.cc/en/pmwiki.php?n=Main/ArduinoBoardProMini

Ich vermute jedoch stark, dass du nen China-Nachbau hast


Aber lies doch am besten mal den Thread:

www.mikrocontroller.net/topic/344829

Ist auf der gleichen Seite und scheint ein ähnliches Problem zu haben 
...

von Joachim B. (jar)


Lesenswert?

Filth __ schrieb:
> Es kommen falsche Werte raus, stimmt mein Code nicht?

warum *3 ?
1
float mess = analogRead(A0);
2
float spannung = (mess * 3.3 / 1023) * 3;

denn 489 * 3,3 / 1023  = 1,577 (V)

und mit

Filth __ schrieb:
>Also am Teiler messe ich 1.61v gegen GND

sieht das doch gut aus, genauer wird es wenn du mehrere Messwerte 
mittelst.

#define READS 3
// (bis 5)

ich lese immer 2^READS Werte und addiere sie in einer unsigned int auf 
und shifte dann entsprechend READS nach rechts

definiere dein falsch ! doch nicht etwa die 33mV Abweichung ?

fehlt der Kondi am AREF Pin ?

und rechne dann erst mit mess

: Bearbeitet durch User
von Mike (Gast)


Lesenswert?

Filth __ schrieb:
> Welcher ist der AREF pin? Ich glaube der ist beim Pro Mini nicht
> rausgeführt.

Dann nimm dir einfach das Datenblatt vom Prozessor (je nach Version von 
deinem Board: ATmega168 oder ATmega328) und guck nach, welche der 
Aref-Pin am µC ist. Wenn da ordnungsgemäß ein Kondensator dran ist, 
kannst du da bequem mit deinen Prüfspitzen ran.

Bernhard F. schrieb:
> Bei dir anscheinend 3.3V.

Dazu sagt die Arduino Pro Mini Seite
http://arduino.cc/en/Guide/ArduinoProMini
"Please note that there are two versions of the board: one that operates 
at 5V (like most Arduino boards), and one that operates at 3.3V. "

von Joachim B. (jar)


Lesenswert?

also ich rechne und bekomme richtig gerechnet passendes raus...

ohne x 3

von Filth _. (filth)


Lesenswert?

Ja, das was am Pin ankommt ist richtig - aber ich möchte eigentlich VCC 
messen. Daher der Spannungsteiler - was ich rausbekommen will, ist der 
Batteriestand, also die 4.8V

von Uwe (de0508)


Lesenswert?

Hallo,

wieso wird mit /1023 gerechnet ?
Im Atmel AVR Datenblatt steht etwas anderes.

von Bernhard F. (bernhard_fr)


Lesenswert?

Mike schrieb:
> Bernhard F. schrieb:
>> Bei dir anscheinend 3.3V.
>
> Dazu sagt die Arduino Pro Mini Seite
> http://arduino.cc/en/Guide/ArduinoProMini
> "Please note that there are two versions of the board: one that operates
> at 5V (like most Arduino boards), and one that operates at 3.3V. "

Ähm ich will ja nicht meckern aber:

Filth __ schrieb:
> Es handelt sich um einen Micro Pro 3.3v.


Filth __ schrieb:
> Das der Chip läuft auf 3.3v.


muss ich dazu noch was sagen?
Wobei ich aber dann noch das falsche Board verlinkt hab, was ich zu 
meiner Schande gestehen muss.



Und das mal 3... kommt schon.

Er will eine Spannung von 0..5V messen und hat die mit einem 
Spannungsteiler im Verhältnis 2:1 verringert auf ein Drittel des 
Ursprungswertes.
Grundsätzlich ist das Richtig, da man es tunlichst vermeiden sollte, an 
den Pin mehr als die Betriebsspannung anzulegen.
Und jetzt die Quizfrage: Wie kommt man von dem Wert am Abgriff des 
Spannungsteilers zu dem Ursprungswert, den er mit dem Hilfsmittel 
"Spannungsteiler+A/D-Wadnlung" messen will?

Eine Spannung von 0 .. 1.7V jetzt aber mit dem vollen Messbereich von 0 
.. 3.3V AD zu wandeln gibt allein schon dadurch einen größeren 
Fehler,dass hier ein Bereich mit abgedeckt wird, der nie erreicht wird. 
Gibt ja dann eine gröbere Auflösung.
Ein Spannungsteiler im Verhältnis von 2:3 Würde sich hier schonmal 
anbieten. Oder eine andere Referenz aber ich hab jetzt keine Lust die 
möglichen aus dem Datenblatt zu ziehen...
Und ja ich hab jetzt gerade Auflösung und Genauigkeit ein wenig in den 
gleichen Topf geworfen. Ich kann das gerne auch nochmal detallierter 
erläutern, falls es da noch Bedarf gibt.


Joachim B. schrieb:
> definiere dein falsch ! doch nicht etwa die 33mV Abweichung ?

Anscheinend ist es doch genau das.
Durch die bescheidene Anpassung vom Messbereich und dann noch den Faktor 
3 ist dieser Fehler aber größer als er eigentlich sein müsste.


Uwe S. schrieb:
> wieso wird mit /1023 gerechnet ?

Weil die bei Arduino dazu folgendes in ihrem ofiziellen Tutorial sagen.
1
To change the values from 0-1023 to a range that corresponds to the
2
voltage the pin is reading, you'll need to create another variable, a
3
float, and do a little math. To scale the numbers between 0.0 and 5.0,
4
divide 5.0 by 1023.0 and multiply that by sensorValue :
5
6
float voltage= sensorValue * (5.0 / 1023.0);

Es ist doch nicht etwa falsch was das große Arduino sagt? Und zählt 
wirklich, was im Datenblatt von Atmel steht? hust
Ein Arduino irrt nie !!!!1einself
Und sollte sich doch mal ein Arduino irren, dann ist irgendwo etwas in 
einer lib versteckt, wodurch automatisch die Zeile davor in Kraft tritt 
...

: Bearbeitet durch User
von Filth _. (filth)


Lesenswert?

Also es stünde noch 1.1v interne Referenz zur Verfügung.

Wenn ich einen 2:3 Spannungsteiler baue, also

5.0v --> 44k --> A0 --> 66k --> GND

Welche Spannung liegt dann bei A0 an?

von Pferdehaar (Gast)


Lesenswert?

Wie wäre es zuvor mit Grundlagen?

Ein "2:3" Spannungsteiler verringert die Spannung um den Faktor 0.666.
66K:44k teilt auf 0.6 herunter.

von Bernhard F. (bernhard_fr)


Lesenswert?

Filth __ schrieb:
> Welche Spannung liegt dann bei A0 an?

Dein Ernst? Versuch es mal mit 3V ...

Natürlich darfst du dann in deiner Rechnung nicht mehr x3 rechnen, 
sondern mal 5 durch 3.


Pferdehaar schrieb:
> Wie wäre es zuvor mit Grundlagen?

Bis dahin stimm ich dir noch zu.

> Ein "2:3" Spannungsteiler verringert die Spannung um den Faktor 0.666.

Ich meinte "zwei zu drei" und habe das als "2:3" geschrieben...  einen 
"zweidrittel" Spannungsteiler hätte ich wenn dann mit "2/3" beschrieben 
auch wenn das irgendwie seltsam klingt. Das ist so schon richtig.

> 66K:44k teilt auf 0.6 herunter.

Und genau das habe ich vorgeschlagen. Damit er auch noch was messen 
kann, wenn seine "max 5V" mal auf bis zu 5,5V hochgehen und nicht gleich 
der uC sich beschwert.

von Wolfgang (Gast)


Lesenswert?

Bernhard F. schrieb:
> Und genau das habe ich vorgeschlagen. Damit er auch noch was messen
> kann, wenn seine "max 5V" mal auf bis zu 5,5V hochgehen und nicht gleich
> der uC sich beschwert.

Der wird sich da bestimmt nicht beschweren, sondern einfach etwas Strom 
durch seine Eingangsschutzdiode fließen lassen, bis der Spannungsabfall 
am oberen Teilerwiderstand so groß ist, dass die Eingangsspannung 
unkritisch ist.

von Filth _. (filth)


Lesenswert?

> Und genau das habe ich vorgeschlagen. Damit er auch noch was messen
> kann, wenn seine "max 5V" mal auf bis zu 5,5V hochgehen und nicht gleich
> der uC sich beschwert.

Ein 3.3v uC verträgt doch keine 5v am Pineingang, oder?

von Joachim B. (jar)


Lesenswert?

bei 66k würde der max Strom bei 5V unter 0,1mA liegen, aber der Atmel 
würde die über seine internen Schutzdioden nach VCC abführen und selber 
verbrauchen sprich die VCC veniger belasten. Ich denke auch das 
klappt.Eigntlich muss am 66k nur 5V-3,6V = 1,4V / 66k Ohm, oder anders 
gesagt 1,4^2/66k an Leistung im Vorwiderstand "vernichtet" werden

von spess53 (Gast)


Lesenswert?

Hi

>Ein 3.3v uC verträgt doch keine 5v am Pineingang, oder?

Kommt auf den Strom an. Es gibt eine App-Note von ATMEL an der ein 
AVR-Eingang an 230V Wechselspannung liegt.

Für ADC-Eingänge wird von ATMEL eine Eingangsimpedanz von <=10k 
empfohlen.

MfG Spess

von Bernhard F. (bernhard_fr)


Lesenswert?

Wolfgang schrieb:

> Der wird sich da bestimmt nicht beschweren, sondern einfach etwas Strom
> durch seine Eingangsschutzdiode fließen lassen, bis der Spannungsabfall
> am oberen Teilerwiderstand so groß ist, dass die Eingangsspannung
> unkritisch ist.

Hab ja auch nicht behauptet, dass er gleich abraucht.
Ich würde trotzdem den Spannungsteiler nicht genau auf die Grenze 
auslegen.
So präziese sind die Widerstände auch nicht, dass die 5V Exakt auf 3,3V 
geteilt werden. Mit E48 komme ich im Worst-Case schonmal auf 3,388V und 
das liegt schon deutlich über der Referenz. Dann kommt noch die 
Genauigkeit des A/D Wandlers dazu... Und die 5V sollen doch wohl noch 
sicher detektiert werden und nich als "allers größer als 4,9V ist eh nen 
0x03FF" untergehen.
Und dann kommt es ja immer noch darauf an, was die Bastelkiste 
hergibt...

Von daher bleibe ich erstmal bei dem Vorschlag, den Spannungsteiler im 
Verhältnis 2 zu 3 auszulegen. Auch wenn das Argument "um den µC zu 
schützen" auf wackligen Beinen steht.


Filth __ schrieb:
> Ein 3.3v uC verträgt doch keine 5v am Pineingang, oder?

Hier ging es aber auch um 5V Eingang an deinem Spannungsteiler wie im 
Eingangspost beschrieben???

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Bernhard F. schrieb:
> Hier ging es aber auch um 5V Eingang an deinem Spannungsteiler wie im
> Eingangspost beschrieben???

und somit wird die 5V über den Vorwiderstand nie zum A Pin gelangen

und selbst wenn die geteilte Spannung über 3,3V liegt dauert es ewig bis 
es kritisch für dan A Pin wird

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

spess53 schrieb:
> Kommt auf den Strom an. Es gibt eine App-Note von ATMEL an der ein
> AVR-Eingang an 230V Wechselspannung liegt.

Nicht der Eingang selbst, sondern ein Widerstand vorm Eingang ;-)
Du meinst die AVR182: Zero Cross Detector
http://www.atmel.com/images/doc2508.pdf

von Sebastian W. (wangnick)


Lesenswert?

Hallo Filth,

Filth __ schrieb:
> Also am Teiler messe ich 1.61v gegen GND.
> VIN gegen GND 4.82v
> Es handelt sich um einen Micro Pro 3.3v.
> Als Spannung bekomme ich 4.68v, also müsste mess = 483 sein

Meiner Meinung nach ist Deine Schaltung genau richtig und Deine 
Ergebnisse doch auch. Zwischen 4.68 und 4.82 liegen ja nur 3% 
Abweichung. Das ist doch schon sehr genau!

Wenn du noch genauer messen willst, dann ist das sehr sportlich. Du 
bräuchtest z.B:

*) Ein hochpräzises Multimeter zur Kontrolle. Wie absolut genau ist Dein 
jetziges?

*) Genaue Widerstände im Spannungsteiler (die ihren Widerstand auch 
wenig mit der Temperatur ändern), zum Beispiel 0.1% oder genauer.

*) Eine präzise Spannungsreferenz. Deine jetzige Spannungsreferenz ist 
VCC, also die Ausgangsspannung des Linearreglers auf Deinem Micro Pro 
oder Pro Mini oder was-auch-immer Du jetzt für einen Arduino hast. Das 
ist aber bei weitem keine Präzisionsreferenz. Und auch die interne 
1.1V-Referenz des Atmega328P kann laut Datenblatt irgendwo zwischen 1.0V 
und 1.2V liegen, kann also schon mal 10% Fehler erzeugen. Ein MCP1525 
hat auch nur ±1% Genauigkeit. Mit einer LM4040B (siehe 
http://www.skillbank.co.uk/arduino/measure.htm) könntest Du anscheinend 
±0.2% erreichen.

*) Die maximale absolute Genauigkeit des ADC des Atmega328P liegt 
typisch bei ±0.2%. Um diese Genauigkeit zu erreichen sind aber einige 
Massnahmen nötig. So sollte zum Beispiel eine separate Ground Plane 
unter dem Analogteil des IC vorgesehen werden, der Analog Noise 
Canceller sollte benutzt werden, und noch andere Kleinigkeiten. Siehe 
Atmega328P Datenblatt, Abschnitt 24.6. Das wird bei Deinem Pro Mini aber 
eher nicht der Fall sein.

*) Dicke Kupferkabel und -leitungen.

Oder hab ich Dich falsch verstanden?

LG, Sebastian

: Bearbeitet durch User
von uxomm (Gast)


Lesenswert?

Hallo!
Das Messen von VCC geht bei den (meisten) ATmegas auch intern ohne 
zusätzliche Hardware. Der Code unten funktioniert zumindest bei 
ATmega168  328  1280 / 2560. Wahrscheinlich gehts auch mit dem ATmega8 
(kenn sein Datenblatt nicht auswendig).
1
int getBandgap(void) // Returns actual value of Vcc (x 100)
2
    {
3
        
4
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
5
     // For mega boards
6
     const long InternalReferenceVoltage = 1115L;  // Adjust this value to your boards specific internal BG voltage x1000
7
        // REFS1 REFS0          --> 0 1, AVcc internal ref. -Selects AVcc reference
8
        // MUX4 MUX3 MUX2 MUX1 MUX0  --> 11110 1.1V (VBG)         -Selects channel 30, bandgap voltage, to measure
9
     ADMUX = (0<<REFS1) | (1<<REFS0) | (0<<ADLAR)| (0<<MUX5) | (1<<MUX4) | (1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (0<<MUX0);
10
  
11
#else
12
     // For 168/328 boards
13
     const long InternalReferenceVoltage = 1056L;  // Adjust this value to your boards specific internal BG voltage x1000
14
        // REFS1 REFS0          --> 0 1, AVcc internal ref. -Selects AVcc external reference
15
        // MUX3 MUX2 MUX1 MUX0  --> 1110 1.1V (VBG)         -Selects channel 14, bandgap voltage, to measure
16
     ADMUX = (0<<REFS1) | (1<<REFS0) | (0<<ADLAR) | (1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (0<<MUX0);
17
       
18
#endif
19
     delay(50);  // Let mux settle a little to get a more stable A/D conversion
20
        // Start a conversion  
21
     ADCSRA |= _BV( ADSC );
22
        // Wait for it to complete
23
     while( ( (ADCSRA & (1<<ADSC)) != 0 ) );
24
        // Scale the value
25
     int results = (((InternalReferenceVoltage * 1023L) / ADC) + 5L) / 10L; // calculates for straight line value 
26
     return results;
27
 
28
    }

Gruß
Udo

von Sebastian W. (wangnick)


Lesenswert?

Hallo Udo,

uxomm schrieb:
> Das Messen von VCC geht bei den (meisten) ATmegas auch intern ohne
> zusätzliche Hardware. Der Code unten funktioniert zumindest bei
> ATmega168  328  1280 / 2560. Wahrscheinlich gehts auch mit dem ATmega8
> (kenn sein Datenblatt nicht auswendig).

Der OP will ja gar nicht VCC messen. Er will VIN messen, also die (max. 
5V) Speisespannung seines Arduino Pro Mini vor dem 3.3V-Linearregler. 
Und das schafft er auch schon, mit sodala Genauigkeit, mit seinem 
Spannungsteiler.

Was der OP jetzt noch genau darüber hinaus will ist mir allerdings etwas 
unklar ...

LG, Sebastian

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.