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?
microcontroller
led
multiplexer
JYelton
quelle
quelle
Antworten:
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 )2 n
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 - 1n2- n n n - 1
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.
quelle
Mit Charlieplexing können Sie LEDs direkt von Pins aus ansteuern.nn×(n−1) n
Beispiel:
Sechs LEDs an 3 Pins:
quelle
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
quelle
Wie @ mjh2007 mit einem I2C-Expander vorgeschlagen. Es gibt jedoch solche speziell für die Ansteuerung von LEDs, bei denen keine externen Strombegrenzungswiderstände erforderlich sind.
quelle
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.
quelle
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.
quelle