Wie kann ich mit Multiplexing effektiv mehrere LEDs ansteuern?

8

Ich schließe meinen Mikrocontroller (AVRmega32U4) an ein 4x4-LED-Array an. Es gibt 2 Steuerleitungen zum Betreiben von Spalten (an einen Demultiplexer mit 2 bis 4 übergeben) und 4 Steuerleitungen zum Betreiben von Zeilen. Ich bringe eine Spalte hoch und eine Zeile niedrig, um eine bestimmte LED zu beleuchten. Ich ziehe entweder die Spalte niedrig oder die Zeile hoch, um eine LED auszuschalten.

Dieses Design eignet sich für bis zu 4 LEDs gleichzeitig. Wenn ich jedoch versuche, mit dieser Strategie alle 16 auf einmal zu beleuchten, sind die LEDs merklich weniger hell (sie haben immerhin einen Arbeitszyklus von 1/16!).

Was sind einige Möglichkeiten, um eine größere Anzahl von LEDs in diesem Array effektiver zu beleuchten? Sagen wir, 10+?

Ich denke darüber nach, viel Code zu schreiben, um die verschiedenen Situationen zu bewältigen, aber das verbraucht mehr Platz auf meinem Mikrocontroller, als ich möchte. Ich habe überlegt, ein weiteres Mikro mit 16 Steuerleitungen hinzuzufügen, um diese LEDs einzeln zu verwalten, aber dies scheint viel Aufwand zu bedeuten.

Geben Sie hier die Bildbeschreibung ein

Samoz
quelle
Schreibe einen Schaltplan. Die Worte sind großartig, aber ein Schaltplan hilft immens dabei, herauszufinden, was los ist. Da ich keinen Schaltplan sehe, kann ich nicht sagen, ob das Folgende zu 100% funktionieren würde - aber ich versuche, Transistoren zu verwenden, um die LEDs tatsächlich mit Strom zu versorgen, anstatt mit einem Mux (wie es scheint).
Saad

Antworten:

12

Ich habe wertvolle Informationen aus Telaclavos Antwort verwendet , um meine anzupassen. Wenn Sie seine mögen, vergessen Sie nicht, ihn zu bewerten.

Wenn Ihr Arbeitszyklus 1/16 beträgt, müssten Sie jeder LED das 16-fache ihres Nennstroms geben, um die gleiche durchschnittliche Helligkeit zu erhalten. Dies verkürzt die Lebensdauer Ihrer LEDs. LEDs mit hoher Helligkeit können bei einem Nennstrom von 1/16 Tastverhältnis PWM-gesteuert werden und sind dennoch so hell wie eine herkömmliche Anzeige-LED.
Die einfachste Lösung besteht darin, diesen Arbeitszyklus fest zu halten, damit auch der Strom fest bleibt. Jeder Spaltentreiber muss 4 LEDs gleichzeitig ansteuern, das ist also das 4-fache des Nennstroms.

Der 7404, den Sie in Ihrem Schaltplan haben, ist dafür nicht geeignet. Die erste TTL kann sehr wenig Strom liefern: 0,4 mA. Aber auch das Absinken reicht nicht, das sind auch nur 16mA, die meisten LEDs, auch hohe Helligkeit sind für 20mA spezifiziert. Sie benötigen einen Treiber, der das beschaffen kann. In Ihren 4 Spalten x 4 Zeilen muss jede der 4 Spalten 4 LEDs mit jeweils 20 mA liefern, das sind 80 mA. Es gibt High-Side-Treiber, aber Sie müssen möglicherweise mit diskreten Komponenten (BJT oder MOSFET) arbeiten. Der Strom führt nicht zu einer hohen Verlustleistung, da sein Durchschnitt pro High-Side-Transistor nur 1/4 davon beträgt: 20 mA, und das ist der schlimmste Fall, wenn alle LEDs leuchten.

edit
Ein BC807 ist hierfür eine gute Wahl und hat ein von mindestens 100, so dass ein paar mA Basisstrom ihn in Sättigung treiben. Sie benötigen den 7404 nicht mehr, um den aktiven Low-Ausgang des 74S139 zu invertieren, da der BC807 von einer Niederspannung angetrieben wird. Der 74S139 (warum nicht LS?) Kann den erforderlichen Strom aufnehmen, auch ein 74HC139 reicht aus. Während die meisten Mikrocontroller 20 mA versenken können, scheint dies beim ATMega32U4 nicht der Fall zu sein . Das Datenblatt gibt keinen maximalen Strom als Parameter (eine Lücke) an, aber die minimale und maximale Ausgangsspannung sind bei 10 mA angegeben. Für die niedrige Seite sind Sie also ein zusätzlicher Fahrer. Der 74LVC07A ist für das Absinken von Strömen auf 32 mA spezifiziert. HFE

In Mengen kosten die Widerstände 74HC139 + 74LVC07A + 4 BC807 + 8 bei Digikey weniger als 35 Cent.×

stevenvh
quelle
Gute Antwort! Aber denken Sie, dass der maximale Ausgangsstrom des 7404 16 mA betragen kann, wenn Sie 4 LEDs an einen Ausgang anschließen?
Saad
Ich verstehe Ihren Standpunkt zur TTL. Was halten Sie von der Verwendung von Transistoren, wie Saad vorgeschlagen hat? Ich bin mir auch nicht sicher, warum Sie 16 x 8 erwähnen, es ist ein 4 x 4-Array.
Samoz
Das Erzwingen von 80 mA durch eine 20 mA-LED ist keine gute Idee. Es verkürzt sein Leben. Siehe den letzten Teil meiner Antwort.
Telaclavo
@ Telaclavo - Ja, ich habe es gelesen, ich habe meine Antwort bereits korrigiert. Danke für den Zusatz. Interessant. Ich kenne jedoch mehrere Produkte, die dies tun, mit normalen Anzeige-LEDs. Ich habe keine Daten zur Ausfallrate oder Lebensdauer.
Stevenvh
Ich habe mein Design auf Transistoren umgestellt, 4 in den Spalten und 4 in den Zeilen, wobei der Mikrocontroller an die Basis jedes Transistors angeschlossen ist. Dies hilft, aber ich werde einige hellere LEDs untersuchen, um das Problem des kleineren Arbeitszyklus zu lösen. Danke für deine Hilfe!
Samoz
5

Wenn möglicherweise alle LEDs gleichzeitig leuchten sollen, sollten die Treiber für eine Dimension (häufig als "Zeilen" bezeichnet, unabhängig von der physischen Anordnung der LEDs) so konstruiert werden, dass sie aktiviert werden, wenn ein Zeilentreiber aktiviert wird in der Lage, alle Säulen gleichzeitig zu beleuchten; In der anderen Richtung sind die Säulen typischerweise so ausgelegt, dass sie jeweils mit einer Reihe unter Spannung stehen. In den meisten Fällen bedeutet dies, dass Zeilentreiber "kräftiger" sein müssen als Spaltentreiber.

Das Entwerfen einer Anzeige mit Zeilentreibern, die nur die Hälfte der Spaltentreiber gleichzeitig steuern können (z. B. weil helle Nachrichten in einem Teil der Anzeige blinken sollen), kann gelegentlich Vorteile bringen, wobei in den meisten Fällen ein bestimmtes Niveau erreicht wird Eine scheinbare Helligkeit mit einer bestimmten Anzahl von Zeilen erfordert einen bestimmten Zeilenstrom. Wenn man nur die Hälfte der Säulen gleichzeitig antreiben könnte, würde das Beleuchten aller Säulen mit einer bestimmten Helligkeit erfordern, dass sie zum Ausgleich mit doppelt so viel Strom betrieben werden.

Übrigens, ein Punkt, der noch nicht erwähnt wurde: Wenn man bei Verwendung von Multiplex-LEDs versuchen möchte, etwas in der Nähe der maximalen Helligkeit zu erreichen, sollte man eine Schaltung entwerfen, die verhindert, dass eine Reihe über einen längeren Zeitraum mit Strom versorgt wird. Zumindest sollte man die Dinge so gestalten, dass beim Stoppen der CPU die Anzeige entweder heruntergefahren oder autonom durch die Zeilen geschaltet wird und dass das Scannen der Anzeige nicht zu häufig neu gestartet werden kann, ohne die Anzeige auszublenden (entweder indem der Zähler der CPU mitteilt Wenn es umbricht, anstatt dass die CPU den Zähler zurücksetzt oder wenn das Signal "Zähler zurücksetzen" die Zeilentreiber für eine bestimmte Mindestzeit deaktiviert. Andernfalls kann eine CPU-Fehlfunktion ein LED-Panel zerstören.

Superkatze
quelle
3
Sehr guter 3. Absatz.
Telaclavo
5

Der ATmega32 mit Vs = 5 V kann +/- 20 mA pro Pin mit einem Spannungsverlust von ca. 0,7 V und 0,8 V versorgen und versenken

ATmega32_1

und es kann 4 · (20 mA) = 80 mA insgesamt (pro Packung) und sogar pro Port ohne Probleme quellen und sinken.

ATmega32_2

Angenommen, Sie möchten die 20-mA-Nennleistung pro LED nicht überschreiten, ist dies eine andere Vorgehensweise:

Schema

U1 = ADG1636 . Es verfügt über zwei SPDT-Schalter. Jeder Schalteranschluss kann 238 mA (max.) In jede Richtung bei 25 ºC führen. Das ist deutlich höher als 4 · (20 mA) = 80 mA. U1 wirkt also als Hochstrompuffer. Der IC kostet 1,83 USD in 1 kpcs.

Rs = (5-2-0,7 V) / (20 mA) = 115 , 1/4 W. Sie benötigen nur vier davon.Ω

Um sicher zu sein, dass LED-Paare wie gezeigt antiparallel verbunden werden, muss esund diese Bedingung ist normalerweise erfüllt.VF<|VRmax|

Schritte:

1) Setzen Sie B = 0 (wie in Abb. Gezeigt). Dadurch erhalten Sie Zugriff auf die Dioden D9 bis D16. Die Dioden D1 bis D8 sind alle ausgeschaltet.
2) Setzen Sie A = 0 (wie in Abb. Gezeigt). Dadurch erhalten Sie Zugriff auf die Dioden D10, D12, D14 und D16.
3) Setzen Sie C = A, wenn D10 ausgeschaltet sein soll. Setzen Sie C =! A (! Bedeutet negiert), wenn D10 eingeschaltet sein soll.
4) Machen Sie gleichzeitig mit 3) dasselbe für {D, D12}, {E, D14}, {F, D16}.
5) Setze A = 1. Dadurch erhalten Sie Zugriff auf die Dioden D9, D11, D13 und D15.
6) Wiederholen Sie 3) und 4), jedoch für {C, D9}, {D, D11}, {E, D13}, {F, D15}.
7) Setze B = 1. Dadurch erhalten Sie Zugriff auf die Dioden D1 bis D8.
8) Wiederholen Sie 2) bis 6), jedoch für die Dioden D1 bis D8.
9) Wiederholen Sie 1) bis 8) für jeden neuen ganzen Zyklus.

Damit ist jede Diode mit einem Tastverhältnis von 1/4 eingeschaltet (was gut ist, wenn man bedenkt, dass Sie 16 Dioden haben). Und ja, Sie können PWM mit dieser Idee mischen, wenn Sie die Helligkeit schrittweise steuern möchten.

Wie gesagt, diese Lösung überschreitet nicht die 20-mA-Bewertung pro LED, sodass die maximale Helligkeit, die Sie sehen, 1/4 der maximalen Helligkeit beträgt, die jede LED erzeugen kann. Wenn Sie mehr Helligkeit wünschen, verwenden Sie LEDs, die mehr mcd / mA erzeugen. Dies wird ihr langes Leben intakt halten.

Dank der hohen Stromstärke von U1 hängt die Lichtmenge, die jede LED erzeugt, nicht von der Gesamtzahl der eingeschalteten LEDs ab.

Und Sie benötigen immer noch nur sechs GPIO-Leitungen von Ihrer MCU. Mit nur einem externen IC anstelle von Decoder + Puffern oder Transistoren. Dies ist teurer, aber kompakter (wenn dies kritisch ist) und mit einer etwas einfacheren Verkabelung (sechs statt acht Leitungen gehen zur LED-Matrix). Dies ist meiner Meinung nach eher eine merkwürdige und akademische Antwort.

Für Federico Russo hinzugefügt : Was Sie sagen, wurde bereits in meinem Absatz "Wie gesagt, diese Lösung [...]" angesprochen. Es ist keine gute Idee, 80 mA durch eine 20-mA-LED zu zwingen, selbst für 1/4 der Zeit. Sein Leben wird verkürzt. Und nicht aufgrund einer übermäßigen Verlustleistung (die gleich ist), sondern aufgrund einer Elektromigration (die proportional zum Strom ist). Siehe diese Referenz von Cree. Auszug:

Wiederholtes Pulsieren

Die zweite Art des Überstromzustands, das wiederholte Pulsieren mit hohem Strom, kann zu einem frühen katastrophalen Ausfall der LED führen oder auch nicht. Wiederholtes Hochstrompulsieren kann zu einer verkürzten Lebenserwartung der LED im Vergleich zur üblichen erwarteten Lebensdauer in der Größenordnung von Zehntausenden oder Hunderttausenden von Stunden führen. Ein bestimmtes Gerät, das wiederholten Transienten mit einer Amplitude ausgesetzt ist, die einige Prozent über den Datenblattgrenzen, aber unter dem für einen Einzelimpulsausfall erforderlichen Schwellenwert liegt, fällt schließlich immer noch aus. Der Versagensmechanismus wird höchstwahrscheinlich auf Elektromigration zurückzuführen sein, da schließlich genügend Metallionen von ihren ursprünglichen Gitterpositionen weg verschoben werden.

Wenn Sie dieselbe Lebensdauer und dasselbe Licht für weniger Strom wünschen, verwenden Sie LEDs, die bei 20 mA mehr mcd erzeugen.

Telaclavo
quelle
Sollte das nicht 0,7 V für die Widerstandsberechnung 2 V sein (oder was auch immer die Spannung der LED ist)? Oder ist das der Spannungsabfall aufgrund des Innenwiderstandes? Sollte in diesem Fall nicht die 2V hinzugefügt werden?
Stevenvh
Dies ist eine Alternative zu den von mir vorgeschlagenen PNP-Transistoren, einer für jede Spalte. Nur teurer: 4 BC807 sind 10 Cent zusammen.
Stevenvh
@stevenh Klar, ich habe die 2 V der LED vergessen. // Dies ist eine Alternative zu allem anderen. Es hat nichts mit PNPs zu tun, weder in Gerätetypen noch in der Struktur. // Richtig, dies ist teurer, sogar wenn Sie die Kosten für einen 2-zu-4-Decoder hinzufügen, den Sie benötigen, um weiterhin 6 GPIO-Leitungen zu verwenden, aber es ist kompakter und die Verkabelung ist etwas einfacher (nur 6 Drähte, statt 8 gehen Sie zur LED-Matrix). // Und es ist eine merkwürdige Lösung. Anders.
Telaclavo
Es ist eine originelle Möglichkeit, zwei Pins zu sparen, aber ich denke nicht, dass es gut ist. Die LEDs haben nur einen Durchschnitt von 5 mA, nicht 20 mA. Um die gleiche Helligkeit wie 20 mA zu erhalten, benötigen Sie das 4-fache des Stroms in einem 1: 4-Multiplex. Der Mikrocontroller kann das nicht liefern, daher benötigen Sie einen ULN2804.
Federico Russo
@FedericoRusso Siehe Text oben. Hier nicht genug Platz.
Telaclavo