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
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.
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...
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.)
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.
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.
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.
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.
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.
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?
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/
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...
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.
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?
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.
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.
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. ;)