Steuerung von 500 LEDs mit PWM

26

Ich erwäge, ein Projekt zu übernehmen, bei dem 500 LEDs einzeln adressiert werden, wobei jeweils die PWM-Unterstützung optimal ist.

Ich habe vor, ein Arduino zu verwenden, da ich bereits eines habe. Ich bin jedoch offen für Vorschläge, wenn jemand der Meinung ist, dass eine andere Plattform besser zu mir passt.

Schieberegister müssten eingesetzt werden. Was ist in dieser Situation ein gutes Schieberegister? Wenn PWM dieses Projekt sehr viel teurer macht, kann ich darauf verzichten. Ich möchte versuchen, weniger als 100 Dollar auszugeben. Ich würde 500 LEDs von eBay kaufen.

Was ist Ihre Meinung dazu, wie Sie eine so große Anzahl von LEDs am besten steuern können? Wie würde ich auch vorgehen, um den Strom bereitzustellen? Ich würde mich über jede Hilfe freuen. Ich bin ziemlich erfahren mit Elektronik, ich habe einfach noch nie etwas in so großem Maßstab gemacht.

littlebirdceo
quelle

Antworten:

14

Ich bin der Autor der ShiftPWM-Bibliothek und habe die Dokumentation soeben aktualisiert, dass sie Schaltpläne und viel allgemeinere Informationen für normale LEDs, LED-Streifen und Hochleistungs-LEDs enthält.

Sie haben wahrscheinlich bereits mit Ihrem Projekt begonnen, aber da diese Seite viele Besucher hat, möchte ich dennoch eine ausführliche Antwort geben.

Wenn Sie 500 LEDs mit ShiftPWM steuern möchten, können Sie ungefähr 64 Helligkeitsstufen pro LED bei 60 Hz erhalten. Sie würden 64 Schieberegister verwenden. Spezielle Hardware-PWM-Treiber bieten mehr Helligkeit, sind jedoch 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 den TLC5916 von TLC5917 anstelle von normalen Schieberegistern wählen, da sie einen eingebauten Konstantstrom-LED-Treiber haben. Dies erspart Ihnen viel Löten, da Sie keine Widerstände benötigen.

Auf meiner Website ( http://www.elcojacobs.com/shiftpwm ) habe ich weitere Informationen zum Anschließen der LEDs und zum Umgang mit dem Antreiben der langen Signalkabel mit dem Arduino bei hohen Geschwindigkeiten.

Wenn Sie weitere Fragen haben, wenden Sie sich bitte.

ElcoJacobs
quelle
Hast du dir meine Antwort unten angesehen? Obwohl die von mir beschriebene Technik zusätzliche Hardware verwendet, könnte derselbe Ansatz wahrscheinlich verwendet werden, um die Geschwindigkeit Ihrer Bibliothek erheblich zu verbessern. Ich habe den Arduino nicht programmiert, daher bin ich mit den Befehlszeiten nicht vertraut, aber in einfachster Form könnten Sie die CPU-Belastung auf das reduzieren, was zum einfachen Sprengen der SPI-Bits erforderlich ist (wenn Sie sich derzeit bei 5 Zyklen befinden) pro Bit und Ihr SPI benötigt 16 Zyklen pro Byte (das wäre eine 2,5-fache Geschwindigkeitssteigerung). Sie könnten sogar in der Lage sein, einige anspruchsvollere Dinge zu tun, während Sie noch mit dieser Geschwindigkeit laufen.
Supercat
Angenommen, Sie möchten acht Helligkeitsstufen haben, die für "Voll ein", "1/2", "1/4", "1/8", "1/16", "1/32", "1/64" und "1/128" stehen. Wenn der Arduino eine "AND" - oder "OR" -Operation für einen von einem Zeiger abgerufenen Wert ausführen und diesen Zeiger in weniger als vier Zyklen inkrementieren kann, könnten Sie wahrscheinlich drei Bits pro Pixel verwenden, um Ihre Helligkeitsinformationen zu speichern und dennoch eine Übertragungsgeschwindigkeit zu erzielen 16 Zyklen pro 8 LEDs.
Supercat
Die Berechnung der PWM-Werte überlappt die SPI-Ausgabe in meiner Bibliothek. Ich starte den SPI mit 4MHz und die Berechnungen dauern 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 erzielen, indem Sie die Bitcodemodulation verwenden, bei der Sie 8 Aktualisierungsperioden haben, jede nächste Periode halb so lang wie die vorherige. Ich habe eine BCM-Version geschrieben, diese reagiert jedoch empfindlicher auf den Moment, in dem Sie die Helligkeitseinstellung aktualisieren. Bei falscher Ausrichtung kann es zu Flimmern kommen. Ich werde es aber wahrscheinlich in der Matrix-Version verwenden.
ElcoJacobs
BCM hat den Vorteil Ihres Ansatzes, dass Sie das 1 / 2,1 / 4 ... Timing nutzen können, aber immer noch nur einen Pin pro LED benötigen. Wenn Sie einen Informatikhintergrund haben, ist es möglicherweise interessant, wie die SPI-Bytes berechnet werden. Ich erhalte das Tastverhältnis aus dem Speicher (2 Uhren) und mache einen Vergleich (1 Uhr). Das Vergleichsergebnis wird im Übertrag gespeichert, sodass ich es mit einem Rotate Over Carry (1 Uhr) in das Byte verschieben kann. Durch achtmaliges Ausführen werden alle Vergleichsergebnisse in einem Byte zusammengefasst, das zum Senden an die SPI bereit ist.
ElcoJacobs
13

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 dies in vielerlei Hinsicht eine große Verbesserung darstellt.

In erster Linie macht Peggy 2.0 immer noch dasselbe: Es versorgt 25 x 25 LED-Standorte mit effizienter Energie. Peggy wurde entwickelt, um das Spiel mit LEDs etwas zu vereinfachen. Es ist ein vielseitiges und leistungsstarkes lichtemittierendes Pegboard, mit dem Sie Hunderte von LEDs in jeder gewünschten Konfiguration effizient ansteuern können, ohne einen einzelnen Lastwiderstand zu berechnen. Sie können eine bis 625 LEDs installieren, die Peggy für Sie aufleuchten lässt.


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

Axeman
quelle
Wundervoller Link! Mit Lesezeichen versehen. Ich hatte nicht vor, an so einem Projekt zu arbeiten, aber jetzt muss ich es machen. Ich habe das kleine Video gesehen :-)
Wouter Simons
@NicolaeSurdu Nicht kaputt. Ich habe es gerade erst geöffnet.
Axeman
3
Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
6

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

Sie werden mit einem AVR und Schieberegistern auf diesen vielen LEDs kein echtes PWM erhalten, aber Sie sind möglicherweise in der Lage, 2-4 Helligkeitsstufen zusammenzudrücken. Sie müssten die Zahlen durchgehen und sehen, was möglich ist.

Allegro stellt einige praktische Konstantstrom-Senken-Schieberegister zur Verfügung, die speziell für die Steuerung von LED-Arrays entwickelt wurden, sodass Sie keine zusätzlichen Widerstände benötigen, was die Sache auch einfacher macht. Sie können die LEDs möglicherweise nicht direkt über den AVR-Ausgang ansteuern, wenn dieser nicht genügend Strom liefert. Daher müssen Sie Transistoren verwenden. Sie können sie in Arrays in einem einzelnen IC speichern, was ebenfalls Arbeit spart.

davr
quelle
alles sehr gute punkte!
Jason S
5

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, die Impulse zwischen 600us und 2,4ms liefern kann. Dabei werden mit dem CD74HCT238E (3-8 Line-Demultiplexer) 64 Kanäle aus 8 E / A-Pins an einem ATMega168 generiert, die über einfache serielle Befehle gesteuert werden können. Ich vermute, Sie könnten mehrere Versionen einer modifizierten Version dieses Controllers auf einer seriellen Leitung miteinander verketten und alle 500 LEDs ansprechen ... Sie könnten wahrscheinlich die ATTiny2313-Version des Controllers verwenden, da Ihre Firmware-Anforderungen einfacher wären.

Mein Blog enthält die Assembly-Quelle sowie Schaltpläne und Details des Entwurfsprozesses.

Len Holgate
quelle
5

Schauen Sie sich die LED-Treiber-ICs auf der Maus / dem Digikey an. TI zum Beispiel stellt eine Reihe von Treibern mit einer Vielzahl von Schnittstellen (I2C, SPI) her, die sicherlich Ihren Anforderungen entsprechen. Die meisten dieser Treiber sind so ausgelegt, dass sie in Reihe geschaltet sind, sodass der serielle Ausgang eines Treibers in den seriellen Eingang eines anderen Treibers eingespeist wird.

So bietet beispielsweise der TLC5940 eine 16-Kanal-PWM-Steuerung. Im Grunde genommen handelt es sich also um ein 16-Bit-Schieberegister mit konstantem Strom und 12-Bit-Graustufen-PWM-Steuerung. Ich kann diesen speziellen IC empfehlen, da ich beim Entwerfen eines 80x16-Displays mitgeholfen habe.

David Brenner
quelle
4

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 recht einfach ein System zusammenstellen


quelle
4

Wenn Sie nicht zu viele Bits der PWM-Steuerung für jede LED benötigen und vermeiden möchten, dass ein Prozessor bei jedem PWM-Zyklus mit 500 LEDs herumfummelt, können Sie 8 LEDs mit N Bits Helligkeit mit N 74HC595 oder entsprechenden Chips steuern . Verdrahten Sie die Ausgänge aller N Chips miteinander und verdrahten Sie die Aktivierungen mit einigen Schaltungen, die jeweils nur einen mit einer geeigneten Zeitsteuerung aktivieren. Ordnen Sie dies so an, dass der erste Chip die Hälfte der Zeit aktiviert wird, der zweite für den halben Rest usw.

Ein erneutes Laden der Schieberegister sollte mit der PWM-Rate synchronisiert werden, um Aliasing-Effekte zu minimieren (z. B. wenn ein Helligkeitspegel schnell zwischen 0111 und 1000 umgeschaltet wurde, kann der Zeitpunkt im PWM-Zyklus, an dem der Wechsel erfolgte, die scheinbare Helligkeit vorübergehend ändern ).

Die Verwendung mehrerer 74HC595-Ausgänge für jede LED kann ärgerlich sein, aber dieser Ansatz ist wahrscheinlich der einfachste, mit dem unterschiedliche Helligkeitsstufen ohne laufenden CPU-Eingriff beibehalten werden können.

Superkatze
quelle
3

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 500-Batch. Dies ist besonders wichtig, wenn diese LEDs wie in einer Matrix oder in 7-Segment-Anzeigen nahe beieinander montiert sind. In dieser Antwort finden Sie weitere Informationen zur Behebung dieses Problems, insbesondere zur Verwendung der Punktkorrektur, um Schwankungen der LED-Helligkeit auszugleichen.

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

  1. Ich habe einen LED-Tester in ein Steckbrett eingebaut, um LED-Sätze in verschiedene Helligkeitsklassen einzuteilen
  2. Ich habe jedes Segment mit LEDs der gleichen Kategorie montiert (in meinem Design bestand jedes Segment aus 5 in Reihe montierten LEDs)
  3. Ich habe den Unterschied in jeder Segmenthelligkeit mit unterschiedlichen Strombegrenzungswiderständen kompensiert. Zum Beispiel würde ich für ein Segment mit helleren LEDs einen 100-Ohm-Widerstand verwenden, während ich für ein anderes Segment mit schwächeren LEDs 120-Ohm-Widerstände verwenden würde.
Ricardo
quelle
1
Gültiger Punkt, aber beantwortet die Frage nicht.
Matt Young
1
@MattYoung Einverstanden. Die Frage wird weitgehend von allen anderen Antworten beantwortet. Ich wollte diese Antworten nur ergänzen und ein Nebenproblem ansprechen, das sich auf das Design des OP auswirken könnte.
Ricardo
1

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

Leon

Leon Heller
quelle
1

Engagierte Treiberchips mit seriellen Schnittstellen werden in der Tat wahrscheinlich die beste Route sein. Der Umgang mit einzelnen Schieberegistern wird wahrscheinlich eine sehr komplexe Schaltung bedeuten. Zumindest machen Maxim und TI welche. Ich erinnere mich nicht, ob eines der beiden Modelle dafür besonders geeignet ist.

Es wird noch viel Hardware brauchen.

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

XTL
quelle
1

Im Softwarebereich kann es hilfreich sein, die Daten im Bit-Planar-Format (wie in meiner anderen hardwarebasierten Antwort beschrieben) zu speichern, wenn die Anzahl der benötigten Helligkeitseinstellungen nicht zu groß ist Ausgaberoutinen verwenden Boolesche Operatoren, um 8 Pixel gleichzeitig zu bearbeiten. Für eine maximale Effizienz sind mehrere separate Ausgaberoutinen erforderlich, 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 Vergleichers (FF, wenn frei)
  iorwf POSTINCF, w; Bit 0 von Daten; benutze immer IORWF
  undwf POSTINCF, w; Bit 1 von Daten; verwende IORWF, wenn Bit 1 des Vergleichers gesetzt ist; ANDWF wenn klar
  undwf POSTINCF, w; Bit 2 von Daten; Verwenden Sie IORWF, wenn Bit 1 des Komparanden gesetzt ist. ANDWF wenn klar
  undwf POSTINCF, w; Bit 2 von Daten; Verwenden Sie IORWF, wenn Bit 1 des Komparanden gesetzt ist. ANDWF wenn klar
  movwf SPIREG; Ergebnisbyte speichern (Bits gesetzt, wenn> = Vergleicher)

Man würde verschiedene Kombinationen von IORWF und ANDWF verwenden, abhängig vom Wert des Komparanden. Es ist zu beachten, dass unter Verwendung dieses Ansatzes, wie dargestellt, Pixelhelligkeitswerte an jedem Punkt im PWM-Zyklus ohne Flimmern aktualisiert werden können, vorausgesetzt, dass alle vier Bits zwischen Aufrufen der Anzeigeverschiebungsroutine geschrieben werden, oder indem die Pixelaktualisierungsroutine bestimmt, ob die Die nächste Verschiebung gibt eine "1" oder eine "0" für das Pixel aus und setzt oder löscht alle Bits des Pixels (welche Operation es auch immer veranlassen würde, das zu tun, was es ohnehin tun würde) und schreibt dann alle Bits, deren Wert es sollte gegenüber sein. Man beachte auch, dass man willkürliche nichtlineare Helligkeitsskalen erzielen kann, indem man den Zeitpunkt der Anzeigeaktualisierungen variiert oder einige Vergleichswerte mehr als einmal in einem PWM-Zyklus verwendet.

Superkatze
quelle
1

FPGAs oder CPLDs können für solche Aufgaben gut geeignet sein, da sie viele E / A-Pins bieten. Entscheide dich für die einfachsten und billigsten. Wenn einer nicht ausreicht, benutze ein Paar.

Carl
quelle
Können Sie uns ein paar Details dazu geben, warum dies eine gute Option ist? Ich weiß es gerade, aber ich weiß, welche Optionen es gibt und welche vorgeschlagenen Technologien Sie auflisten ein Hintergrund.
Kortuk
Ich bin mir nicht sicher, ob es die beste Option ist, wollte es aber der Vollständigkeit halber erwähnen. Wenn 500 LEDs auf die eine oder andere Weise mit PWMs angesteuert werden sollen, werden letztendlich 500 einzeln ansteuerbare Drähte benötigt. Es ist schwer, einen Mikrocontroller mit so vielen Ausgangspins zu finden. Es gibt noch viele Möglichkeiten, Mikrocontroller zu verwenden, aber ein oder mehrere billige CPLDs / FPGAs könnten diese Ausgangspins problemlos bereitstellen.
Carl
1

Mit einer PSoC3 oder PSoC5 ist dies mit ziemlicher Sicherheit problemlos möglich .

Die PSoC-Chips sind Mikrocontroller mit rekonfigurierbarer digitaler Hardware, ähnlich einem FPGA oder CPLD. Dies bedeutet, dass Sie komplexe Schaltungen erstellen können, um ungewöhnliche Aufgaben wie das Ansteuern von 500 LEDs mit PWM auszuführen. Darüber hinaus können Sie das Ganze wahrscheinlich mit den neu konfigurierbaren 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önnte dies funktionieren. Erraten Sie, was? Die PSoC hat mehr als das.

Sie können auf einfache Weise 24 PWM-Kanäle auf einem PSoC einrichten und 21 andere Pins als Teil eines Schieberegisters konfigurieren. Konfigurieren Sie als Nächstes 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 Grafiken generieren. Die PSoC3 verfügt über einen 8-Bit-8051-Kern, während die PSoC5 über einen 32-Bit-ARM verfügt. Treffen Sie Ihre Wahl. Die einzigen externen ICs, die Sie benötigen, sind einige ULN2803, um den hohen Treiberstrom für die Zeilen bereitzustellen. Die PWM-Ausgänge sollten genug Strom für einzelne LEDs haben.

Raketenmagnet
quelle
Dies ist ein totaler Overkill für das Ansteuern von LEDs. Es gibt dedizierte, billige, vorgefertigte LED-Treiber, mit denen große Mengen wie diese verkettet werden können und die ständig für gigantische Displays verwendet werden. Das alles muss nicht neu erfunden werden, und das zu höheren Kosten.
nemik
@nemik - Tatsächlich betragen die Gesamtkosten der Chips (von teurem Farnell) nur £ 6,80.
Rocketmagnet
0

Skaleneffekte nutzen. Chinesische Websites wie Aliexpress verkaufen WS2811-basierte LED-Stränge für ~ 15 USD pro 50 LEDs. Sie sind einzeln adressierbar, hell, normalerweise wasserdicht und haben PWM für Helligkeit. Keine Löt- oder Schieberegister. Ich wette, all dies selbst zu tun kostet dich mehr, nimmt dir viel mehr Zeit und ist sehr frustrierend. Außerdem sind Sie in Oz, damit der Versand aus China nicht zu teuer wird.

Diese sind für die Herstellung von riesigen LED-Displays gedacht, daher sind sie in der Regel recht billig. Stellen Sie einfach sicher, dass Sie etwa alle 50 LEDs erneut Strom einspeisen, um eine optimale Leistung zu erzielen.

Es gibt auch Arduino-Bibliotheken, um die Verwendung zu vereinfachen.

nemik
quelle
1
15 $ pro 50 LEDs? Für 500 LEDs sind das also 150 US-Dollar? Und Sie haben den Mut, mir mitzuteilen, dass meine Lösung teuer ist? -1
Rocketmagnet
Bitte geben Sie auch einen Link dazu an. WS801 funktioniert bei Google nicht gut und es wird auch nicht nach Aliexpress
Rocketmagnet
Entschuldigung, ich meinte WS2811, wie diese aliexpress.com/store/product/… oder, ohne PWM Verdunkelung
nemik
Ein serielles Signal zur Ansteuerung von 50 LEDs mit PWM-Dimmung. Danke, genau das bin ich. Ein Standard-Schieberegister stellt jedoch einen "Latch" -Pin bereit, um gepufferte Daten auf die Ausgänge zu kopieren, nachdem der vollständige Frame übertragen wurde. Hier gibt es keine Lasche, daher erwarte ich bei hohen Bildwiederholraten ein spürbares Rauschen. Die Chips unterstützen 400-Kbit / s-Daten mit 15 Bit pro Pixel, sodass der Bildschirm für 1,9 Millisekunden Unsinn anzeigt, während der Frame aktualisiert wird.
Nialsh