Popularny post Gieneq Napisano Sierpień 27, 2021 Popularny post Udostępnij Napisano Sierpień 27, 2021 (edytowany) Sygnał sterujący diody programowalne przypomina sygnał PWM i całkiem łatwo zrealizować go sprzętowo. W tym wpisie chcę przedstawić w jaki sposób można zrealizować układ sterujący składający się z bramek i liczników z serii 74xx. Czym zasilać WS2812B? W odróżnieniu od swojego poprzednika, wariant z końcówką "B" można sterować z niższych napięć. Warto od razu przejrzeć dokumentację, jest bardzo krótka – tylko 5 stron. Napięcie zasilania zawiera się w przedziale 3,5 – 5,3 V. Stany logiczne reprezentowane są następująco: logiczne 1: od 0,7 napięcia zasilania czyli dla zasilania 5 V będzie to 3,5 – 5 V, logiczne 0: do 0,3 napięcia zasilania czyli dla 5 V będzie to 0 – 1,5 V. Mamy więc pewien przedział zabroniony i całkiem szerokie obszary tolerancji stanów wysokiego i niskiego. Realizacja zasilania nie jest skomplikowana. USB micro 5 V, zabezpieczenie przed odwrotnym podłączeniem z MOS P, bezpiecznik polimerowy 500 mA i cała masa kondensatorów przy scalakach i LEDach: Wejścia nieużytków oczywiście podłączone: Jak wygląda protokół komunikacji? Sposób sterowania jest bardzo prosty i tu znowu warto przejrzeć dokumentację albo przeczytać kurs STM32L4 dotyczący tego tematu. Pierwsza informacja to, że diody sterowane są szeregowo asynchronicznie - występuje tylko jedna linia danych i transmisja odbywa się w jedną stronę. Dane są zakodowane w bardzo prosty sposób poprzez zmianę wypełnienia sygnału: Okres sygnału wynosi w idealnym przypadku 1.25 us i zależnie od tego jaki bit chcemy wysłać czas trwania stanu wysokiego wynosi: bit 0: 0.4 us, bit 1: 0.8 us. i ważna informacja – mamy spory rozrzut dopuszczalnych czasów: +- 150 us. Ramka danych składa się z 24 bitów opisujących kolejno składową zieloną, czerwoną i niebieską: Dalej informacja o tym, że sygnał sterujący jest przekazywany przejściowo przez diody, więc aby wysterować każdą diodę potrzeba powtórzyć ramkę danych dla każdej z diod. I na koniec informacja o tym, że aby zakończyć transmisję trzeba odczekać minimum 50 us utrzymując linię w stanie niskim. I tyle Jak więc przekuć to w jakiś układ sprzętowy? Synteza kodera bitów Pierwsza sprawa to wybór częstotliwości taktowania. Okres sygnału to 1,25 us czyli częstotliwość (bitrate) wynosi 800 kHz, ale częstotliwość taktowania musi być wyższa aby zrealizować kodowanie bitów. Tu wymyśliłem pewne uproszczenie. Uznałem że mieszcząc się w tolerancji czasów można przeprowadzić modulację sygnału tylko na 2 bitach. Wybrałem więc za częstotliwość taktowania 4 MHz tak by używając liczników 74HC4040 przełączać najmłodszy bit z okresem 0,25 us. Okres zmniejszył się więc do 1 us ale nie wpłynęło to negatywnie, najgorszy możliwy przypadek to 0,9 us. Generator sygnału jest prostym generatorem Pierce'a, niefortunnie użyłem zwykłej bramki NOT (powinienem użyć bramki Schmitta), ale nie pojawiły się żadne komplikacje. Obok zrealizowałem generator niższej częstotliwości służący do sterowania częstotliwością animacji wtapiania jasności LED: Do realizacji kodowania bitów wykorzystałem układ kombinacyjny: Jest on wynikiem minimalizacji funkcji logicznej do kanonicznej postaci sumacyjnej (czyli docelowo realizowanej na bramkach NAND). Zrealizowałem to wychodząc od tabeli prawdy opisującej powyższy rysunek: 3 pętle minimalizacji w tabeli Karnaugh nachodzą na siebie więc nie powinno być wyścigów, ale i tak były widoczne drobne szpilki przy przejściu ze stanu 01 do 10 co widoczne w bicie 0: Mimo to, ten blok działał bardzo dobrze, diody WS281B2 są naprawdę wdzięcznym tematem Reasumując, ten blok na wejściu przyjmuje stan bitu, a następnie w 4 cyklach zegara jest generowany zmodulowany sygnał wyjściowy, który trafia na bramkę kluczującą z sygnałem PASS wykorzystywanym do wygenerowania minimum 50 us sygnału resetującego (RES). Synteza ramki danych Ramka danych składa się z 24 bitów, można ją więc zrealizować na tym samym liczniku 74HC04040. Wykorzystałem do tego celu kolejne wyjścia: 2, 3, 4 (3 bity, 8 wartości) tak by móc zakodować 1 kanał koloru. Dlaczego tylko jeden? Realizacja 3 kanałów wymagałaby na pewno 3 rejestrów przesuwnych i 3 układów kombinacyjnych co zwiększyłoby liczbę układów przynajmniej o kolejne 8 scalaków. Celem projektu nie była funkcjonalność ale estetyka, gdzie upakowanie i tak było już duże. Wpadłem jednak na pomysł, że umożliwię w prosty sposób wybór kanału koloru. W końcu aby zmienić kolor wystarczy w innym momencie wyzwolić wysyłanie bitów (zawartości rejestru przesuwnego). Tak więc sygnał z kolejnych bitów (5 i 6) przydał się do sterowania innym układem kombinacyjnym. Całość wygląda w ten sposób: Choć wygląda to na spory układ to jest on bardzo prosty i służy do sterowania rejestrem przesuwnym 74HC597, który wymaga podania zbocza sygnału 1 na 0. Jest to detektor wartości 0 dla 5 bitów danych (a w zasadzie 6, bo chciałem uzyskać połowę długości sygnału na wyjściu). Gdyby chcieć napisać tabelę prawdy to sprowadzi się to do wpisania jedynek w miejsce gdzie wszystkie bity mają wartość 0. Przy takim podejściu zrealizowanie wyboru kanału jest bardzo proste - wystarczy umożliwić wyłączenie negacji sygnału zwierając wejście z wyjściem bramki. Domyślnie zworki są otwarte więc aktywna 1 jest dla stanu 00 (kolor niebieski). Niestety nie obyło się bez problemów w pierwszej wersji projektu trafiłem na paskudne szpilki wynikające z oszczędności... Chciałem zmniejszyć liczbę układów scalonych realizując funkcję logiczną z tego co było pod ręką i wkradły się wyścigi: Jedna ze szpilek powodowała, że rejestr przesuwny był ładowany 2 razy przez co uzyskałem 10 bitów danych, objawiało się to świeceniem 2 kolorów jednocześnie. Udało się jednak do tego dojść i teraz całość działa bez problemów Oczywiście ten blok na pewno da się zrealizować dużo lepiej, zworki służyły do upewnienia się, że ta wersja zadziała, ale i tak jest OK. Sterowanie jasnością Wymyśliłem, że prostym sposobem sterowania będzie wtapianie przebiegiem trójkątnym od 0 do 255 i znowu do 0. Dodałem eż możliwość wyłączenia ostatniego bitu, gdyż maksymalna jasność nie zawsze jest potrzebna. Za sterowanie odpowiada ten układ: Na wejście licznika trafia przebieg o mniejszej częstotliwości. Układ liczy od 0 do 255 w 2 cyklach. W pierwszym stan jest przenoszony na 8 wejść rejestru. W drugim cyklu stan jednego z wejść bramek XOR jest zamieniany na przeciwny przez co na rejestr przesuwny trafia sygnał postaci 255 - wartość. Rejestr przesuwny 74HC597 Tu miałem sporą zagwozdkę jak tym się steruje, gdyż rejestr ma 2 warstwy przerzutników - te na wyjściu i te odpowiedzialne za przesuwanie sygnału. Zapis wejść do przerzutników wejściowych odbywa się przy zboczu odpadającym na jednym z wejść sterujących. Pozostało dogłębne studium dokumentacji i przebiegów czasowych układu 74HC597: Zapis do przerzutników wejściowych może odbywać się dość często więc wykorzystałem jeden z sygnałów kodujących bity danych. W sumie mogło to odbywać się w czasie resetu... cóż kolejnym razem Przeniesienie wartości do rejestru i przygotowanie do wysłania na wyjście szeregowe ma odbyć się raz w momencie rozpoczęcia transmisji kanału koloru – służy do tego sygnał, który opisałem wcześniej. Wejście serial load jest podpięte do 0, więc gdy dane zostaną w całości wysłane, to na wyjściu będzie 0, czyli nie trzeba się dalej niczym przejmować. Reset czyli sygnał PASS Gdy zostanie wysłana 1 ramka danych, czyli 2 bity zliczające bajty osiągną wartość 11: następuje reset licznika, ale też inkrementowany jest inny licznik: Dopóki licznik ten nie doliczy do 1000 na wyjściu będzie 1 - umożliwia więc wysłanie 8 ramek danych czyli wysterowanie 8 diod. Następnie zliczane są 3 cykle, gdzie na wyjściu (czyli na wejściu diod) jest logiczne 0 - sygnał reset. Jeżeli 1 bit trwa 1 us to 24 bity * 8 * 3 cykle to 576 us – tyle trwa przerwa. Dużo więcej niż wymagane 50 us i w sumie można było pominąć jeden z bitów i dać reset od Q5, osiągając 192 us, ale coś widocznie przekombinowałem Podsumowanie Realizacja sprzętowego sterowania diod programowalnych jest całkiem prosta. Nie widzę co prawda sensownego sposobu wykorzystania tego we współpracy z mikrokontrolerami, a projekt ma głównie walory estetyczne i edukacyjne. Po czymś takim można zostać specjalistą ds. diod programowalnych W załączeniu schemat w pdf stm32L4_kurs_schemat_v3_final.pdf Edytowano Sierpień 27, 2021 przez Gieneq 9
_LM_ Sierpień 27, 2021 Udostępnij Sierpień 27, 2021 Kawał dobrej roboty! Aż łezka się w oku kręci na widok tej "plątaniny" bramek i liczników. Super! 1
Elvis Sierpień 28, 2021 Udostępnij Sierpień 28, 2021 Super projekt, fajnie zobaczyć że nawet bez mikrokontrolera można sterować diodami WS2812 Chociaż nie jestem pewien, czy to łatwiejsze rozwiązanie. No i chyba pierwszy raz widzę użycie tablic Karnaugh w praktyce... na studiach katowano tą metodą bez opamiętania, ale jak widać czasem może się jednak do czegoś przydać. 2
pmochocki Październik 14, 2021 Udostępnij Październik 14, 2021 Bardzo fajny projekt. Do sterowania WS2812B wybrałbym ATTiny13 , ale wartość edukacyjna tego projektu ogromna. Mała uwaga, jedna literówka: Dnia 27.08.2021 o 21:09, Gieneq napisał: mamy spory rozrzut dopuszczalnych czasów: +- 150 us. chodziło oczywiście o 150ns.
Gieneq Październik 15, 2021 Autor tematu Udostępnij Październik 15, 2021 @pmochocki dziękuję, to jest projekt bardziej edukacyjny, ale pokazuje jak skomplikowane są bardziej rozbudowane układy. Tak zgadza się 150 ns 1
mwwojcik Sierpień 9, 2022 Udostępnij Sierpień 9, 2022 cześć, Łezka w oku się zakręciła jak zobaczyłem coś tak "oldskulowego". Przypomniały mi się czasy projektowania układów cyfrowych i tworzenia rzeczy bez użycia mikrokontrolerów no i podziwiam zacięcie i wiedzę! Czy zastanawiałeś się żeby "zaszyć" logikę w jakimś układzie programowalnym typu GAL, czy chodziło o zupełne podstawy i użycie klasyków? Walory edukacyjne są tutaj oczywiście niezaprzeczalne dodatkowo pokazanie przebiegów na analizatorze czy oscyloskopie robi wrażenie... Pozdrawiam! PS Ja osobiście jednak pozostanę przy użyciu Atmegi do sterowania tymi diodami, choć kusi mnie żeby sprawdzić ten Twój układ kiedyś 1
Ogyb Grudzień 27, 2022 Udostępnij Grudzień 27, 2022 (edytowany) Dnia 14.10.2021 o 15:44, pmochocki napisał: Bardzo fajny projekt. Do sterowania WS2812B wybrałbym ATTiny13 Akurat tiny 13 jest przestarzały, drogi itd. Nowsze tiny potrafią na CCL ws2812 wysterowac w większości, a do tego są tańsze o wiele. Ogolnie 13 aktualnie to tylko do projektów w których jest od dawna. Nigdy do nowych;) Przykładowo tiny414 - o wiele większe możliwości, dużo nizsza cena. Edytowano Grudzień 27, 2022 przez Ogyb 1
pmochocki Grudzień 27, 2022 Udostępnij Grudzień 27, 2022 2 godziny temu, Ogyb napisał: Akurat tiny 13 jest przestarzały, drogi itd. Nowsze tiny potrafią na CCL ws2812 wysterowac w większości, a do tego są tańsze o wiele. Ogolnie 13 aktualnie to tylko do projektów w których jest od dawna. Nigdy do nowych;) Przykładowo tiny414 - o wiele większe możliwości, dużo nizsza cena. Jak najbardziej się zgadzam. W 2022 też poznałem nowe ATTiny i pisałem o nich tu na forum. Człowiek cały czas się uczy... 1
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »