WS2812 Ansteuerung

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Die Ansteuerung von WS2812 RGB LEDs mit integriertem Controller

WS2812 Protokoll

Die Ansteuerung der WS2812 erfolgt über eine einzelne Datenleitung mit einem asynchronen seriellen Protokoll. Eine "0" wird dabei über einen kurzen, eine "1" über einen langen High-Puls definiert. Jede LED benötigt 24 Datenbits (G8:R8:B8). Die Daten aller LEDs werden seriell direkt hintereinander übertragen. Wenn die Datenleitung für mehr als 50µs auf "low" gehalten wird ("reset code"), werden die Daten in die PWM-Register der LEDs übernommen.

Die Herstellerangaben für das genaue Timing des Protokolls weichen teilweise zwischen unterschiedlichen Datenblattrevisionen ab. In der Praxis hat sich allerdings gezeigt, dass die Bauteile relativ tolerant gegenüber kleinen Timingfehlern sind. Pausen von mehr als 5 µs zwischen den Datenbits sind zu vermeiden, da diese als Reset interpretiert werden können, was eine gravierende Abweichung von dem im Datenblatt hinterlegten Wert von 50µs ist.

Empfohlenes Timing (Details hier) :

Zeit High Zeit Low
Kodierung "0" 0.35 µs ±150 ns 0.9 µs ±150 ns
Kodierung "1" 0.9 µs ±150 ns 0.35 µs ±150 ns
Reset - >50 µs (ab V4 >280µs)

Die Gesamtdauer eines Bits beträgt 1.25 µs.

Da das WS2812 Protokoll keinen gängigen Standards folgt, wird es nicht durch die übliche Mikrocontroller-Peripherie unterstützt. Das relativ schnelle Timing stellt zusätzliche Herausforderungen dar.

Ansteuerung mit reiner Softwarelösung ("Bitbanging")

Aufgrund der kurzen Pulszeiten muss die Ansteuerung in Software durch taktzyklenoptimierten Code, idealerweise direkt in Assembler, erfolgen. Vorteile einer Bitbanging-Lösung sind kleine Codegröße und gute Kompatibilität zu unterschiedlichen Controllern, da keine spezielle Peripherie erforderlich ist. Ein Nachteil dieser Herangehensweise ist, dass der Code exakt auf die Taktfrequenz der CPU angepasst werden muss. Interrupts sind zu sperren.

Ansteuerung per Software auf AVR

Kombination von WS2812B Ansteuerung mit nur 5us Resetzeit(!) und IRMP. Mittels Assemblerfunktion kann die Datenausgabe auf jedem beliebigen IO-Pin erfolgen, welches dynamisch zur Programmlaufzeit ausgewählt werden kann.

Libraries

Light weight WS2812 Library

Geschrieben in Ansi-C. Unterstützt alle AVR-Cores (XMEGA, classic, tinyavr 4-20 Mhz), sowie ARM (8-60 MHz). Der Code ist extrem klein, so dass er auch auf sehr kleinen Controllern wie ATtiny 10 genutzt werden kann.

Adafruit neopixel Library

Geschrieben in C++. Unterstützt AVR von 8-16 Mhz, sowie ARM.

Ansteuerung unter Nutzung integrierter Peripherie

Neben reinen Softwarelösungen gibt es auch Ansätze in denen Peripherie zur Implementierung des Timings eingesetzt wird. z.B. können auf dem AVR SPI oder PWM verwendet werden um das Timing eines einzelnen Bits abzubilden. Ein Vorteil dieser Lösungen ist, dass sie nicht für jede CPU-Taktfrequenz adaptiert werden müssen. Nachteilig ist allerdings, dass aufgrund des schnellen Bittimings trotzdem die CPU zu 100% ausgelastet wird, sich Codegröße und Komplexität gegenüber der Softwarelösung erhöhen und keine einfache Portierung mehr möglich ist.

Beispiele

Ansteuerung mit fastPWM auf AVR

Geschrieben in Ansi-C. Unterstützt ATtiny 45/85, ATmega 48/88/168/328, ATxmega xA3, xA3U ab 16(?) Mhz.

Die mächtigere Peripherie auf größeren und moderneren Mikrocontrollern, wie DMA und komplexe Timer, erlaubt teilweise die Ansteurung des WS2812 weitestgehend unabhängig von der CPU. In diesem Fall kann die CPU entlastet werden und es ergibt sich ein deutlicher Vorteil gegenüber einer Bitbanging Implementierung.

Ansteuerung mit Timer und DMA auf STM32F4

Geschrieben in Ansi-C. Nutzt Timer und DMA.

Ansteuerung mit SCT und SPI auf LPC800

Geschrieben in Ansi-C. Nutzt den state configurable timer zur Konvertierung des SPI Ausgangs in das WS2812 Protokoll.

Ansteuerung mit MSP430

und DMA

basierend auf 5529 launchpad kit from TI. Braucht DMA Modul und UART

Assembler

MSP430G2553 mit 16 MHz, Interrupts müssen gesperrt sein

Ansteuerung mit PIC12, PIC16, PIC18 und PIC24 mit SPI und Bitbanging

Der PIC12/18 muss mit 32MHz (--> 8MHz SPI) laufen. Beim PIC24 sollte das SPI mit 5.3333MHz (16/3) laufen. Bitbanging Versionen gibt es ab 16MHz.

Für PIC12, PIC16, PIC18 und PIC24 gibt es Code in ASM und C.

Ansteuerung mit PIC16F1509 mit CLC

Vorteil: Nicht 100% CPU Auslastung während des Sendens.

Ansteuerung mit Event System auf AVR ATTiny817

Entkoppelkondensator

Der laut Datenblatt vorgesehene Abblockkondensator von 100 nF ist unbedingt notwendig! Ohne diesen verhalten sich die LEDs fehlerhaft.

Siehe auch

Weblinks