Mikroprocesorowy sterownik latarki LED - Sterownik Flagiusza™ wersja 1 (4,5V)


Tym razem przedstawiam jeden z kolejnych swoich mini-projektów, także dotyczący tematyki ściśle związanej z latarkami, choć nieco bardziej zaawansowany od poprzednich.
Celem projektu było skonstruowanie inteligentego sterownika do latarki, zawierającego szereg użytecznych funkcji dostępnych jedynie w latarkach z "najwyższej półki".
Sercem układu jest 8-bitowy mikroprocesor jednoukładowy typu RISC ATTiny13v firmy Atmel, który do tego celu został przeze mnie* specjalnie zaprogramowany.

Schemat ideowy wraz z blokami funkcjonalnymi mikrokontrolera
Układ powstał w 2 wersjach: w prostszej bez pomiaru prądu diody LED (gdzie możliwy jest direct drive) oraz z jego stabilizacją.

Funkcje sterownika / cechy układu

Kontrola i stabilizacja prądu diody LED

zrealizowna została przy użyciu przetwornika analogowo-cyfrowego (ADC) stanowiącego jeden z bloków kontrolera.
Na wejście Fb (PB.3) podawany jest analogowy sygnał napięciowy z rezystora pomiaru prądu, czyli spadek napięcia na Rfb.
Aby zminimalizować straty na tym rezystorze ograniczono do minimum napięcie wymagane do stabilnej pracy układu.
Przetwornik używa wewnętrznego napięcia referencyjnego (1V), a przetwarznie odbywa się z częstotliwością 10kHz (synchronicznie względem PWM).
Zakres pracy napięć URfb leży w następujących przedziałach: Czyli przykładowo dla diody LED 1W, której max. prąd wynosi 300 mA, spadek napięcia na Rfb przy pełnej jasności wynosić będzie 0,5V a zatem wartość Rfb = 0,5/0,3 = 1,7 Ω.

Rodzaj diody LED20mA30mA100mA0,5W1W3W
Wartość Rfb (E12)24 Ω18 Ω4,7 Ω3,3 Ω1,6 Ω0,47 Ω

Przetwornik ADC posiada 4-kanałowy multiplekser. Może więc on służyć dodatkowo do pomiaru napięcia baterii (jest to opcja opisana poniżej).

Sterownik PWM

w połączeniu z układem L, Ds daje nam klasyczną implementację przetwornicy step-down, której cechą charakterystyczną jest obniżanie napięcia/prądu z zachowaniem dużej sprawności (co w urządzeniach bateryjnych odgrywa ważną bardzo rolę).
Implementacja PWM zrealizowana jest programowo na bazie wewnętrznego Timer`a pracującego z częstotliwością 10kHz.
Procedura pomiaru prądu i sterowania kluczem obsługiwana jest na przerwaniu, co w zastosowanym rozwiązaniu daje wysoką gwarancję czasu przełączania (PWM) jak i brak ryzyka niekontrolowanego pozostawienia klucza w trybie włączonym. Duty cycle PWM regulowane jest w pełnym zakresie od 0 do 100%.
Połączenie logiczne części ADC i PWM oprócz energooszczędnego sterowania i stabilizacji prądu (jasności) daje nam jeszcze jedną cenną rzecz - informację o niskim poziomie stanu baterii, o czym za chwilę.

Sterowanie latarką

odbywa się za pomocą tylko jednego astabilnego przycisku (micro switch). Nie jest więc konieczne posiadanie dodatkowych wyłączników bistabilnych (on/off) odcinających zasilanie. Rozwiązanie proste, a za razem bardzo funkcjonalne.
Algorytm obsługi przycisku posiada zabezpieczenie przed odbiciami styków (czas ciągłego przyciśnięcia przycisku min. 50ms).

Tryby pracy

Kontroler ten ma zaprogramowane wiele trybów pracy, które zmienia się krótkim przyciśnięciem przycisku (<1s).
Tryby te podzielone zostały na dwie grupy.
Przełączanie się między grupami odbywa się poprzez podwójne szybkie przyciśnięcie (tzw. dwuklik).

Ilustracja działania trybów pracy
Wszystkie tryby z Grupy 2 pracują z maksymalną jasnością.
W każdym z trybów pracy (także w impulsowych) działa mechanizm pomiaru i stabilizacji prądu diody LED, co w praktyce oznacza, że zachowana będzie stała w czasie, zawsze taka sama jasność niezależnie od napięcia baterii.

Pamięć ustawień

Kontroler zapamiętuje używany ostatnio tryb pracy i po ponownym włączeniu latarki jest on automatycznie ustawiany.
Po resecie procesora lub fizycznym wyłączeniu zasilania (np. wymiana baterii) kontroler inicjalnie ustawia trzeci tryb pracy z grupy pierwszej (światło ciągłe o 75% jasności) i przechodzi do stanu uśpienia (power-down).

Kontrola i sygnalizacja stanu rozładowania baterii

Sterownik posiada mechanizmy automatycznie wykrywające niski poziom zasilania.
Nie robi jednak tego w sposób konwencjonalny, czyli mierząc napięcie zasilania np. poprzez dzielnik, choć oczywiście ma taką możliwość.
Przetwornik ADC posiada analogowy 4-ro kanałowy multiplekser, więc mógłby od czasu do czasu przełączyć się i sprawdzić stan zasilania.
Problemem może być ów dzielnik, który musiałby być rozpięty między plusem zasilania, a masą. A to oznacza, że nie podlegałby wyłączaniu przez procesor i pobierał non-stop prąd.
Opcjonalnie mógłby on być umieszczony tuż za emiterem klucza i odczytywany w jego włączonych cyklach, choć nie byłby to pomiar dokładny z co najmniej dwóch powodów: do mierzonego napięcia liczony byłby także spadek na przewodzącym tranzystorze oraz czas owarcia tranzystora mógłby być zbyt krótki do wykonania pomiaru.

Rozwiązanie detekcji rozładowania baterii zostało zaimplementowane w nieco inny sposób.
Zasada działania jest prosta, a cały pomysł polega na zliczaniu kolejnych cykli z włączonym kluczem.
Jeżeli ich wartość liczona w czasie przekroczy pewną ustaloną granicę (np. 3 sek.), to oznacza, że urządzenie nie jest w stanie dostarczać wystarczającej ilości energii do diody LED. W tej sytuacji URfb jest poniżej progu odcięcia i klucz Q jest permanentnie włączony.
Informacja ta pozwala podjąć stosowne kroki np. poinformować użytkownika o wyczerpaniu baterii, co w przyjętym rozwiązaniu jest sygnalizowane przez dwa 0,5s mignięcia o jasności o 50% mniejszej względem obecnej powtarzanych co 1 minutę lub przełączyć sterownik w tryb pracy z niższą jasnością.
Po 5-ciu minutach pracy na najniższym trybie (najmniejsza jasność) przy sygnalizowanym niskim stanie baterii latarka automatycznie się wyłącza.
Ponowne jej włączenie zeruje licznik i dalszy proces przebiega analogicznie.

Rozwiązanie to w stosunku do podejścia "konwencjonalnego" ma jedną wadę - nie można (lub jest to dość trudne) wyłączyć sterownika po zejściu napięcia poniżej z góry ustawionej wartości.
Zabezpieczenie takie ma np. na celu zapobieganie głębokiemu rozładowaniu akumulatorów, co w przypadku NiMH może być dla nich istotne.

Szeroki zakres zasilania

Dopuszczalne napięcie zasilania procesora mieści się w granicach od 1,8V do 5,5V.
Ale to nie tylko zasilanie procesora decyduje z jakiego napięcia powinna być zasilana latarka.
Ponieważ układ ten jest konwerterem typu step-down, jego zasilanie musi być większe niż maksymalne napięcie na diodzie LED powiększone o spadek napięcia na Rfb. Spadek na pracującej diodzie LED to ok. 3,5V, a URfb max. to 0,5V. Zatem w takich warunkach latarka powinna być zasilana napięciem od 4,1 do 5,5V - czyli z 3 ogniw 1,5 (4,5V) lub 4 NiCd/NiMH (4,8).

Niskie zużycie energii

w przypadku urządzeń zasilanych bateryjnie jest szczególnie istotne.
Dlatego też zdecydowałem się na sterowanie impulsowe z modulacją szerokości impulsu (PWM), któro ogranicza straty na kluczu (tranzystorze Q) oraz odzyskiwanie prądu na układzie L, D, C (w klasycznej konfiguracji konwertera step-down typu Buck)
Dodatkowo zminimalizowałem straty energii na rezystorze Rfs służącym do pomiaru prądu diody (stabilizacja) do zaledwie 500mV.

Podobnie i podczas programowania procesora położono szczególny nacisk na optymalne wykonywanie kodu, a w szczególności na unikanie pustych przebiegów procesora.
Wszystkie asynchroniczne triggerowane funkcjonalności zdarzeniowe zrealizowane zostały na bazie przerwań (timer, obsługa portów wejściowych) pomiędzy którymi procesor wprowadzany jest w stan płytkiego uśpienia (idle).
Dzięki temu procesor w czasie pracy pobiera poniżej 1 mA @ 4,5V.

Podobnie podczas logicznego wyłączania procesora (a więc i całej latarki) ustawiany jest on w tryb power-down.
Procesor pobiera wówczas prąd poniżej 1 uA (mikro Ampera), czyli praktycznie niezauważalny.
Jedynym aktywnym blokiem jest port wejściowy PB.1 obsługujący przycisk.
Zmiana jego stanu (a dokładniej sam niski stan, bo w trybie power-down zatrzymany jest zegar I/O i nie ma detekcji zboczy) generowane jest przerwanie zewnętrzne INT0, które budzi procesor odtwarzając jego kontekst i aktywując zatrzymane na czas uśpienia bloki.

Jako ciekawostkę podam, że w procesorze tym po wejściu w stan power-down dalej pracuje blok wewnętrznego napięcia referencyjnego dla przetwornika ADC. W takiej sytuacji procesor pobierał dalej kilkaset mikroamperów więcej niż powinien. Dopiero wyłączenie przetwornika ADC (ADCEN=0) lub samego napięcia referencyjnego tuż przed wejściem w tryb uśpienia spowodowało, że procesor "usnął" naprawdę.

Duża dowolność stosowanych diod LED

została zagwarantowana dzięki prostej i powszechnie stosowanej metodzie pomiaru prądu jako spadku napięcia na włączonym szeregowo rezystorze.
Nie ma więc konieczności przeprogramywania układu do pracy z różnymi typami diod, a prąd ich pracy określa wyłącznie wartość rezystancji Rfb.

Małe rozmiary

są często jednym z kluczowych czynników dających szansę powodzenia przeróbki posiadanej latarki.
Zarówno procesor, który w wersji SMD zajmuje powierzchnię 3x3mm jak i mała liczba elementów zewnętrznych dają się upchnąć na powierzchni ok. 1,5 cm2.

Możliwość upgrade`owania firmware`u

dzięki protokołowi ISP i odpowiedniemu przypisaniu funkcji do portów jest możliwa bez konieczości wyjmowania/wylutowywania procesora z docelowego układu.
Cecha ta jest niezwykle przydatna szczególnie w procesie tworzenia i testowania układu, ale przydaje się także do jego późniejszego rozwijania.

Niski koszt

to nie tylko optymalne i oszczędne zużywanie energii, ale i cena zastosowanych w tym projekcie komponentów.

Mikroprocesor

W projekcie wykorzystałem mikroprocesor jednoukładowy ATTiny13v firmy Atmel.
Procesor ten należy do rodziny mikrokontrolerów AVR i ma wszystko co mi potrzeba: A do tego bez większego problemu można go kupić w bardzo przyzwoitej cenie (3,50 - 5,00 PLN).

Środowisko IDE

Kod programu mikrokontrolera powstał w asemblerze w programie AVR Studio 4 dostępnym za darmo na stronie producenta procesorów.
W obecnej wersji po kompilacji zajmuje on nieco ponad 360 bajtów, co stanowi 36% zajętości pamięci Flash.

Programowanie

Do programowania procesora wykorzystałem interfejs ISP (In System Programming) umożliwiający upgrade firmware`u bezpośrednio w układzie docelowym (nie ma konieczności wyjmowania procesora).

Programator pracujący na porcie równoległym LPT komputera wykonałem zgodnie z schematem STK200 ISP dongle.
Jak sama nazwa wskazuje jest on zgodny z popularnym standardem STK/200, który obsługuje wiele narzędzi do programowania.
Sporo innych schematów programatorów znajdziesz na stronie ELM - Simple AVR Programmers z której to pochodzi także wykonany przeze mnie programator.

Oprogramowanie obsługujące interfejs STK/200 jest bardzo popularne.
Ja do programowania używałem PonyProg`a.

Jestem pomysłodawcą i autorem przedstawionego tu rozwiązania oraz kodu mikrokontrolera, do których zastrzegam sobie prawa autorskie.
Publikowanie tego artykułu w całości lub części możliwe jest wyłącznie w celach edukacyjnych przy zachowaniu pełnej informacji o autorze Flagiusz oraz ze wskazaniem źródła w postaci odnośnika do niniejszej strony internetowej.
Wykorzystywanie opisów, ich fragmentów, zdjęć, diagramów oraz pomysłów autorskich w celach komercyjnych wymaga zgody autora