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
Ich weiss nicht welchen AVR du verwendest, aber meiner Meinung nach geht das nur mit dem AC, zumindest Sinnvoll.
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
Man kann als Referenz die Betriebsspannung nehmen und dann die interne Bandgap-Spannung messen. Dazu braucht man nichtmal einen Portpin. ...
Hallo Hannes, das hört sich genial an, Gibt es dazu Beispiele oder Erklärungen (Hard- und Software?)? Viele Grüße, Achim
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. ...
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.
@HanneS Könntest du bitte diese Akku-Statusanzeige mal kurz erklären, ASM ist leider nicht meine Stärke.
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. ...
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.
> 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. ...
@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
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
@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.
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. ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.