Mikroprocesorowy sterownik latarki - 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 (przetwarzanie ADC)
- sterowanie oparte na kluczowaniu PWM (step-down)
- pełne sterowanie jednym przyciskiem (micro switch astabilny)
- wiele trybów pracy (różne jasności, stroboskop, sekwencje kodowe)
- pamiętanie ustawień (ostatnio używanego trybu pracy)
- sygnalizacja rozładowania baterii
- szeroki zakres zasilania (1,8V - 5,5V)
- bardzo niskie zużycie energii (1mA w czasie pracy /bez liczenie prądu diody LED/ i <1uA w trybie power-down)
- duża dowolność stosowanych diod LED (prąd od pojedynczych mA do A)
- małe rozmiary i minimalna liczba elementów zewnętrznych
- możliwość upgrade`owania firmware`u (ISP)
- niski koszt
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:
- 100% jasności - 0,5 V
- 75% jasności - 325 mV
- 50% jasności - 250 mV
- 10% jasności - 50 mV
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 LED | 20mA | 30mA | 100mA | 0,5W | 1W | 3W |
| 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.
- Pojedyncze krótkie przyciśnięcie zmienia tryb pracy na kolejny
- Podwójne krótkie przyciśnięcie zmienia grupę (światło ciągłe / sekwencje)
- Dłuższe przyciśnięcie (>1s) wyłącza latarkę
- Ponowne uruchomienie latarki następuje po kolejnym przyciśnięciu przycisku.
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
- Grupa 1 - światło ciągłe
- światło ciągłe o maksymalnym natężeniu [»]
- światło ciągłe o 75% natężeniu [»]
- światło ciągłe o 50% natężeniu [»]
- światło ciągłe o 10% natężeniu [»]
- Grupa 2 - sekwencje błysków
- błyski o czasie trwania 50ms i okresie 1s [»]
- sekwencje 4 szybkich 50ms błysków w czasie 0,5s z 0,5s przerwą (tzw. tryb emergency) [»]
- funkcja stroboskopowa o częstotliwości 10 Hz [»]
- sekwencje błysków 1Hz z 50% współczynnikiem wypełnienia [»]
- sekwencja S.O.S. [»]
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.
- koszt procesora ATtiny13v to kilka PLN (3,90 - 5,00).
- reszta elementów elektronicznych (R,L,C,Q) to pojedyncze złotówki.
- dioda LED, w zależności od mocy i producenta, to wydatek rzędu kilku do kilkudziesięciu PLN.
- obudowa może być wykonana samemu lub przerobiona ze zwykłej "fabrycznej" np. żarówkowej latarki - kilka/kilkanaście PLN.
- opcjonalnie kolimator do LED`a - kilka PLN.
- + ok. 20h na napisanie i przetestowanie programu
- + ok. 6h na przygotowanie i polutowanie płytki
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:
- interfejs ISP (możliwość programowania w systemie)
- 1kB pamięci programu - Flash (obecnie zajęte przez kod ok.60%)
- uniwersalne porty I/O (z obsługą przerwań)
- timer (z obsługą przerwań)
- przetwornik ADC (z obsługą przerwań)
- mechanizmy zarządzania energią (używane tryby idle oraz power-down)
- małe rozmiary (DIP-8/SOT-8)
- bardzo mały pobór prądu (ok. 1mA podczas pracy i <1uA w trybie power-down)
- mechanizm Watch-Dog zabezpieczający przed zawieszeniem się procesora (ważne przy sterowaniu PWM)
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 jego części bez zgody autora jest zabronione.