Forum: Mikrocontroller und Digitale Elektronik Arduino misst Spannung falsch


von Sebastian W. (Gast)


Lesenswert?

Ich habe vor für ein Netzteil eine Spannungs- und Stromanzeige 
aufzubauen.

Momentan bin ich dabei Spannung zu messen. Mein Problem ist, dass der 
Arduino bei einer Batterie die 1,61V hat immer 1,32V anzeigt als 
eigentlich anliegen. Hab es mit mehreren Codebeispielen probiert aber 
immer das selbe Ergebnis. Bei einem Lipo mit 3,65V werden 3,42V 
angezeigt. 7,29V bei 2 Lipos in Reihe, 7,13V werden gemessen.

Als Spannungsteiler sind 1k als R1 und 110 als R2.
Damit kann ich bis 50V messen. Daraus ergibt sich auch der Faktor im 
Code. Also 50V durch 1024AuflösungDAC.

Warum wird die Spannung nicht korrekt gemessen?

Mein Code:
1
#include <LiquidCrystal.h>
2
3
// initialize the library with the numbers of the interface pins
4
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
5
6
// variables for input pin and control LED
7
  int analogInput = A0;
8
  float vout = 0.0;
9
  float vin = 0.0;
10
  float faktor = 0.048828125;
11
12
// variable to store the value 
13
  int value = 0;
14
15
void setup(){
16
  // declaration of pin modes
17
  pinMode(analogInput, INPUT);
18
19
  // set up the LCD's number of columns and rows:
20
  lcd.begin(16, 2);
21
  lcd.print("U:");
22
  Serial.begin(9600);
23
  analogRead(analogInput);           // ersten Analogwert lesen und verwerfen
24
}
25
26
void loop(){
27
  // read the value on analog input
28
  value = analogRead(analogInput);
29
30
  vin = value*faktor;          // und in Spannung umrechnen
31
32
  // print result to lcd display
33
  lcd.setCursor(3, 0);
34
  lcd.print(vin);
35
  lcd.print("V");
36
  Serial.println(vin);
37
38
  // sleep...
39
  delay(200);
40
}

von holger (Gast)


Lesenswert?

>Warum wird die Spannung nicht korrekt gemessen?

Deine Vref ist nicht exakt 5V.
Ausserdem bekommst du noch Rundungsfehler rein.

von Sebastian W. (Gast)


Lesenswert?

Wie kann ich dir Vref denn in den Code mit einbeziehen? Ich mein wenn 
ich die ganze Schaltung an eine extra Spannungsversorgung hänge sollte 
ich doch die Vref ein mal messen können und ins programm schreiben.

Wie berechne ich den Faktor denn dann richtig?

Edit: Der 7805 gibt mir 4,9V.

von holger (Gast)


Lesenswert?

1,61V / 1,32V = 1.34  34% daneben
3,65V / 3,42V = 1.07   7% daneben
7,29V / 7,13V = 1.02   2% daneben

Je höher deine Spannungen werden desto besser das Ergebnis.
Echt seltsam.

Wie sieht deine Schaltung noch mal genau aus?

von Jasch (Gast)


Lesenswert?

Sebastian W. schrieb:
> Wie kann ich dir Vref denn in den Code mit einbeziehen?

Mathematisch... ;-)

> Ich mein wenn
> ich die ganze Schaltung an eine extra Spannungsversorgung hänge sollte
> ich doch die Vref ein mal messen können und ins programm schreiben.

Ja. Wobei die Betriebsspannung des Mikros als Referenz denkbar 
ungeeignet ist, die ist normalerweise nicht dazu gedacht über die Zeit, 
die Temperatur, was-weiss-ich konstant zu sein - braucht der Mikro ja 
auch nicht.

Nimm z.B. einen TL431 oder TL432 oder sowas als Referenz.

> Wie berechne ich den Faktor denn dann richtig?

Vollausschlag entspricht 0x3ff entspricht (fast) Referenzspannung. Steht 
sicher auch ganz genau im Datenblatt des Mikros.

> Edit: Der 7805 gibt mir 4,9V.

Siehst Du. 7805 nix Referenz.

Übrigens haben die Widerstände in Deinem Spannungsteiler Toleranzen...

von Johannes O. (jojo_2)


Lesenswert?

Wo wird denn eigentlich der ADC initialisiert? Versteckt das der "tolle" 
Arduino mal wieder?

Alternativ könnte man natürlich auch die interne Bandgap-Referenz 
verwenden. Dann müsste man aber eben die Spannungsteiler zum Messen 
ändern.

Die Bandgap ist VIEL stabiler als deine "normale" Versorgungsspannung.

(Alternativ kannst du natürlich auch ne externe Referenzspannungsquelle 
dranhängen. Ist hier den Aufwand aber nicht wert.)

von Sebastian W. (Gast)


Lesenswert?

Der Arduino ist ein Arduino Mega 2560. Der wird versorgt von einem 7805 
nach dem ein 10µF Kondensator ist. Ein 2x16 Zeichen Display hat einen 
eigenen 7805 bekommen, weil vorher der Arduino nur 4,6V bekommen hat. An 
Analog 0 ist ein Spannungsteiler mit 1k als R1 und 110 Ohm als R2. Die 
beiden 7805 werden von einem Schaltnetzteil mit 12V versorgt.

von Sebastian W. (Gast)


Lesenswert?

Bandgap sind beim Mega 2,65V Volt richtig? Den Spannungsteiler ändern 
wär kein Problem hält mich nur zeitlich ein bisschen auf. Is momentan 
nur auf Breadboard. Soll später mit einem Atmega328 mit Arduino 
Bootloader laufen.

von Michael (Gast)


Lesenswert?

holger schrieb:
> Je höher deine Spannungen werden desto besser das Ergebnis.
> Echt seltsam.

So seltsam nun auch wieder nicht. Wenn ich im Datenblatt Abschnitt 26 
die ersten Zeilen zu den Features des Wandlers richtig lese, hat er eine 
Auflösung von 10 Bit mit bis zu 1 Bit Linearitätsfehler und absolut 
einen Fehler von bis zu +/- 2 LSB. Bei Verwendung von dem 
Spannungsteiler und einer 5V Referenz entspricht ein LSB
  5V/1024*1000/110=0,044V

Da der Wandler laut Spezifikation bis zu 3 LSB daneben liegen kann, hat 
man alse keinen Recht, sich an Fehler von bis zu 3*0,044V = 0,133V zu 
stören. Die Widerstandstoleranzen im Spannungsteiler sind dabei noch 
nicht berücksichtigt.

von Sebastian W. (Gast)


Lesenswert?

So ich hab jetzt unter void setup eine zeile eingefügt die da wäre: 
analogReference(INTERNAL1V1);

Jetzt hab ich 1,1 Volt vom Chip als Referenzspannung und kann dann bis 
ca. 11V messen mit dem aktuellen Spannungsteiler. Messen tuts jetzt 
korrekt und dann kann ich mir den zweiten 7805 sparen. Springt zwar um 
0.01 Volt hin und her aber das ist in Ordnung. Ich lass dann einfach 
mehr delay.

Jetzt muss ich mich nur noch um die Strommessung kümmern.

von Michael (Gast)


Lesenswert?

Sebastian W. schrieb:
> Ich lass dann einfach mehr delay.
Das wird an der Springerei nichts ändern. Messe lieber ein paar mal 
mehr, Bilde einen Mittelwert und zeige das Ergebnis zur Beruhigung mit 
einer kleinen Hysterese an.

von Sebastian W. (Gast)


Lesenswert?

Ich bin jetzt wieder ein Stück weiter. Ich hab jetzt einen ATmega328 auf 
Breadboard und der misst jetzt. Mein Problem jetzt ist dass der Wert 
zwischen 0,00 und 0,01 schwankt auch wenn das angeschlossene Netzteil 
aus ist. Ich hab auch gemerkt dass der Wert genauer wird wenn das 
Breadboard mit mehr als nur einem Jumper Wire an Masse vom Netzteil 
hängt. Strommessung funktioniert auch. Nur da stimmt mein errechneter 
Faktor überhaupt nicht. Auf dem Widerstand steht 0,1 Ohm. Dann müssten 
rechnerisch bei 11A, 1,1V am Widerstand abfallen. Oder irre ich mich da?

von Sebastian W. (Gast)


Lesenswert?

Ach ja die springerei ist jetzt auch besser. Jetzt wird 20 mal gemessen 
alles addiert und durch 20 geteilt und ausgegeben.

von M. K. (sylaina)


Lesenswert?

Sebastian W. schrieb:
> Edit: Der 7805 gibt mir 4,9V.

Du nutzt nen 7805 als Spannungsreferenz eines AD-Wandlers? Also wenn du 
dich dann auch noch wunderst warum du damit nicht genau messen kannst 
empfehle ich dir zunächst mal folgende Seite durchzulesen (auch wenn 
Sprut sich mit PICs beschäftigt):

http://www.sprut.de/electronic/referenz/

von Johannes O. (jojo_2)


Lesenswert?

Michael Köhler schrieb:
> Du nutzt nen 7805 als Spannungsreferenz eines AD-Wandlers? Also wenn du
> dich dann auch noch wunderst warum du damit nicht genau messen kannst

Das hab ich ihm schon vor ner Woche erklärt, dass er sich ne anständige 
Referenz zulegen soll, siehe mein Betrag vom: Datum: 03.08.2013 00:47

Aber offenbar scheinen Arduino-Benutzer oftmals beratungsresistent zu 
sein, da es ja kein Referenzsspannungs-Shield gibt...

von Arduino der Bastler (Gast)


Lesenswert?

Hallo,
du hast eine Marktlücke entdeckt. Ein Referenzspannungs-Shield fehlt in 
der Arduino-Welt noch. Schnell zu Patentamt.

MfG

von Sebastian W. (Gast)


Lesenswert?

Johannes O. schrieb:
> Das hab ich ihm schon vor ner Woche erklärt, dass er sich ne anständige
> Referenz zulegen soll, siehe mein Betrag vom: Datum: 03.08.2013 00:47
>
> Aber offenbar scheinen Arduino-Benutzer oftmals beratungsresistent zu
> sein, da es ja kein Referenzsspannungs-Shield gibt...

Beratungsresistent? Aha. Hab halt echt geschrieben dass ich durch die 
Zeile mit INTERNAL1V1 die interne Bandgap Referenz im atmega als 
referenz gesetzt hab.

Was haben eigentlich alle gegen die Arduinos? Nebenbei hab ich sowieso 
nur einen einzigen arduino, auf dem rest ist entweder der bootloader 
drauf oder der code direkt per isp drauf geschrieben. Alle controller in 
nem ic sockel auf meinen projekten. Nutze eigentlich nur die 
benutzerumgebung und den arduino mega zum experimentieren weil man damit 
schön mit jumper wires und breadboards arbeiten.

Ein shield hab ich gar keines weil die alle komplett überteuert sind. 
praktisch sind die shields allemal. Draufstecken und loslegen ohne dass 
man viel ahnung haben muss. Ist doch auch in ordnung wenn man die nicht 
hat. Hätte ich mich ewig am meinen pc gesetzt hätte ich auch 
herausgefunden dass der atmega eine interne referenz hat. Nur hab ich 
halt hier nachgefragt weil ich nicht wusste was los war.

Ich finds einfach nur unfair wie die leute behandelt werden nur weil man 
weiß dass sie einen arduino haben/benutzen.

Die betriebsspannung will ich nicht mehr als referenz weils dann 
schwieriger wird wieder auf 0-5 volt zu kommen ohne opamp.

von Sebastian W. (Gast)


Lesenswert?

Und nur mal nebenbei.. 2 LM336-2.5 waren schon auf dem weg zu mir bevor 
ich die letzten posts gelesen hab..

von Gregor B. (Gast)


Lesenswert?

Sebastian W. schrieb:
> Beratungsresistent? Aha. Hab halt echt geschrieben dass ich durch die
> Zeile mit INTERNAL1V1 die interne Bandgap Referenz im atmega als
> referenz gesetzt hab.

Hast Du auch mal genauer ins Datenblatt geschaut? Die darf ungefähr 
+-9,1% Fehler haben, da ist ein 7805 mit seinen +-5% besser.

Sebastian W. schrieb:
> Auf dem Widerstand steht 0,1 Ohm. Dann müssten
> rechnerisch bei 11A, 1,1V am Widerstand abfallen. Oder irre ich mich da?

11A über 0,1 Ohm macht 12,1W Verlustleistung am Widerstand.
Was für einen Widerstand hast du denn? Welchen Temperaturkoeffizienten 
hat der?

von Hubert G. (hubertg)


Lesenswert?

Sebastian W. schrieb:
> Was haben eigentlich alle gegen die Arduinos?

Grundsätzlich gar nichts.
Nur wenn man sich das Layout anschaut und die lange Antenne am AREF-Pin 
sieht, der Blockkondensator ist irgendwo, dann kann man vom ADC nichts 
besonderes erwarten.
Es ist nun mal ein Board das alles kann und damit in speziellen Fällen 
aber auch seine Einschränkungen hat.

von Sebastian W. (Gast)


Lesenswert?

Die 11 ampere hab ich theoretisch hergenommen. Praktisch weiß ich dass 
ich die da nicht drauf lassen kann. Hab ich nur zum rechnen hergenommen. 
Weil ja theoretisch an 0.1 ohm bei 11A am widerstamd 1.1V abfallen. Hoff 
das stimmt so. Dann müsst ich die 11A durch 1024 teilen und bekomm dann 
den Faktor raus. Mir zeigts aber viel mehr an als es eigentlich ist.

Hubert G. schrieb:
> Grundsätzlich gar nichts.
> Nur wenn man sich das Layout anschaut und die lange Antenne am AREF-Pin
> sieht, der Blockkondensator ist irgendwo, dann kann man vom ADC nichts
> besonderes erwarten.
> Es ist nun mal ein Board das alles kann und damit in speziellen Fällen
> aber auch seine Einschränkungen hat.

Ja das stimmt wohl. Den Arduino selber nehm ich aber halt eben nur zum 
rumprobieren. Das andere is wie gesagt auf eigener Platine. Mir gefällt 
halt die entwicklungsumgebung.

Die Spannung wird ja jetzt bis auf den leicht falschen faktor richtig 
gemessen. Der faktor is ja errechnet. Aber der spannungsteiler ist ja 
auch nicht zu 100 Prozent genau das was man ausgerechnet hat. Nur jetzt 
is halt noch das Problem dass wenn ich gar keinen strom drauf gebe dass 
dann ein wert zwischen 0.00 und 0.01 rauskommt.

von Gerhard K. (mikros)


Lesenswert?

Dann schau halt mal ins Datenblatt.
Da steht dann so in etwa ±2 LSB Absolute Accuracy.
D.h. 5mV * 2 = 10mV passt doch zu Deiner Messung.

MfG

von Timonius (Gast)


Lesenswert?

Also mitteln, mitteln, mitteln, bis man die verschenkten Bits wieder 
kompensiert hat. Und am besten auch noch die Referenz ein bisschen 
filtern, dann sollte doch was brauchbaren bei rauskommen. ;)

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.