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

  • Also für Steckdosen schalten und nen paar Stripanimationen braucht man kein Stromhungriges WLAN Module überall betreiben. Schaut euch mal Bluetooth Low Energy an... wird auch vom BlueZ Stack unterstützt (kann man dann alles vom Pi steuern)... ist zur Zeit ziemlich im kommen. Die Gategets-Anzahl explodiert förmlich ;)


    Und WS2811 im Bitbangmodus, dass lastet auch ein Pi ziemlich sehr aus.... zumal das OS ja nicht Echtzeitfähig ist...


    offtopic ende

  • also da habe ich andere Erfahrungen gemacht. der Raspberry mit wlan und rfm12 modul benötigt bei mir ca 1 Watt im Betrieb. Das Messgerät ist kein Laborgerät, aber eine schaltbare Steckdose benötigt auch in dem Dreh. Und der Treiber für die Stripes benötigt bei 5m und 25hz ca 3 Prozent CPU Zeit.


    Am Wlan gefällt mir in meinem Setting(und das war relativ anstrengend aufgrund dicker Stahlbetonwände) das ich nun die bestehende Infrastruktur problemlos nutzen kann und das die Geräte an jedem Ort mit jedem anderen kommunizieren können.


    Zwischenzeitlich bin ich gerade daran mir den Arduino und diverse Shields anzuschauen. Bluetooth gibt es sehr günstig. Wlan abartig teuer.. über 40 Euro stimmt das?


    Ein Problem bleibt nämlich tatsächlich: die mangelnde Echtzeitfähigkeit. Sobald mehr auf dem Raspberry läuft gibt es Timing-Probleme (Der SPI Treiber wird in diverse Richtungen weiter entwickelt. Ob es also in Zukunft besser wird ist schwer zu beurteilen). Fange ich also an und stelle 2 in einem Raum auf. Einen zur Verwaltung und einen als LED Controller sehe ich inzwischen auch eher den Vorteil das über einen Arduino und evtl Bluetooth zu lösen.


    Ich für mich nehme mir mit, das ich in einer ruhigen Minute mal die Plattform in dem Link von 2bl mal vornehme. Wenn dort Bluetooth integriert werden könnte wäre das eine interessante Sache. Zumal das Rad dann nicht ständig neu erfunden werden müsste.


    Viele Grüße

  • Einfach bei ebay suchen. Wichtig: ebay.com (nicht .de), und Browsersprache auf englisch stellen.
    Gibt sicher auch WLAN shields, die aber vom verlinkten Arduino code nicht angesprocen werden.
    Steht Dir natuerlich frei, einen WLAN-Accesspoint aufzustellen, und das Ethernet-shield per Kabel anzubinden...
    Und ja - so wie ich schrieb: Anstecken, aufspielen WS2811 Data pin an den richtigen Arduino Pin und fertig. (ArtNet konforme Datenquelle vorausgesetzt)


    Neni: sorry das ich jetzt Deinen Thread damit zugespammt habe!!


    Viele Gruesse
    Andre

  • Hallo


    Zurück zum ursprünglichen Thema:


    Ich habe versucht die Treiberschaltung nachzubauen. Leider bis jetzt ohne Erfolg.


    Meine WS2811 Strips brauchen 800khz, d.h. die Impulse ab dem Monoflop müssen 0.6uS resp. 0.25uS lang sein. Leider klappt die bei mir nicht. Für die C-Werte habe ich jeweils 1nF eingesetzt und für die zugehörigen Widerstände jeweils 1k-Ohm Trimmer (auf 680Ohm und 360Ohm) eingestellt. Mit dieser Bauteilauswahl kommt leider kein Signal ab dem Monoflop. Ich kann mit die Signale bis zum Monoflop nachvollziehen, aber anschliessend ist leider nichts mehr zu sehen :(


    Heute habe ich nun einige Versuche mit dem Monoflopbaustein 74HC4538 unternommen. Mit etwas höheren Widerstandswerten als jenen die ich in der Schaltung verwendet habe, klappt die Signalgenerierung ab dem Baustein wunderbar. Wenn ich aber Widerstände <1k-Ohm verwende, da ist wieder tote Hose am Ausgang.


    Was kann ich unternehmen um den 74HC4538 zu Zusammenarbeit sprich zu generierung der Pulse mit korrekter Länge zu bewegen? Gibt es einen alternativen Monoflopbaustein welcher Pulse in der richtigen Länge, d.h. 0.6uS und 0.25uS erzeugen kann?


    Danke und Gruss


    Tom

  • Hallöchen,


    hast du trotzdem auch mal geringere C-Werte getestet, 470, 220 oder sogar bis 100 pF runter? Dann hast du automatisch höhere R-Werte, wenn eben der 4538 bei Rs unter 1 kOhm problematisch reagiert. Das kann natürlich schon sein (hatte ich bei meiner Antwort an Florian nicht bedacht, mea culpa), denn die Cx/Rx-Pins haben intern jeweils einen MOSFET, welcher die Cs zum entsprechenden Zeitpunkt gegen Masse entladen soll. Wenn der externe R aber klein genug wird, dass der ON-Widerstand des MOSFETs den C nicht mehr vollständig entladen kann, bzw. dass der sich bildende Spannungsteiler (R und Ron) den unteren Spannungs-Schwellenwert für das IC nicht mehr erreicht, dann funktioniert das Ding nicht mehr.


    Der Nachteil der tieferen C-Werte ist natürlich wie schon gesagt der Einfluss der parasitären Kapazitäten. Wenn man das Ganze aber auf jeden Fall (nicht nur in der Testphase, sondern auch in der Endschaltung auf PCB oder so) mit Trimmpotis für die R-Werte ausstattet, kann man die Pulsdauer jeweils einstellen und die sich je nach Aufbau durch die genannten Einflüsse etwas ändernden Kapazitäten so kompensieren. Weniger als 100 pF würde ich aber auf jeden Fall vermeiden, und die Endschaltung sollte dann so auf- und eingebaut werden, dass die zeitgebenden R- und C-Bauelemente möglichst nahe am Cx/Rx-Pin platziert und mit möglichst wenig Kupferfläche mit diesem verbunden sind. Die Einstellungen an den Trimmpotis macht man dann am Besten mit einem Kunststoff-Schraubendreher (wie man ihn häufig für die Kompensations-Einstellung von Oszi-Tastköpfen findet).


    Gruss
    Neni


    PS: ausserdem solltest du den 74HCT4538 nehmen (also nicht HC sondern HCT)

  • Hallo Neni


    Mit 100pF und einem anderen Trimmer (auf ca. 3.5k eingestellt) habe ich es mittlerweile auch ausprobiert. Leider auch wieder ohne brauchbares Resultat. Eingangssignale am Monoflop wunderbar, Ausgang nix verwertbares.


    Ev. liegt das Problem wirklich daran, dass ich den HC und nicht den HCT Typen verwendet habe. Leider war der HCT Type auf die schnelle nicht erhältlich, ist jetzt aber bestellt (mal sehen wie lange Distrelec braucht den Chip aufzutreiben). Mal sehen ob das was bringt.



    Merci für die Hilfe


    Tom

  • lizard.king:
    Wenn ich das so lese, mit Trimmpoti und so, kommt mir ein gaaanz übler Verdacht:
    Du hast diese Schaltung doch nicht etwa auf 'nem Steckbrett aufgebaut, oder?
    Muss ich erwähnen, dass das sehr wahrscheinlich so nix wird?



    @Neni:
    Was hältst Du davon, Deine Schaltung durch 'nen ATtiny9 oder so zu ersetzen?
    http://de.farnell.com/atmel/at…lash-6sot-23/dp/1841629RL
    [Blockierte Grafik: http://de.farnell.com/productimages/farnell/thumbnail/42334038.jpg
    Gut, der muss geflasht werden, was natürlich lästig ist.
    Aber die Vorteile:

    • Winziges, 6-poliges SOT-Gehäuse.
    • Keine weiteren Bauteile erforderlich (wirklich gar keine!).
    • Billig.
    • Durch den internen, kalibrierten Oszillator viel höhere Präzision des Timings, als mit externen RC-Gliedern erreichbar.
    • Unter Verzicht auf den Reset-Pin stehen vier I/O zur Verfügung. Also drei Eingänge. Somit kann man - gegenüber Deiner Schaltung - zusätzlich ein CS-Signal nutzen, was vorteilhaft ist, wenn weitere Bausteine am SPI-Port hängen.

    Üppig ausgestattet sind diese 6-Pin ATtinys nicht gerade, aber für diesen Zweck sollte es reichen, denke ich.

  • Hallo Irrlicht


    Die Schaltung ist nicht auf einem Steckbrett. Habe eine kleine Platine hergestellt. Werde ich sofern das irgenwann funktioniert auch gerne hier zur Verfügung stellen.


    Die Idee mit dem Tiny ist mir auch gekommen und ich habe auch schon einige Versuche in diese Richtung angestellt. Es hat sicher allerdings schnell gezeigt, dass der Weg nicht funktioniert. Der Tiny ist nicht schnell genug. Bei der Anzahl Taktzyklen die pro Bit zur Verfügung stehen, kriegt mann das Timing nicht sauber hin (Habs mit Assembler probiert).. Ich denke für diesen Weg müsste man min. 10-20mhz Taktfrequenz (besser noch etwas mehr) haben.


    Gruss


    Tom

  • Irrlicht:
    Das kann man sicher machen, ist auch sicherlich kein Problem. Ich wollte eben einfach nur einen kleinen Umsetzer entwickeln, den man 'nur' auzubauen und einzustellen braucht ohne eine zusätzliche Firmware brennen zu müssen. Sonst könnte man auch einen CPLD, GAL etc. nehmen.


    Leider bin ich langsam auch der Meinung, dass es mit dem 4538 wohl für den Fast Mode nicht geht. Ich habe jetzt selbst mal die Teile bestellt, so dass ich mal testen kann, ob man wirklich nicht Pulsweiten von 250 ns (allerdings wohl knapp) erreichen kann. Nachdem ich mir aber auch das Datenblatt von TI (neben NXP) zum 74HC(T)4538 genauer angeschaut habe (insbesondere die Graphen), ist es wohl tatsächlich ein Grenzfall. 500 ns erreicht man wohl noch einigermassen gut, darunter wird's dann schwierig. Das Design des 4538 ist ja auch schon etwas älter, auch wenn er mit den HC(T)-Typen mittlerweile auch in modernisierter Technik vorliegt.


    Ich habe auch schon eine Alternative parat. Bzw. hatte ich die schon am Anfang im Kopf. Aber weil der 4538 das einzige Monoflop ist, bei welchen das /CD bzw. /R Signal neben der Reset/Disable-Funktion nicht auch noch selbst eine Trigger-Funtion ausübt, habe ich dieses Monoflop gewählt, da der Rest der Schaltung dann mit nur einem zusätzlichen Gatter-Typ (XOR) realisiert werden konnte.
    Die Alternative wäre eben, den SN74AHC123A als dual Monoflop zu verwenden. Dieser kann laut Datenblatt (Graphik) Pulsweiten von bis unter 100 ns locker erreichen. Da sich aber aus den oben genannten Gründen dessen /CLR Signal nicht entsprechend verwenden/verschalten lässt, braucht man drei verschiedenartige Gatter (1 x 2-Input-AND, 1 x 2-Input-AND mit EINEM invertierten Eingang und 1 x 2-Input-XOR) als Zusatzbeschaltung. Glücklicherweise gibt es die "Little Logic"-Bausteine (TI und andere), welche jeweils nur ein bis zwei Gatter des jeweiligen Typs enthalten und somit auch sehr platzsparend sind. Das Ganze wird man dann aber auf jeden Fall nur noch in SMD aufbauen können.
    Wenn ich Zeit habe, werde ich dieses WE schnell mal die Schaltung zeichnen.


    Gruss
    Neni

  • Bin ebenfalls am warten bis der 4538 als HCT eintrifft. Mal sehen was das bringt.


    Beim Nachdenken über Alternativen, ist mir noch aufgefallen, dass das Taktsignal des SPI genau die nötige Dauer für ein 1 Bit hat. Dafür muss also nicht aml unbedingt eine eigene Timerschaltung eingsetzt werden, sondern es kann einfach das Taktsignal via Logikgatter ausgegeben werden. Für die 0 Bits mit den 0.25uS muss allerdings trotzdem noch eine lösung gefunden werden.

  • Der Tiny ist nicht schnell genug. Bei der Anzahl Taktzyklen die pro Bit zur Verfügung stehen, kriegt mann das Timing nicht sauber hin (Habs mit Assembler probiert).. Ich denke für diesen Weg müsste man min. 10-20mhz Taktfrequenz (besser noch etwas mehr) haben.

    Ohne das selbst probiert zu haben, wage ich diese Aussage vooorsichtig zu bezeweifeln. Sorry, falls ich jetzt Stuss schreibe.


    Der Tiny macht übrigens auch 12 MHz.
    Aber gehen wir mal von normalen 8 MHz aus: Da wären 1/8 Mikrosekunden drin. Also 0,125 Mikrosekunden.
    2 Takte x 0,125 Mikro = 0,25 Mikro. Der Hardware-PWM macht also schon mal ein perfekt passendes Timing für das kritische 0-Bit, wenn man den ohne Vorteiler direkt mit 8 MHz betreibt (weiß gar nicht, ob das geht bei dem Ding).


    Für die 0,6 Mikro passt es nicht ganz: 5 Takte x 0,125 Mikro = 0,625 Mikro.
    Das sollte gut im Rahmen der Toleranz sein, für den WS2811. Sonst könnte man den Controller eventuell auf etwas mehr Speed kalibrieren, so dass diese Pulse ewas kürzer werden. Dann werden zwar auch die 0,25 Mikro-Pulse schmaler, aber das Gesamttiming passt besser.
    Die WS2811 sollen ja einigermaßen tolerant sein, was kleine Abweichungen betrifft.


    Der Controller bräuchte nichts weiter zu tun, als in Abhängigkeit von den Eingängen den PWM einzustellen.
    Die Kunst ist, das mit diesen paar Takten hinzubekommen (in der Tat dammich wenig Takte).


    Da wäre Pesi doch bestimmt der Guru. Mit einzelnen Takten Wunder zu vollbringen ist seine Spezialität.
    ;) Der würde es wahrscheinlich schaffen, parallel noch 'ne Fernbedienung abzufragen, ein Display anzusteuern, 'nen 48 Bit tiefen HSV-Wert nach RGB zu wandeln und per LAN an 'nen Router zu schicken ... und ... ;)


    Nee, im Ernst: Das mit den schmalen Pulsen ist schon wirklich übel knapp.
    Peeesiii! Deine Meinung ist gefragt!


    Ich wollte eben einfach nur einen kleinen Umsetzer entwickeln, den man 'nur' auzubauen und einzustellen braucht ohne eine zusätzliche Firmware brennen zu müssen.

    Jupp, ist mir klar.
    Das macht auch die Eleganz Deiner Schaltung aus, kein Einspruch. Was mir nur auf Anhieb nicht gefiel und was ja offensichtlich auch tatsächlich problematisch ist, ist die analoge Pulsweiteneinstellung. Und halt, dass kein CS zur Verfügung steht.

  • Ich habe etwas Aehnliches schonmal gemacht.
    Allerdings auf einem Arduino (weil grad rumliegend, hier aber 16 MHz), und als WS2801 auf WS2811 Umsetzer (Controller fuer WS2801 war da, aber es mussten WS2811 betrieben weren).


    Hier der Assembler Schnipsel.
    Es strang bitweise gearbeitet, die Pause fuer das Latch-Signal muss also im Ursprungs-Signal enthalten sein.
    Bei jeder steigenden Taktflanke wird die DAT-Leitung geprueft, und ein entsprechend langer Puls ausgegeben (nop-instructions, "High-Speed").


    Wenn hier der WS2801 Takt zu hoch ist, die naechste Taktflanke also kommt, bevor der (lange) Puls abgeschlossen ist, wird das Bit verschluckt, und die Sache geht in die Hose.


    Sicher also nicht optimal, funktionierte aber hervorragend im vorliegenden Fall. :)


    Viele Gruesse
    Andre


  • Ich habe meine Versuche mit einem Attiny13 gemacht. Bei 9.6mhz Taktfrequenz stehen pro Bit welches ausgegeben werden soll 12 Taktyklen zur Verfügung bevor das nächste Bit beginnt. D.h. der Puls für 1 müsste etwa 6 Taktzyklen umfassen, jener für 0 etwa 2.4 Taktzyklen (nehme an 3 Zyklen würde auch funktionieren).


    Ich habe ein kleines Assemblerschnipssel poduziert (siehe unten)welche diese Vorgaben in etwa einhalten sollte und das Ausgangsgnal per Bitbanging produziert, aber irgendwie hat das nicht richtig geklappt. Die Taktzyklen sind abgezählt und in jeder Zeile im Kommentar vermerkt. Hoffe ich habe nichts wichtiges übersehen.


    Die Idee den PWM Ausgang zu "missbrauchen" scheint mir reizvoll, bin aber nicht sicher ob man dies Timingmässig unterkriegt. Wäre ein interessantes Experiment.


    Hier der Code meines Versuchs. PIN.B wäre das SPI Taktsignal, PINB.3 die SPI Datenleitung und PORTB.0 der Datenausgang für den WS2811 LedStrip.


  • Ich habe hier mal die Schaltung mit dem 74HCT123(A) dual Monoflop gemacht, welches ja problemlos Pulsweiten bis unter 100 ns erzeugen können sollte. Nach gründlichem Studium des Datenblattes bin ich zum Schluss gekommen, dass man es trotz der im vorigen Post erklärten Zusammenhänge mit einer sehr einfachen Zusatzbeschaltung betreiben kann (nur XORs). Wichtig dabei ist, dass der SCK an den beiden Trigger-Eingängen bereits auf Low ist, bevor ein etwaiger Pegelwechsel am MOSI eine steigende Flanke an einem der /RD-Pins erzeugt. /RD triggert bei steigender Flanke nämlich nur dann auch selbst das Monoflop, wenn /A Low und B High ist. /A muss auf Low sein, damit B überhaupt triggert, also muss man darauf achten, dass an /RD nur dann eine aufsteigende Flanke entstehen kann, wenn B Low ist. Da der SPI ja im Mode Pegel 0, Phase 0 erst bei fallender SCK-Flanke den MOSI-Pegel ev. ändert (bei steigender SCK-Flanke wird dann beim Slave gesamplet), muss man 'nur' dafür sorgen, dass diese sicher etwas früher bei B ankommt, als ein etwaiger Flankenwechsel an /RD. Deshalb habe ich die XOR-Gatter nur bei den /RD-Eingängen eingeplant, nicht aber bei den B-Eingängen. Die Gatter sorgen dann für die paar ns Verzögerung, welche ein 'falsches' Triggern verhindern sollten.


    Gruss
    Neni

  • Hi Neni


    Danke für das Update.


    Da werde ich doch morgen mal zu Pusterla (die lokale Elektronikteilehändler) pilgern und fragen ob der 74HCT123 an Lager ist.


    By the way, habe die ursprüngliche Schaltung auch noch mit der HCT Variante des Chips kurz ausprobiert. Scheint ebenfalls nicht zu funktionieren.


    Gruss

  • Hier ist noch eine weitere, etwas komplexere Umsetzer-Schaltung, welche dafür aber 'rein digital' arbeitet, d.h. ohne irgendwelche Pulsweiten etc. analog einstellen zu müssen. Sie beinhaltet auch das von Irrlicht so sehr gewünschte ;) CS-Signal (Chip Select) in positiver Logik (1 = aktiv, 0 = deaktiviert):

    Das 16 MHz Taktsignal kann vom µC geliefert werden oder aber mit einem dieser kleinen 4-Pin-Quarzoszillatoren (gibt's in SMD oder through hole) erzeugt werden. Die Schaltung ist so wie gezeigt auf den Fast Mode des WS2811 ausgelegt. Für den Slow Mode verschiebt man die drei Verbindungen von den Zählerausgängen (74HC4024) zu den NAND-Gattern einfach eins höher, also anstatt Q1, Q2 und Q3 einfach entsprechend Q2, Q3 und Q4. Man kann es auf einer Leiterplatte auch mit 3 Auswahl-Lötbrücken oder 3 Auswahl-Jumpern realisieren, wenn man die Flexibilität der Mode-Umschaltung benötigt. Man könnte für den Slow Mode auch einfach ein 8 MHz Taktsignal (anstatt 16) nehmen, was ich aber weniger empfehlen würde, da die Zeitauflösung der Schaltung sinkt. Mit 16 MHz ist die maximale Variationsbreite der Pulsweite +/- 62,5 ns, mit 8 MHz wäre sie +/- 125 ns, was dann doch recht nahe an die im WS2811-Datenblatt spezifizierten max. +/- 150 ns rankommt.
    Für das 4-fache AND und das 4-fache NAND sollte man wirklich die angegebenen Typen verwenden, also AHCT, da diese deutlich schneller sind (A) und TTL-Pegel-Thresholds (T) haben (wichtig für 3,3 V Signale). Den Zähler (4024) gibt's 'nur' in HC, aber auch in HC kann er bei 5V im Minimum 30 MHz 'zählen'.


    Gruss
    Neni

  • Hallo


    Mittlerweile habe ich die Schaltung mit dem 74123 auf dem Breadboard nachgebaut. Allerdings musste ich auf den 74HC123 satt des 74HCT123 ausweichen, da der HCT-Typ auf die schnelle nicht erhältlich war. Fürs Timming habe ich bei den C jeweils 100pF eingesetzt und für die zugehörigen Wiederstände 2.2k für 0, sowie 10k und 8.2k parallel (ergibt ca. 4.5k) für 1 verbaut. Damit passen die Impulslängen recht genau.



    Für die Lieferung der Daten an die Schaltung benutze ich einen Raspberry PI. Der SPI Driver ist gepatcht um die 800khz Outputfrequenz zu ermöglichen (siehe http://www.raspberrypi.org/phpBB3/viewtopic.php?f=44&t=43442).
    Mit dieser Kombination ist es nun möglich einen WS2811 resp. WS2812 basierten Ledstreifen anzusteuern. :D8)


    Im Oszi sieht das Ausgangsignal wie folgt aus (Grün=Ausgangssignal, Gelb=MOSI):


    Anzumerken bleibt noch, dass das Monoflop für den 0-Impuls (0.25us) zum Teil dazu neigt nach der Generierung des ersten Pulses noch einen zweiten Puls zu produzieren.

    Da diese Problem meist nur auftritt, wenn noch ein Oszi am Ausgang hängt, nehme ich mal an, dass der Aufbau auf dem Breadboard und der zugehörige Kabelverhau (siehe unten folgendes Bild) zwischen Raspi, Schaltung Oszi und Ledstripe sich ungünstig auswirkt.


    Um die Schaltung noch etwas praxistauglicher zu machen, wäre eine kleine Verstärkerstufe am Ausgang ev. eine Überlegung wert. Damit wären auch etwas längere Leitungen von der Schaltung zum Ledstripe weniger problematisch.


    Viele Grüsse


    Tom

  • Hallo Tom,


    schön dass es klappt :) .


    Pobier's doch mal auch noch so:

    Das übrig gebliebene XOR ist hier als nochmalige Verzögerungsstufe für MOSI geschaltet. Möglicherweise treten dann auch die Doppeltrigger nicht mehr auf, auch mit dem Drahtverhau. Übrigens ist die HC-Version durchaus kompatibel mit der HCT-Version, was das Timing betrifft. Die HCT-Version wird nur deswegen benötigt, damit die 3,3V-High-Pegel, die üblicherweise vom Raspi kommen, auch sicher als High erkannt werden, wenn die Schaltung bei 5V betrieben wird (was sie wegen der 5V am WS2811 ja auch sollte).


    PS: Wenn du Pusterla kennst, dann bist du sicher auch in/um-herum Zürich beheimatet :) .


    Gruss
    Neni