Wie kann ich viele LEDs mit nur wenigen Pins an meinem Mikro steuern?

10

Ich verwende einen Atmel ATtiny13 mit einer 6-poligen E / A. Ich möchte ungefähr 15 LEDs steuern, bin mir aber nicht sicher, wie ich alles anschließen soll. Ohne Multiplexing könnte ich anscheinend nur 6 LEDs gleichzeitig steuern. Bin ich aufgrund der Größe des Mikrocontrollers auf nur 6 LEDs beschränkt?

JYelton
quelle
Ich habe nicht gesehen. Möglicherweise dupliziert: electronic.stackexchange.com/questions/9860/…
Daniel Grillo
3
Vergessen Sie nicht, Ihre Optionen mit den Kosten für den Kauf eines etwas feineren Mikrocontrollers zu vergleichen. Beachten Sie auch die Grenzwerte pro Port und Gesamtstrom.
Joeforker
Als ich vor einiger Zeit anfing, mit Mikros zu arbeiten, war diese Frage, die ich mir wünschte, mit klaren Antworten leicht zu finden. Ich habe es geschafft, etwas über Charlieplexing zu lernen und es erfolgreich umzusetzen, aber ich wollte die Frage hier mit der hervorragenden Qualität der Antworten der SE-Community neu erstellen.
JYelton
1
@joeforker Du hast Recht, die Kosten für ein Mikro mit mehr Pins waren ziemlich gering, wenn man bedenkt, dass mein Projekt einmalig war. Ich dachte einmal darüber nach, ein Mikro mit ungefähr 20 E / A-Pins zu verwenden, um den Job zu erledigen, aber eines meiner Ziele war ein sehr kleiner Platzbedarf für Leiterplatten. Auch super Adjektiv pinnier !
JYelton

Antworten:

18

Es gibt verschiedene Methoden, mit denen eine große Anzahl von LEDs von wenigen E / A-Pins angesteuert werden kann.

Am einfachsten ist das Standard-Multiplexing der Zeilen- / Spaltenanzeige. Mit dieser Technik können Sie LEDs mit IO-Pins ansteuern. Mathematisch ist das Tastverhältnis: n(n/2)2n

1minimum(unique row patterns, unique column patterns)

Dies bedeutet, dass diese Technik ein Tastverhältnis von 100% hat, wenn alle LEDs leuchten (oder alle Zeilen oder alle Spalten identisch sind) und ein Tastverhältnis von wenn eine diagonale Linie leuchten muss (oder alle Zeilen unterschiedlich sind) ). Sie können nur dann 100% Einschaltdauer garantieren, wenn Sie jede LED oder eine LED (oder keine LEDs, aber das zählt nicht wirklich viel) anzünden.1/n

Etwas komplexer ist Charlieplexing . Mit dieser Technik können Sie LEDs mit IO-Pins ansteuern. Mit dieser Technik können nur LEDs gleichzeitig leuchten. Mathematisch ist das Tastverhältnis:n n - 1n2nnn1

1minimum simultaneous sets

Dabei ist ein simultaner Satz eine eindeutige Gruppe von LEDs mit einer gemeinsamen Anode oder einer gemeinsamen Kathode. (Dies wurde nicht bewiesen, es ist genau das, worauf ich gekommen bin, nachdem ich eine Minute über das Problem nachgedacht habe. Wenn Ihnen das Tastverhältnis wichtig ist, sollten Sie dies weiter untersuchen.) Dies ist eine viel komplexere Berechnung, sowohl intellektuell als auch und rechnerisch als die äquivalente Berechnung für Standardmultiplex. Tatsächlich erhalten Sie ein Tastverhältnis von wenn alle LEDs leuchten, aber einige (nur einige) Muster von n-1 oder weniger LEDs können ein Tastverhältnis von 100% haben. Sie können nur dann 100% Einschaltdauer garantieren, wenn 1 LED leuchtet.1/n

Die letzte Methode, die ich erwähnen werde, ist die Verwendung eines Schieberegisters oder eines E / A- Expanders. Mit zwei Pins (entweder der Rohdaten- / Taktschnittstelle, I2C oder unidirektionalem SPI) können Sie eine beliebig große Anzahl von LEDs steuern. Das Tastverhältnis für jedes Muster beträgt 100%, aber die Aktualisierungsrate ist umgekehrt proportional zur Anzahl der LEDs. Dies ist die teuerste Methode. Für 15 LEDs ist es wahrscheinlich billiger, nur auf ein Mikro mit so vielen E / A-Pins aufzurüsten.

Kevin Vermeer
quelle
+1 zur Erläuterung des Arbeitszyklusaspekts. Im zweiten Satz über Charlieplexing, meinten Sie „drive n ^ 2-n - LEDs mit n IO Pins?
JYelton
Charlieplexing kann sehr ähnlich wie Multiplexing durchgeführt werden, wenn einfach ein Licht aus jeder Reihe weggelassen wird. Tatsächlich kann es möglich sein, dieses Licht durch Hinzufügen einer Diode "wiederzugewinnen", obwohl es schwierig sein kann, es an die Helligkeit der anderen anzupassen, es sei denn, Säulentreiber sind Konstantstromausgänge.
Supercat
11

Mit Charlieplexing können Sie LEDs direkt von Pins aus ansteuern.nn×(n1)n

Beispiel:

Sechs LEDs an 3 Pins:

PINS        LEDS
0 1 2   1 2 3 4 5 6
0 0 0   0 0 0 0 0 0
0 1 Z   1 0 0 0 0 0
1 0 Z   0 1 0 0 0 0
Z 0 1   0 0 1 0 0 0
Z 1 0   0 0 0 1 0 0
0 Z 1   0 0 0 0 1 0
1 Z 0   0 0 0 0 0 1
0 0 1   0 0 1 0 1 0
0 1 0   1 0 0 1 0 0
0 1 1   1 0 0 0 1 0
1 0 0   0 1 0 0 0 1
1 0 1   0 1 1 0 0 0
1 1 0   0 0 0 1 0 1
1 1 1   0 0 0 0 0 0

Schema des Charlieplexing mit 3 Ausgangspins

Daniel Grillo
quelle
Vielen Dank für den Ausgangs-Pin-Datensatz sowie einen hilfreichen Schaltplan.
JYelton
1
Eine andere Möglichkeit, den Schaltplan zu zeichnen, besteht darin, ein NxN-Raster zu erstellen, jedoch nur Spalten anzutreiben und die primäre Diagonale durch Zeilen-Spalten-Kurzschlüsse zu ersetzen.
Supercat
bedeutet, dass ich nicht alle auf einmal einschalten kann? Bedeutet das, dass ich, wenn ich alle auf einmal einschalten möchte, genug Zeit haben muss, um die Augen zu täuschen?
MaNyYaCk
@MaNyYaCk Ja. Du hast recht.
Daniel Grillo
8

Ohne Multiplexing (Direktantrieb) sind Sie auf 6 LEDs beschränkt.

Mit Charlieplexing können Sie n * (n-1) LEDs über n Pins ansteuern.

Mit E / A-Expandern oder Schieberegistern können Sie eine praktisch unbegrenzte Anzahl von LEDs ansteuern.
Beispiel: MCP23008 8-Bit-I2C-E / A-Expander

mjh2007
quelle
Können Sie näher erläutern, was E / A-Expander wären?
JYelton
3
Ein E / A-Expander ist ein externer Chip, der E / A-Pins und -Register enthält. Sie können einen Standard-Kommunikationsbus wie I2C oder SPI verwenden, um mit ihnen zu kommunizieren.
mjh2007
+1 Mit dem TLC594 von TI ( focus.ti.com/lit/ds/symlink/tlc5940.pdf ) können Sie viele LEDs ansteuern , dies kann jedoch für viele Jobs zu viel des Guten sein. search.digikey.com/scripts/DkSearch/…
kenny
Vielen Dank - ich sollte ein Projekt entwerfen, das E / A-Expander verwendet, um das Erlernen ihrer Verwendung zu erzwingen.
JYelton
2

Hier ist ein Beispiel für Charlieplexing, das ich gebaut habe.

Es ist ein Leuchtturm-Strahlensimulator und verwendet eine Reihe von 12 LEDs, die auf 4 GPIOs gebündelt sind, um einen Lichtstrahl um eine Disc zu streichen. Hier gibt es ein Video davon .

Das Projekt basiert auf PIC. Ich verwende einen PIC12f683, der ebenfalls ein 8-Pin-UP ist und als vergleichbar mit den 8-Pin-AVRs angesehen werden kann.

Die Intensität der LED wird durch eine Unterbrechung gesteuert, die eine 32-Stufen-PWM bei etwa 60 Hz liefert. Es dürfen immer nur zwei LEDs gleichzeitig leuchten, was eine 50% ige Leistung für jede LED ergibt, da dies alles war, was ich brauchte. Es gibt auch einen guten Kompromiss zwischen der PWM-Bildwiederholfrequenz und der Auflösung.

Die Codierung für die Verwendung von Charlieplexing ist eigentlich ziemlich einfach, wenn Sie sich an die "klassische" Methode halten, nur eine einzelne LED zu einem bestimmten Zeitpunkt mit einer sehr schnellen Bildwiederholfrequenz zu beleuchten. Ich erarbeite die erforderlichen PORT- und TRIS-Register (Bild-spezifische Register) zuerst auf Papier und speichere dann die Ergebnisse in einem statischen Array. Um LED x zu leuchten, muss der PIC nur den Wert am Index [x] des Arrays nachschlagen und direkt in den PORT schreiben (mit etwas Maskierung, um den Zustand der anderen Pins zu erhalten, die nicht im Charliplex verwendet werden).

Mein Projekt hat nur 12 LED, nicht 15 oder maximal 20, die 5 GPIO zulassen, da ich ein GPIO für die zukünftige Entwicklung übrig haben wollte.

Wie auch immer ... Ich dachte nur, es könnte hilfreich sein, ein funktionierendes Beispiel zu haben, das Ihrer Anfrage ähnelt.

Vollständiger Quellcode und Schaltpläne finden Sie in meinem Blog.

Matt Casey
quelle
0

Eine andere Möglichkeit wäre die Verwendung der Neopixel-LEDs. Sie haben einen eingebauten Steuer-IC und Sie benötigen nur einen Pin, um so viele LEDs zu steuern, wie Sie möchten. Natürlich benötigen Sie dann eine geeignete separate LED-Stromquelle.

alles Notwendige
quelle