PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Spannungsteiler Wiederstände & Auswertung ?



Zyrano
15.07.2016, 14:31
Hallo liebe Leute,

ich bin grad dabei eine Akkukontrolle zu planen und bin an dem Punkt der Widerstandswahl angekommen.
Ich habe nun schon einiges über Spannungsteiler gelesen und auch wie der Arduino damit verbunden wird, aber so langsam steigt etwas Verwirrung auf ^^
Der Akku hat 12V (Blei). Ich habe nun gelesen, dass man für 12V einen 10K und einen 4,7K (ca. 3,83V am Arduino) Widerstand nehmen soll, wobei ich an anderer Stelle erfahren habe, dass ein Verhältnis 1/5 gut sein soll. Dafür habe ich 10K und 2,5K (2,4V am Arduino). Ich habe ebenso gelesen, dass ein größerer Wert genauer sein soll (kann mir im Moment nicht erklären warum ^^)

Welche Werte sind denn nun besser bzw. vertretbarer ?
Und wie wird nachher der tatsächliche Spannungswert im Arduino berechnet ?

Danke für eure Mühe

Holomino
15.07.2016, 16:17
Analoge Spannungen werden über den AD im Controller gewandelt.
Ein AD hat eine Referenz (vermutlich 5V) und eine Auflösung (hier vermutlich 10Bit, also 1024 Stufen). OV sollten dem Ausgangswert 0 und 5V dann dem Ausgangswert 1024 entsprechen. Bei 2,5V wäre dann z.B. der Ausgangswert im Idealfall 512, es wird also linear aufgelöst.

Wenn Du den möglichen Eingangsspannungsbereich durch den Teiler auf max. 2,5V begrenzt, wird Dir der Wandler auch nie mehr als 512 ausgeben. Du verlierst also die Hälfte Deiner möglichen Auflösungsschritte. Der Wandler wird damit ungenauer.

Es ist also anzustreben, den Teiler so zu dimensionieren, dass die Spannung am Eingang des Wandlers bis zum Referenzwert steigen kann.

ABÄR: Dein Bleiakku hört (insbesondere während des Ladens) mitnichten bei 12V auf, da geht die Spannung hoch bis 13,4...14,8V (je nach Typ, Bleivliess, Bleigel, ...). Übersteigt die Spannung am Eingang des Wandlers die Referenzspannung, wird 1024 (oder in Ausnahmefällen ein Overflow, also 0) angezeigt.
Mit einem Spannungsteiler 1:3 bist Du also gut bedient. Mit dem 4k7 und 10k sollte das passen (wenn Du den 4k7 gegen Masse und den 10k gegen Akkuspannung schaltest, NICHT ANDERSHERUM).

Aber lies bitte noch mal das Datenblatt Deines Arduino durch, gegen welche Referenz der wandelt. Wenn der die interne 1,1V Referenz verwendet oder mit 3,3V arbeitet, musst Du andere Werte nehmen.

Die Auswertung ist ein Dreisatz: Referenz/(Teilerverhältnis * Auflösung) = Wert/ADWert umgeformt in

Wert = (Referenz * ADWert)/ (Teilerverhältnis * Auflösung)

Bsp:
gemessener ADWert = 800
Auflösung = 1024 (10Bit)
Referenz = 5V
Teilerverhältnis: 4,7/14,7 = 0,32

(Systemkonstanten sind fett gekennzeichnet)

Wert = (5V * 800)/ (0,32 * 1024) = 12,21V

Noch was: Die üblichen Widerstände haben 1% Toleranz. Der Wandler kann aber bis zu 0,1% genau. Es empfiehlt sich also, das Teilerverhältnis empirisch genauer zu ermitteln (Multimeter nehmen und Ergebnis des Wandlers mit Messung vergleichen)

BMS
15.07.2016, 16:26
Hallo,
Holomino hat das schon sehr genau erklärt.

Noch ein paar Kleinigkeiten:
Die Toleranzen der Widerstände fließen auch in das Messergebnis ein. Wenn du genau messen möchtest, sollten auch die Widerstände präzise sein, logisch. Also keine billigen 5% Kohleschichtwiderstände nehmen ;)
Was auch hilfreich sein kann: parallel zum "unteren" Widerstand des Spannungsteilers noch einen kleinen Kondensator einbauen (z.B. 1µF, egal). Damit werden die Messergebnisse etwas gemittelt. Ansonsten schlägt die Akkuwarnung bei jedem kurzen Spannungseinbruch an.

Viele Grüße,
Bernhard

Zyrano
15.07.2016, 16:29
Hallo Holomino,

vielen Dank für deine Antwort. Das hört sich jetzt alles etwas einleuchtender an ^^
Im Datahseet vom Sainsmart Arudino MEGA 2560 habe ich nichts derartiges wie eine Rezerenzangabe in V gefunden ?

Die Schaltung würde ich dann so bauen: +12V ---> 10K ---> AN ---> 4k7 ---> GND richtig ? Nur rein zum Verständnis ;-)



Was auch hilfreich sein kann: parallel zum "unteren" Widerstand des Spannungsteilers noch einen kleinen Kondensator einbauen (z.B. 1µF, egal). Damit werden die Messergebnisse etwas gemittelt. Ansonsten schlägt die Akkuwarnung bei jedem kurzen Spannungseinbruch an.


Hallo BMS,

Geht auch ein 100mf oder 22mf Kondensator ? davon hab ich noch welche =)

Holomino
15.07.2016, 16:44
Mit der Reihenfolge der Widerstände: Genauso habe ich es gemeint.

Mit den Kondensatoren: mF = Millifarad, die müssten etwa so groß sein, wie nen Koffer, die würden nicht gehen. Wenn Du nF = Nanofarad meinst: Aus Sicht des RC-Gliedes liegen die beiden Widerstände parallel, macht also etwa 3,2k aus. Mit 100nF bekommst Du eine Zeitkonstante von 3,2k * 100nF = 320us. Das wird z.B. für das Filtern eines Motorschaltens nicht reichen.
Was Du aber machen kannst, ist die softwareseitige Filterung solcher Störungen, also mehrfach messen und den Mittelwert bilden.

Bezüglich der Referenz: Auf die schnelle gefunden: "analogRead (https://www.arduino.cc/en/Reference/AnalogRead)" und "analogReference (https://www.arduino.cc/en/Reference/AnalogReference)"

Zyrano
15.07.2016, 16:59
Ich meinte eigentlich Mikrofarad. Das was BMS auch meinte 👍

Holomino
15.07.2016, 17:07
Mikrofarad sind dann blöderweise "uF" (Eigentlich griechisch mü-F, aber das will keiner tippen).
Das sollte mit dem 22uF gehen, wenn Du nach dem Einschalten etwa 0,3s wartest, bis Du zu messen beginnst. So lange braucht der Kondensator, bis er über den Spannungsteiler geladen ist.

Zyrano
15.07.2016, 17:18
Oh entschuldige. Dann meinte ich natürlich uF 😄

Peter(TOO)
16.07.2016, 02:02
Hallo,

Oh entschuldige. Dann meinte ich natürlich uF ��
Eben, 1mF = 1'000µF.
Fall ein µ gerade nicht greifbar ist, geht auch uF (ist vor allem im angelsächsischen Sprachraum recht gebräuchlich)

Noch zum Spannungsteiler:

Eigentlich sollte deinem Fall der Gesamtwiderstand möglichst gross sein, der Spannungsteiler entlädt deinen Akku dauernd.

Andererseits hat der ADC auch wiederum einen Eingangswiderstand, welcher einen Fehler im Spannungsteiler verursacht (Stichwort: belasteter Spannungsteiler).

Man kann den Wert also auch nicht beliebig gross wählen.
Wie immer bei eine Konstruktion, muss man auch hier einen Kompromiss wählen.

In meinem Geräten findet sich immer folgende Formel:

wert = ((ADC*k1)/k2)+offset;

Alles Integer mit Vorzeichen.

k1, k2 und Offset befinden sich in einem EEPROM. Für den Abgleich gibt es dann eine kleines Programm.
Anfänglich setzt man k1 = k2 = 1 und offset = 0
Mit k1/k2 kann man dann auch alle möglichen gebrochene Faktoren erstellen. Wichtig ist nur, dass ADC*k1 keinen Überlauft erzeugen kann.

Damit kannst du praktisch alle vorkommenden Fälle abgleichen.
Um ohne einen Abgleich auszukommen, müsstest du bei 10-Bit Widerstände verwenden, welche besser als 0.05% sind.
Mit einem Abgleich tun es im Prinzip auch Widerstände mit 5%, diese müssen nur stabil sein, also am Besten Metallfilm-Widerstände mit kleinem Tk verwenden.

MfG Peter(TOO)

Zyrano
20.11.2016, 18:18
Um das ganze jetzt nochmal auf zu greifen (längere Zeit inaktiv wegen längerer Prioritätsverschiebung ^^)

Folgende Zusammensetzung:
12V Bleiakku, 10kohm und 4,7kohm Widerstände im belastetem Spannungsteiler.
Ein 12V Stromkreis direkt ab Akku für Motortreiber und ein Stromkreis ab Akku mit StepDownRegler auf 5V für Arduino
Spannungsteiler parallel zum StepDownRegler.

Ausgehend vom DataSheet Mega 2560 5V Referenz und 1024 Auflösung.
Ich lese den AnalogPort mit
values = analogRead(analogInput);
Dann mache ich die Berechnung mit
v = (5 * values) / (0.47 * 1024);

Nun werfen mir die Variablen aber "values" zwischen 912 und 916 und "v" 9,46 bis 9,52.
Gemessen direkt am Akku kommen 12,76V.
Was stimmt mit den Werten nicht ? Kann es zu Problemen kommen, wenn ich den Arduino mit USB am Rechner habe ? Irgendwie muss ich ja die Werte auslesen =)

Danke

EDIT: Hier mal der ganze Sktech:



int analogInput = 0;
float v = 0.0;
int values = 0;

void setup() {
Serial.begin(9600);
pinMode(analogInput, INPUT);
}

void loop() {

values = analogRead(analogInput);
v = (5 * values) / (0.47 * 1024);

Serial.print("Wert V= ");
Serial.println(v);
Serial.println("Wert =");
Serial.println(values);

delay(500);
}


EDIT2: Wenn ich die 12V abschalte bleiben über USB noch 2,3V die er misst ?

White_Fox
21.11.2016, 09:21
Mikrofarad sind dann blöderweise "uF" (Eigentlich griechisch mü-F, aber das will keiner tippen).

Also komm...Alt Gr + m, sollte man doch kennen. :)

i_make_it
21.11.2016, 13:03
v = (5 * values) / (0.47 * 1024);


Frage: Für was nimmst Du values mal 5?
Also den selben Wert mal 5.
Das sind ja nicht 5 hintereinander gemessene Werte sondern der letzte gemessene Wert mal 5.

Versuch mal:


v = values * 14.28 / 1023;
oder
v = values * 0.01396;


1023 deshalb, da bei 1024 Werten und 0 als kleinstem Wert der größte Wert 1023 ist.

Und wenn 912 bis 916, also im Mittel 914 einer realen Klemmenspannung von 12,76 V entsprechen und der Wert 0 dementsprechend 0V,
dann entspricht der Wert 1023, 14,28V.

Zyrano
21.11.2016, 20:25
Das war der passende Kick der mir gefehlt hat. Ein einfacher Rechenfehler... Vielen Dank ! Jetzt bekomme ich die richtigen Werte =)

i_make_it
22.11.2016, 09:53
Wenn Du trotzdem noch den Mittelwertüber mehrere Messungen nehmen willst, mach Dir ein Array mit der entsprechenden Anzahl Zellen und inkrementier bei jeder Messung den Pointer so schreibt es den Messwert immer in die nächste Zelle. Bei Überlauf (pointer > maxpointerwert) setze den Pointer auf Startwert. Dann hast Du einen Ringpuffer, der bei jeder Messung den ältesten Wert überschreibt.
Das Array wird beim Start mit 1023 in jeder Zelle initialisiert, dann kann Dir auch nicht eine Unterspannug detektiert werden. Bis alle Initalwerte überschrieben wurden ist dier Mittelwert halt höher als die tatsächlich gemessene Spannung.
Bie der Mittelwertbildung empfiiehlt sich eine Anzahl von Messwerten von 2 hoch n, also 2, 4, 8, etc. Damit ist die Division eine einfache Folge von Shift right. Wenn der Compiler gut ist, (habe ich bei Arduino noch nicht getestet) ersetzt er also eine Division durch 4, durch zwei mal Shift right und spart so deutlich Rechenzeit.

Holomino
22.11.2016, 19:30
Also komm...Alt Gr + m, sollte man doch kennen. :)

Ich komm aus einer Zeit (Orcad/ Trax unter DOS), da gab's sowas noch gar nicht.