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
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.
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...
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...)
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
@ 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.
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.
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?
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.
@ 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"
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.
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).
@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.
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.
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
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 :/
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.
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.
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.
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.
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 :)