logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATTINY13A - Sterownik LED RGB - prośba o sprawdzenie, ulepszenie

olelek 02 Paź 2013 13:38 5640 7
  • #1 12800703
    olelek
    Poziom 24  
    Witam,

    Opracowałem bardzo prosty sterownik diody LED RGB w obudowie 5050.
    Układ losuje kolor, płynnie przechodzi do niego, wyświetla przez jakiś czas, następnie cykl się powtarza. W celu urozmaicenia układu dodałem diodę led białą, czyli mamy w zasadzie RGBW. Sterowanie odbywa się 4-kanałowym programowym generatorem PWM, z użyciem korekcji jasności.

    Schemat:
    ATTINY13A - Sterownik LED RGB - prośba o sprawdzenie, ulepszenie
    Zaprojektowana płytka PCB:
    ATTINY13A - Sterownik LED RGB - prośba o sprawdzenie, ulepszenie
    Kody źródłowe (napisane i skompilowane w Atmel Studio 6.1):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Fusebity: hFuse: 0xFD; lFuse: 0x7A; (9,6MHz, bez podziału na 8; BOD ustawiony na 1,8V).

    Kod bazuje na:
    -programie MkAVRCalculator jeśli chodzi o korekcję gamma;
    -Generator liczb losowych by miszcz310
    -Software PWM on the ATtiny13

    Kod zajmuje (z włączoną optymalizacją -Os):
    				Program Memory Usage 	:	940 bytes   91,8 % Full
    				Data Memory Usage 		:	15 bytes   23,4 % Full


    Po złożeniu prototypu na płytce stykowej, wygląda że program funkcjonuje poprawnie. Prototyp zasilany jest z USB 5V, docelowo układ będzie zasilany z baterii CR2032 lub akumulatorka (Li-Ion albo 2xNiMH). Procesor ATTINY13A posiadam w tej "szerszej" obudowie SMD.

    Uprzejmie proszę o sprawdzenie schematu, projektu płytki oraz programu pod kątem błędów, optymalizacji oraz ulepszeń.
    Chciałbym jeszcze zaimplementować obsługę przycisku na PortB.3. Przycisk (ew. czujnik drgań na sprężynce) miałby pełnić jakąć dodatkową rolę sterującą, np. zatrzymanie zmian koloru, lub wyłączanie/włączanie lampki. Przycisk będzie wymagał eliminacji drgań styków, chociaż chyba można tu wykorzystać blok kodu, który jest realizowany co ok. 0,5 sekundy. Niestety zostało już bardzo mało wolnej pamięci (84 bajty), głównie przez tablicę korekcji jasności diod.

    W załączniku wsad (hex).
  • #2 12801281
    BlueDraco
    Specjalista - Mikrokontrolery
    Jaka jest częstotliwość przerwań timera? Ile masz stopni jasności? (więcej niż 100 raczej nie zauważysz, a od tej liczby zależy, czy to będzie dobrze działać). Korekcji gamma w tym zastosowaniu nie potrzebujesz, a jedynym jej skutkiem jest zmniejszenie liczby stopni jasności diod w porównaniu z tym, co i tak musi obsłużyć oprogramowanie.

    Pomysł, żeby ni robić wszystkiego w przerwaniu timera nie jest zbyt fortunny. Programowy PWM jest zrobiony źle - przy małych jasnościach będę widoczne skoki jasności i migotanie. Znajdź u Atmela słynną notę aplikacyjną o programowym PWM.

    Zrobiłem kiedyś sterownik RGB na ATtiny13 reagujący na polecenia przesyłane przez RS232. Częstotliwość przerwań wynosiła 38400 Hz, 128 stopni jasności.
  • #3 12801382
    olelek
    Poziom 24  
    Częstotliwość przerwań timera to 37500Hz, okres PWM to ok. 146,48Hz. Stopni PWM 256, ile stopni jasności nie liczyłem. Częstotliwość pracy PWM jest w zasadzie na granicy widoczności, lepiej byłoby faktycznie coś koło 300Hz. Czyli co? skrócić cykl do 128 przerwań?

    Korekcja gamma mam wrażenie że zwiększa szanse na uzyskanie ciemniejszych, oraz bardziej kontrastowych barw. Przez charakterystykę dioda ma "chęć" do świecenia światłem zbliżonym do białego.

    Dlaczego mam robić jak najwięcej w przerwaniu? Przecież występuje ono co 256 cykli zegara, a to na prawdę mało czasu na jakieś funkcje. Chwilowy stan PWM nie wpływa na pracę pętli głównej programu.

    To co? Zmniejszyć rozdzielczość do 7-bit? Będzie szybsze odświeżanie, i zwolni się miejsce we flashu po wywaleniu połowy tabeli korekcji. Tylko jak losować liczbę 7-bitową? Tak?:
    (losuj()&0x7F)
  • #5 12801474
    BlueDraco
    Specjalista - Mikrokontrolery
    Coś takiego to było, dioda czworonożna, a można było to łączyć w łańcuch, prawie jak współczesne chińskie WS2812... ;)

    ATTINY13A - Sterownik LED RGB - prośba o sprawdzenie, ulepszenie ATTINY13A - Sterownik LED RGB - prośba o sprawdzenie, ulepszenie
  • #6 12815299
    olelek
    Poziom 24  
    BlueDraco, jakbyś dał radę opisać więcej swój układ to byłbym wdzięczny, bo bardzo mnie ciekawi, zwłaszcza jak rozwiązałeś programowy UART.

    Ja niestety w swoim układzie nie przemyślałem jednej rzeczy - wydajności prądowej CR2032. Pomiar prądu zwarcia posiadanej bateryjki - 17mA!. Wynika z tego że jakiekolwiek połączenie LED+CR2032 nie ma sensu. Na szczęście projektując płytkę planowałem zasilanie układu z innego źródła, wystarczy więc wywiercić otwór na podłączenie "plusa" bliżej kondensatora odsprzęgającego i odciąć zbędną część PCB. Osiągniemy wtedy wymiary 17x22mm.
  • #7 12815903
    BlueDraco
    Specjalista - Mikrokontrolery
    Przeczytaj opis WS2812B, a odechce Ci się konstruowania takich zabawek samemu. :)

    Przy częstotliwości przerwań 38400 Hz można dość skutecznie obsłużyć UART na 9600. Niestety dokładność oscylatora RC w ATtiny13 jest tak słaba, że w praktyce co 5 płytka nie działała, bo rozjeżdżała się transmisja.

    Wniosek z tego taki, że albo należy przewidzieć w oprogramowaniu synchronizację okresu timera do wzorcowego impulsu, albo transmitować dane po np. 6 bitów zamiast po 8, a potem z tych szóstek składać to, co trzeba. Mi już się nie chciało w to bawić i wersja 1.1 nie powstała. Wersja 1.0 służyła jako światełka choinkowe sterowane z PC. Łączenie płytek w łańcuch następowało metodą prób i błędów, czyli radosnej twórczości amatorskiej.

    Polaryzacja danych UART była odwrócona, dzięki czemu można było podłączyć uC do PC przez rezystor, bez konieczności stosowania MAX232 lub podobnych wynalazków.

    PWM był zrobiony średnio przyzwoicie - bez buforowania stanu portu do następnego przerwania. Niby nie było widać rozbłysków, ale pewnie tylko przez przypadek - to jest do poprawki.

    Załączam kod z roku 2009 z opisanymi wyżej błędami, dla potomnych ;).
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 12820406
    olelek
    Poziom 24  
    Dziękuję za ten opis, niejednemu się przyda.
    Przepraszam, ale nie miałem jeszcze chwili aby poprawić i wgrać nowy soft. Kupiłem natomiast w pobliskim sklepie, gdzie "codziennie niskie ceny", bateryjkę CR2032 firmy Energizer. Prąd zwarcia po otwarciu na poziomie 400mA, a to już coś! Po kilku dniach pracy lampki na akumulatorku Li-Ion z telefonu, wrócił pomysł zasilania z pastylki, i muszę powiedzieć że jest o wiele lepiej. Nie wiem jaki jest średni pobór prądu przez układ, ale obstawiam coś koło 40mA. Wg datasheet bateryjka ma 240mAh, ale przy takim poborze prądu na pewno sporo mniej. Tak czy siak fajnie. Dam znać, gdy poprawię program.
REKLAMA