WS2812 Ansteuerung

Wechseln zu: Navigation, Suche

Die Ansteuerung von WS2812 RGB LEDs mit integriertem Controller[Bearbeiten]

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

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")[Bearbeiten]

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.

Libraries[Bearbeiten]

Light weight WS2812 Library[Bearbeiten]

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[Bearbeiten]

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

Ansteuerung unter Nutzung integrierter Peripherie[Bearbeiten]

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[Bearbeiten]

Ansteuerung mit fastPWM auf AVR[Bearbeiten]

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[Bearbeiten]

Geschrieben in Ansi-C. Nutzt Timer und DMA.

Ansteuerung mit SCT und SPI auf LPC800[Bearbeiten]

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

Ansteuerung mit MSP430[Bearbeiten]

und DMA[Bearbeiten]

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

Assembler[Bearbeiten]

MSP430G2553 mit 16 MHz, Interrupts müssen gesperrt sein

Ansteuerung mit PIC12, PIC18 und PIC24 mit SPI[Bearbeiten]

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

Für den PIC12 und 18 gibt es nur Code in ASM, für den PIC24 gibt es einen in ASM und einen in C.

Ansteuerung mit PIC16F1509 mit CLC[Bearbeiten]

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

Beschaltung der LEDs[Bearbeiten]

Der laut Datenblatt vorgesehene Abblockkondensator von 100 nF ist unbedingt notwendig. Ohne diesen verhalten sich die LEDs fehlerhaft (siehe z.B. diesen Beitrag im Forum)