mikrocontroller.net

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


Autor: Thomas G. (thomasguenzel)
Datum:

Bewertung
0 lesenswert
nicht 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:
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
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

Autor: Thomas E. (picalic)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nils Z. (nils_z)
Datum:

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

Autor: Thomas G. (thomasguenzel)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thomas E. (picalic)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du vielleicht eine GND Verbindung vergessen?

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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. Schalte Pin auf Input mit internem Pulldown
2. Ist der Pegel High, dann ist ein externer Pullup vorhanden.
   2.1 Schalte Pin um auf Output OpenDrain

3. Ist der Pegel Low, dann ist kein externern Pullup da.
   3.1 Schalte Pin um auf Output Pushpull und hoffe, dass der Pegel reicht

Source:

https://www.mikrocontroller.net/svnbrowser/wordclo...

Siehe dort Funktion ws2812_init().

: Bearbeitet durch Moderator
Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas G. (thomasguenzel)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas G. (thomasguenzel)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefanus F. (stefanus)
Datum:

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

Autor: Maxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: J Zimmermann (Gast)
Datum:

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

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Thomas E. (picalic)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Thomas G. (thomasguenzel)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas E. (picalic)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: J Zimmermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas G. (thomasguenzel)
Datum:

Bewertung
0 lesenswert
nicht 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 :/

Autor: Thomas E. (picalic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

hier:
http://bedienungsanleitung.elektronotdienst-nuernb...

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
Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas E. (picalic)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas G. (thomasguenzel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas E. schrieb:
> Servus,
>
> hier:
> http://bedienungsanleitung.elektronotdienst-nuernb...
>
> 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.