WS2812b über STM32 flackert ohne Logic Analyzer

OP #5455688
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
#5455727
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...)
Moderator Persönliche Seite #5455881
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().
#5455983
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.
OP #5455985
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.
Angehängte Dateien:
OP #5455994
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?
Gast #5456023
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.
#5456268
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.
OP #5456321
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).
#5456336
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.
#5456654
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.
Gast #5456676
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
OP #5456828
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 :/
#5456941
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.
OP #5459361
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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren