Forum: Mikrocontroller und Digitale Elektronik Auflösung bei Batteriespannungsmessung verbessern


von Maxe (Gast)


Lesenswert?

Tag,

Gerade ein kleiner Knoten im Kopf:

Ich möchte eine 24V Bleibatterie mittels Atmega2561 überwachen und die 
Entladekurve im Eeeprom speichern.

Das bedeutet also einen Spannungsbereich (mit Sicherheitsabstand) von 
20V bis 30V.

Von den maximal 30V interessieren mich eigentlich nur 10V, die ich gerne 
mit möglichst hoher Auflösung messen und speichern möchte.

Problem: Mit einem herkömmlichen Spannungsteiler messe ich immer den 
ganzen Spannungsbereich. Wie kann ich nun das Messfenster anpassen?

30V / 10 Bit: 0.03V
30V /  8 Bit: 0.12V

10V / 10 Bit: 0.001V
10V /  8 Bit: 0.04V

Dazu kommt noch, dass ich nur 4096 Bytes Eeprom habe, was bei 10bit 
Werten nicht mehr wirklich viel ist.

Ein guter Kompromiss scheint mir zu sein, die "oberen" 10 Volt mit nur 8 
Bit zu messen und zu speichern.

Oder gibt es da eine ganz andere, schlauere Lösung, die ich noch nicht 
kenne?

Gibt es einen Weg, von 10bit Messwerten (von 30V) nur den oberen Teil zu 
verwerten, ohne an Auflösung einzubüßen?

Bin für jeden Hinweis Dankbar.

Grüße,

Maxe

von Joe (Gast)


Lesenswert?

Siehe:

Differentielle Spannungsmessung zwischen zwei analogen Eingängen.

von Maxe (Gast)


Lesenswert?

Das würde bei VRef 5V bedeuten:

ADC Kanal 0: 3.3V
ADC Kanal 1: Spannungsteiler 24V/GND

Dann mit 10x Gain die Differenz der Beiden Kanäle messen, mit 8bit.

Korrekt?

von Harald W. (wilhelms)


Lesenswert?

Maxe schrieb:

> Von den maximal 30V interessieren mich eigentlich nur 10V, die ich gerne
> mit möglichst hoher Auflösung messen und speichern möchte.

Siehe hier:
https://www.mikrocontroller.net/articles/Spannungsteiler#Spannungsteiler_mit_Offset.2C_passiv

von c-hater (Gast)


Lesenswert?

Maxe schrieb:

> Von den maximal 30V interessieren mich eigentlich nur 10V, die ich gerne
> mit möglichst hoher Auflösung messen und speichern möchte.

Dann mußt du einfach vor der Messung 20V abziehen.

Schon vor undenklichen Zeiten wurde der Operationsverstärker erfunden, 
der (neben vielen anderen neckischen Spielereien) auch eine Spannung von 
einer anderen subtrahieren kann...

von Maxe (Gast)


Angehängte Dateien:

Lesenswert?

Habe das mal nach der Exceltabelle zusammengesteckt, komme aber bei 
weitem nicht auf das gewünschte Spannungsfenster...

Wo ist mein Fehler?

von plaiaggu (Gast)


Lesenswert?

Maxe schrieb:
> Habe das mal nach der Exceltabelle zusammengesteckt, komme aber
> bei weitem nicht auf das gewünschte Spannungsfenster...
>
> Wo ist mein Fehler?

was willst du mit dem datenpaket anfangen??

von plaiaggu (Gast)


Angehängte Dateien:

Lesenswert?

je nach Belastung und Temperatur, ist die Entladekurfe unterschiedlich.

da müsstest du müdestes noch den Strom und die Temperatur parallel mit 
aufzeichnen ...

von Simpel (Gast)


Lesenswert?

Mit nem Opamp (Spannungsfolger) die unteren 15V am inv.-Eingang (+5V 
anlegen) wegsubtrahieren und die oberen 15V mittels Spannungsteiler 
(Spindelpoti) so justieren, dass am noninv.-Eingang  bei 30V U_batt 10V 
anliegen. Dann hast du ne ADC-Range von 0-5V über den U_Batt_Bereich von 
15-30V. Unter 15V ist eh Pille bei nem 24V-Akku.

von tztz-fliege (Gast)


Lesenswert?

Maxe schrieb:
> Habe das mal nach der Exceltabelle zusammengesteckt, komme aber bei
> weitem nicht auf das gewünschte Spannungsfenster...
>
> Wo ist mein Fehler?

Wer lesen kann, ist klar im Vorteil:

Einschränkungen bezüglich der Werte für Uein_min, Uein_max, Uaus_min, 
Uaus_max
Uaus_min >= Uein_min
Uaus_max >= Uein_max
Vcc >= Uein_max

von Klaus (Gast)


Lesenswert?

Wenn man die max Spannung etwas kleiner als 30V nimmt, so 29V dann 
bekommt man Spannungen von ca 22V bis 29V mit einem 10 Bit ADC in den 
Bereich 0x300 bis 0x3ff. Dann kann man statt 10 nur die 8 unteren Bits 
speichern und bei der Ausgabe einfach 0x300 dzuaddieren.

10 Bit entsprechen einer Auflösung von 0,1%. Alles was man als Schaltung 
baut, um Bereich und Auflösung anzupassen muß sich an diesen 0,1% 
messen. Ein einfacher Spannungsteiler und Offset wegrechen hat es da 
sicher leichter als irgendeine analoge Schaltung mit OpAmp und Referenz.

MfG Klaus

von Simpel (Gast)


Lesenswert?

@Klaus
Du hast dann trotzdem die 29V auf 5V (ADC_max) abgebildet. Mit 
Op-Subtraktion und Spannungsteiler bildet man die oberen 15V auf die 5V 
des ADC ab.... und diese 15V dann mit n Bit aufgelöst ist genauer, als 
29V mit n Bit...

von Leo B. (luigi)


Lesenswert?

Maxe schrieb:
> Ein guter Kompromiss scheint mir zu sein, die "oberen" 10 Volt mit nur 8
> Bit zu messen und zu speichern.
>
> Oder gibt es da eine ganz andere, schlauere Lösung, die ich noch nicht
> kenne?

Die Akkuspannung wird nicht unendlich weit springen... du kannst also 
nur das Inkrement zum vorherigen Wert speichern und nur z.B. alle 127 
Samplepoints einen Absolutwert (10-bit) speichern.
Oder du suchst dir sonst eine Kompressionsmethode aus.
Möglichkeiten gibt es viele

von Klaus (Gast)


Lesenswert?

Simpel schrieb:
> @Klaus
> Du hast dann trotzdem die 29V auf 5V (ADC_max) abgebildet

Richtig, mit einem Spannungsteiler und der entsprechenden Genauigkeit, 
die man mit zwei Widerständen so hinkriegt. Alles, was man mehr macht, 
erfordert wesentlich größeren Aufwand für wesentlich mehr Bauteile. Man 
muß sich zum Beispiel um die Genauigkeit der 15V (bzw des entsprechend 
runtergeteilten Werts) kümmern. Man erhöht die Auflösung auf Kosten der 
Genauigkeit, bestenfalls ein Nullsummenspiel.

MfG Klaus

von Kurt (Gast)


Lesenswert?

Zäum das Pferd doch mal von der richtigen Seite auf:

1) Dich interessieren nur 10 V von der Ent-/Lade-Kurve einer
   24 V Bleibatterie.

2) Das ist richtig, da ist nur der Bereich von 18 V
   (Tiefentladung) bis 28 V (Überladung) interessant.

3) Das soll in 8 Bit = 1 Byte mit 256 Zwischenwerten passen.

4) 10 V / 256 = 39,0625 mV     - Reichen dir die 0,039 V?

Wenn nicht, kannst du die 1-Byte-Geschichte vergessen!


Der Rest funktioniert mit jeder Uref. Beispiel für 5 V:

5) 5 V (Uref) / 1024 = 4,883 mV

6) 39,0625 mV / 4,883 mV = 8,0000

Also lege die Batteriespannung über einen 8:1 Spannungsteiler
an den ADC. (Dann sind sogar 40 V Ubat erlaubt.)

28 V / 8 am ADC:  717 Digits
18 V / 8 am ADC:  461 Digits

Nimm also den 10-Bit ADC-Wert (oder besser den Mittelwert aus
mehreren ADC-Ergebnissen) und ziehe 461 ab.

Ist dann das Ergebnis noch größer, als 255, begrenze es auf 255.
Fertig zum Abspeichern!

Beim Auslesen musst du den Wert von 0...255 mit 39,0625 mV
multiplizieren und 18.000 mV addieren.

von J. T. (chaoskind)


Lesenswert?

Aber wenn man gezwungen ist, einen Spannungsbereich auf einen anderen 
abzubilden, ist ein Nullsummenspiel immer noch erfreuchlicher als eine 
verlorene Schlacht.

von Hermann (Gast)


Lesenswert?

Maxe schrieb:
> Von den maximal 30V interessieren mich eigentlich nur 10V

Eigentlich wurde schon alles gesagt.
Ich habe das mit der Differenzmessung der AVRs gemacht. Also die 
Batterie-Spg an einen Spg-Teiler, so dass maximal Vref herauskommt. Dann 
einen 2. Spg-Teiler von Vcc an den Minus-ADC-Eingang.
Die Differenz der beiden Eingänge müssen jetzt die gewünschten 10V für 
Vollaussteuerung des ADC ergeben. Jetzt hast du also 10V mit 10Bit 
aufgelöst.
Das Ergebnis teilst du dann durch 4, damit der Rohwert in ein Byte 
passt. Damit hast du jetzt die höchst mögliche Speicherdichte im RAM. 
Die Auflösung im RAM ist jetzt 10V/256=39mV.
Aber Vorsicht! Bei der Differenzmessung des AVR muss man einige 
Abstriche machen, da sie nicht sehr linear ist. Mann darf nicht bis an 
die Grenzen (0 und 1024 Rohwert) gehen, sonst entstehen größere Fehler. 
Auch der gesamte Verlauf hat eine Nichtlinearität. Ich habe ±3 Rohwerte 
ausgemessen, die ich dann über eine Wertetabelle korrigiert habe. Man 
kann die Differenzmessung natürlich auch mit einem OP-Verstärker machen.

von Maxe (Gast)


Lesenswert?

Vielen Dank an alle!

Ich denke, der Vorschlag von Kurt ist ein guter Kompromiss zwischen 
Genauigkeit und zusätzlichem Schaltungsaufwand. Genau keinem nämlich ;)

Das war meine Wunschlösung! So wirds gemacht.

Die differenzielle Messung werde ich die Tage mal ausprobieren, wenn 
etwas Zeit zum Spielen ist. Sollte ja auch gut gehen, aber wie Herrmann 
schon angedeutet hat, da lauern ein paar Fallstricke.

Maxe

von Simpel (Gast)


Lesenswert?

@Klaus

Das Nullsummenspiel à la "linke Tasche-rechte Tasche" hast du mit deinem 
o.g. Software"trick" produziert. Obere Bits weg... obere Bits wieder 
dran... Was soll das für einen Vorteil bringen?
Das ändert an der Auflösung von 29V/n Bits nix. Ausserdem brauchst du 
bei 29V->5V einen Spannungsteiler mit Ratio 5,8. Bei der OP-Variante hat 
man Ratio 3. D.h. sowohl die Auflösung, als auch die Genauigkeit ist bei 
der Op-Variante höher. Auch hier braucht man nur 1 Spannungsteiler, am 
nichtinv.Eingang. Der inv.-Eingang des OPs liegt auf ADC_Uref (=Vcc).

@Max & Hermann

Mit differentiellem Messen per ADC ist auch nix gewonnen. Dadurch dass 
man den Ref- bzw. Minus-Eingang des ADC hochlegt, hat man am 
ADC-Messeingang nur noch die Range von Vcc - V_ref_ADC zur Verfügung. 
Der pos. ADC_In kann nur bis max. Vcc messen.

Im o.g. Beispiel von Max werden dann die 10V auf die verbleibende Range 
von  1,7V (5V-3,3V) des ADC abgebildet, was wieder ca. dasselbe ist, wie 
30V auf 5V abzubilden. Zudem sind 2 Spannunggsteiler im Spiel. Also auch 
hierbei kein faktischer Gewinn. Weder an Auflösung, noch an Genauigkeit.

von Amateur (Gast)


Lesenswert?

Mit einem ganz normalen Operationsverstärker.

Auf den nichtinvertierenden Eingang gibst Du die Batteriespannung 
(angepasster Spannungsteiler vorausgesetzt).
Auf den invertierenden Eingang gibst Du (verstärkungskorrigiert) eine 
positive Spannung - konstant - die sozusagen für den vertikalen Versatz 
(-20V) ausreicht.

Die Berechnung findest Du in jedem Buch über Operationsverstärker.

von Amateur (Gast)


Lesenswert?

Ich vergaß:

Da ohne Batterie bei einem OP die Gefahr besteht, das dieser eine 
negative Spannung liefert, kann eine Sicherung hiergegen (Diode oder so) 
nicht schaden. Kein Problem bei Rail-to-Rail.

von Simpel (Gast)


Lesenswert?

Man muss bei der ganzen Geschichte 2 Dinge auseinanderhalten:

1.) Das Fitting eines relvanten Fensters aus einem 10-Bit Wert in eine 
Byte-Variable.

2.) Die Erhöhung der physikalischen Auflösung durch Einsatz eines OPs, 
der die relevante Messrange selektiv verbreitert.

Beides sind 2 Paar verschiedene Stiefel, die nichts miteinander zu tun 
haben. In Kombination können sie beide Vorteile miteinander verbinden.

von Maxe (Gast)


Lesenswert?

So, gerade nochmal ein bisschen probiert.

Gaaanz einfach: Spannungsteiler (Trimmer) so eingestellt, dass bei 40V 
Eingang genau 5V rauskommen. 1:8.

Nun ergibt es sich, dass im Bereich von je ziemlich genau 20V bis 30V 
eines (MSB) der beiden Register immer 00000010 enthält.

Ich muss also nur das LSB speichern und hinterher mit dem konstanten MSB 
zusammenfügen.

Kurts Ansatz also nochmal komprimiert.

von Maxe (Gast)


Lesenswert?

Sprich im Bereich 20V bis 30V gilt: V_in= 20 + (10/256) * ADC_LSB

Wieder wat gelernt.

von Roland L. (Gast)


Lesenswert?

Maxe schrieb:
> Nun ergibt es sich, dass im Bereich von je ziemlich genau 20V bis 30V
> eines (MSB) der beiden Register immer 00000010 enthält.
>
> Ich muss also nur das LSB speichern und hinterher mit dem konstanten MSB
> zusammenfügen.

ich würde das MSB trotzdem kontrollieren (falls die Spannung doch mal 
unter 20V sinkt) und das LSB in dem Fall dann auf 0 setzen.

von Maxe (Gast)


Lesenswert?

Oh, und wenn ich doch mal <20V oder >30V kommen sollte, muss ich ja nur 
das MSB bei Änderung (0,1,2 oder 3) speichern. Ich werd verrückt. Diese 
Möglichkeiten.

von Klaus (Gast)


Lesenswert?

Simpel schrieb:
> Das Nullsummenspiel à la "linke Tasche-rechte Tasche" hast du mit deinem
> o.g. Software"trick" produziert. Obere Bits weg... obere Bits wieder
> dran... Was soll das für einen Vorteil bringen?

Ich fang mal von hinten an. Der To sagt, sein Speicher ist knapp. Also 
ist mein Vorschlag, speichere nur 8 Bit als uint8_t statt 10 Bit als 
uint16_t. Und interpretiere den Wert als Offset plus gespeichertem Wert. 
Das haben auch andere hier gepostet.

Und das zweite: ich verschenke bewußt Auflösung und liefere eine 
Begründung, warum man das vertreten kann. 10 Bit heißt 0,1%, da muß man 
sich ganz schön Mühe geben, daß der immer notwendige Spannungsteiler das 
letzte Bit nicht irrelevant werden läßt. Da sich Fehler addieren, 
produziert jeder weitere Schaltungsteil weitere Fehler und führt dazu 
daß noch mehr Bits irrelevant werden. Durch die OP Schaltung mag man die 
10 Bit Auflösung zwar behalten, die unteren Bits liegen aber nicht mehr 
im Vertrauensintervall der Messanordnung. IMHO ist es also einfacher und 
billiger, sich den OP zu schenken und auf die zwei unteren Bits, die 
sowieso nicht vertrauenswürdig sind, zu verzichten.

Was daran ein "Trick" sein soll, ist mir nicht klar

MfG Klaus

von Maxe (Gast)


Lesenswert?

Nach nochmaligem Lesen gebe ich zu, im Prinzip habe ich nun erst endlich 
Klaus' Vorschlag vom Anfang nachvollzogen und umgesetzt. Mea culpa.

Aber immerhin. Es funktioniert. Und ohne zusätzlichen Aufwand (ausser 
diesem Thread natürlich) besser, also es für die Anwendung letztlich 
nötig gewesen wäre ;) Das nennt man dann Fortschritt?!

von Karl (Gast)


Lesenswert?

Wenn der Speicher knapp ist, warum nicht einfach Ein externes EEPROM 
über I2C anschließen?

Zur Messung, wie wäre es, durch Oversampling die Auflösung auf 12 bit zu 
erhöhen und mit einem Spannungsteiler die 30 V auf 5 V abzubilden. Das 
bringt eine bessere Auflösung als 10 V bei 10 bit.

von Maxe (Gast)


Lesenswert?

Oversampling: Jaaa... aber für eine Batterieanzeige langts nun ;)
Aber danke für den Denkanstoß, demnächst wird mal wieder gespielt und 
probiert.

Maxe schrieb:
> Es funktioniert. Und ohne zusätzlichen Aufwand (ausser
> diesem Thread natürlich) besser, also es für die Anwendung letztlich
> nötig gewesen wäre ;)

Externer EEprom ja... müsste aber noch zusätzlich an das fertige Board 
angedübelt werden. Mit der nun gefunden KlausKurt-Lösung komme ich mit 
den 4kB ganz gut zurecht, denke ich.

von Hermann (Gast)


Lesenswert?

Simpel schrieb:
> Mit differentiellem Messen per ADC ist auch nix gewonnen

Das stimmt so nicht! Die differenzielle Messung subtrahiert den 
negativen von dem positiven Eingang und die Differenz wird auf den ADC 
mit 10Bit Auflösung gegeben. Der Eingangs-Offset kann dabei (annähend) 
den gesamten Bereich von 0V bis Vcc überdecken. Also genau wie bei 
Einsatz eines OP. Man gewinnt also definitiv Auflösung und kann die 
gesamten 10Bit nutzen. Ich war auch skeptisch und habe es deshalb genau 
getestet.

Maxe schrieb:
> Gaaanz einfach: Spannungsteiler (Trimmer) so eingestellt, dass bei 40V
> Eingang genau 5V rauskommen. 1:8

Damit hast du nur 40V/1024=40mV Auflösung, und der Anspruch "Auflösung 
erhöhen" ist nicht mehr erreicht.

Klaus schrieb:
> Da sich Fehler addieren,
> produziert jeder weitere Schaltungsteil weitere Fehler und führt dazu
> daß noch mehr Bits irrelevant werden

Das ist natürlich richtig. Aber es ist bei so einem Messaufbau Pflicht, 
das Ergebnis zu kalibrieren. D.h. es bleiben danach nur Temperatur- und 
Drift-Fehler übrig.

Karl schrieb:
> durch Oversampling die Auflösung auf 12 bit zu
> erhöhen

Das mache ich auch immer. Ich taste so hoch wie möglich ab und glätte 
die Werte durch einen digitalen Tiefpass.

von Simpel (Gast)


Lesenswert?

Hermann schrieb:

> Das stimmt so nicht! Die differenzielle Messung subtrahiert den
> negativen von dem positiven Eingang und die Differenz wird auf den ADC
> mit 10Bit Auflösung gegeben. Der Eingangs-Offset kann dabei (annähend)
> den gesamten Bereich von 0V bis Vcc überdecken. Also genau wie bei
> Einsatz eines OP. Man gewinnt also definitiv Auflösung und kann die
> gesamten 10Bit nutzen. Ich war auch skeptisch und habe es deshalb genau
> getestet.
>

Bist du sicher?

Das hiesse nach Deiner Aussage:
Wenn du (bei Vcc 5V) an den Minus-Eingang des ADC +4,9V legst, kann der 
Plus-Eingang bis +9,9V beaufschlagt werden, um auf die max. Differenz 
von 5V zu kommen???

Dagegen spricht...
Laut Datenblatt (Absolute Maximum Ratings):
Voltage on any Pin except RESET
with respect to Ground ................................-0.5V to VCC+0.5V

von Hermann (Gast)


Lesenswert?

Simpel schrieb:
> Wenn du (bei Vcc 5V) an den Minus-Eingang des ADC +4,9V legst, kann der
> Plus-Eingang bis +9,9V beaufschlagt werden,

Natürlich nicht! Ich habe nur gesagt, dass der Offset bis Vcc gehen 
kann. Also z.B. Vcc=5V; Vref=2,5V;  V-=2V; V+=4,5V für Vollaussteuerung.

von Ingo (Gast)


Lesenswert?

Warum packst du deine Entladekurve nicht in den Flashspeicher?


Ingo

von Maxe (Gast)


Lesenswert?

Ingo schrieb:
> Warum packst du deine Entladekurve nicht in den Flashspeicher?
>
> Ingo

Weil das meines Wissens nur mit einem kleinen Bootloader funktionieren 
würde, der zum Schreiben angesprungen werden müsste.
Die Aufzeichnung der Ladekurve ist nicht wirklich die Hauptaufgabe des 
µC in der Schaltung, sondern v.A. die Überwachung verschiedener Zustände 
inkl. schneller Reaktion auf Änderungen.

Da möchte ich ihn nicht mit solchen Sachen ärgern, mal ganz abgesehen 
vom Entwicklungsaufwand. Dann doch lieber ein externer Eeprom.

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.