Forum: Mikrocontroller und Digitale Elektronik Arduino - Spuk oder Meßungenauigkeit?


von Egon M. (kpc)


Lesenswert?

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

von Tobias L. (murxwitz)


Lesenswert?

mess in jeder der Situationen mal die Versorgungsspannung des Atmegas 
nach und rechne damit den Wert des AD-Wandlers um

von Egon M. (kpc)


Lesenswert?

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

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Wenn die Spannung so stark schwankt, dann die interne Referenz 
einschalten und Spannungsteiler an den jeweiligen ADC Pin.

von Jürgen S. (jurs)


Lesenswert?

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

von Egon M. (kpc)


Lesenswert?

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

von uwe s. (Gast)


Lesenswert?

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.

von Jürgen S. (jurs)


Lesenswert?

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.

von Michael W. (mwulz)


Lesenswert?

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
Noch kein Account? Hier anmelden.