Wstęp/założenia
Przedstawiam sterownik jasności diod LED przy pomocy PWM 14bit, max 6 niezależnych linii, 3 różne źródła sterowania jasnością. Układ został uruchomiony w dwóch wersjach: Attiny13 (2kanały) oraz Atmega48 (6kanałów), dodatkowo w kodzie obsłużyłem Attiny24 (4kanały) jednak nie przetestowałem praktycznie.
Uruchomione przeze mnie wersje służą mi:
a) Attiny13 zrobiony na pająku - oświetlenie diodowe łazienki
b) Atmega48 zrobiony na płytce uniwersalnej - oświetlenie diodowe akwarium
Opis konstrukcji
Część elektryczna jest banalna, co widać na załączonym schemacie. Dlatego też nie chciało mi się bawić w dedykowane płytki.
Jeśli chodzi o oprogramowanie to:
1. Na wejściu mamy wartości jasności LedValue(1bajt), które po podniesieniu do kwadratu ostatecznie przerabiane są na PWM podobny do 14-bitowego. Timery pracują jako 8-bit PWM, programowo zwiększana jest rozdzielczość PWM do 14-bit. Częstotliwość wyjściowa jest zmienna i rosnąca wraz z jasnością. Dla 8MHz Atmega48 wynosi (LedValue:f):
1:61Hz 2:122Hz 3-4:244Hz ... 15:3,9kHz
Jak widać problematyczna jest tylko częstotliwość przy najsłabszym świeceniu, jednak diody wtedy ledwo widocznie świecą, więc nie stanowi to problemu.
2. Zmiana jasności następuje płynnie, z prędkością ustaloną podczas kompilacji (plik LED.inc, stała DELAY_05HTHSEC). Interwał jest mnożnikiem 1/200sec, czyli minimum można ustawić 1,28sec na całkowite rozjaśnienie. Można też zrezygnować z płynnego zmieniania poprzez ustawienie wartości stałej na 0.
2. Jasność możemy zmieniać na 3 sposoby:
a) za pomocą przełącznika bistabilnego on/off
b) za pomocą guziczków monostabilnych
c) za pomocą linii szeregowej (nie UART!)
ad 2.b) W programie mamy definiowane (w załączniku: 4) poziomy zapamiętanej jasności. Klikanie guziczka zmienia 0->1->2->3->0. Zrobienie przerwy dłuższej niż 4-5sec między kliknięciami spowoduje, że kolejne kliknięcie da przejście do poziomu 0, czyli: 0->1(6sec przerwy)->0.
Przytrzymanie guziczka wciśniętego ponad 2sec spowoduje mrugnięcie diod oraz wejście do trybu zmiany wartości bieżącego poziomu jasności. Po ustawieniu odpowiedniej jasności guziczkami up/down kliknięcie guziczkiem dowolnej linii spowoduje wyjście z trybu zmiany, mrugnięcie diod oraz zapisanie zmiany do EEPROM.
ad 2.c) Interfejs jest niestandardowy, gdyż Attiny nie ma UART. Zasada transmisji łatwa do rozpoznania w kodzie, tam dodatkowo umieściłem w komentarzu procedury dla nadajnika. Od strony logicznej programu odbiór wartości przez RS nie powoduje zmian zdefiniowanych jasności poziomów 0-3, natomiast kolejne kliknięcie guziczka powoduje przejście w poziom jasności 0.
Opis załączników
W załączniku program, dwa pliki z konfiguracją, dwa pliki Makefile, oraz opis co zmienić w fusebits.
Podsumowanie
Urządzenie sprawuje się w obu wersjach bezawaryjnie, jedyne co można zarzucić to fakt, że poprzez dotykanie palcami nóżek łatwo doprowadzić do resetu. Jednak nie dotykam, więc nie resetuję
Przybliżony kosztorys (z pamięci):
Attiny13: 3zł/szt
Atmega48: 8zł/szt
IRLZ34: 2zł/szt
Mikroprzełącznik: 50gr/szt
Rezystory, przewody, styki -> posiadałem
Czyli:
wersja Attiny+2xIRLZ34 około 9zł
wersja Atmega+6xIRLZ34 około 24zł
Schemat
Inne zdjęcia
Fajne? Ranking DIY