Arduino misst Spannung falsch

Gast #3266047
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
}
Gast #3266075
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.
Gast #3266082
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?
Gast #3266084
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...
#3266086
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.)
Gast #3266087
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.
Gast #3266091
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.
Gast #3266097
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.
Gast #3266102
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.
Gast #3275636
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?
#3275907
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...
Gast #3276829
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.
Gast #3276937
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?
Gast #3277151
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.
Gast #3277213
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. ;)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren