Forum: Mikrocontroller und Digitale Elektronik Batterieüberwachung mit ADC


von Oliver (Gast)


Lesenswert?

Hallo,
Ich versuche gerade auf einem ATMega32L eine Batterieüberwachung zu
realisieren. Ich versorge die CPU mit 3,6V Lithium und habe eine
externe stabile 2,50V Referenzspannung. Ich habe nun vor, die 3,6V zu
messen und bei Unterschreitung eines bestimmten Levels irgendwie zu
reagieren.
Nun mein Problem: Die 3,6V sind zu hoch, um sie direkt zu messen.
Ich dachte  Ursprünglich, ich könnte das Problem umgehen, indem ich
eine Differenzmessung mache ADC1=negative Spannung (=0V) und
ADC0=positive Spannung (=max.3,6V), aber da habe ich glaub ich falsch
gedacht, oder? Das würde glaub ich nur gehen, wenn man einen Gain von
0,5 einstellen könnte. So wie ich das sehe, muss doch Vin max kleiner
sein als VRef, richtig?
Meine nächste Idee war ein Spannungsteiler, der hat aber wiederum das
Problem, dass er ständig Strom zieht und zusätzlich im worst-case einen
zu großen Fehler produzieren würde. Hat jemand eine andere Idee?
Vielleicht einen verlustlosen Spannungsteiler, oder so ähnlich??
Im Voraus besten Dank für Hilfe und Anregungen!
Oliver

von PeterL (Gast)


Lesenswert?

hallo

spannungsteiler nur während der messung über fet einschalten

peter

von Oliver (Gast)


Lesenswert?

Daran habe ich auch schon gedacht. Ich könnte aber doch auch den
Spannungsteiler statt gegen Masse gegen einen Portpin laufen lassen,
den ich zur Messung auf Ausgang und Low schalte, oder. Habe zwar dann
noch den Eingangsstrom zu berücksichtigen, aber das müsste doch so zu
realisieren sein, oder?
Oliver

von Michael (Gast)


Lesenswert?

ansonsten Differenzmessung von Vref und Vbatterie?!

von Oliver (Gast)


Lesenswert?

Das hört sich gut an! Das versuche ich jetzt mal! Besten Dank.

von Hendi (dg3hda) (Gast)


Lesenswert?

Wie wärs mit nem Resetbaustein, falls es welche für 2,5V gibt ?
Kostet am Controller auch nur nen Digitalen Eingang...

Grüße,
Hendi.

von Dirk M. (avr-nix)


Lesenswert?

@ Oliver: wie hast du deine Referenzschaltung gemacht ?

von Mark S. (struberg)


Angehängte Dateien:

Lesenswert?

Willst du die Batteriespannung nur schätzen oder ganz genau messen?

Wenn du sie nicht exakt brauchst, dann kannst du dir eventuell die
Diodenspannung von ~ 0,7V bei Si zunutze machen. Irgendsowas wie in der
angehängten Schaltung etwa (erste Idee, also noch nicht erprobt).

Der Leerlaufstrom beträgt (wenn der Eingang des µC auf hochohmig
geschalten ist)

(3.6V - (3 x 0,7V ))/1M0 = 1,5µA

Ich glaube das kann durchaus vernachlässigt werden.

Und selbst wenn man auf 'messen' umschaltet und der Eingang ein wenig
niederohmiger werden sollte ändert sich die anliegende Spannung aufgrund
der Diodenkennlinie nur unwesentlich.

Der Wiederstand könnte ev sogar noch ein wenig höher gewählt werden,
das hängt alleine davon ab, ab welchem Flußstrom die Diode in den Knick
kommt und welchen Eingangswiderstand der µC hat. Ev gnügt sogar der
Eingangswiderstand alleine, dann brauchst du den R1 nicht und hast
(fast) gar keinen Ruhestrom.

Nimm dir die Dioden die einbauen willst und probiere mal mit einem 10M0
Poti aus wie die Schaltung mit 2V bis 3,6V Batspannung reagiert.

Wäre fein, wenn du wissen läßt ob das tatsächlich so funktioniert ;)

von Hannes L. (hannes)


Lesenswert?

Also ich habe in einem Projekt mit Mega8 eine Akkuspannungsüberwachung
mit Ausgabe in Prozent auf das LCD. Dazu messe ich die Bandgapspannung
in Relation zur Betriebsspannung
(4 Zellen NiMH). Dies kommt ohne ADC-Eingangspin aus, da die interne
Bandgapspannung gemessen wird und als AREF die Betriebsspannung (ist ja
die Akkuspannung) genutzt wird.


;in der Reset-Routine, Initialisierung der Akkuüberwachung:
 ldi wl,50                  ;Startwert für Mittelwert
 sts batt1,wl               ;Akkuzustand ins SRAM
 sts batt0,null             ;Nachkommastellen löschen
 ldi wl,(1<<adlar)+14       ;linksbündig, Bandgap an
 out admux,wl               ;ADC legen
 ldi wl,(1<<aden)|(1<<adsc)|(1<<adfr)+6 ;ADC freilaufend mit
 out adcsra,wl              ;Vorteiler 64 einschalten


;als Task der Mainloop, alle hundertstel Sekunde:
akkutest:       ;Akku-Zustand messen (Vergleich Vcc mit V_bandgap)
 cbr flags,1<<hundertstel   ;Flag löschen, Job wird erledigt
 ldi wl,80                  ;Basiswert Akkuladezustand
 in wh,adch                 ;ADC einlesen (60...80)
 sub wl,wh                  ;(0...20)
 mov wh,wl                  ;Kopie
 lsl wl                     ;mal
 lsl wl                     ;4,
 add wl,wh                  ;nochmal dazu entspricht mal 5
 lds r0,batt1               ;Mittelwert aus SRAM holen
 lds wh,batt0               ;Nachkommastellen auch
 sub wh,r0                  ;1/256 subtrahieren
 sbc r0,null                ;Übertrag auch
 add wh,wl                  ;Neuwert/256 addieren
 adc r0,null                ;Übertrag auch
 sts batt1,r0               ;zurück
 sts batt0,wh               ;ins SRAM
 rjmp mainloop              ;fertig...

;innerhalb Display-Ausgabe alle Sekunde:
 locate 3,2                 ;Position Akku-Meldung
 printf txtakku             ;Text,
 print8s batt1              ;Wert,
 print 32                   ;Leerzeichen
 print '%'                  ;Prozentzeichen
 print 32                   ;und noch'n Leerzeichen ausgeben
 rjmp mainloop              ;fertig...

txtakku:    .db "Akku-Ladezustand: ",0,0

-----

Das Programm nutzt einige Makros des LCD-Print-Systems:

locate positioniert den Cursor im LCD,
printf schreibt einen String aus dem Flash in das LCD,
print8s sendet ein Byte aus dem SRAM als ASCII-Text an das LCD,
print sendet ein Byte (Konstante) als Zeichen an das LCD

...

von Dirk M. (avr-nix)


Lesenswert?

Könntest du mal den Schaltplan posten, mir ist nicht so klar was du
machen möhtest.

Was misst du genau, um die Akkuspannug zu messen, weil AREF=gleich
Akkuspannung ergibt AREF immer 100%, weil die Messung sich auf AREF
sich bezieht. Und wenn die Akkuspannung fällt auch AREF, die sich immer
auf die Akkuspannung bezieht.

von marcel (Gast)


Lesenswert?

in dem adc ist eine bandgap-referenz eingebaut.
nun stellst du den ADC, dass
Referenz-Spannung(Maximal-Wert) = VCC (Batteriespannung)
und dann misst du die Bandgap-Referenz (ein spezieller Wert bei der
Kanal-Auswahl (meistens der vorletzte)

wennn nun die Batterie-Spannung sinkt - die Referenz-Spannung bleibt
aber gleich - dann steigt auch der gemessene Wert für die
Bandgap-Referenz.

durch die formel (steht auch im datenblatt)

v = vref * wert / max

und vref = vcc

kannst du die spannung ausrechnen (oder einfach einen festen wert
nehmen, ab dem gewarnt wird)

von AxelR. (Gast)


Lesenswert?

nette Idee, fein!

Gruß und Dank

AxelR.

von Hannes L. (hannes)


Lesenswert?

Danke für die Erklärung...

Die Frage nach dem Schaltplan hat sich nun sicherlich erübrigt. Denn es
gibt keinen. Es passiert alles innerhalb des AVRs, es wird kein Portpin
benötigt und es gibt keine externe Beschaltung.

Bit- & Bytebruch...
...HanneS...

von Dirk M. (avr-nix)


Lesenswert?

gute Idee und sparsam zur Brieftasche ;-)

von Hannes L. (hannes)


Lesenswert?

Diese Methode ist aber nicht übermäßig genau (Exemplarstreuungen in der
Bandgapspannung) und die Auflösung ist auch nicht berauschend (bei
4,8V-Akku etwa 20 von 256 Stufen zwischen voll und leer). Um die Werte
etwas zu "beruhigen" (es sind ja sonst nur 5%-Sprünge) habe ich ja
die Mittelwertbildung über 256 Messungen eingebaut. Für Betrieb mit 3
Akkuzellen müsste die Auswerteroutine natürlich den neuen Werten
angepasst werden.

...

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.