SantyagoSantyago
Avatar

Witaj!
Blog archiwalny. Już niebawem nowy serwis!

YouTube RSS Facebook GitHub

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

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

  1. int CKI = 4; // pin CKI
  2. int SDI = 5; // pin SDI
  3. #define LEDS 18 // Liczba wyjść
  4.  
  5. uint8_t Buffer[LEDS];
  6.  
  7. void setup()
  8. {
  9.   // Ustawiamy CKI, SDI jako wyjścia
  10.   pinMode(CKI, OUTPUT);
  11.   pinMode(SDI, OUTPUT);
  12.  
  13.   // Inicjalizujemy WS2803 - zegar w stan niski na >=600us
  14.   digitalWrite(CKI, LOW);
  15.   delayMicroseconds(600);
  16.  
  17.   // Czyścimy bufor i gasimy wyjścia
  18.   for (int Out = 0; Out < LEDS; Out++)
  19.   {
  20.     Buffer[Out] = 0x00;
  21.   }
  22.  
  23.   Send();
  24. }
  25.  
  26. void Send()
  27. {
  28.     for (int Out = 0; Out < LEDS; Out++)
  29.     {
  30.       shiftOut(SDI, CKI, MSBFIRST, Buffer[Out]);
  31.     }
  32.     delayMicroseconds(600);
  33. }
  34.  
  35. void loop()
  36. {
  37.   // Test wyjść
  38.   for (int Out = 0; Out < LEDS; Out++)
  39.   {
  40.     // Zapalamy i gasimy wybraną diodę
  41.     Buffer[Out] = 0xFF; // PWM 100%
  42.     Send();
  43.     delay(500);
  44.     Buffer[Out] = 0x00; // PWM 0%
  45.     Send();
  46.   }
  47.  
  48.   // Test PWM
  49.   for (int Out = 0; Out < LEDS; Out++)
  50.   {
  51.     // Rpzjaśniamy
  52.     for (int i = 0; i < 256; i++)
  53.     {
  54.       Buffer[Out] = i;
  55.       Send();
  56.     }
  57.  
  58.     // ... i gasimy
  59.     for (int i = 0; i < 256; i++)
  60.     {
  61.       Buffer[Out] = (uint8_t)0xFF &amp; 255-i;
  62.       Send();
  63.     }
  64.   }
  65. }

Demo

Do pobrania

https://www.jarzebski.pl/arduino/example04_ws2803.ino

https://www.jarzebski.pl/datasheets/WS2803.pdf

Reklama

Komentarze Komentarze
Avatar 1
Qc Windows 7 / Safari 537.36
09 November 2015 - 10:39 Poznań

Drobna poprawka - TLC5940 ma PWM 0-4095 czyli 12bit

Avatar 1
karol Linux x86_64 / Mozilla Firefox 47.0
11 July 2016 - 14:11 Szczecin

Witam gdzie można kupić WS2803 z \'nóżkami\' do płytki stykowej?