Forum: Mikrocontroller und Digitale Elektronik Fragen zum Datenblatt WS2812B


von Mike (Gast)


Lesenswert?

Threads zu den RGB-LEDs WS2812B gibt es ja hier zuhauf. Allerdings ist 
mir das Datenblatt an einigen Stellen nicht ganz klar bzw. ist es 
widersprüchlich.
https://components101.com/displays/ws2812b-addressable-rgb-led

So sind die Toleranzwerte für die einzelnen High- bzw- Lowphasen der 
bits mit +-150 ns angegeben, die für die Periodendauer TH+TL aber mit 
+-600 ns.

Noch eine Frage: Was ist eigentlich der Ruhepegel, wenn nicht 
kommunziert wird. Ich vermute High, da sonst die Low-Phase des letzten 
Bits nicht abgegrenzt wäre. Im Timing-Diagramm folgt auf das letzte Bit 
aber direkt der Reset-Impuls.  Dieser ist mit >= 50 µs angegeben, gibt 
es da eine Obergrenze?

Ich frage deshalb, weil ich die LEDs über SPI ansteuern will. Ideal wäre 
eine SPI-Frequenz von 3MHz, wobei eine kurze Phase 1 Bit = 333 ns, eine 
lange 3 Bits = 1000 ns entsprechen würde. Allerdings wäre dann bei T1H 
das Timing verletzt. Alternative wäre, das SPI mit 6MHz zu betreiben 
(333ns kurz, 867 ns lang), dann müsste ich aber fast die doppelte 
Datenmenge, nämlich 7 SPI-Bits pro LED-Bit vorhalten.

Letzte Frage: Was sollen eigentlich die Spannungsangaben bei den 
LED-Farben? Wenn ich nur die rote Farbe nutze, kann ich dann das Display 
mit <3V betreiben? Oder sind das die Durchlassspannungen der LEDs? Wenn 
ja, was nützt diese Info dem Anwender?

von Stefan F. (Gast)


Lesenswert?

Mike schrieb:
> Allerdings ist mir das Datenblatt an einigen Stellen nicht ganz klar

nicht nur dir. Das Timing variiert je nach Version des Chips und die 
Angaben sind schwammig.

Ich habe die unterschiedlichen Varianten mal auf einen gemeinsamen 
Nenner gebracht, und dabei auch Messprotokolle von jemandem 
berücksichtigt, der die Grenzen ausgetestet hat.

• Eine 0 überträgt man durch einen kurzen HIGH Impuls mit 250 … 380 ns.
82
• Eine 1 überträgt man durch einen langen HIGH Impuls mit 750 … 1000 ns.
• Mit der nachfolgenden LOW Phase muss jedes Bit insgesamt 1250 … 5000 
ns lang sein.

Nachdem alle LEDs ihre Helligkeitswerte erhalten haben, halte die 
Daten-Leitung für mindestens 280 µs auf LOW. Dann ändert sich die 
Helligkeit aller LEDs auf den vorher festgelegten Wert.

Ich denke, damit bist du auf der sicheren Seite.

von pegelwendler (Gast)


Lesenswert?

Mike schrieb:
> Ich frage deshalb, weil ich die LEDs über SPI ansteuern will.

Dann nimm APA102.

von Stefan F. (Gast)


Lesenswert?

Mike schrieb:
> Was ist eigentlich der Ruhepegel, wenn nicht kommunziert wird.

Low

> Letzte Frage: Was sollen eigentlich die Spannungsangaben bei den
> LED-Farben? Wenn ich nur die rote Farbe nutze, kann ich dann das Display
> mit <3V betreiben? Oder sind das die Durchlassspannungen der LEDs? Wenn
> ja, was nützt diese Info dem Anwender?

Wenig. Die wollen damit wohl nur nur andeuten, dass bei zu geringer 
Versorgungsspannung die LED-Farben nicht alle gleichzeitig ausfallen.

von Falk B. (falk)


Lesenswert?

Mike schrieb:

> Noch eine Frage: Was ist eigentlich der Ruhepegel, wenn nicht
> kommunziert wird.

LOW.

 Ich vermute High, da sonst die Low-Phase des letzten
> Bits nicht abgegrenzt wäre.

Ist in dem Moment egal.

> Im Timing-Diagramm folgt auf das letzte Bit
> aber direkt der Reset-Impuls.  Dieser ist mit >= 50 µs angegeben, gibt
> es da eine Obergrenze?

Viele WS2812B halten das nicht ein, einige vertragen kaum 5 (FÜNF!) us.

> Ich frage deshalb, weil ich die LEDs über SPI ansteuern will. Ideal wäre

Bringt wenig, denn das TIming ist wirklich relativ anspruchsvoll 
bezüglich der Toleranzen. Da kann es die CPU auch gleich selber machen.

https://www.mikrocontroller.net/articles/WS2812_Ansteuerung#Ansteuerung_per_Software_auf_AVR

> Letzte Frage: Was sollen eigentlich die Spannungsangaben bei den
> LED-Farben?

FYI.

> Wenn ich nur die rote Farbe nutze, kann ich dann das Display
> mit <3V betreiben?

Nein.

> Oder sind das die Durchlassspannungen der LEDs?

Ja.

> Wenn
> ja, was nützt diese Info dem Anwender?

Wenig bis nichts.

von Markus M. (adrock)


Lesenswert?

Hi,

ich habe diverse WS2812x und Derivate bisher immer per SPI angesteuert.

Dabei habe ich den Controller (STM32xx) so konfiguriert, dass ich einen 
SPI-Takt von 3 MHz hatte.

Dann ergeben sich als Bitmuster

Low: 100
High: 110

mit

T1L = 0,33µs, T0L = 0,66µs
T1H = 0,66µs, T0H = 0,33µs

Jetzt wo Du es sagst, das Timing für T0L wird tatsächlich verletzt, gut 
dass die LEDs davon nichts wissen ;-)

Funktioniert bei mir mit WS2812 im Dauerbetrieb (Uhr) seit >5J, in 
anderen Projekten mit WS2812b-2020 (Weihnachtsdeko) als auch mit PL9823 
(bedrahteter WS2812x Klon) in einer 20x20 Matrix.

Je nachdem wie Du es programmierst kannst Du die Konvertierung 
"on-the-fly" machen, dann benötigst Du keinen extra Speicher, dafür wird 
die CPU während der Ausgabe der LED-Daten beschäftigt sein.

Alternativ kannst Du mit DMA arbeiten, wenn Du es geschickt 
programmierst (double-buffering) erzeugst Du in einem SPI Buffer die 
neuen Daten während der andere Buffer gerade versendet wird. Dann muss 
der Buffer nur so groß sein, dass Du genug Zeit hast den anderen zu 
füllen während die Übnertragung läuft. Das kann man im Interrupt machen, 
so kann Dein Hauptprogramm immer noch weiter laufen.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Markus M. schrieb:
> Low: 100   (T1L=0,33µs + T0L=0,66µs)
> High: 110  (T1H=0,66µs + T0H=0,33µs)
> Jetzt wo Du es sagst, das Timing für T0L wird tatsächlich verletzt

T1L und T1H passen schon, aber ich denke da gehört noch eine Null hinten 
dran, weil

> Mit der nachfolgenden LOW Phase muss jedes Bit
> insgesamt 1250 … 5000 ns lang sein.

Also:

Low: 1000   (T1L=0,33µs + T0L=0,99µs)
High: 1100  (T1H=0,66µs + T0H=0,66µs)

von Markus M. (adrock)


Lesenswert?

Stefan ⛄ F. schrieb:

> T1L und T1H passen schon, aber ich denke da gehört noch eine Null hinten
> dran, weil
>
>> Mit der nachfolgenden LOW Phase muss jedes Bit
>> insgesamt 1250 … 5000 ns lang sein.

Da habe ich wohl Glück gehabt, mit dem "3-Bit" Betrieb hat es bisher 
immer funktioniert, ich hatte wohl das 800 kbit/s Limit verdrängt.

ABER man sollte das tatsächlich nicht tun, da würde ich Dir Recht geben.

Mit 4 SPI-Bits pro WS2812 Bit käme man dann tatsächlich gut hin, zumal 
dann auch die Umwandlung einfacher ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.