Steuerung von 500 LEDs mit PWM

Ich erwäge, ein Projekt zu übernehmen, bei dem 500 LEDs individuell adressiert werden, optimalerweise mit PWM-Unterstützung für jede.

Ich plane die Verwendung eines Arduino, da ich bereits einen habe, aber ich bin offen für Vorschläge, wenn jemand der Meinung ist, dass eine andere Plattform besser geeignet wäre.

Es müssten Schieberegister verwendet werden. Was ist ein gutes Schieberegister in dieser Situation? Wenn PWM dieses Projekt viel teurer macht, kann ich gut darauf verzichten. Ich möchte versuchen weniger als 100€ auszugeben. Ich würde 500 LEDs in großen Mengen bei ebay kaufen.

Was ist Ihrer Meinung nach der beste Weg, um eine so große Anzahl von LEDs zu steuern? Und wie würde ich vorgehen, um den Strom bereitzustellen? Ich würde mich über jede Hilfe freuen. Ich bin ziemlich erfahren mit Elektronik, ich habe nur noch nie etwas in so großem Umfang gemacht.

Antworten (15)

Ich bin der Autor der ShiftPWM-Bibliothek und habe gerade die Dokumentation aktualisiert, um Schaltpläne und viel mehr allgemeine Informationen für normale LEDs, LED-Streifen und Hochleistungs-LEDs aufzunehmen.

Wahrscheinlich haben Sie Ihr Projekt bereits gestartet, aber da diese Seite viele Besucher hat, möchte ich trotzdem eine ausführliche Antwort geben.

Wenn Sie 500 LEDs mit ShiftPWM ansteuern möchten, können Sie bei 60 Hz etwa 64 Helligkeitsstufen pro LED erhalten. Sie würden 64 Schieberegister verwenden. Dedizierte Hardware-PWM-Treiber geben Ihnen mehr Helligkeitsstufen, sind aber etwas teurer. Ich denke, der Hauptvorteil meiner Bibliothek ist die Benutzerfreundlichkeit, da sie RGB- und HSV-Funktionen und viele Beispiele enthält.

Ich persönlich würde mich für den TLC5916 von TLC5917 anstelle von normalen Schieberegistern entscheiden, weil sie einen eingebauten Konstantstrom-LED-Treiber haben. Dies erspart Ihnen viel Lötarbeit, da Sie keine Widerstände benötigen.

Auf meiner Website ( http://www.elcojacobs.com/shiftpwm ) habe ich mehr Informationen darüber, wie man die LEDs anschließt und wie man mit dem Ansteuern der langen Signaldrähte mit dem Arduino bei hohen Geschwindigkeiten umgeht.

Wenn Sie weitere Fragen haben, fragen Sie bitte.

Hast du dir meine Antwort unten angesehen? Obwohl die von mir beschriebene Technik zusätzliche Hardware verwendet, könnte der gleiche Ansatz wahrscheinlich verwendet werden, um die Geschwindigkeit Ihrer Bibliothek erheblich zu verbessern. Ich habe den Arduino nicht programmiert, daher bin ich mit seinen Befehlszeiten nicht vertraut, aber in der einfachsten Form könnten Sie Ihre CPU-Last auf das reduzieren, was erforderlich wäre, um einfach Bits aus dem SPI zu sprengen (wenn Sie derzeit bei 5 Zyklen sind). pro Bit und Ihr SPI benötigt 16 Zyklen pro Byte, das wäre eine 2,5-fache Beschleunigung). Vielleicht können Sie sogar anspruchsvollere Dinge tun, während Sie immer noch mit dieser Geschwindigkeit laufen.
Angenommen, Sie möchten beispielsweise acht Helligkeitsstufen haben, die Vollständig, 1/2, 1/4, 1/8, 1/16, 1/32, 1/64 und 1/128 darstellen. Wenn der Arduino eine „UND“- oder „ODER“-Operation an einem von einem Zeiger abgerufenen Wert ausführen und diesen Zeiger in weniger als vier Zyklen erhöhen kann, könnten Sie wahrscheinlich drei Bits pro Pixel verwenden, um Ihre Helligkeitsinformationen zu speichern und dennoch eine Übertragungsgeschwindigkeit zu erreichen von 16 Zyklen pro 8 LEDs.
Die Berechnung der PWM-Werte überlappt die SPI-Ausgabe in meiner Bibliothek. Ich betreibe den SPI mit 4 MHz und die Berechnungen dauern nur etwas länger als die SPI-Ausgabe. Es dauert 43 Taktzyklen pro Byte, also pro 8 Ausgänge. Dies ist für die meisten Setups schnell genug. Sie können mehr Geschwindigkeit erreichen, indem Sie die Bitcode-Modulation verwenden, bei der Sie 8 Aktualisierungsperioden haben, wobei jede nächste Periode die Hälfte der Dauer der vorherigen ist. Ich habe eine BCM-Version geschrieben, aber sie reagiert empfindlicher auf den Moment, in dem Sie die Helligkeitseinstellung aktualisieren. Es kann ein Flackern verursachen, wenn es falsch ausgerichtet ist. Ich werde es aber wahrscheinlich in der Matrix-Version verwenden.
BCM hat den Vorteil Ihres Ansatzes, dass Sie das Timing 1/2,1/4 ... nutzen können, aber immer noch nur einen Pin pro LED benötigen. Wenn Sie einen Informatikhintergrund haben, wird es Sie vielleicht interessieren, wie die SPI-Bytes berechnet werden. Ich erhalte das Tastverhältnis aus dem Speicher (2 Takte) und vergleiche (1 Takt). Das Vergleichsergebnis wird im Übertrag gespeichert, sodass ich es mit einem Rotationsübertrag (1 Takt) in das Byte verschieben kann. Wenn Sie dies 8 Mal tun, werden alle Vergleichsergebnisse in einem Byte abgelegt, das bereit ist, an die SPI gesendet zu werden.

Einfach kopieren :-)

http://www.evilmadscientist.com/article.php/peggy2

Heute veröffentlichen wir ein Update für unser Open-Source-LED-Pegboard-Projekt „Peggy“. Peggy Version 2 wurde von Grund auf neu gestaltet. Und es sieht … fast genauso aus. Die Änderungen unter der Haube sind jedoch erheblich, und wir denken, dass es in vielerlei Hinsicht eine große Verbesserung ist.

In erster Linie macht Peggy 2.0 immer noch dasselbe verdammte Ding: Es versorgt ein 25 x 25-Array von LED-Positionen effizient mit Strom. Peggy wurde entwickelt, um etwas von dem Stich, der Komplexität und dem Durcheinander beim Spielen mit LEDs zu nehmen. Es ist eine vielseitige und leistungsstarke lichtemittierende Stecktafel, mit der Sie Hunderte von LEDs in jeder beliebigen Konfiguration effizient ansteuern können, ohne auch nur einen einzigen Lastwiderstand zu berechnen. Sie können beliebig zwischen einer und 625 LEDs installieren, und Peggy wird sie für Sie zum Leuchten bringen.


Peggy 2.0 ist jetzt auch Arduino-kompatibel: Es unterstützt die Programmierung über ein USB-TTL-Kabel unter Verwendung der beliebten Arduino-Softwareumgebung.

Wunderbarer Link! Markiert. Ich hatte nicht vor, an einem Projekt wie diesem zu arbeiten, aber jetzt, wo ich das kleine Video gesehen habe, muss ich es schaffen :-)
@NicolaeSurdu Nicht kaputt. Ich habe es gerade geöffnet.
Während dies die Frage theoretisch beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.

In welchem ​​Layout möchten Sie die LEDs haben? Sie können viel Arbeit sparen, wenn Sie einige LED-Matrizen kaufen, Sie können einfarbige 8x8-LED-Matrizen (64 LEDs) für ein oder zwei Dollar bekommen .

Mit einem AVR und Schieberegistern auf so vielen LEDs erhalten Sie kein echtes PWM, aber Sie können möglicherweise 2-4 Helligkeitsstufen drücken. Sie müssten die Zahlen ausführen und sehen, was möglich ist.

Allegro stellt einige praktische Konstantstromsenken-Schieberegister her, die speziell für die Steuerung von LED-Arrays entwickelt wurden, sodass Sie keine zusätzlichen Widerstände benötigen, was die Dinge ebenfalls vereinfacht. Möglicherweise können Sie die LEDs nicht direkt vom AVR-Ausgang ansteuern, wenn dieser nicht genügend Strom liefern kann, sodass Sie Transistoren verwenden müssen. Sie können sie in Arrays in einem einzigen IC erhalten , was auch etwas Arbeit spart.

alles sehr gute punkte!

Ich habe keine Ahnung, welchen PWM-Bereich Sie für eine LED benötigen, aber ich habe an einem 64-Kanal-PWM-Controller für eine Servosteuerungsanwendung gearbeitet, der mir Impulse zwischen 600 us und 2,4 ms geben kann. Dies verwendet CD74HCT238E (3-8-Zeilen-Demultiplexer), um 64 Kanäle aus 8 E / A-Pins auf einem ATMega168 zu erzeugen, und ist über einfache serielle Befehle steuerbar. Ich denke, Sie könnten mehrere Versionen einer modifizierten Version dieses Controllers auf einer seriellen Leitung miteinander verketten und alle 500 LEDs adressieren ... Sie könnten wahrscheinlich die ATTiny2313-Version des Controllers verwenden, da Ihre Firmware-Anforderungen einfacher wären.

Mein Blog enthält die Montagequelle und Schaltpläne sowie Details des Designprozesses.

Schauen Sie sich "LED-Treiber"-ICs auf mouser/digikey an. TI stellt beispielsweise eine Reihe von Treibern mit einer Vielzahl von Schnittstellen (I2C, SPI) her, die sicherlich Ihren Anforderungen entsprechen würden. Die meisten dieser Treiber sind so konzipiert, dass sie in Reihe geschaltet werden können, sodass der serielle Ausgang von einem in den seriellen Eingang eines anderen eingespeist wird.

Beispielsweise bietet etwas wie der TLC5940 eine 16-Kanal-PWM-Steuerung. Im Grunde handelt es sich also um ein Konstantstrom-16-Bit-Schieberegister mit 12-Bit-Graustufen-PWM-Steuerung. Ich kann diesen speziellen IC empfehlen, da ich damit geholfen habe, ein 80x16-Display zu entwerfen.

Mondomatrix stellt einige seriell (rs-485) adressierbare LED-Treiberplatinen her und basiert auf der Arduino-Plattform: http://www.displayduino.com/ Möglicherweise können Sie mit dieser Hardware ziemlich einfach ein System zusammenstellen

Wenn Sie nicht zu viele Bits PWM-Steuerung für jede LED wünschen und vermeiden möchten, dass ein Prozessor bei jedem PWM-Zyklus mit 500 LEDs herumfummeln muss, können Sie 8 LEDs mit N Bits Helligkeit mit N 74HC595 oder gleichwertigen Chips steuern . Verdrahten Sie die Ausgänge aller N Chips miteinander und verdrahten Sie die Freigaben mit einigen Schaltungen, die jeweils nur eine mit geeignetem Timing aktivieren. Ordnen Sie es so an, dass der erste Chip für die Hälfte der Zeit aktiviert wird, der zweite für die Hälfte des Rests usw.

Jedes Neuladen der Schieberegister sollte mit der PWM-Rate synchronisiert werden, um Aliasing-Effekte zu minimieren (z. B. wenn ein Helligkeitspegel schnell zwischen 0111 und 1000 wechselt, könnte der Punkt im PWM-Zyklus, an dem die Umschaltung erfolgte, die scheinbare Helligkeit vorübergehend ändern ).

Während die Verwendung mehrerer 74HC595-Ausgänge für jede LED lästig sein kann, ist dieser Ansatz wahrscheinlich der einfachste, der unterschiedliche Helligkeitsstufen ohne laufenden CPU-Eingriff aufrechterhalten könnte.

Dies beantwortet die Frage nicht direkt, aber ein weiterer Aspekt, den Sie möglicherweise berücksichtigen müssen, ist die mögliche Helligkeitsvariabilität zwischen den LEDs in Ihrem 500er-Charge. Das ist besonders wichtig, wenn diese LEDs nahe beieinander montiert sind, wie in einer Matrix oder in 7-Segment-Anzeigen. In dieser Antwort finden Sie weitere Einzelheiten zur Behebung dieses Problems, insbesondere zur Verwendung der Punktkorrektur, um Schwankungen in der LED-Helligkeit zu kompensieren.

Ich habe dieses Problem erlebt, als ich 200 rote 1-mm-LEDs für einen Satz großer 7-Segment-Anzeigen bekam, die ich baute. Meine billige Lösung zur Lösung des Problems beinhaltete Folgendes:

  1. Ich habe einen LED-Tester in einem Steckbrett gebaut, um LED-Sätze in verschiedene Helligkeitskategorien zu klassifizieren
  2. Ich habe jedes Segment mit LEDs derselben Kategorie montiert (in meinem Design bestand jedes Segment aus 5 in Reihe montierten LEDs)
  3. Ich habe den Unterschied in der Helligkeit jedes Segments mit verschiedenen Strombegrenzungswiderständen kompensiert. Beispielsweise würde ich für ein Segment mit helleren LEDs einen 100-Ohm-Widerstand verwenden, während ich für ein anderes Segment mit dunkleren LEDs 120-Ohm-Widerstände verwenden würde.
Gültiger Punkt, beantwortet aber nicht die Frage.
@ MattYoung Einverstanden. Die Frage wird weitgehend durch alle anderen Antworten beantwortet. Ich wollte diese Antworten nur ergänzen und ein Nebenproblem ansprechen, das sich auf das Design des OP auswirken kann.

Ich schlage vor, die in diesem Artikel http://www.artisticlicence.com/WebSiteMaster/App%20Notes/appnote011.pdf beschriebene Technik der binären Winkelmodulation zu verwenden

Oder überprüfen Sie die ShiftPWM-Bibliothek http://www.elcojacobs.com/shiftpwm/

Während dies die Frage theoretisch beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.

XMOS verwendet den Macroblock MBI5026 mit seinen LED-Kachel-Kits. Ich denke, dass sie in den meisten anderen professionellen Systemen verwendet werden.

Leon

Dedizierte Treiberchips mit seriellen Schnittstellen werden in der Tat wahrscheinlich der beste Weg sein. Der Umgang mit einzelnen Schieberegistern wird wahrscheinlich eine sehr komplexe Schaltung bedeuten. Wenigstens machen Maxim und TI welche. Ich kann mich nicht erinnern, ob einer der beiden ein Modell hat, das für so viel besonders geeignet ist.

Es wird immer noch eine Menge Hardware benötigt.

In Bezug auf Leistung, Programmierung und Busse enthält das Datenblatt für jeden Treiber wahrscheinlich die meisten Informationen, die Sie benötigen.

Wenn die Anzahl der benötigten unterschiedlichen Helligkeitseinstellungen im Softwarebereich nicht zu groß ist, kann es hilfreich sein, die Daten im "bitplanaren" Format zu speichern (wie in meiner anderen hardwarebasierten Antwort beschrieben) und dann die Ausgaberoutinen verwenden boolesche Operatoren, um auf 8 Pixel gleichzeitig einzuwirken. Für maximale Effizienz erfordert dies mehrere separate Ausgaberoutinen, die für verschiedene Teile des PWM-Zyklus verwendet werden; Wenn man beispielsweise 4-Bit-Helligkeitswerte verwenden möchte, würde man acht Routinen der Form verwenden:

  movf bit0Comp,w ; Sollte 00 oder FF sein, abhängig von Bit 0 des Komparanden (FF wenn frei)
  iorwf POSTINCF,w ; Bit 0 der Daten; Verwenden Sie immer IORWF
  andwf POSTINCF,w ; Bit 1 der Daten; IORWF verwenden, wenn Bit 1 des Komparanden gesetzt ist; ANDWF wenn klar
  andwf POSTINCF,w ; Bit 2 der Daten; Verwenden Sie IORWF, wenn Bit 1 des Vergleichers gesetzt ist; ANDWF wenn klar
  andwf POSTINCF,w ; Bit 2 der Daten; Verwenden Sie IORWF, wenn Bit 1 des Vergleichers gesetzt ist; ANDWF wenn klar
  movwf SPIREG ; Ergebnisbyte speichern (Bits gesetzt wenn >= Vergleich)

Man würde verschiedene Kombinationen von IORWF und ANDWF verwenden, abhängig vom Wert des Komparanden. Man beachte, dass man unter Verwendung dieses dargestellten Ansatzes Pixelhelligkeitswerte an jedem Punkt im PWM-Zyklus ohne Flimmern aktualisieren kann, vorausgesetzt, dass alle vier Bits zwischen Aufrufen der Anzeigeverschiebungsroutine geschrieben werden, oder indem man die Pixelaktualisierungsroutine bestimmen lässt, ob die Die nächste Verschiebung gibt eine "1" oder eine "0" für das Pixel aus und setzt oder löscht entweder alle Bits des Pixels (welche Operation auch immer dazu führen würde, dass es das tut, was es sowieso tun würde) und schreibt dann alle Bits, deren Wert sollte gegenüber sein. Beachten Sie auch, dass man willkürliche nichtlineare Helligkeitsskalen erzielen kann, indem man das Timing der Anzeigeaktualisierungen variiert oder einige Vergleichswerte mehr als einmal in einem PWM-Zyklus verwendet.

FPGAs oder CPLDs können für solche Aufgaben gut sein, da sie viele I/O-Pins bieten. Entscheiden Sie sich für das Einfachste und Billigste. Wenn einer nicht ausreicht, verwenden Sie ein Paar.

Können Sie uns ein paar weitere Details darüber geben, warum dies eine gute Option ist, im Moment weiß ich darüber, aber ich weiß, welche Optionen es gibt und welche vorgeschlagenen Technologien Sie auflisten. Das Origial Poster (OP) hat wahrscheinlich keine solchen ein Hintergrund.
Ich bin mir nicht sicher, ob es die beste Option ist, wollte aber, dass es der Vollständigkeit halber erwähnt wird. Wenn man 500 LEDs auf die eine oder andere Weise mit PWMs ansteuert, werden am Ende 500 einzeln ansteuerbare Drähte benötigt. Es ist schwer, einen Mikrocontroller mit so vielen Ausgangspins zu finden. Es gibt viele Möglichkeiten, dies immer noch mit Mikrocontrollern zu umgehen, aber ein oder ein paar billige CPLDs/FPGAs könnten diese Ausgangspins leicht bereitstellen.

Sie können dies mit ziemlicher Sicherheit problemlos mit einem PSoC3 oder PSoC5 tun .

Die PSoC-Chips sind Mikrocontroller, die rekonfigurierbare digitale Hardware enthalten, ein bisschen wie ein FPGA oder CPLD. Das bedeutet, dass Sie komplexe Schaltungen für ungewöhnliche Dinge wie das Ansteuern von 500 LEDs mit PWM erstellen können. Darüber hinaus können Sie das Ganze wahrscheinlich mit den rekonfigurierbaren digitalen Blöcken implementieren, sodass der CPU-Teil des Chips nur die gewünschten LED-Helligkeiten in ein Array schreiben muss.

504 LEDs passen in ein Rechteck von 21 x 24. Wenn Sie 24 PWM-Kanäle und 21 GPIO hätten, könnten Sie dies zum Laufen bringen. Erraten Sie, was? Der PSoC hat mehr als das.

Sie können 24 PWM-Kanäle einfach auf einem PSoC einrichten und 21 andere Pins als Teil eines Schieberegisters konfigurieren. Als nächstes konfigurieren Sie einige DMA-Kanäle, um Bytes aus dem Speicher in die PWM-Ausgänge zu pumpen, und Sie lachen. Jetzt muss die CPU nur noch die Grafik generieren. Der PSoC3 hat einen 8-Bit-8051-Kern, während der PSoC5 einen 32-Bit-ARM hat. Treffen Sie Ihre Wahl. Die einzigen externen ICs, die Sie benötigen, sind einige ULN2803s, um den hohen Treiberstrom für die Zeilen bereitzustellen. Die PWM-Ausgänge sollten genügend Strom für einzelne LEDs haben.

Dies ist ein totaler Overkill für das Ansteuern von LEDs. Es gibt spezielle, billige, vorgefertigte LED-Treiber, die für die Verkettung großer Mengen wie dieser entwickelt wurden und die ständig für gigantische Displays verwendet werden. Sie müssen das alles nicht neu erfinden und das zu höheren Kosten.
@nemik - Tatsächlich betragen die Gesamtkosten der Chips (vom teuren Farnell) nur 6,80 £.

Nutzen Sie Skaleneffekte. Chinesische Seiten wie Aliexpress verkaufen WS2811-basierte LED-Stränge für ~15 US-Dollar pro 50 LEDs. Sie sind einzeln adressierbar, hell, normalerweise wasserdicht und haben PWM für die Helligkeit. Auch kein Löten oder Schieberegister zum Durcheinander. All dies selbst zu tun, wird Sie bestimmt mehr kosten, viel mehr Zeit in Anspruch nehmen und sehr frustrierend sein. Außerdem befinden Sie sich in Oz, sodass der Versand aus China nicht zu teuer ist.

Diese sind für die Herstellung riesiger LED-Displays gedacht, daher sind sie in der Regel ziemlich billig. Stellen Sie einfach sicher, dass Sie die Stromversorgung etwa alle 50 LEDs oder so neu einspeisen, um die beste Leistung zu erzielen.

Es gibt auch Arduino-Bibliotheken, um sie einfach zu verwenden.

$15 pro 50 LEDs? Für 500 LEDs sind das also 150 US-Dollar? Und Sie haben die Frechheit, mir zu sagen, dass meine Lösung teuer ist? -1
Könnten Sie bitte auch einen Link dazu bereitstellen. WS801 ist bei Google nicht gut und taucht auch nicht bei einer Suche bei Aliexpress auf
Entschuldigung, ich meinte WS2811, wie diese aliexpress.com/store/product/… oder, ohne PWM-Dimmung, diese aliexpress.com/store/product/…
Ein serielles Signal zur Ansteuerung von 50 LEDs mit PWM-Dimmung. Danke, genau darum geht es mir. Ein Standard-Schieberegister stellt jedoch einen "Latch"-Pin bereit, um gepufferte Daten zu den Ausgängen zu kopieren, nachdem der vollständige Rahmen übertragen wurde. Hier gibt es keine Verriegelung, daher erwarte ich ein merkliches Rauschen bei hohen Bildwiederholraten. Die Chips unterstützen 400-Kbps-Daten mit 15 Bit pro Pixel, sodass der Bildschirm 1,9 Millisekunden lang Unsinn anzeigt, während der Frame aktualisiert wird.