Große LED-Matrizen mit Helligkeitsmodulation
Die Basissoftware macht jede LED einzeln in 256 logarithmischen
(8192 linearen) Helligkeitsstufen dimmbar!
Die Firmware ist hierzu trickreich und in Assembler erstellt.
Die Implementationsstudie
zeigt günstige Eigenschaften:
- 13-bit-PWM mit einer Quantelung von 1 CPU-Takt - mehr geht wirklich nicht!
- Totzeit (beim Umschalten der Katode) 6 Takte (immer noch sehr geringer Lichtverlust bei 213-1 = 8191 Takten)
- Die Totzeit ist für die Ausgabe des kürzestmöglichen Impulses erforderlich,
nicht für die eigentliche Katodenumschaltung.
- Wiederholfrequenz für alle 100 LEDs: 150 Hz (bei 12,8 MHz CPU-Taktfrequenz)
- Krumm-bittrige PWM (bspw. 12¾ bit) für netzsynchrone Flimmerfrequenz ohne Lichtverlust möglich,
sinnvoll, da ja ohnehin mit einer Exponentialtabelle gearbeitet wird, beispielsweise:
- 16 MHz Quarz, 200 Hz Flimmern, 10 Spalten => Zählumfang 8000 => 12¾ Bit => günstig bei Quarzbetrieb
- 16 MHz Quarz, 100 Hz Flimmern, 10 Spalten => Zählumfang 16000 => 13¾ Bit => fast 14 Bit!!
- 12,8 MHz RC-Oszillator, 100 Hz Flimmern, 10 Spalten => Zählumfang 12800 => 13½ Bit: üppige Auflösung
- 12,8 MHz RC-Oszillator, 150 Hz Flimmern, 10 Spalten => Zählumfang 8533 => 13¼ Bit: lohnt nicht das 14. Bit
- 12,8 MHz RC-Oszillator, 200 Hz Flimmern, 10 Spalten => Zählumfang 6400 => 12½ Bit: reicht vielleicht auch
Die Beinahe-Netzsynchronität ist wichtig, wenn die LEDs gleichzeitig mit einer Raumbeleuchtung arbeiten.
Ohne diese würde man eine störende Interferenz wahrnehmen.
Das ist auch ein Grund, warum Fernsehfrequenzen der landestypischen Netzfrequenz angepasst wurden.
Sternhimmel
Genügend billige weiße Leuchtdioden lassen den Wunsch nach einer modernen,
Energie sparenden und kindgerechten Zimmer(decken)beleuchtung aus bis zu 100 LEDs aufkommen.
Diese einfache Schaltung ermöglicht mittels zweier Potenziometer
die Einstellung der Beleuchtungshelligkeit und die Auswahl eines
„Animationsprogramms“, welches die Anzeige einzelner Sternbilder
oder die Simulation von „Supernovas“ einschließt.
Natürlich eignet sich eine derartige LED-Decke nicht als Raumbeleuchtung
im herkömmlichen Sinne, dafür sind die LEDs (noch) zu leistungsschwach;
die eingesetzten Schalttransistoren können aber schon ordentliche Ströme schalten.
Die Schaltung wird mit einem Schaltnetzteil mit 5 V (maximal ca. 1 A) versorgt.
Notfalls tut es auch ein PC/Notebook über USB.
Die Schaltung ist eine einfache Multiplexansteuerung, wie sie für LED-Anzeigen bekannt ist.
Statt der üblichen LED-Treiber (ULN2003 u.ä.) wurden hier viel besser
geeignete MOS-Leistungstransistoren verwendet, die in der Lage sind,
die hohen Ströme für superhelle LEDs verlustarm zu schalten.
Da jede einzelne LED einzeln in ihrer Helligkeit angesteuert werden kann,
ist der Rest (bspw. die Gruppierung zu bekannten Sternbildern) nur eine Frage
ihrer Anordnung und der Mikrocontroller-Firmware.
Die Leiterplatte findet bspw. in einer Zwischendecke Platz.
Programmiert wird der Chip am einfachsten über die parallele Schnittstelle
eines PCs über den (rechten) SubD-Stecker.
Leiterplatten-Bestückung: Ziemlich übersichtlich! Eagle-Quelle
Der USB-Anschluss dient nur zum Firmware-Update (zurzeit nicht implementiert).
Dazu müssen beide Potenziometer auf Linksanschlag stehen,
damit durch die dann inaktiven LEDs die Betriebsspannung ruhig genug ist,
dass (mit dem internen RC-Oszillator) eine USB-Kommunikation zustande kommt.
Ursprünglich war eine komplette PC-Steuerung vorgesehen,
diese funktioniert aber nur stabil mit Quarz – dafür fehlen nun zwei Pins.
Bei Verzicht auf K1 und K0 (nur 80 LEDs) wäre dies aber deutlich schöner.
Die Verdrahtung der Außenbeschaltung ist simpel.
Der SubD-Stecker wird links angeschlossen.
Zunächst wurde der Sternhimmel als 10x10-Matrix auf einer Plastscheibe
erstellt, um die Firmware zu entwickeln.
Gelötet wurde die Leiterplatte von Lehrlingen einer Elektronikwerkstatt;
das können sie offenbar ganz gut.
Versuchsaufbau und SMD-Lötarbeit
Hier: Eagle-Schaltplan und -Board herunterladen!
Hier: Firmware herunterladen! oder
auf dem Server ansehen
Es existiert eine Implementationsstudie für Windows,
an der man die Funktion der Firmware am PC nachvollziehen kann.
Screenshot der Implementationsstudie (Flimmer-Programm)
Einsatzerfahrungen
Die bisherige Firmware läuft für einen Sternhimmel zu schnell
(Disko-Effekt), was aber durchaus beabsichtigt war.
Langsamere Effekte würden eine größere PWM-Tiefe als 8 Bit benötigen,
um keine störenden Einzelstufen, insbesondere bei geringen Helligkeiten, wahrnehmen zu können.
Weitergehende Betrachtungen
Was ist zu ändern bei 3-Farb-LEDs?
Hier sind verschiedene Fälle zu beachten!
- Bei Typen mit gleichen Vorwiderständen (bspw. Flussspannungen)
und einzeln herausgeführten Anschlüssen können 33 LEDs verbaut werden.
- Bei gleichen Vorwiderständen können auch Typen mit gemeinsamer Katode
oder gemeinsamer Anode verwendet werden. Man kommt auf 30 Stück.
- Bei unterschiedlichen Vorwiderständen können nur solche
mit gemeinsamer Katode verbaut werden. Ebenfalls 30 Stück.
Die unterschiedlichen Widerstände und LED-Farben sind an R0 bis R8
so zu verteilen, dass blaue, grüne und rote LEDs anodenmäßig gleich angeordnet sind.
(R9 wird ja nicht gebraucht.)
- Dreifarb-LEDs mit unterschiedlichen Vorwiderständen
und gemeinsamer Anode erfordern Widerstände auf der Katodenseite.
Dazu sind R0 bis R9 durch Null-Ohm-Widerstände zu ersetzen
und die katodenseitigen bspw. am SubD-Stecker einzulöten.
Es sind erhebliche Firmware-Änderungen erforderlich,
und die Portpinverteilung ist hierfür ziemlich ungünstig,
sodass man auf die Leitungen K0 bis K3 besser verzichtet
und so auf nur 20 3-Farb-LEDs kommt.
Auf 30 LEDs kommt man durch Umverdrahtung von K0 oder K1
auf ein PORTD-Pin.
Oder man muss noch deutlich mehr Änderungen an der Firmware machen.
Ich will mehr LEDs
Verschiedene Wege führen nach Rom:
- Einsatz eines BCD-zu-1-aus-n-Dekoders für die Spalten-Adressierung, etwa eines
74HC42 (Low-aktive Ausgänge) oder
4028 (High-aktive Ausgänge),
verbraucht 4 Portpins für die 10 Spalten, spart also 6 Pins
- Einsatz eines Schieberegisters
74HC164 oder
4015,
verbraucht nur 2 Portpins für die 10 Spalten, wenn man die Portpins
zum Schieben (Takt + Daten) auch zur Spaltenansteuerung verwendet
(das geht, man muss aber die Gate-Kapazitäten beachten), spart 8 Pins.
Ein echter Portexpander 74HC595
wäre hier Overkill und bringt nichts
- Größerer Mikrocontroller mit mehr Portpins, etwa ATmega16
Eine Vergrößerung der Anzahl der „Spaltenleitungen“ (hier sind's die Katoden)
auf mehr als 10 ist nicht empfehlenswert, weil die Impulsstrombelastbarkeit
typischer LEDs das 10-fache des zulässigen Dauergleichstroms entspricht
und mehr Spalten einem Lichtverlust gleich kommt.
Außerdem sinkt die Wiederholfrequenz.
Daher wird man nur noch die „Zeilenleitungen“ (hier die Anoden)
vergrößern können und daher zu rechteckligen Matrizen
(= etwas weniger LEDs pro Portpin) tendieren.
- ATmega8 + BCD-Dekoder: 10 × 18 = 180 LEDs, 2 Analogeingänge frei
- ATmega16: 8 × 24 = 192 LEDs, 10 × 22 = 220 LEDs, nichts frei
- ATmega16 + BCD-Dekoder: 10 × 24 = 192 LEDs, 4 Portpins frei
Ist der Lichtverlust akzeptabel, wären 16 Spalten mit einem Binärdekoder (etwa 74HC154) die nächstliegende Wahl:
- ATmega8 + Binärdekoder: 16 × 16 = 256 LEDs, 1 Portpin und 2 Analogeingänge frei
- ATmega16: 16 × 16 = 256 LEDs, nichts frei
- ATmega16 + Binärdekoder: 16 × 24 = 384 LEDs, 3 Portpins frei
Bei Dreifarb-LEDs sind die angegebenen LED-Zahlen dementsprechend durch 3 zu teilen.
Bei den BCD- oder Binärdekodern muss man auf Invertierung bzw. Nichtinvertierung der Ausgänge achten
und ist damit auf Spalten = Anoden oder Katoden festgelegt.
Nimmt man stattdessen Schieberegister, etwa 74HC164, 4014 oder 4015,
braucht man zwar 2 ICs, ist aber bei der Polarität wahlfrei.
Noch mehr LEDs
Hier sollte man den Lichtverlust gezielt einplanen. Etwa:
- ATmega16 + Schieberegister: 24 × 24 = 576 LEDs, 6 Portpins frei
- 32-bit-Controller (empfehlenswert!!) etwa AT91SAM7S64 + Schieberegister: 33 × 32 = 1056 LEDs (352 3-Farb-LEDs)
- Mehrere Mikrocontroller, mit I²C-Steuerung
Hinweis:
Das Netzteil muss den Dauergleichstrom aller Leuchtdioden liefern können!

Leuchtschnecke mit Infrarot-Fernbedienung
Bunte Leuchtschnecke
Eine Leuchtschnecke mit 54 RGB-LEDs, mithin 162 Einzel-LEDs
ist eine praktische Realisierung einer 9x18-Matrix an einem ATmega16.
Dabei ist – bei 16 MHz Quarzfrequenz – die PWM-Tiefe 13 Bit
und die Bildwiederholfrequenz 200 Hz. Besser geht's nicht!
Die Rechenlast ist ca. 25 %, und dank partiell freigegebener Interrupts
ist auch USB möglich. (Der USB-Betrieb führt zum leichten Flackern der LEDs.)
Die Schaltung ist durchaus geeignet, genügend Strom als Nachttischbeleuchtung zu liefern;
dann blendet die Schnecke beim Anblick.
Die Assembler-ISR beinhaltet in der Kommentarspalte auch den Zeitplan
für die Ausgabe von minimalen Impulsbreiten auf den notwendigen 3 Ausgabeports.
Siehe Quelltext.
Die ISR verlangt das Freihalten der Register R2 .. R6 sowie R7 für CurKatode.
Damit darf rand()
aus der Standardbibliothek nicht eingebunden werden,
da diese (sowie eine Reihe anderer, insbesondere Gleitkomma-Funktionen)
diese Register ungefragt in Beschlag nimmt, leider.
Die oben angegebene Firmware enthält nicht die Ablaufsteuerung,
keine Infrarotkommunikation und kein V-USB, sondern ist nur als Funktionsnachweis gedacht.
Alles weitere ist © Tobias Lucas.