Forum: Analoge Elektronik und Schaltungstechnik Batterie unterspannung


von Achim H. (el-achimo)


Lesenswert?

Hallo,
ich suche nach einer Möglichkeit eine Batterie Unterspannung zu
erkennen und darauf zu reagieren. Der "Brown out" Detektor löst, so
wie ich gelesen habe, einen Reset aus und startet den AVR erst wieder,
wenn die Spannung über 2,7V steigt.
Wie muss ich den AVR beschalten und programmieren, wenn ich z.B. bei 3V
eine Aktion auslösen möchte?
Vielen Dank im voraus,
Achim

von Hubert.G (Gast)


Lesenswert?

Ich weiss nicht welchen AVR du verwendest, aber meiner Meinung nach geht
das nur mit dem AC, zumindest Sinnvoll.

von Lupin (Gast)


Lesenswert?

nimm doch den DAC :)

von Lupin (Gast)


Lesenswert?

ADC

von Achim H. (el-achimo)


Lesenswert?

Hallo Hubert,
tschuldigung.. Ich möchte speziell den MEGA8 benutzen.

>(...)  mit dem AC, zumindest (...)
Was meist du mit "AC"?

Ich benutze den Controller als Dimmer für meine kleine LED-Tauchlampe,
und möchte bei einer Spannung von 2,7V-3V eine rote LED einschalten
bzw. die Lampe ein paar mal blinken lassen um das Ende der Leuchtzeit
zu signalisieren.
Viele Grüße,
Achim

von Hannes L. (hannes)


Lesenswert?

Man kann als Referenz die Betriebsspannung nehmen und dann die interne
Bandgap-Spannung messen. Dazu braucht man nichtmal einen Portpin.

...

von Achim H. (el-achimo)


Lesenswert?

Hallo Hannes,
das hört sich genial an, Gibt es dazu Beispiele oder Erklärungen (Hard-
und Software?)?
Viele Grüße,
Achim

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Ich habe da mal vor längerer Zeit mit einem 4x27-LCD und Mega8
"gespielt", da ist eine Akku-Statusanzeige auf dieser Basis drin.

Einige angefangene Funktionalitäten (der ganze Impuls-Mess-Kram) sind
aber nicht zu Ende verfolgt und daher mit Sicherheit fehlerhaft.

Aber die Anzeige des Akkuzustandes funktioniert zuverlässig. Man kann
sie leicht auf Spannungsanzeige umbauen und noch leichter zum Erkennen
eines Schwellwertes.

...

von Hubert.G (Gast)


Lesenswert?

Ich meinte den Analog-Comparator. Wie schon HanneS meinte die
Bandgap-Spannung und die Betriebsspannung vergleichen. Über den
Interrupt der ausgelöst wird kannst du dann deine Aktionen
programmieren. Wie es allerdings ohne Portpin gehen soll ist mir nicht
klar, aber vielleicht kann HanneS das erklären, ist sicher interessant.

von Hubert.G (Gast)


Lesenswert?

@HanneS
Könntest du bitte diese Akku-Statusanzeige mal kurz erklären, ASM ist
leider nicht meine Stärke.

von Hannes L. (hannes)


Lesenswert?

Ich wusste garnicht, dass man ohne ASM-Grundkenntnisse in einer
Hochsprache hardwarenah programmieren kann... ;-) <-- Dickes Smilie!


;Linksbündige Ausgabe, um nur das H-Byte des ADC zu nutzen:
 ldi wl,(1<<adlar)+14       ;linksbündig, Bandgap an
 out admux,wl               ;ADC legen

;ADC mit Vorteiler 64 im Free-Run-Mode aktivieren, also ohne
;ADC-Interrupt:
 ldi wl,(1<<aden)|(1<<adsc)|(1<<adfr)+6 ;ADC freilaufend mit VT 64
 out adcsra,wl              ;einschalten

;die Abfrage erfolgt in der Routine Akkutest, die von der Mainloop
;alle hundertstel Sekunde aufgerufen wird, wenn es die
;Prozessorauslastung erlaubt (niedrigste Priorität):

 sbrc flags,hundertstel     ;neue hundertstel Sekunde da?? nein...
 rjmp akkutest              ;ja...
 sleep                      ;bis zum nächsten Int pennen
 rjmp mainloop

;Routine zum Auslesen des ADC:
akkutest:      ;Akku-Zustand messen (Vergleich Vcc mit V_bandgap)
;Das Flag, das vom Timer-Interrupt alle hundertstel Sekunde gesetzt
;wird, wird jetzt gelöscht:
 cbr flags,1<<hundertstel   ;Flag löschen, Job wird erledigt
;Relevante Werte liegen zwischen 60 und 80 und sind rückwärts (also
;hoher Wert ist leerer Akku), denn es wird mit variabler Referenz
;(Vcc) die stabile interne Bandgap-Spannung gemessen:
 ldi wl,80                  ;Basiswert Akkuladezustand
 in wh,adch                 ;ADC einlesen (60...80)
 sub wl,wh                  ;(0...20)
 mov wh,wl                  ;Kopie (damals kannte ich MUL noch nicht)
 lsl wl                     ;mal
 lsl wl                     ;4,
 add wl,wh                  ;nochmal dazu entspricht mal 5
;Mittelwertermittlung über 256 Messungen. Dazu wird jeweils 1/256
;vom Mittelwert subtrahiert und 1/256 des Neuwertes zum Mittelwert
;addiert. Das 1/256 wird erreicht, indem man mit dem untersten Byte
;arbeitet:
 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...

;Der ermittelte Wert wird dann während des normalen LCD-Refresh
;(jede Sekunde) ausgegeben:
 locate 3,2                 ;Position Akku-Meldung
 printf txtakku             ;Text,
 print8s batt1              ;Wert,
 print 32                   ;Leerzeichen
 print '%'                  ;Prozentzeichen
 print 32                   ;und noch'n Leerzeichen ausgeben

;Dazu gibt's dann auch 'ne Stringkonstante:
txtakku:    .db "Akku-Ladezustand: ",0,0


Für Auswertung der Akkuspannung als Schwellwert ist dieser ganze
Klimbim nicht erforderlich. Man ermittelt einfach den Wert (zwischen 60
und 80), bei dem Alarm ausgelöst werden soll und vergleicht den
eingelesenen ADC-Wert mit dieser Konstante und löst in Abhängigkeit des
Ergebnisses die Aktion aus.


...

von Hubert.G (Gast)


Lesenswert?

Na ja, ASM ist wirklich nicht meine Stärke. Ich wusste nicht wo du VCC
hernimmst um es zu vergleichen ohne einen Pin zu belegen, das du es auf
AREF legst ist natürlich fies ;-). Aber es zeigt das der scheinbar
gerade Weg nicht unbedingt der beste sein muss.

von Hannes L. (hannes)


Lesenswert?

> Na ja, ASM ist wirklich nicht meine Stärke. Ich wusste nicht wo du
> VCC
> hernimmst um es zu vergleichen ohne einen Pin zu belegen, das du es
> auf
> AREF legst ist natürlich fies ;-).

Muss man doch garnicht...
Vcc liegt am AVcc-Pin, was völlig normal ist, ob mit oder ohne
Tiefpass, sei erstmal nebensächlich. Ich lege Vcc zwar auch auf AREF,
könnte das aber auch genausogut intern auf Vcc schalten.

Was ist eigentlich fies daran, eine unveränderliche Spannung
(Bandgap) gegen eine veränderliche Referenz (Vcc, Akku) zu messen?

Klar, die Auflösung ist nicht doll, es sind nur um die 20 Werte, aber
für diesen Zweck hat es gereicht.
Ein Beispiel der Akkuspannungsüberwachung mit Tiny15, bei der die
konventionelle Messmethode angewendet wird, findest du auf
www.hanneslux.de unter AVR, Modellbau, Not-Aus-Modul.

...

von Hubert.G (Gast)


Lesenswert?

@HanneS
Gute Idee das ganze. Es zeigt immer wieder das das Lesen des
Datenblattes nicht umsonst ist. Ich habe diese Art der
Spannungsüberwachung noch nie gebraucht aber ob ich es auf die Schnelle
auch so hingebracht hätte weis ich nicht.
Ich hoffe Achim kann das gleich mal nutzen.

Hubert

von Achim H. (el-achimo)


Lesenswert?

Hallo,
ich habe das Problem, dass ich keine stabilisierte Referenzspannung
habe. Ich benutze zwei AAA Batterien, Die minimale Betriebsspannung des
AVR ist 2,7V; bevor ich diese Grenze erreiche, möchte ich eine
"Notaktion" auslösen (Die Lampe soll blinken). Was spricht gegen eine
Z-Diode, die in Sperrichtung an den AIN0 und die Batterien geschaltet
wird?

AIN0 ---->|----BAT

Viele Grüße,
Achim

von Hubert.G (Gast)


Lesenswert?

@Achim
Die Bandgap-Spannung ist deine stabile Referenzspannung. VCC mit AVCC
verbinden und im ADMUX "AVCC with external capacitor at AREF pin"
einstellen und mit MUX3..0 1,23V. Das Ergebnis ist die Differenz
zwischen VCC und 1,23V Bandgap. Ab einem gewissen Wert den du dir
selbst auswählen kannst setzt du deine gewünschte Aktion.

von Hannes L. (hannes)


Lesenswert?

Messen bedeutet Vergleichen zweier Werte. Welcher von Beiden veränderbar
ist und welcher unverändert, ist doch eigentlich unwichtig.

In deinem Mega8 gibt es eine (sehr stabile) "Bandgap-Referenz"
(Datenblatt Seite 40), die man (statt eines ADC-Pins) auf den Eingang
des ADC legen kann.
Als Referenzspannung für den ADC kann man die Betriebsspannung
auswählen (Standard-Voreinstellung). Da das die Akkuspannung ist, ist
diese veränderlich.

Du misst dann also eine feste Spannung (Bandgap, etwa 1,23V) gegen eine
variable Referenz (Akku, 2,0V..3,0V). Bei 8 Bit Auflösung des ADC
erreichst du dann Grenzwerte von:

105 für 3V (256 / 3.00V * 1,23V)
und
157 für 2V. (256 / 2,00V * 1,23V).

Die Werte sind als Beispiel zu sehen, du musst dann schon mit den von
dir gewünschten Werten rechnen und die Exemplarstreuung der
Bandgap-Referenz beachten.

Diese Messmethode hat den Vorteil, dass sie keinen zusätzlichen
Ruhestrom hat.

Alternativ würdest du ja eine Referenzspannungsquelle an den AREF-Pin
anschließen (braucht Ruhestrom) und einen Spannungsteiler zwischen
Akkuspannung und ADC-Pin (braucht auch Ruhestrom). Batteriebetrieb und
Ruhestrom sind aber nicht unbedingt die besten Freunde... ;-(

Dies sparst du durch Messen der intern (sowiso vorhandenen!) stabilen
Bandgap-Referenz gegen die (sowiso vorhandene!) Betriebsspannung (die
der Akkuspannung entspricht) ein.

"Billiger" wird es nicht gehen.
Ich bin sogar etwas traurig, dass der Tiny15 diese Möglichkeit nicht
bietet, da er den ADC-Eingang nicht auf interne Bandgap-Referenz
schalten kann.

...

von Hannes L. (hannes)


Lesenswert?

Ups...
Ich habe nicht aufmerksam genug gelesen.
Du benutzt ja keine Akkus sondern Primärzellen.
Und du möchtest vor Erreichen der 2,7V eine Aktion auslösen.

Dann ist (256 / 2,75 * 1,23 =) 115 dein Schwellwert, bei dem du
reagieren musst. Der muss allerdings noch an die Exemplarstreuung
angepasst werden.

Ich würde auf alle Fälle die Mittelwertbildung über 256 Messungen
(siehe weiter oben) verwenden, denn die unterdrückt Spikes, wirkt also
wie eine Störunterdrückung und vermeidet damit Fehlauslösungen.

...

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.