Möglichkeit zur Ansteuerung einer dimmbaren LED-Matrix

Ich habe eine Anfängerfrage: Ich möchte eine benutzerdefinierte LED-Matrix (mindestens 7x7; nur einfarbig) erstellen, bei der jede LED-Reihe separat oder idealerweise sogar jede LED gedimmt werden kann. Das Ganze sollte von einem Arduino oder einem anderen Mikrocontroller gesteuert werden.

Ich habe umfangreiche Programmierkenntnisse, aber meine Elektronikkenntnisse beschränken sich auf die Thames-and-Kosmos-Bausätze, mit denen ich als Kind "gespielt" habe, dh ich kann einfache Schaltpläne interpretieren, aber das war es auch schon. Im Moment möchte ich nur wissen, ob das Folgende machbar ist, was die Hardwareanforderungen ungefähr wären und ob ein Neuling wie ich dazu in der Lage wäre. Gibt es überhaupt eine Hardwarelösung von der Stange?

Vielen Dank für Ihre Antworten und Geduld mit einem Anfänger.

Andreas

PS: Meine ursprünglich gepostete Frage enthält falsche Anforderungen (zweifarbige LED), weshalb ich diese ziemlich ähnliche Frage gepostet habe. Eine der Antworten dort verlinkt auf einen verwandten Thread , der nicht wirklich hilft, meine Fragen zu beantworten.

Wie viele diskrete Helligkeitsstufen möchten Sie? Warum?
Eine Ebene pro Reihe. Es ist für ein wissenschaftliches Projekt in einem biologischen Labor.
eine Ebene pro Zeile ist wunderbar . Siehe Ergänzung am Ende der Antwort.

Antworten (2)

Reihen-/Spalten-Multiplexanzeige: Eine sehr traditionelle und recht einfache Möglichkeit, dies zu tun, besteht darin, Ihre LEDs in einer (typischerweise mit 8-Bit-Ports) bis zu 8 x 8 Zeilen- und Spaltenanzeige anzusteuern. Sie können dann Daten für die 8 LEDs ausgeben in einer Spalte und aktivieren Sie die entsprechende Spalte, oder geben Sie Daten für eine Zeile aus und aktivieren Sie dann den entsprechenden Zeilentreiber. Es sind 8 Schreibvorgänge aufeinanderfolgender Spalten oder Zeilen erforderlich, um alle 64 LEDs zu durchlaufen. Dies muss schnell genug erfolgen, um sichtbares Flimmern zu vermeiden. Sie können diese Anordnung pulsweitenmodulieren, indem Sie ausgewählte LEDs nur bei einigen Gelegenheiten einschalten, oder Sie können den Zeitraum variieren, in dem jede LED eingeschaltet ist, wenn eine Zeile oder Spalte aktiviert ist. Beide haben ihre Vor- und Nachteile und Herausforderungen.

Das folgende Diagramm zeigt eine gemultiplexte 7-Segment-Anzeige. Hier kann man sich eine einzelne Anzeige als die 7 (oder 8) Datenbits für eine Zeile vorstellen, und der Transistor über jeder Anzeige ist die Zeilenfreigabe. Wie gezeigt ist dies 4 x 7, aber die Erweiterung auf 7 x 7 oder 8 x 8 ist nur eine Frage des Hinzufügens von Komponenten. Wie hier gezeigt, werden alle Segmente eines einzelnen Displays direkt vom Mikrocontroller - hier ein ATmega16 - angesteuert, aber die aktuelle Leistungsfähigkeit Ihres Geräts lässt dies möglicherweise nicht zu. Die Verwendung eines Puffer-ICs wie z. B. eines ULN2803 8-Kanal-Treiber-ICs mit offenem Kollektor liefert bis zu 500 mA Gesamttreiberstrom. Der ULN2803-Eingang ist für 5-Volt-Antriebspegel optimiert, aber Seite 2 des Datenblatts oben listet 5 Familienmitglieder mit verschiedenen Antriebsanordnungen auf.

Geben Sie hier die Bildbeschreibung ein

Wenn die obige Anordnung mehr Rechenleistung erfordert, als Sie möchten, können Sie Treiber mit überlegener Funktionalität verwenden – auf Kosten der Kosten.

Sie können die gesamte Aufgabe mit 2 ICs lösen, indem Sie 2 x MM5450 verwenden, die jeweils 35 LEDs ansteuern können. LEDs sind bei voreingestellten Helligkeiten entweder aus- oder eingeschaltet, sodass Sie das PWM-Signal erneut steuern müssen, indem Sie es auf kontrollierte Weise ein- und ausschalten. Sie können ein Array von 70 LEDs in weniger als einer Millisekunde mit einem 100-kHz-Takt schreiben. Wenn Sie also eine Aktualisierungsrate von 50 Hz für alle LEDs in einem Frame bei ausgewählter Helligkeit anstreben, würde dies etwa 20 Helligkeitsstufen ermöglichen. Wenn man den Takt auf sein Maximum von 500 kHz bringt, wären etwa 100 Helligkeitsstufen möglich.

Der MM5450 ermöglicht die Ansteuerung von 35 LEDs aus einem einzigen Gehäuse. Normalerweise werden 3 Pins für den Antrieb benötigt, aber 1 Pin kann mit ein wenig Klebelogik verwendet werden.

  • MM5450 35 LED-Treiber . Datenblatt Dies ist mein Favorit von weit zurück. Sobald Sie eines davon verwenden, werden Sie verwöhnt. In Bezug auf Kosteneffizienz und Einfachheit des Antriebs ist kaum etwas vergleichbar. Auf Lager bei Digikey für 4,39 $/1 in DIP40 und auch auf Lager in PLCC 443,78 $/1. Mit etwas Arbeit verkettbar. Benötigt fiktiv 3 Leitungen, um es zu steuern, aber die übermäßig Begeisterten können es mit 1 Leitung und ein paar RC-Verzögerungen tun. Es klappt :-). Sie sagen: Daten werden seriell über 2 Signale übertragen; Uhr und serielle Daten. Die Datenübertragung ohne die zusätzlichen Unannehmlichkeiten eines externen Ladesignals wird durch die Verwendung eines Formats mit einer führenden „1“, gefolgt von den zulässigen 35 Datenbits, erreicht. Diese 35 Datenbits werden zwischengespeichert, nachdem das 36. übertragen wurde. Dieses Schema stellt eine nicht gemultiplexte, direkte Ansteuerung der LED-Anzeige bereit. Die aktuell angezeigten Zeichen (also die Datenausgabe) ändern sich nur, wenn sich die seriellen Datenbits von den zuvor übertragenen unterscheiden. Beachten Sie den Tippfehler beim Ausschneiden und Einfügen auf Seite 5 des Datenblatts. Wie man mit einem Ausgangspin fährt - siehe am Ende.

Eine modernere, aber nicht viel leistungsfähigere Alternative ist der TLC59282 mit 16 Kanälen. Datenblatt hier.Jeder Kanal kann einzeln über ein einfaches serielles Kommunikationsprotokoll gesteuert werden, das mit 3,3-V- oder 5-V-CMOS-Logikpegeln kompatibel ist, je nach Betriebs-VCC. Sobald der serielle Datenpuffer geladen ist, überträgt eine steigende Flanke an LATCH die Daten an die LEDx-Ausgänge. Der BLANK-Pin kann verwendet werden, um alle OUTn-Ausgänge während des Einschaltens auszuschalten und Daten zu speichern, um unerwünschte Bildanzeigen während dieser Zeiten zu verhindern. Der Konstantstromwert aller 16 Kanäle wird durch einen einzigen externen Widerstand eingestellt. Mehrere TLC59282 können kaskadiert werden, um zusätzliche LEDs von demselben Prozessor zu steuern.

Prozessorbasierte Software PWM:

Sie können nur einige Prozessoren mit einer großen Anzahl von E/A, aber geringer Kapazität, um einen bescheidenen Preis zu haben. Die Implementierung von Mehrkanal-Software-PWM auf solchen ist einfach. Wirklich. (Bei Bedarf kann ich Details liefern). Es wäre machbar, Software-PWM an jedem E / A-Pin zu haben. Du bräuchtest zwei. Sie können dies über eine serielle Verbindung mit bescheidener Geschwindigkeit ansprechen oder es als Teil Ihres Gesamtsystems integrieren. Kommunikation - zwei Bytes asynchron. Byte 1 hat msbit gesetzt und bis zu 128 Adressen. Byte zwei mas msbit klar und bis zu 128 Helligkeitsstufen.

Dieses PIC 18F86J72 $7.64/1 Teil hat 51 E/A-Pins, aber das 80-Pin-TQFP-Paket passt möglicherweise nicht zu Ihnen.

Dieser PIC 16F887 für 2,80 USD/1 hat 35 E/A, die meisten oder alle sind als Standardausgänge in Ordnung und für Software-PWM verwendbar. Bescheidenes Multiplexing würde es ermöglichen, mehr LEDs anzusteuern.


Wenn für alle LEDs in einer Reihe die gleiche Helligkeit erforderlich ist (wie Andreas sagt, ist dies der Fall), wird das Problem etwas einfacher.

Richten Sie Zeilendaten ein und dann entweder

  • (1) Schalten Sie die Zeile für den ausgewählten Zeitraum entsprechend der Helligkeit ein und durchlaufen Sie alle Zeilen. Wiederholen Sie "oft genug", um kein Flackern zu bekommen. oder

  • (2) Zeilen spärlich anzeigen, um die Helligkeit zu variieren. Wenn Sie zB ~ 1% Schritte wünschen, beträgt der Gesamtzyklus 100 Frames aller Zeilen, ABER für zB 30% Helligkeit zeigen Sie diese Zeile 30/100 der Zeit an.
    Dies kann z. B. dadurch erfolgen, dass pro Reihe ein Helligkeitsregister geführt wird. Ein Bildzähler wird auf 1 gesetzt und alle Zeilen werden der Reihe nach angezeigt (außer Zeilen mit Helligkeit = 0 – siehe unten). Der Rahmenzähler wird dann inkrementiert und ein Zeilenzyklus wiederholt. Wenn das Helligkeitsregister für Reihe N größer oder gleich dem Rahmenzähler ist, dann zeige Reihendaten an, wenn nicht, zeige keine Reihendaten an, ABER stelle sicher, dass der "Aus"-Zyklus die gleiche Zeit wie ein Ein-Zyklus (isochron) dauert. Wenn der Frame-Zähler den maximalen Wert erreicht (z. B. 100), setzen Sie ihn zurück und starten Sie erneut.

Wie schnell ein Display gemultiplext werden muss, ist "oft genug" Gegenstand vieler Diskussionen hier und anderswo, aber nur knapp über der POV-Rate (Persistenz des Sehens) ist nicht schnell genug, wenn alle LED-Multiplex-Artefakte eliminiert werden sollen. Eine Rate von 100 ganzen Bildern pro Sekunde ist wahrscheinlich sicher und höher schadet nicht.

Bei beispielsweise 100 Bildern pro Sekunde und 100 Helligkeitsstufen pro Zeile benötigen Sie 100 x 100 = 10.000 vollständige Displays pro Sekunde = 100 US / Display-Set. Bei 8 Zeilen müssen Sie eine Zeile in 100/8 ~= 12 uS ausgeben. Nicht schwer mit selbst preisgünstigen modernen Controllern. dh in Szenario 2 müssen Sie alle 100 uS 8 Zeilen anzeigen, also müssen Sie alle 100/8 ~= 12 uS den Helligkeitszähler einer Zeile untersuchen, um zu entscheiden, ob er angezeigt werden soll oder nicht. Wenn es angezeigt werden soll, geben Sie es aus. Wenn nicht angezeigt werden soll, alles 0 ausgeben.

Prozessorbasierter Kommentar am Ende hinzugefügt.
Oh wow. Was für eine umfassende Antwort. Vielen Dank! Ich glaube, ich werde jetzt viel lesen müssen...

Die Modulation des Software-Tastverhältnisses pro Pin ist tatsächlich viel einfacher, als viele Leute glauben, wenn man sich eher für das Tastverhältnis als für die Impulsbreite interessiert.

Um acht Bits gleichzeitig mit einer 4-Bit-Helligkeitssteuerung zu verarbeiten, könnte man den folgenden Code verwenden. Angenommen, das lsb (Bit 0) aller acht Helligkeitsstufen ist in hell0, Bit 1 aller acht Helligkeitsstufen ist in hell1 usw. Bei jedem Licht, das auf "voll hell" sein sollte, sollten die entsprechenden Bits auch in hellX gesetzt sein hell0..hell3. Die Variable tickcount ist einfach ein Zeichen ohne Vorzeichen, das jeden Interrupt zählt; es könnte für andere Zwecke geteilt werden.

  tickcount++;
  if (Tickcount & 1)
    PORT_OUT = hell3;
  sonst wenn (Tickcount & 2)
    PORT_OUT = hell2;
  sonst wenn (Tickcount & 4)
    PORT_OUT = hell1;
  Sonst wenn (Tickcount & 8)
    PORT_OUT = hell0;
  anders
    PORT_OUT = hellX;

Der Code könnte leicht auf eine beliebige Anzahl von Helligkeitsbits oder eine beliebige Anzahl von I/O-Pins erweitert werden. Eine Einschränkung, die Sie beachten sollten, ist, dass eine Änderung der Helligkeit *, wenn die Tickzahl nicht Null ist, eine vorübergehende Unterbrechung der Anzeigehelligkeit von einem halben Zählwert verursachen kann. Kein Problem, wenn die Helligkeit nicht zu häufig geändert wird, aber wenn man die Helligkeit 16 Mal in 16 Ticks ändert, könnte man am Ende eine Helligkeit haben, die um 8 Werte höher oder niedriger als erwartet ist (z. B. wenn die Helligkeit zwischen 7 und 8 wechselt, könnte das Display am Ende für 0 von 16 oder 15 von 16 Zyklen eingeschaltet). Die einfachste Abhilfe besteht darin, die Helligkeit nur einmal alle 16 Zählungen zu ändern.