Bitars banka steg för steg: Arduino kontroll av WS2811, WS2812 och WS2812B RGB lysdioder (4 / 5 steg)
Steg 4: Från binära tal till Digital logik
Disclaimer: det är en liten variant av tidpunkten beskrivs nedan beroende oavsett om du använder en faktisk WS2811 IC, eller den inbäddade versionen inuti WS2812/WS2812B. Numren används nedan motsvarar det senare fallet (WS2812/WS2812B). Om du använder WS2811 IC så rådfråga datablad för den något annorlunda nummer (annat än att allt annat beskrivs nedan är samma).
Principen om drift
WS2811 förväntar sig två saker:
1) en puls (dvs, rektangulär) vinkar signalerar med en frekvens runt 800 KHz — andra frekvenser som fungerar lika bra, men vi kommer hålla oss till 800 KHz i denna tutorial – som sätter intensitetsvärdena i ett inre skiftregister. Låt oss Observera dock att WS2811 beter sig annorlunda än en standard SKIFT register genom att data skiftas i en First-In sista ut mode.
2) när data flyttas på plats, WS2811 förväntar sig en låg signal varar minst 50μs för att spärren data till deras respektive produktion.
Flytta data
De obekanta med termen "pulse wave" kanske har hört talas om dess specialfall: fyrkantsvåg. Dessa typ av icke-sinusformade signaler består av en omväxlande amplitud mellan en bestämd maximigräns och fasta minst en konstant frekvens. När växlingen sker symmetriskt, det vill säga har när den tid under vilken signalen har ett maxvärde är identisk med den tid under vilken signalen har ett minsta värde, sedan vi det speciala fallet av en fyrkantsvåg. Vid cirka 800KHz, varje period av pulse wave är omkring 1.25μs lång (1 / 1.25μs = 800 KHz). För att kommunicera med WS2811 måste vi justera tiden under vilken signalen är antingen hög eller låg för att signalera en 0 eller 1. Det finns ett fel i databladet från WorldSemi, så de verkliga värdena bör (kredit till folken över på Adafruit för att fånga detta):
Sänder en 1:
Tid för signalen att förbli hög (T1H): 0.8μs
Tid för signalen att förbli låg (T1L): 0.45μs
Sänder en 0:
Tid för signalen att förbli hög (T0H): 0.4μs
Tid för signalen att förbli låg (T0L): 0.85μs
Ickesparande data
Efter att skicka alla bitar motsvarar intensitetsvärdena för alla lampor att vi vill styra, så vi behöver helt enkelt hålla värdet av pulse wave till lägsta värde för minst 50μs.
Sänder en "spärr kommando":
Tid för signalen att förbli låg (TL): > = 50μs
Denna typ av signal har särskilda egenskaper för att vara själv klockat, och noll avkastning (NZR). Så är det som återstår att se hur vi kan sätta vår ATMega328p att producera en just tidsinställda signal så att vi kan överföra till mängd WS2812 RGB lysdioder. [Spoiler alert!] Vi kommer att använda den bitbanging tekniken.