1 Volt LED Lampe mit AVR
Winfried Mueller, www.reintechnisch.de, Start: 13.10.2006, Stand: 12.12.2006
Mit nur einer Zelle bis 0.9 Volt hinunter eine weiße LED betreiben, wie kann das gehen? Und dann dazu noch einen AVR-Prozessor...
Die Lösung greift auf einen recht neuen Spezial-IC zurück, der ein paar interessante Eigenschaften hat. Er kommt in einem ultrakleinen SOT-23 Gehäuse daher, hat nur 3 Anschlüsse und braucht außer einer Spule keine weiteren externen Komponenten. Er sorgt dafür, dass aus einer Spannung von 0.9-1.5 Volt eine für weiße Leuchtdioden passende Spannung gemacht wird. Oder genauer: Er versorgt eine weiße Leuchtdiode mit einem Strom von ca. 20 mA.
Der Chip heißt PR4401 und kommt von Prema. Bastler bekommen den z.B. bei http://www.ak-modul-bus.de für ca. 1 Euro das Stück. Dazu kann man dort gleich eine ultrakleine passende Spule für 30 Cent kaufen. Nachtrag 12/07: Den PR4401 gibt es nun auch bei http://www.reichelt.de
Die Schaltung
Grafik lässt sich vergrößern: Klick mit rechter Maustaste, Grafik anzeigen
Für die Spannungswandlung ist, wie oben schon geschrieben, der PR4401 verantwortlich (IC2). Er benötigt L1 mit 10 uH. C1 stabilisiert die Eingangsspannung, weil kurzzeitig höhere Ströme durch den Wandler fließen. Am Ausgang (Pin2 IC2) wird gegen Masse die Leuchtdiode angeschlossen (An Pin 2/Pin 3 von SV1). An SV1 Pin 4 und Pin 1 wird die Eingangsspannung (1.5Volt) angeschlossen, in unserem Fall eine Micro-Batterie (AAA). Die hält etwa für 10-15 Stunden.
Die Schaltung soll aber nicht nur eine LED zum leuchten bringen. Ein Mikroprozessor soll dafür sorgen, dass durch einen Tastendruck die Lampe einschaltet. Ein weiterer Tastendruck und die Lampe soll wieder ausschalten. Und zwar so, dass kein Strom mehr verbraucht wird. Außerdem soll die Lampe nach 3 Minuten selbständig abschalten - ein Feature, was ich mir schon immer für eine Taschenlampe gewünscht habe, weil man das Ausschalten gerne mal vergisst.
Hierfür wird an die Schaltung über SV2 ein Mikroschalter angeschlossen. Der gemeinsame Kontakt an Pin 2, der Schließer an Pin3 und der Öffner an Pin1. Leider braucht es für dieses Schaltungskonzept einen Taster mit Öffner und Schließer, wie es jedoch die meisten Mikroschalter/Schnappschalter haben. Bei einer Eingangsspannung von nur 1 Volt ist mir kein Schaltungskonzept mit nur einem einfachen Taster mehr eingefallen.
Wird dieser Taster betätigt, bekommt R3 ein Massepotenzial, worüber dann Q1 durchschaltet. Im ausgeschalteten Zustand wird er sauber über R1 gesperrt. Wenn Q1 durchschaltet, beginnt der PR4401 (IC2) mit seiner Arbeit und versorgt die Leuchtdiode mit Strom. Gleichzeitig wird über D1/R2 der Tiny12 (IC1) mit Spannung versorgt. Das Programm sorgt dafür, dass PB3 auf High gehalten wird, womit dann über R4 der Transistor Q2 durchgesteuert wird. Damit ist dann die Selbsthaltung realisiert. Der Taster kann losgelassen werden und trotzdem fließt in die Basis von Q1 über Q2 ein Strom. Damit der Prozessor weiß, wann der Taster erneut gedrückt wird, ist der Öffner des Mikrotasters an PB4 geklemmt. Normal wird der Pin darüber auf Masse gehalten. Betätigt man den Taster aber, öffnet sich der Kontakt und PB4 wird über den internen Pullup auf High gezogen. Damit erkennt der Prozessor den Schaltvorgang und kann dann ggf. die Lampe wieder abschalten. Dies geschieht über PB3 auf Low.
D2 ist eine 4.7 Volt Zenerdiode, die im normalen Betriebsfall nicht benötigt wird. Wenn aber die externe LED fehlen sollte, würde die Ausgangsspannung des PR4401 einen recht hohen Wert annehmen. Der Prozessor würde sofort zerstört. Hier begrenzt die Zenerdiode auf etwa 4.7 Volt.
Klar, dass der Prozessor der Leuchtdiode etwas Strom "klaut". Diese bekommt damit nicht die vollen 20 mA. Der Prozessor ist aber so sparsam, dass das kaum ins Gewicht fällt. Wegen des geringen Stromes reicht übrigens auch der "mutig dimensionierte" Tiefpass R2/C2 mit C2 = 100nF völlig aus. Die Stromaufnahme sollte deutlich unter 1 mA sein. Vorteilhaft wirkt sich der Spannungsabfall an D1 und R2 aus. Damit sinkt die Betriebsspannung des Prozessors und damit auch der Stromverbrauch. Es stellt sich am Prozessor eine Spannung von etwa 2.5-3 Volt ein.
Hier noch die Eagle-Dateien: Attach:lamp-1V.zip
Programm
Als Basis für das Programm wurde die Software vom 9V-LED-Lampenprojekt II verwendet. Insofern braucht es dafür keine Erläuterungen mehr.
Wichtig ist, beim Tiny 12 eine BOD-Level von 1.8 Volt einzustellen und die BOD-Überwachung zu aktivieren. Der Takt bleibt mit 1.2 MHz internem Oszillator in der Default-Einstellung.
; 1V-Lampe mit PR4401 nach Idee vom 13.10.2006 ; Interner RC-Oszi, Tiny 12 ; Beginn: 13.10.2006, Stand: 13.10.2006 ; Author: Winfried Mueller, www.reintechnisch.de ; Changelog: ; 13.10.2006 Fork von main.asm Projekt 9V-Lampe ; ; PORTB ; PB0: IN P NC ; PB1: IN P NC ; PB2: IN P NC ; PB3: OUT - On-Transistor ; PB4: IN P Switch (Low aktiv) ; PB5: IN Reset .include "tn12def.inc" ; IO-PINS .equ P_SWITCH = 4 .equ P_ON = 3 ; Register Definition ; General Purpose .def a = r16 .def b = r17 .def c = r18 ; Interrupt .def i_a = r19 .def sSREG = r1 ; sonstig .def key_0_longcount = r4 ;Counter für key_0 LongPressedEvent .def sec_divider = r20 ;Timer-Divider Sekundentakt .def cnt_s = r21 ;Count Sekunden .def cnt_m = r22 ;Count Minuten .def flags = r23 ;General Flag Register .def key_0 = r24 ;Bit 0..2 Prellcount ;Bit 3: Keystatus (0=losgel., 1=gedrückt) ;Bit 4 Event Key OFF (losgelassen) ;Bit 5 Event Key ON (gedrückt) ;Bit 6 Event Key LONG_ON (lange gedrückt) ;(Bit 4/5/6 wird von Applika rückgesetzt ; und von ISR gesetzt) ; Constants .equ TM0_PRESET = 209 ;kalibrieren auf Timereinsprung alle 10ms (256-x) .equ LAMP_OFF_TIME_S = 0 .equ LAMP_OFF_TIME_M = 3 .equ FLAG_SEC = 0 .equ FLAG_MASK_SEC = 0x01 .equ KEY_EVENT_OFF = 4 .equ KEY_EVENT_ON = 5 .equ KEY_EVENT_LONG_ON = 6 .MACRO INIT_IO_ON ldi a, 0b00011111 out PORTB, a ldi a, 0b00001000 out DDRB, a .ENDMACRO .MACRO INIT_IO_OFF ldi a, 0b00010111 out PORTB, a ldi a, 0b00001000 out DDRB, a .ENDMACRO .MACRO INIT_TIMER ldi a, 0b00000100 ;Prescale Timer = 256 -> ca alle 213us out TCCR0, a ldi a, TM0_PRESET ;Timer-Counter Preset out TCNT0, a ; Set Oscillator Calibration default ldi a, 0x60 out OSCCAL, a .ENDMACRO .MACRO RESET_TIME ldi sec_divider, 0 ldi cnt_s, 0 ldi cnt_m, 0 .ENDMACRO .MACRO INIT_INT_ON cli ldi a, 0b00000000 ;kein External/Pin-Change Interrupt out GIMSK, a ldi a, 0b00000010 ;Timer Overflow Interrupt Enable out TIMSK, a sei .ENDMACRO .MACRO INIT_INT_OFF cli .ENDMACRO .MACRO INIT_COMPARATOR cbi ACSR, ACIE ;No Interrupt cbi ACSR, ACD ;Comparator enable sbi ACSR, AINBG ;Internal Reference .ENDMACRO .MACRO INIT_SLEEP ldi a, 0b00100000 ;Idle out MCUCR, a .ENDMACRO .MACRO RESET_KEY ldi key_0, 0 .ENDMACRO .MACRO RESET_KEY_EVENT andi key_0, 0b10001111 .ENDMACRO ;-------------------------------------- ; Interruptvektoren ;-------------------------------------- rjmp RESET rjmp EXT_INT0 rjmp PIN_CHANGE rjmp TIMER0 rjmp EE_RDY rjmp COMPARATOR ;-------------------------------------- ; Interrupt Service Routine ;-------------------------------------- EXT_INT0: reti PIN_CHANGE: reti EE_RDY: reti COMPARATOR: reti TIMER0: in sSREG, SREG ldi i_a, TM0_PRESET ;Timer-Counter Preset out TCNT0, i_a ;--- inc sec_divider cpi sec_divider, 100 brne t0_l1 ; Endwert erreicht ldi sec_divider, 0 sbr flags, FLAG_SEC inc cnt_s cpi cnt_s, 60 brne t0_l2 ; Sekundenüberlauf inc cnt_m ldi cnt_s, 0 t0_l2: t0_l1: t0_kb: ;-- Tastencheck sbrc key_0, 3 ; -> Taste gedrückt gemerkt? rjmp t0_l5 ;-> Taste gemerkt losgelassen, Check, ob gedrückt sbis PINB, P_SWITCH ;+ rjmp t0_l8 ;->gemerkt losgelassen, ist losgelassen ;-> gemerkt losgelassen, ist gedrückt inc key_0 mov i_a, key_0 andi i_a, 0x07 cpi i_a, 0x02 brne t0_l4 ; -> noch kein Wechsel einleiten ;-> gilt jetzt als gedrückt, Event gedrückt andi key_0, 0b11111000 ori key_0, 0b00101000 ldi i_a, 200 ;Init LongKeyPressedCount mov key_0_longcount, i_a rjmp t0_l4 t0_l5: ;-> Taste gemerkt gedrückt, Check, ob losgelassen sbic PINB, P_SWITCH ;+ rjmp t0_l6 ;->gemerkt gedrückt, ist gedrückt inc key_0 mov i_a, key_0 andi i_a, 0x07 cpi i_a, 0x03 brne t0_l4 ; -> noch kein Wechsel einleiten ;-> gilt jetzt als losgelassen, Event losgelassen andi key_0, 0b11110000 ori key_0, 0b00010000 rjmp t0_l4 t0_l6: tst key_0_longcount breq t0_l8 dec key_0_longcount brne t0_l8 ;-> jetzt Null -> KeyLongPressed-Event ori key_0, 0b01000000 t0_l8: ;->Merker und Tastenstatus gleich -> Prellcount Reset andi key_0, 0b11111000 ;Count Reset rjmp t0_l4 t0_l4: ;--- out SREG, sSREG reti RESET: MAIN: INIT_IO_ON RESET_TIME INIT_SLEEP INIT_TIMER INIT_INT_ON INIT_COMPARATOR clr flags ; Check, ob Taster noch gedrückt, wenn nicht, dann war es ein Spike ; und das Gerät soll sofort wieder ausschalten sbis PINB, P_SWITCH ;+ rjmp m_l2 ldi a, 200 rcall WAIT_M ;Warten damit Taste nicht sofort geprüft wird RESET_KEY_EVENT m_l1: sleep cpi cnt_m, LAMP_OFF_TIME_M breq m_l2 sbrc key_0, KEY_EVENT_ON rjmp m_l3 rjmp m_l1 m_l3: ;Taste gedrückt, warte bis losgelassen sleep sbrc key_0, KEY_EVENT_OFF rjmp m_l2 rjmp m_l3 m_l2: ;Zeit abgelaufen/Taste gedrückt INIT_INT_OFF INIT_IO_OFF ;jetzt sollte Prozessor ausschalten ldi a, 255 rcall WAIT_M rjmp RESET ;Reset, falls Fehler ;Zeitschleife ;Übergabe: a - Länge= 10ms * a (a:1..255) WAIT_M: WM_0: ldi b, 0xFF WM_1: lpm lpm lpm lpm lpm lpm lpm lpm lpm lpm lpm lpm lpm lpm wdr wdr dec b brne WM_1 dec a brne WM_0 ret
Praxiserfahrung
Die Schaltung tut seit Mitte Oktober 2006 ihren Dienst als Nachttischlampe, seit Dezember 2006 auch als Taschenlampe. Gut einsetzen kann man sie auch als Lampe zur kurzzeitigen Ausleuchtung von unbeleuchteten Räumen.
Im Sommer 2008 kam eine kleine Holztaschenlampe aus gedämpfter Robinie hinzu, in der ebenfalls obige Schaltung werkelt. Sie wird mit einer Microzelle betrieben.
Tipps
Der PR4401 schafft es auch, 2 LED's in Reihe zu treiben. Allerdings muss dann die Schaltung angepasst werden, um die Versorgung des Prozessors sicherzustellen. Man könnte z.B. den Mittelabgriff zwischen den beiden Leuchtdioden für die Spannungsversorgung des Prozessors verwenden.
Für höhere Ströme als 20 mA ist der PR4401 leider nicht ausgelegt.
Der PR4401 reagiert sehr empfindlich, wenn die Spannung an VIN einbricht. Evtl. muss der Kondensator C1 vergrößert werden. Auf kurze Anschlußdrähte zur Batterie ist zu achten.
Ein Tiny 13 mit 128KHz internem Oszillator betrieben ist noch wesentlich stromsparender (unter 100uA). Das Programm dafür anzupassen, ist leicht.
Den Code so zu erweitern, das der Watchdog mit eingebunden wird, macht Sinn. Im Fehlerfalle setzt er dann den Chip zurück. Für mich war es übrigens ein interessanter Test, den AVR mal absichtlich ohne Watchdog laufen zu lassen, um zu schauen, wie oft so ein Ausnahmefall vorkommt, dass der AVR sich aufgrund elektromagnetischer Einflüsse aufhängt. Vor 15 Jahren hatte ich bei den PICs diesbezüglich ab und zu mal Probleme: Geräte, die im rauhen Alltagseinsatz betrieben wurden, hängten sich 1-2 mal pro Jahr aus unerfindlichen Gründen einfach auf. Und auch hier hatte ich jetzt den Fall: Im Winter 2008 hängte sich meine Holz-Taschenlampe das erste mal auf. Man konnte sie nicht mehr ausschalten. Nach etwa 20 Minuten und unendlichen Schaltversuchen ging sie dann aber doch aus. Es handelte sich um einen der absolut seltenen Fälle - die aber doch irgendwann vorkommen. Ein Watchdog hätte sicherlich geholfen.
Weblinks
- http://www.prema.com - Firma Prema, Hersteller des PR4401
- Prema PR4401-Seite
- http://www.ak-modul-bus.de - Lieferant PR4401 und 10uH SMD-Spule
- Elektor zum PR4401
- Elexs Experimente mit PR4401 (led4)
- Elexs Experimente mti PR4401 (led5)