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