Kleine Schaltung: SPI nach WS2811-Umsetzer mittels Standard-Logik-Bausteinen

  • Da ich mir ja selbst letztens eine Rolle WS2811-RGB-LEDs zum Rumspielen gekauft hatte und weil in unserem CCCZH (CCC Zürich) Hackerspace noch jemand mit WS2811-Stripes experimentieren wollte (am liebsten mit dem Raspberry Pi), habe ich zur einfachen Ansteuerung solcher LEDs (bzw der WS2811 Chips) über die SPI-Schnittstelle eine kleine Logikschaltung als Umsetzter entwickelt. Dabei war das Ziel, dass die Hardware-SPI-Schnittstelle eines µC direkt verwendet werden kann, ohne Bitbanging und ohne die SPI-Datenworte künstlich zu verbreitern (mehrere SPI-Datenbits entsprechen einem WS2811-Datenbit). Es sollte einfach eine direkte Umsetzung der per SPI gesendeten Datenworte in das WS2811-NRZ-Format erfolgen, und zwar Bit für Bit (also 8 Bit SPI = 8 Bit WS2811-NRZ etc.). Damit sollte es dann auch möglich sein, bei µCs mit integriertem DMA direkt den SPI via DMA anzusteuern, ohne die Pufferspeicher-Grösse durch Datenwortverbreiterung unnötig vergrössern zu müssen. Ausserdem kann man dann auch entsprechend der Datenrate beim WS2811 low speed SPI von 'nur' 400 oder 800 kHz (je nach Speed-Mode) verwenden.

    Die hier gezeigte Schaltung verwendet ein Dual Monoflop ( 74HCT4538 ) und ein 4 x 2-Input-XOR ( 74HCT86 ). R1, C1 bestimmen die Pulsdauer bei einem 1-Bit und R2, C2 diejenige bei einem 0-Bit. Im Slow-Mode (bei den meisten WS2811-LEDs implementiert) ist die Pulsdauer für ein 1-Bit ca. 1,2 µs und für ein 0-Bit ca. 0,5 µs, im Fast-Mode jeweils die Hälfte. Die Werte für R und C lassen sich laut NXP-Datenblatt zum 74HCT4538 folgendermassen bestimmen: Pulsdauer(s) = 0,7 x R x C. Die beiden XOR-Gatter U1.1 und U1.2 sind als nichtinvertierende Puffer geschaltet und wären somit rein von der Logik-Funktion her nicht unbedingt nötig. Ich habe sie aber extra mit eingeplant, damit es zu keiner signifikanten Laufzeitverzögerungsdifferenz der SPI-Signale vor den Monoflops kommt. Durch Verwendung von HCT-Logik ist die Ansteuerung (SPI) sowohl mit 5V- als auch mit 3,3V-Pegeln möglich. Natürlich gehören noch 100 nF Entkoppel-Kondis an die Stromversorgungspins beider ICs (nicht im Schaltplan).


    Das das jetzt keine grossartige Sache ist, hab ich's mal ins TTT gestellt, aber vielleicht ist's ja für jemanden hier noch nützlich.


    Gruss
    Neni

  • Das das jetzt keine grossartige Sache ist, hab ich's mal ins TTT gestellt, aber vielleicht ist's ja für jemanden hier noch nützlich.

    Auf jeden Fall - daher auch verschoben nach "LED Schaltungen, Treiber und µC"... ;)

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Öi, das ist stark, synvox!


    Duch den Wegfall von Bitbanging wird der ansteuernde Controller ja sehr entlastet.
    Ich nehme an, Du hast das bereits ausprobiert und es funzt, oder?


    Schick wäre noch sowas wie ein CS-Eingang an der Schaltung, damit man nicht in Konflikt mit anderer Hardware kommt, die ebenfalls am SPI hängt.

  • hat schon jemand die schaltung erfolgreich getestet? ich habe als Widerstand jeweils 50KOhm verwendet mit 8pF und 18pF Kondenstatoren. Aber am Ausgang tut sich nix. Und irgendwie schwingt zwischen den Cs und Rs nichts. Die Signale aus dem 86er IC sehen gut aus. Einen Fehler kann ich im Aufbau auch nicht erkennen (sonst würds ja auch laufen *g*). Hilfe!

  • Hallöchen,


    ein Kollege aus unserem Hackerspace in Zürich hat die Schaltung getestet und mir bestätigt, dass sie funktioniert, zumindest im Slow-Modus (welchen er benötigt und somit auch getestet hat). Ich selbst habe die Schaltung noch nicht aufgebaut, da bei mir gerade andere Projekte (als solche mit WS2811-LEDs) im Vordergrund stehen.


    firefox0815
    Rein rechnerisch sind die gewählten Werte für R und C für den Fast-Mode (ich nehme an, du benötigst diesen) ok, aber trotzdem sind sie praktisch kaum geeignet. Mit Kapazitäten von 8 und 18 pF bewegst du dich im Bereich der parasitären Kapazitäten von IC-Eingängen, Leiterbahnen, Steckverbindungen, Verbindungslitzen etc. Je nachdem wie du die Schaltung aufgebaut hast, könntest du effektive Kapazitäten von einem Mehrfachen der eingesetzten Werte haben, was natürlich dann zu massiv längeren Pulsen bzw. je nach SPI-Taktfrequenz zu einem praktisch unveränderlichen Pegel am Ausgang führen kann.
    Ich würde dir deshalb vorschlagen, dass du die C-Werte um etwa den Faktor 100 grösser machst und dafür die R-Werte 100 mal kleiner. Zum Bsp. wäre für den Fast-Mode ein C-Wert von 1nF und ein Trimmpoti von 1 kOhm für den R-Wert für beide RC-Zeitkonstanten sinnvoll, wobei für R1 dann ca. 860 Ohm und für R2 ca. 360 Ohm eingestellt werden sollten. Damit bist du dann weit genug vom Bereich der parasitären Kapazitäten entfernt, so dass die eingestellte Pulsweite um vielleicht max. 5 % aufgrund der parasitären Kapazitäten schwanken kann. Klar sollte auch sein, dass die SPI-Taktfrequenz für den Fast-Mode 800 kHz betragen sollte, damit vom Timing her alles stimmt.


    Gruss
    Neni

  • Hallo Neni,


    vielen Dank für die Antwort. Ich werde meine Schaltung entsprechend modifizieren. Hier rächt sich wieder das ich nur Informatiker bin und kein Elektrotechniker. Aber eine Frage. Im Datenblatt steht ein empfohlener Mindestwiderstandswert im kOhm Bereich. Stimmt das einfach nicht oder findet das nur in diesem Falle keine Anwendung?


    Viele Grüße


    Florian

  • Hallo Florian,


    wenn du im Datenblatt von NXP nachschaust, dann steht zwar dort: Rext ab 2 kOhm, aber in den Figuren ab Fig. 11 werden die Kurven für bis 1 kOhm runter angegeben. Man sieht auch recht gut aus den Figuren, was bei niedriegeren Widerständen passiert. Der Faktor für die Multiplikation mit R und C (rechts auf der y-Achse angegeben) wird grösser, also nicht mehr 0,7 sondern 0,9 oder je nachdem auch über 1. Man kann die Widerstände schon nicht beliebig klein wählen, da die Kurve gegen unten (kleinere Widerstände) relativ steil ansteigt, d.h. irgendwann steigt der Faktor so stark an, dass man trotz kleinerem Widerstand keine kürzeren Zeitkonstanten mehr erreicht. Wenn ich mir Figur 12 (geht bis 1 kOhm runter) links weiter denke, dann sollte bei Rext etwa 100 Ohm der Faktor auf ca. 1,5 (oder eher weniger) ansteigen, also immer noch gut verwendbar.
    Meine Rechnung von oben war also insofern falsch, als ich immer noch den Faktor 0,7 gewählt und die Daten aus den Kurven nicht berücksichtigt hatte. Deshalb ist es aber um so sinnvoller, Trimmpotis zu verwenden und die effektiven Werte für R mittels eines Oszis oder Logic Analyzers einzustellen. Ev. könnte man auch ein C von 630 pF nehmen, dann könnte man ein etwas grösseres R nehmen (z.Bsp. Trimmpoti mit 2,2 kOhm), hätte dann aber Schwankungen von ca. 10 % zu erwarten (wohl immer noch ok) und der Faktor steigt bei Kapazitäten unter 1 nF in Abhängigkeit der sinkenden Kapazität teilweise noch stärker an als bei sinkenden Widerständen (bei höherem C) (Fig. 11).


    Gruss
    Neni

  • Hallo


    Die Schaltung ist wirklich eine elegante Idee.


    Mir ist leider nur noch nicht klar wie ich den Atmega auf die richtige, d.h. 800 khz Output Frequenz, bringe. Gibt es eine andere Lösung als den Einsatz eines 12.8 mhz Quarzes und 16 als Prescaler für den SPI?

  • Es ist im Prinzip auch so, dass die 400 kHz bzw. 800 kHz die jeweiligen Maximalwerte für die beiden Modi sind. D.h. man kann z.Bsp. im Fast Mode die Bits auch mit niedrigerer Frequenz als 800 kHz raushauen, solange die Pulsdauern für 1 und 0 dem Mode entsprechend bleiben und die Bitfrequenz nicht so langsam wird, dass ein Reset mitten im Datenstrom ausgelöst wird. Natürlich begrenzt man damit die maximale Frame-Rate für eine LED-Kette bestimmter Länge zusätzlich.


    Wenn es also 'nur' darum geht, einen seriellen Eingangs-Stream jeglicher Art in einen seriellen Ausgangs-Stream für WS2811-LEDs zu wandeln (mit einem ATmega oder was auch immer), dann würde ich immer noch eher auf Bitbanging setzen, da es in einem solchen Fall problemlos umsetzbar und flexibler ist.


    Wenn hingegen der µC viele zusätzliche Aufgaben erledigen muss und vielleicht auch noch Effekte/Animationen selbst berechnet bzw. wenn man dann eben auch DMA verwenden möchte und/oder das verwendete System mit einem RTOS läuft, dann wird zeitkritisches Bitbanging schwierig. Andererseits sind dann solche Systeme/µCs meist auch deutlich leistungsfähiger und komplexer und haben eine oder mehrere PLLs und flexible Teiler-Register für die integrierten Peripherie-Schnittstellen, so dass sich dann die SPI-Frequenz recht genau und ziemlich unabhängig vom CPU-Takt einstellen lässt. Und diese Schaltung ist primär für solche Fälle konzipiert.


    Gruss
    Neni

  • Mittlerweile bin ich dabei Versuche mit dem Raspbeery Pi anzustellen. Das Problem dabei ist, dass der Raspi per Default nur SPI Frequenzen unterstützt die mit einem Teiler der eine Potenz von 2 ist aus dem Systemtakt (250mhz) gebildet werden können. 800khz oder etwas in der nähe sind so nicht möglich.


    In folgendem Artikel habe ich eine Lösung für dieses Problem gefunden:
    http://www.raspberrypi.org/php…0586&f=44&t=43442&start=0


    Der Raspi unterstützt Hardwareseitig auch andere Teiler und die Zweierpotenz ist nur Softwareseitig verankert. Mit einem angepassten Treiber stehen daher wesentlich mehr verschidenen SPI Frequenzen zu Verfügung. Habe die Frequenz bereits per Oszi geprüft und konnte eine Frequenz nahe an 800khz ausgeben.


    Werde nun die Monoflopschaltung nachbauen und anschliessend prüfen ob der WS2811 Led Stripe sich kooperativ zeigt.

  • Aber ein Raspi dürfte ja so oder so von dem WS2811-ern ja nicht mal gekitzelt werden was die Leistung angeht. Wäre es da nicht vll. sinnvoller das ganze einen kleinen Mikrocontroller zu überlassen und diesen mit dem Raspi anzusteuern? Dann wäre der Raspi auch für andere Zwecke verfügbar.


    Ich für meinen Teil bin dabei aus einem Arduino + Ethernet Shield einen Controller für die WS2811er zu machen so das dieser dann einfach über das Netzwerk im Ganzen Haus verbaut werden kann. Später dann kommt mir als Haussteuerung ein Raspi oder ein Cubieboard ins Haus ;-).


    War nur mal ein kleiner Gedankenanstoß^^. Ich weiß ja nicht was du sonst noch damit so vor hast.


    Lg Thomas

  • Ein guter einwurf. Ein raspberry mit wlan und netzteil kostet komplett 45 euro. Ich fand das damals günstiger als andere lösungen. Was würde deine genannte lösung kosten? Damals hatte ich auch sehr wenig erfahrung mit microcontrollerprogrammierung. Da hatte mir der raspberry gut gelegen.


    Viele grüße

  • Ich für meinen Teil bin dabei aus einem Arduino + Ethernet Shield einen Controller für die WS2811er zu machen so das dieser dann einfach über das Netzwerk im Ganzen Haus verbaut werden kann. Später dann kommt mir als Haussteuerung ein Raspi oder ein Cubieboard ins Haus ;-).

    Hi!


    Will Dir den Spass am programmieren nicht verderben - aber falls Du auf Schwierigkeiten stoesst... :D


    http://www.deskontrol.net/blog…tnet-node-for-led-pixels/


    Viele Gruesse
    Andre

  • also ich für meinen Teil hätte garnichts dagegen wenn ich mich um dem LED Treiber nicht kümmern müsste. Mein Hauptaugenemerk ist eigentlich die Middleware zur Automatisierung und das Frontend für Android. Bisher kann ich schon LED Stripes befeuern und Steckdosen fernschalten. Heizung sowie Lampen werden in Angriff genommen sobald die Process-Engine steht.


    Was kostet den ein Arduino mit Lan oder besser Wlan (sowohl zeitlich als auch finanziell) bis er steht?


    Viele Grüße


    die Sourcen zum Projekt sind bei Google Projects und werden unter Apache Lizenz stehen. Ich gebe dazu auch hin und wieder mal ein Update in einem Nachbarthread (wenn man verlinken darf könnte ich den bei Interesse hier rein packen)