Hallo zusammen,
ich lese schon länger hier im Forum, das hier ist aber glaube ich mein erster größerer Post.
Es ist ne Menge Text, bitte lest ihn trotzdem durch damit ihr mein Problem auch versteht...
Ich habe vor Kurzem einen alten LED-Cube (4x4x4 monochrom) von mir ausgegraben und bissl damit gespielt - das weckte die Lust auf mehr und so habe ich beschlossen direkt "in die Vollen" zu gehen und 8x8x8 in RGB zu bauen.
Mir ist bewusst, dass das ein ambitioniertes Projekt ist und ich bin seit ein paar Tagen am Forschen und Testen.
Die Grundidee ist Folgende:
Ein Dutzend TLC5940 übernehmen die Ansteuerung der 64 RGB LEDs einer Ebene.
Die Umschaltung der Ebenen geht über ein HC595 Schieberegister das wiederum acht HighSide Treiber ansteuert (Logic-Level P-Channel MOSFETs mit PNP/NPN Treiberstufe).
Um das Ganze zu testen habe ich eine 5x8 RGB Matrix fliegend verdrahtet.
Statt der MOSFETs kommen bei diesem Testaufbau noch BC337 als Ebenentreiber (bzw. in diesem Fall Zeilentreiber) in Kollektorschaltung zum Einsatz. Durch die Kollektorschaltung gehen die NPNs nicht in Sättigung und ich brauche mir wenig bis keine Gedanken zum Abschaltverhalten zu machen.
SPI-seitig hängt das HC595 am Arduino, ein einzelner TLC5940 hängt in der Daisy-Chain hinter dem HC595.
Arduino MOSI -> HC595 Sin
HC595 Sout -> TLC5940 Sin
Arduino SCK (13) -> HC595 SRCLK -> TLC5940 SCLK
Arduino 10 (BLANK) -> HC595 /OE -> TLC5940 BLANK
Arduino 9 (Latch) -> HC595 RCLK -> TLC5940 XLAT
Arduino 3 (PWM) -> TLC5940 GSCLK
Die Blank-Leitung hat zusätzlich noch einen PullUp von 10k damit da auch ja nix wackelt.
Das Ganze habe ich fliegend auf einem Steckbrett verdrahtet und verwende zur Ansteuerung die TLC5940 Lib von Sparkfun.
Diese habe ich modifiziert und um rudimentären Support für das Multiplexing erweitert.
Kernpunkt ist, dass man zusätzlich zur Anzahl der TLCs in der Chain nun auch noch die Anzahl der Ebenen konfigurieren kann. Dadurch wird u.U automatisch mehr Speicher für den Puffer allokiert.
Die update() Methode muss nicht mehr manuell aufgerufen werden, die Library refresht nun automatisch Ebene für Ebene. Dafür habe ich die bestehende Overflow-Interrupt Routine aus der Lib etwas modifiziert.
Ergebnis: Die Testmatrix läuft mit stabilen 122Hz Wiederholfrequenz (976Hz Zeilenfrequenz).
Jetzt war ich neugierig und habe einfach mal 8 TLCs konfiguriert (mehr geht mit nem Arduino UNO nicht weil das RAM nicht reicht) um zu schauen wie gut das noch funktioniert.
Durch den Aufbau der SPI-Chain mit dem HC595 als erstes Glied sind die weiteren TLCs quasi einfach "virtuell" vorhanden. Die Daten für die virtuellen Chips werden rausgetaktet, verschwinden aber im Nirvana - braucht ja auch keiner...
Ergebnis: Die 122Hz werden immer noch erreicht, ABER es bleibt scheinbar nicht mehr viel Zeit außerhalb der Bitshifterei um noch Animationen zu berechnen. Der einfache HSV-Colorfader den ich zum Test laufen lasse wird jedenfalls merklich(!!!) langsamer, d.h. die Farben laufen deutlich langsamer durch wenn ich virtuelle TLCs konfiguriere vs. wenn ich nur den einen, echten TLC konfiguriere.
(Die Farbwerte werden in beiden Fällen nur für den echten TLC berechnet, die Rechenarbeit für die Animation verändert sich also nicht...)
Damit sind wir bei meinem Problem: Für das Projekt scheinen die "normalen" Arduinos nicht mehr auszureichen weil sie beim SPI-Transfer einfach komplett blockiert werden. Weiterhin wären beim späteren Cube ja auch nochmal 50% mehr an Daten zu senden (12 TLCs an Stelle der 8 mit denen ich getestet habe).
Ich könnte die Updates seltener fahren, aber dann sinkt die Wiederholfrequenz direkt auf 60Hz und das nehme ich bereits als leichtes Flimmern wahr. Somit ist das also keine echte Lösung.
Und z.B. 80Hz kann ich nicht anfahren, denn wenn bei "so schnell wie möglich" 120Hz rauskommen kann ich höchstens "jede zweite Periode" nutzen und lande dann direkt bei 60Hz.
Nun die Frage an die Spezialisten unter euch:
Welchen Controller könnte ich nehmen?
Wären die ARMs eine Alternative?
Würde die Nutzung von Interrupt-basiertem SPI was bringen? Pro Byte vergehen 16 Takte, könnte man von denen evtl. noch ein paar für das Hauptprogramm nutzen?
Bin für Ideen und Anregungen dankbar!
Grüße aus Hessen,
Shuzz