Forum: Mikrocontroller und Digitale Elektronik WS2812b über STM32 flackert ohne Logic Analyzer


von Thomas G. (thomasguenzel)


Lesenswert?

Hallo,

ich habe ein STM32F746NG-Discovery Board und versuche darüber, WS2812b 
LED Stripes anzusteuern. An sich funktioniert das auch schon ziemlich 
gut, nur alle paar Wiederholungen flackern die LEDs (sieht fast so aus, 
als würden sie die ersten paar bits überspringen/ignorieren). Wenn ich 
jetzt meinen Saleae Logic Analyzer anschließe, geht alles wunderbar (nur 
so alle paar Minuten ein flackern).

Der Pin vom STM32 ist folgendermaßen konfiguriert und wird über DMA 
angesteuert:
1
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
2
GPIO_InitStruct.Pull = GPIO_PULLUP;
3
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

Meine Vermutung war, dass vielleicht ein Widerstand fehlt (oft steht 
online man soll einen 300-500 Ohm Widerstand nehmen) aber auch mit 
Widerstand flackert es noch ziemlich stark.

Meine Frage ist nun: Was mache ich falsch bzw. was beachte ich nicht?

Ich bin noch absolut unerfahren was Elektrotechnik betrifft und vermute 
daher, das es irgendein banaler Anfängerfehler ist.

Über Hilfe wäre ich sehr dankbar,
Thomas

von Thomas E. (picalic)


Lesenswert?

Vermutlich liegt das Problem am zu kleinen High-Pegel am Eingang der 
WS2812. Der soll mindestens 0,7*VDD betragen, bei 5V also min. 3,5V - 
das kann der STM32 mit seiner 3,3V Betriebsspannung nicht liefern. Du 
brauchst also einen Pegelwandler.

von Nils Z. (nils_z)


Lesenswert?

Schau mal hier: Beitrag "WS2812B mit 3.3V ansteuern" bzw. ins 
Datenblatt zu "Input voltage level".

von Thomas G. (thomasguenzel)


Lesenswert?

Ich habe einen SN75176B um das Signal über XLR zu schicken, ich bin mir 
zwar nicht sicher, aber dachte der wandelt das korrekt auf 5V um?

Das komische finde ich eben, das es ziemlich gut funktioniert, wenn der 
Logic Analyzer angeschlossen ist, aber sonst nicht...

von Thomas E. (picalic)


Lesenswert?

Thomas G. schrieb:
> Ich habe einen SN75176B um das Signal über XLR zu schicken, ich bin mir
> zwar nicht sicher, aber dachte der wandelt das korrekt auf 5V um?

Aha. Hättest Du gleich schreiben sollen. Also dann mal her mit dem 
kompletten Schaltplan (zumindest dem Teil zwischen STM32 und WS2812) und 
Details zum Aufbau (welches Kabel, wie lang, welche Spannungsversorgung 
usw...)

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Hast du vielleicht eine GND Verbindung vergessen?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thomas G. schrieb:
> nur alle paar Wiederholungen flackern die LEDs

Das liegt meist an zu niedrigem Pegel oder falschem Timing. Oft ist es 
so, dass die Versorgungsspannung der LEDs knapp über 5V liegt, z.B. bei 
5.1V. Geht man runter auf 4.9 Volt, ist meist das Problem weg, was aber 
prinzipiell keine Lösung ist.

Grund:

Der Output-High-Pegel eines STM32 liegt ziemlich genau bei der 
Umschaltschwelle der WS2812.

Am besten nimmt man einen 1,8k Widerstand als Pullup an DIN der ersten 
LED und schaltet den STM32 auf OpenDrain. Dann hast Du einen simplen, 
aber effektiven Pegelwandler.

Im Projekt WordClock mit WS2812 wird sogar geprüft, ob ein Pullup 
vorhanden ist, nämlich so:
1
1. Schalte Pin auf Input mit internem Pulldown
2
2. Ist der Pegel High, dann ist ein externer Pullup vorhanden.
3
   2.1 Schalte Pin um auf Output OpenDrain
4
5
3. Ist der Pegel Low, dann ist kein externern Pullup da.
6
   3.1 Schalte Pin um auf Output Pushpull und hoffe, dass der Pegel reicht

Source:

https://www.mikrocontroller.net/svnbrowser/wordclock24h/src/ws2812/ws2812.c?revision=112&view=markup

Siehe dort Funktion ws2812_init().

: Bearbeitet durch Moderator
von Falk B. (falk)


Lesenswert?

@ Frank M. (ukw) (Moderator)

>Am besten nimmt man einen 1,8k Widerstand als Pullup an DIN der ersten
>LED und schaltet den STM32 auf OpenDrain. Dann hast Du einen simplen,
>aber effektiven Pegelwandler.

Naja. Wenn da ein längeres Kabel dranhängt kann das auch schief gehen. 
Man muss nicht immer und überall krampfhaft sparen. Ein echter 
Pegelwandler mit nahezu jedem beliebigen 74HCT-xx Gatter ist solide.

von Thomas G. (thomasguenzel)


Angehängte Dateien:

Lesenswert?

Thomas E. schrieb:
> Aha. Hättest Du gleich schreiben sollen. Also dann mal her mit dem
> kompletten Schaltplan (zumindest dem Teil zwischen STM32 und WS2812)

Ich habe die zwei Schaltpläne angehängt, einmal den, der aus meinem 
STM32 raus geht (es wären zwei Outputs möglich, ich nutze momentan aber 
nur D1/OUT1). Beim Board Connector nutze ich die +5V/GND vom STM32 
Discovery board, und Pin B9 für die Daten (DMA1 Stream 7 Channel 2, 
Timer 4 Channel 3). Das ganze geht dann durch einen SN75176B an den 
Output. An OUT1 schließe ich eine XLR Buchse an und geh über ein kurzes 
Kabel in eine XLR Buchse bei den LEDs. Da hab ich dann wieder einen 
SN75176B der, wie im anderen Bild gezeigt, das ganze wieder zum normalen 
Datensignal macht.

> und Details zum Aufbau (welches Kabel, wie lang, welche Spannungsversorgung
> usw...)

Die Stromversorgung vom STM32 Board kommt über USB (genau gesagt den 
eingebauten ST-LINK). Das XLR Kabel zwischen den Boards ist ca 2m lang. 
Für die Stromversorgung vom Stripe habe ich ein 200W Mean Well Netzteil 
in einen kleinen Kasten, von dem aus 1.5m lange Kabel (1.3qmm) zu den 
LEDs gehen, eingebaut. Zusätzlich ist in dem Kasten das Board, was von 
XLR wieder auf das normale Signal für die WS2812b geht und dann ebenso 
ein 1.5m langes Kabel was aus dem Kasten zu den LED Stripes geht.

von Thomas G. (thomasguenzel)


Lesenswert?

Stefanus F. schrieb:
> Hast du vielleicht eine GND Verbindung vergessen?

Kann gut sein, ich habe eben die Schaltpläne hochgeladen, vielleicht 
fehlt da wirklich etwas essentielles...

Frank M. schrieb:
> Der Output-High-Pegel eines STM32 liegt ziemlich genau bei der
> Umschaltschwelle der WS2812.

> Am besten nimmt man einen 1,8k Widerstand als Pullup an DIN der ersten
> LED und schaltet den STM32 auf OpenDrain. Dann hast Du einen simplen,
> aber effektiven Pegelwandler.

Ich werde es heute Abend mal ausprobieren! Aber rein von Verständnis: 
Ist die aktuelle Variante wie ich es mache, mit dem SN75176B, auch eine 
Option um den Pegel auf die 5V zu bringen?

Falk B. schrieb:
> Naja. Wenn da ein längeres Kabel dranhängt kann das auch schief gehen.
> Man muss nicht immer und überall krampfhaft sparen. Ein echter
> Pegelwandler mit nahezu jedem beliebigen 74HCT-xx Gatter ist solide.

Wäre es besser noch so ein Gatter dazu zu hängen oder sollte der 
SN75176B reichen als Pegelwandler?

von Stefan F. (Gast)


Lesenswert?

>> Hast du vielleicht eine GND Verbindung vergessen?
> Kann gut sein, ich habe eben die Schaltpläne hochgeladen
Die sehen diesbezüglich korrekt aus.

von Maxx (Gast)


Lesenswert?

Stefanus F. schrieb:
>>> Hast du vielleicht eine GND Verbindung vergessen?
>> Kann gut sein, ich habe eben die Schaltpläne hochgeladen
> Die sehen diesbezüglich korrekt aus.

Wie ist der SN an VCC angebunden? Jumperkabel & dünne langgezogene 
Leiterbahnen? "Eigentlich" sollte es bei dem 1uA Input Current der WS 
(Also eigentlich keine Last) nichts ausmachen, dennoch kann es nicht 
schaden den SN zu stützen, zumal im Datenblatt im "Layout Example" ein 
1uF Stützkondensator verwendet wird.

von J Zimmermann (Gast)


Lesenswert?

Hatte das gleiche Problem, allerdings mit OSZI. Weg, seitdem in der 
Datenleitung vom ARM zu WS... ein 1k Widerstand ist.
Mfg
Achim

von Falk B. (falk)


Lesenswert?

@ J Zimmermann (Gast)

>Hatte das gleiche Problem, allerdings mit OSZI. Weg, seitdem in der
>Datenleitung vom ARM zu WS... ein 1k Widerstand ist.

AUA!

Du hast wohl eher ein Problem mit Reflektionen und schlechter 
Leitungsführung. Siehe Wellenwiderstand und

Beitrag "Re: Differnz-Signal für WS2812B"

von Thomas E. (picalic)


Lesenswert?

Thomas G. schrieb:
> Die Stromversorgung vom STM32 Board kommt über USB (genau gesagt den
> eingebauten ST-LINK). Das XLR Kabel zwischen den Boards ist ca 2m lang.
> Für die Stromversorgung vom Stripe habe ich ein 200W Mean Well Netzteil
> in einen kleinen Kasten, von dem aus 1.5m lange Kabel (1.3qmm) zu den
> LEDs gehen, eingebaut. Zusätzlich ist in dem Kasten das Board, was von
> XLR wieder auf das normale Signal für die WS2812b geht und dann ebenso
> ein 1.5m langes Kabel was aus dem Kasten zu den LED Stripes geht.

Ok, hier sind ein paar potentielle Probleme, die mir so einfallen:
- fehlende Abblock-Kondensatoren an den Chips (wurde schon genannt)
- fehlende Terminierung der 2m Bus-Leitung
- 1,3 Quadratmillimeter ist für 200W bei 5V ein Witz.Selbst, wenn die 
LEDs nur 50W ziehen, sind das 10A, was bei so dünner Leitung bei 1,5m 
Kabel schon einen ordenlichen Spannungsabfall produziert.
- Masseschleife bzw. Verschiebung des Masse-Potentials, wenn im Kasten 
mit dem Netzteil und an den 1,5m entfernten LEDs Signal- und Power-Masse 
verbunden sind. Besser den Receiver gar nicht im Kasten mit dem Netzteil 
verbinden, sondern das Datenkabel zu den LEDs 3-polig ausführen und den 
Receiver darüber speisen.
- Serienwiderstand (100-470 Ohm) in der Datenleitung zur ersten LED 
schützt den LED-Eingang und hilft gegen Reflexionen, bei 1,5m sehr zu 
empfehlen.

: Bearbeitet durch User
von Thomas G. (thomasguenzel)


Lesenswert?

Thomas E. schrieb:
> Ok, hier sind ein paar potentielle Probleme, die mir so einfallen:
> - fehlende Abblock-Kondensatoren an den Chips (wurde schon genannt)

Hab leider nur 100nF da, hab jetzt aber einfach mal einen hingebastelt.

> - fehlende Terminierung der 2m Bus-Leitung

Habe ich eben getestet, hat aber leider den Fehler auch nicht 
beseitigt..

> - 1,3 Quadratmillimeter ist für 200W bei 5V ein Witz.Selbst, wenn die
> LEDs nur 50W ziehen, sind das 10A, was bei so dünner Leitung bei 1,5m
> Kabel schon einen ordenlichen Spannungsabfall produziert.

Ja sind 45W, habe aber schon 2,5qmm bestellt.

> - Serienwiderstand (100-470 Ohm) in der Datenleitung zur ersten LED
> schützt den LED-Eingang und hilft gegen Reflexionen, bei 1,5m sehr zu
> empfehlen.

Sieht so aus als war es das. Habe jetzt einen Widerstand zwischen STM32 
und dem Data In vom SN75176B und noch einen kurz vor dem LED Stripe. Bis 
jetzt funktioniert es!

Also ich hoffe, dass die Lösung nicht irgendwie aus elektronischer Sicht 
schlecht ist, das ich sowohl vor dem Stripe als auch nach dem Controller 
einen Widerstand habe (momentan 220 Ohm, heute Abend werden welche mit 
470 Ohm geliefert).

von Falk B. (falk)


Lesenswert?

@Thomas G. (thomasguenzel)

>Hab leider nur 100nF da, hab jetzt aber einfach mal einen hingebastelt.

Das ist schon OK.

>> - fehlende Terminierung der 2m Bus-Leitung

>Habe ich eben getestet, hat aber leider den Fehler auch nicht
>beseitigt..

Wie sieht deine Datenleitung aus? Wilder Klingeldraht oder mit Masse 
verdrillte Leitung?

>Ja sind 45W, habe aber schon 2,5qmm bestellt.

Zum Testen kann man auch erstmal nur wenige LEDs anschalten.

Beitrag "Re: Frage zu IR-Remote+LED-Strips an AVR"

Beitrag "Re: Frage zu IR-Remote+LED-Strips an AVR"

>> - Serienwiderstand (100-470 Ohm) in der Datenleitung zur ersten LED
>> schützt den LED-Eingang und hilft gegen Reflexionen, bei 1,5m sehr zu
>> empfehlen.

>Sieht so aus als war es das. Habe jetzt einen Widerstand zwischen STM32
>und dem Data In vom SN75176B und noch einen kurz vor dem LED Stripe. Bis
>jetzt funktioniert es!

Naja, 100-470Ohm ist hf-technisch viel Zuviel. Es funktioniert zwar 
trotzdem erstaunlich oft, aber nur mit Glück und Dreckeffekten. Man 
braucht eher um die 22-100 Ohm, je nach Treiber und Leitung.

>Also ich hoffe, dass die Lösung nicht irgendwie aus elektronischer Sicht
>schlecht ist, das ich sowohl vor dem Stripe als auch nach dem Controller
>einen Widerstand habe (momentan 220 Ohm, heute Abend werden welche mit
>470 Ohm geliefert).

Beides eher unsinnig.

von Thomas E. (picalic)


Lesenswert?

Falk B. schrieb:
> Naja, 100-470Ohm ist hf-technisch viel Zuviel.

Es geht dabei auch gar nicht so sehr um die HF-Technik, sondern um den 
Schutz des LED-Eingangs. Habe mir selbst schon so eine LED zerschossen, 
weil ich keinen Serienwiderstand drin hatte und den Datenstecker wohl 
auch mal bei eingeschaltetem Controller angesteckt hatte. Gut wäre 
vermutlich ein auf den Wellenwiderstand des Kabels angepasster 
Serienwiderstand direkt am Ausgang des Treiberbausteins (z.B. 75 Ohm) 
und ein größerer (z.B. 470 Ohm) direkt vor dem Eingang der LED. 
Letzterer hat ja auch kaum Auswirkungen auf die Anpassung, weil der 
LED-Eingang eh hochohmig ist.

von J Zimmermann (Gast)


Lesenswert?

falk:
> Du hast wohl eher ein Problem mit Reflektionen und schlechter
> Leitungsführung.

Schleche Leitungsführung? Das Ganze, 10 LEDs und ARM befinden sich auf 
einem Breadboard - PIN zu LED höchstens 8cm.
Hab mit 47 Ohm begonnen, Flackern hat dann ab 820 Ohm aufgehört.

mfg
Achim

von Thomas G. (thomasguenzel)


Lesenswert?

Falk B. schrieb:
> Wie sieht deine Datenleitung aus? Wilder Klingeldraht oder mit Masse
> verdrillte Leitung?

Also über die meiste Strecke gehen die Daten über das XLR Kabel. 
Lediglich die ersten 10cm und die letzten 1.5m gehen über ein 2-poliges 
Kabel, auf dem GND und Daten liegen.
Zum Stripe gehen also 4 Kabel: Stromversorgung (+5V/GND) und 
Datenleitung (Data/GND). Weder Datenleitung noch Stromversorgung sind 
verdrillt. Für die Stromversorgung nutze ich ein Lautsprecherkabel.

> Naja, 100-470Ohm ist hf-technisch viel Zuviel. Es funktioniert zwar
> trotzdem erstaunlich oft, aber nur mit Glück und Dreckeffekten. Man
> braucht eher um die 22-100 Ohm, je nach Treiber und Leitung.

Bei 22-100 Ohm ist leider immer noch das flackern vorhanden :/

von Thomas E. (picalic)


Lesenswert?

Servus,

hier:
http://bedienungsanleitung.elektronotdienst-nuernberg.de/impedanz.html

kannst Du den Wellenwiderstand einer 2-Drahtleitung rechnen lassen.
Wenn die Kabel nicht verdrillt sind und lose daliegen, ist der Abstand 
ja vermutlich recht groß, damit ergibt sich ein hoher Wellenwiderstand 
(> 200 Ohm). Außerdem schwankt er, je nachdem, wie man das Kabel 
hinlegt. Verdrillen würde also schonmal helfen, um einen einigermaßen 
definierten Leiterabstand zu erhalten.
Wo hast Du denn den 22-100 Ohm Widerstand angebracht? Wie gesagt, der 
Widerstand zur Anpassung des Kabels an den IC-Ausgang sollte direkt in 
Serie zum IC-Ausgang. Dann noch einen recht hochohmigen R als Schutz 
(330-470 Ohm, 1k würde wohl auch gehen) direkt vor den Eingang der LED.

Für das XLR-Kabel würde ich eine Serien-Terminierung am Sender (je ein 
Serienwiderstand von 100 Ohm an D+ und D-) und einen Parallelwiderstand 
am Empfänger einbauen.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Thomas G. schrieb:
> Bei 22-100 Ohm ist leider immer noch das flackern vorhanden :/
Dann würde ich da mal mit einem Oszilloskop die Flanken und das Timing 
kontrollieren.
Und die Versorgung.

von Stefan F. (Gast)


Lesenswert?

Unterschiedliche Kabeltypen zu kombinieren ist nicht so gut weil an der 
Stelle dazwischen zusätzliche Reflexionen entstehen, die du nicht mit 
Abschlusswiderstände unterdrücken kannst.

von Thomas E. (picalic)


Lesenswert?

Stefanus F. schrieb:
> Unterschiedliche Kabeltypen zu kombinieren ist nicht so gut weil an der
> Stelle dazwischen zusätzliche Reflexionen entstehen,

Das passt hier schon, weil an den Verbindungspunkten jeweils die 
Bustreiber dazwischen sind.

von Thomas G. (thomasguenzel)


Lesenswert?

Thomas E. schrieb:
> Servus,
>
> hier:
> http://bedienungsanleitung.elektronotdienst-nuernberg.de/impedanz.html
>
> kannst Du den Wellenwiderstand einer 2-Drahtleitung rechnen lassen.
> Wenn die Kabel nicht verdrillt sind und lose daliegen, ist der Abstand
> ja vermutlich recht groß, damit ergibt sich ein hoher Wellenwiderstand
> (> 200 Ohm). Außerdem schwankt er, je nachdem, wie man das Kabel
> hinlegt. Verdrillen würde also schonmal helfen, um einen einigermaßen
> definierten Leiterabstand zu erhalten.
> Wo hast Du denn den 22-100 Ohm Widerstand angebracht? Wie gesagt, der
> Widerstand zur Anpassung des Kabels an den IC-Ausgang sollte direkt in
> Serie zum IC-Ausgang. Dann noch einen recht hochohmigen R als Schutz
> (330-470 Ohm, 1k würde wohl auch gehen) direkt vor den Eingang der LED.
>
> Für das XLR-Kabel würde ich eine Serien-Terminierung am Sender (je ein
> Serienwiderstand von 100 Ohm an D+ und D-) und einen Parallelwiderstand
> am Empfänger einbauen.

Ich hab das jetzt alles mal so gemacht und es funktioniert 1A!
Vielen vielen Dank :)

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.