Sterownik LED WS2803
WS3803 to 18-kanałowy sterownik LED od World Semiconductor. Jest to większy brat 3-kanałowego WS2801, który między innymi wykorzystano w programowanych taśmach RGB - taką taśmę diod wykorzystałem swojego czasu do podświetlania Ambilight swojego monitora. Układ ten jest w pewnym sensie odpowiednikiem TLC5940 od Texas Instruments, jednak różni się on w kilku kwestiach, które możemy zaklasyfikować jako zalety.
Spójrzmy na małe porównanie najważniejszych wartości:
TLC5940 | WS2803 | |
Liczba kanałów PWM | 16 | 18 |
Rozdzielczość PWM | 10-bit | 8-bit |
Maksymalna częstotliwość zegara | 30MHz | 25MHz |
Maksymalny prąd wyjścia Vcc = 3.3V | 60mA | 20mA |
Maksymalny prąd wyjścia Vcc = 5V | 120mA | 30mA |
Maksymalne napięcie zasilania LED | 17V | 45V |
Na pierwszy rzut oka TLC5940 wydaje się być lepszym wyborem, jednak wszystko zależy od naszych potrzeb.
W przypadku sterowania diodami LED - 30mA tak naprawdę jest w zupełności wystarczające. Podobnie jest z 8-bitową rozdzielczością PWM. WS2803 ma jednak trzy ogromne zalety. Pierwszą z nich jest większa liczba kanałów, a drugą prostota w sterowaniu przez MCU. Ostatnią zaś - wygodne wyprowadzenia.
Projektując różne urządzenia doskonale wiemy, jakim problemem jest szybko spadająca liczba wolnych I/O. W odróżnieniu od TLC5940, który do działania wymaga pięciu linii I/O, WS2803 wymaga tylko dwóch - CKI i SDI.
Konfiguracja wyprowadzeń WS2803
https://www.jarzebski.pl/datasheets/WS2803.pdf
Jak zatem działa WS2803?
Bajecznie prosto. 8 bitów wartości PWM jest przesuwana w pakietach po 18 bajtów. Pierwszy odebrany bajt wrzucany jest na wyjście "0", drugi na wyjście "1" i tak aż do 18-go bajtu na wyjście "17".
Poszczególne bajty są zatem przesuwane w kolejności MSB do LSB. Po wysłaniu wszystkich 18 bajtów (144 impulsów) następuje zatrzask danych, zwolnienie wyjść oraz uaktywnienie wyjść SDO i SCO do kolejnego układu. Na koniec pozostaje jedynie ustawić linię zegara na stan niski, na czas dłuższy niż 600us resetując stan układu.
Oczywiście w WS2803 można łączyć szeregowo, zwiększając tym samym liczbę wyjść. Według specyfikacji pierwsze 18 bajtów powinna być przechwycona przez pierwszy WS2803, natomiast kolejne 18 bajtów powinny znaleźć się w drugim układzie. Tutaj działa to troszkę inaczej niżeli w przypadku WS2801. Mianowicie, gdy zostanie wysłane 18 bajtów, drugi układ otrzyma 18 bajtów, które były przechowane w pierwszym. Należy zwrócić na to szczególną uwagę projektując rzeczywiste urządzenie.
Dobór rezystora Rref i podłączenie
Aby ustawić wymagany prąd na wyjściach należy dobrać odpowiednią wartość rezystora Rref podłączonego między masę, a "nogę" IREF. Można to wyliczyć z poniższego wzoru:
Rref = 27.5 / Iref
Dla prądu ~20mA otrzymamy wynik 1375 Ω. Oczywiście nie znajdziemy takiego rezystora o takiej wartości, więc wybierzemy najbliższy w górę 1.4 kΩ. Diody podłączamy katodą do wyjścia układu, natomiast anodę na zasilanie. Całość zasilamy napięciem Vcc = 5V. Do CKI i SDI podłączamy natomiast dwa dowolne wyjścia cyfrowe MCU, chyba że decydujemy się na sprzętowe SPI.
Program testowy
- int CKI = 4; // pin CKI
- int SDI = 5; // pin SDI
- #define LEDS 18 // Liczba wyjść
- uint8_t Buffer[LEDS];
- void setup()
- {
- // Ustawiamy CKI, SDI jako wyjścia
- pinMode(CKI, OUTPUT);
- pinMode(SDI, OUTPUT);
- // Inicjalizujemy WS2803 - zegar w stan niski na >=600us
- digitalWrite(CKI, LOW);
- delayMicroseconds(600);
- // Czyścimy bufor i gasimy wyjścia
- for (int Out = 0; Out < LEDS; Out++)
- {
- Buffer[Out] = 0x00;
- }
- Send();
- }
- void Send()
- {
- for (int Out = 0; Out < LEDS; Out++)
- {
- shiftOut(SDI, CKI, MSBFIRST, Buffer[Out]);
- }
- delayMicroseconds(600);
- }
- void loop()
- {
- // Test wyjść
- for (int Out = 0; Out < LEDS; Out++)
- {
- // Zapalamy i gasimy wybraną diodę
- Buffer[Out] = 0xFF; // PWM 100%
- Send();
- delay(500);
- Buffer[Out] = 0x00; // PWM 0%
- Send();
- }
- // Test PWM
- for (int Out = 0; Out < LEDS; Out++)
- {
- // Rpzjaśniamy
- for (int i = 0; i < 256; i++)
- {
- Buffer[Out] = i;
- Send();
- }
- // ... i gasimy
- for (int i = 0; i < 256; i++)
- {
- Buffer[Out] = (uint8_t)0xFF & 255-i;
- Send();
- }
- }
- }
Demo
Do pobrania
Reklama
Komentarze
Drobna poprawka - TLC5940 ma PWM 0-4095 czyli 12bit
Witam gdzie można kupić WS2803 z \'nóżkami\' do płytki stykowej?