Hallo, ich habe mir einen Arduino beschafft (Iteaduino=Duomilanova) und versuche gerade, damit eine Spannung zu messen. Angelegt sind 2,49 V, angezeigt wird bei Spannungsversorgung aus USB-Anschluß 2,74 V, bei Spannungsversorgung über Hohlstecker und 9-V-Batterie zunächst 2,81 V, wobei es dann im Verlauf von etwas 5 Minuten langsam auf 5,96 V steigt. (Werte aus 1024 bits und 5,00 V umgerechnet). Kompliziert ist die ganze Schaltung nicht, neben dem I2C-Anschluß eines Displays ist nur noch der Spannungsteiler aus 3*10k, der aus einer zweiten 9-V-Batterie Batterie gespeist wird, vorhanden, mit dem Abgriff hinter einem der Widerstände. Ich habe es an zwei verschiedenen analogen Eingängen probiert, es gibt keinen Unterschied. Hat vielleicht jemand eine Idee, was ich da falsch mache, oder ist das bei Arduino immer so? Gruß KPC
mess in jeder der Situationen mal die Versorgungsspannung des Atmegas nach und rechne damit den Wert des AD-Wandlers um
Hi Tobias, vielen Dank, das war es! Ich hatte die Leistungsaufnahme des Arduino als so gering eingeschätzt, daß ich mit dem Spannungsabfall der speisenden Batterie nicht gerechnet hatte. Was verbraucht denn so ein Arduino (incl. LCD-Display)? Nochmals vielen Dank Gruß Egon
Wenn die Spannung so stark schwankt, dann die interne Referenz einschalten und Spannungsteiler an den jeweiligen ADC Pin.
Egon Müller schrieb: > Was verbraucht denn so ein Arduino (incl. LCD-Display)? Mit aktivem Spannungsregler braucht das Arduino-Board wohl so ca. 25 mA. Der Spannungsregler auf dem Board davon die eine Hälfte. Das LCD-Display vielleicht nochmal 2 mA ohne Hintergrundbeleuchtung und 18 mA mit Hintergrundbeleuchtung. Wenn es auf möglichst lange Batterielaufzeiten ankommt, bietet es sich eher an, nackte Atmega328 zu verbauen, an 4,5 Volt zu betreiben (3xAA oder 3xAAA), ohne Spannungsregler, und dann immer möglichst lange im Energiespar-/Schlafmodus zu halten. Das setzt natürlich voraus, dass die Anwendung nicht dauernd laufen muß, z.B. bei Wettersensoren, die nur einmal pro Minute einen Wetter-Messwert funken sollen. Alle AVR-Rechenbeispiele tun so, als würde die Spannung bei der ADC Umwandlung 5,0 Volt betragen. Das ist praktisch nie der Fall. Falls Du die ermittelten ADC-Werte anhand der tatsächlichen Spannung umrechnen möchtest, diese Funktion ermittelt auf einem Atmega328 die tatsächliche Betriebsspannung: http://code.google.com/p/tinkerit/wiki/SecretVoltmeter
Hi Jürgen Der Arduino verbraucht in der Tat eine beachtliche Menge an Energie, hätte ich nicht gedacht. Gespeist via power jack mit 10,0V, benötigt der Arduino allein ca 25 mA und das Display auch noch etwa 25 mA. Das Ding hängt z.Zt. probeweise nur am Netz, aber für spätere Versionen werde ich den Tip mit dem nackten AVR wohl realisieren. VG Egon
Jürgen S. schrieb: > Alle AVR-Rechenbeispiele tun so, als würde die Spannung bei der ADC > Umwandlung 5,0 Volt betragen. Das ist praktisch nie der Fall. Falls Du > die ermittelten ADC-Werte anhand der tatsächlichen Spannung umrechnen > möchtest, diese Funktion ermittelt auf einem Atmega328 die tatsächliche > Betriebsspannung: > http://code.google.com/p/tinkerit/wiki/SecretVoltmeter Das ist ein einfaches Beispiel, aber was fehlt ist die Korrektur des offset Fehlers und des Linearitätsfehlers jedes ADCs . Was das ist beschreiben die AP von Atmel und andered µP Hersteller.
uwe s. schrieb: > Das ist ein einfaches Beispiel, aber was fehlt ist die Korrektur des > offset Fehlers und des Linearitätsfehlers jedes ADCs . > > Was das ist beschreiben die AP von Atmel und andered µP Hersteller. Ich bin mir nicht mal sicher, dass die im Code genannte Konstante 1126400L korrekt ist. Müsste es nicht vielmehr 1125300L sein, bezogen auf den Maximalwert einer ADC Wandlung von 1023, also Konstante = 1.1*1023*1000 = 1125300L ??? Anyway, hier dann auch noch eine "kalibrierte Version" des Codes zur Spannungsmessung, die für den jeweils vorliegenden AVR-Controller in der Konstante angepasst werden muss. D.h. die umgerechnete Konstante gilt nur für den jeweiligen Controller. Dafür sind Fertigungstoleranzen bei der Chipfertigung dann mit berücksichtigt, die zu abweichenden Werten der internen 1.1 V Referenzspannung führen, und die Spannungsmessung wird mit dieser Funktion genauer, dank Kalibrierung der Konstanten. So geht's: Den Code erst einmal auf dem Controller mit der Konstanten 1125300L laufen lassen und das angezeigte Ergebnis notieren. Die Spannung gleichzeitig mit einem möglichst genauen Multimeter messen. Die kalibrierte Konstante errechnen zu (Spannungen in Millivolt): 1125300 * VCC_voltmeter / VCC_readVcc Das Ergebnis runden und als neue Konstante verwenden.
1 | long readVcc() { |
2 | long result; |
3 | // Read 1.1V reference against AVcc |
4 | ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); |
5 | delay(2); // Wait for Vref to settle |
6 | ADCSRA |= _BV(ADSC); // Convert |
7 | while (bit_is_set(ADCSRA,ADSC)); |
8 | result = ADCL; |
9 | result |= ADCH<<8; |
10 | // #define internalRefConst 1125300L |
11 | // 1125300 = 1.1*1023*1000 (original value) |
12 | // for improved accuracy, read actual voltage with voltmeter and readVcc, |
13 | // then recalculate |
14 | // set internalRefConst to 1125300L * VCC_voltmeter / VCC_readVcc |
15 | // this new constant is good for the AVR chip measured ONLY! |
16 | // example for calculation: |
17 | // VCC by voltmeter is 4,82V = 4820 mV, |
18 | // VCC by readVcc() with 1125300L constant is 4871 mV |
19 | // set corrected internalRefConst to 1125300L * 4820 / 4871 = 1113518L |
20 | |
21 | #define internalRefConst 1113518L |
22 | result = internalRefConst / result; // Back-calculate AVcc in mV |
23 | return result; |
24 | } |
Auftretende Ungenauigkeiten bei Temperaturänderungen des Controllers sind damit allerdings immer noch unberücksichtigt, falls der Controller bei stark schwankenden Temperaturen eingesetzt wird.
HalLo, habe auch folgendes Setup: ATMEGA 328 (Arudino Clone) Spannungsteiler (mit 1% Winderständen) Traco TSR-1-2450 (Schaltwandler zum 7805 kompatibel nur genauer) Wenn ich am Arduino messe hab ich ca, 4,9V bis 4,8 Volt (besser als mit 7805 da hatte ich nämlich 4,1V) egal. Jedenfalls wenn ich exakt 8V anlege (mit Labornetzgerät) dieses auch mit einem Multimeter auf genau 8V messen kann, zeigt mir der Arduino gemessen 8,3 bis 8,6 Pendelt immer hin/her. Was meint Ihr, ist die Kalibrierung (wie im Beitrag vorher) daher für jeden Chip sinnvoll? Einsatzbereich meines ATMEGA ist in einem Ladegerät für LiFePo4. Sollte also wenns 11Grad hat gleich laden wie wenns 30Grad hat. grüße
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.