Ich plane, einen RGB-LED-POV-Globus zu erstellen, der nur physisch größer ist als dieser.
Ich plane die Verwendung von 64 RGB-LEDs, die 3x Pins pro LED für insgesamt 192 Ausgänge benötigen. Offensichtlich brauche ich einige Schieberegister. Ich habe mir 74HC595 (8 Bit) angesehen und es wären 24 dieser Chips erforderlich, um alle diese LEDs zu verarbeiten.
Ich plane, diese Schieberegister mit 6 pro Kanal von meinem Mikrocontroller in Reihe zu schalten.
Der 74HC595 hat eine Schaltfrequenz von 100 MHz.
Mir wurde gesagt, dass ich den Globus mit etwa 1500 U / min (25 pro Sekunde) drehen muss.
Der Plan ist, einen Arduino für den Mikrocontroller zu verwenden, aber ich bin offen für Vorschläge.
Meine Fragen sind:
1. Ein Haufen 74HC595-Chips wird großartig funktionieren. Andere Chips, die auch genauso gut und vielleicht etwas besser funktionieren würden, sind aufgelistet unter: Welcher SIPO-Chip ist besser, 74HC4094 oder 74HC595 oder etwas anderes?
2. Der Arduino ist eine ausgezeichnete Wahl für das Prototyping, besonders wenn Sie mit gcc vertraut sind. Vielleicht wäre es jetzt schneller, einen zu verwenden. Leider vermute ich, dass Sie bald Code für dieses POV-Display schreiben werden, das mehr RAM benötigt, als der Arduino zur Verfügung hat -- zu diesem Zeitpunkt verwenden Sie entweder (a) einen oder mehrere Tricks, um den benötigten RAM zu reduzieren, oder (b) fügen einige hinzu externes RAM, oder (c) den Code auf einen anderen Mikrocontroller mit mehr RAM portieren (vielleicht den ATMEGA1284?).
Der Parallax-Propeller ist eine ausgezeichnete Wahl für ein hochauflösendes POV-Display – er hat eine Größenordnung mehr internen RAM (32 KB RAM) als der ATmega238 im Arduino. (Gibt es irgendetwas, was ich tun kann, um die Portierung von gcc auf den Propeller zu unterstützen?)
Manche Leute bevorzugen "quadratische Pixel". Sie wissen sicher bereits, dass der Abstand um den Äquator einer Kugel doppelt so lang ist wie der Abstand von Pol zu Pol (der Äquator der Erde ist etwas mehr als doppelt so lang). Da Sie 64 Pixel vom Südpol zum Nordpol haben, können Sie eine neue vertikale „Linie“ von Pixeln 2*64 = 128 mal pro Umdrehung neu laden, um 128 „quadratische Pixel“ am Äquator zu erhalten. Der einfachste Weg, dies zu tun, besteht darin, das Vollbild unkomprimiert im RAM zu speichern. Das erfordert 64*128 Pixel * 3 Bits/Pixel = 24 576 Bits = 3 072 Bytes plus ein paar Bytes RAM für andere Programmvariablen. Leider hat der Atmel ATmega328 im Arduino nur 2 048 Byte RAM.
Frühere POV-Anzeigenverwendete Mikrocontroller mit einer Größenordnung (!) weniger RAM als dieser. Die Leute haben also eine Vielzahl von Tricks entwickelt, mit denen Sie dies umgehen können. Ein Trick: Beleuchten Sie nur die "vordere" Hälfte des Globus, während Sie die LEDs sehen, und schalten Sie dann alle LEDs aus (oder lassen Sie sie in einer konstanten Farbe) während der "hinteren" Hälfte, die Sie nicht direkt können siehe LEDs. Das halbiert die Menge an RAM, die Sie benötigen, und passt dann in den Arduino. Wenn Ihnen dieser Trick nicht gefällt, gibt es andere Tricks, die Sie verwenden können, die weniger offensichtlich sind. Ein weiterer Trick: Speichern Sie das Bild im Flash-Programmspeicher. Der Arduino hat genug Flash-Programmspeicher, um mehrere 3072-Byte-Frames zu speichern. Noch ein Trick: Verwenden Sie ASCII-Text, um den Text zu speichern, den Sie anzeigen möchten, und verwenden Sie dann den Flash-Programmspeicher, um das "Zeichengenerator-ROM" zu speichern. Daten. Ich bin mir ziemlich sicher, dass es noch andere POV-Tricks gibt ...
3. Wenn ich es bauen würde, würde ich den Arduino und die 74HC595-Chips von einem großen Netzteil mit Strom versorgen und den Motor, der den POV dreht, von einem separaten Netzteil mit Strom versorgen.
Erst nachdem ich das alles zum Laufen gebracht hatte, würde ich überhaupt ein komplizierteres getrenntes Stromversorgungssystem in Betracht ziehen. (Wenn Sie ein separates "rotes" Schaltnetzteil haben, dessen + V nur mit 74HC595-Chips verbunden ist, die wiederum nur mit roten LEDs verbunden sind, können Sie die Ausgangsspannung unabhängig voneinander einstellen, um die Gesamtstrom- und Wärmeerzeugung zu minimieren das System. Aber es scheint unnötig kompliziert.)
4. und 5. Die vielleicht einfachste Möglichkeit für den Arduino, das POV-Display anzusteuern, besteht darin, alle 24 74HC595-Chips in einer langen einzelnen Zeichenfolge zu verketten und dann die Arduino-SPI-Bibliothek zu verwenden . Das erfordert 192 Taktimpulse, um die neue Datenspalte einzutakten, und dann einen Impuls auf dem RCLK (auch bekannt als Framing-Impuls, SS usw.), um mit der Anzeige dieser neuen Daten zu beginnen. Laut einem Arduino-zu-SPI-Schnittstellen-Tutorial ist die schnellste SPI-Taktrate die Systemgeschwindigkeit / 4. Der 16-MHz-Arduino kann also einen SPI-CLK von 4 MHz ausgeben. Wenn Sie es mit einem 20-MHz-Quarz aufrüsten, können Sie einen SPI-CLK von 5 MHz erhalten. Wenn Sie Ihr Programm schnell genug bekommen, um mit der SPI-Hardware Schritt zu halten, können Sie eine neue Spalte bestenfalls in 5 MHz / 193 Impulsen ausgeben, sodass die theoretisch maximal mögliche Geschwindigkeit 25 907 Spalten/Sekunde beträgt.
Bei der standardmäßigen Zeichentrickfilm-Aktualisierungsrate von 24 Bildern/Sekunde (die merklich flimmert – Sie möchten etwas Besseres) und bei 128 Spalten/Bild, um „quadratische“ Pixel am Äquator zu erhalten (Sie möchten möglicherweise mehr, um eine bessere Auflösung zu erhalten). , das ergibt 24 Frames/Sekunde * 128 Spalten/Frame = 3072 Spalten/Sekunde.
Zwischen "der gewünschten Geschwindigkeit": 3072 Spalten/Sekunde und "der Geschwindigkeit, die auf Arduino-Hardware völlig unmöglich ist": 25.908 Spalten/Sekunde, liegt fast eine Größenordnung Luft zum Atmen. Hoffentlich gibt dir das genug Platz.
Einige Leute denken, dass Sie eine schnellere Spaltenaktualisierungsrate erhalten können, indem Sie die 74HC595-Chips in 2 oder mehr Ketten neu anordnen und alle Ketten parallel laden. Manche Leute sind so – sie sehen unbenutzte Pins auf dem Arduino und brennen darauf, sie für etwas zu verwenden . Aber es kann kontraproduktiv sein – die SPI-Hardware ist nur mit einem Satz Pins auf dem Arduino verbunden, und so müssen Ketten, die an andere Pins angeschlossen sind, mit emulierter „Bit-Banging“-Software geladen werden, die ausnahmslos langsamer und langsamer ist verbrauchen mehr CPU-Zeit als die eingebaute SPI-Hardware.
Beachten Sie, dass Sie, um andere Farben als nur Aus, Weiß, Rot, Grün, Blau, Gelb, Cyan und Fuchsia zu erhalten, Ihre eigene PWM ausführen müssen, wenn Sie nur ein Schieberegisterbit verwenden, um jede LED-Komponente zu steuern . Sie müssen jedes Bit PWMen, während Sie jede Gruppe hineinschieben, also müssen Sie dies für Ihre Aktualisierungsrate berücksichtigen, und es wird auch Ihren Code etwas komplexer machen.
Alternativ könnten Sie einen IC wie den TI TLC5947 verwenden, der 24 PWM-Kanäle ausführt, basierend auf den Bits, die Sie hineinschieben. http://focus.ti.com/lit/ds/symlink/tlc5947.pdf
Bei dieser Lösung müssten Sie für jeden Kanal 12 Bit (statt 1) verschieben, aber es kümmert sich um die PWM für Sie, sodass es sich möglicherweise um eine lohnende Lösung handelt.
Angenommen, Sie benötigen 500 Aktualisierungen pro Rotation. Das sind 500*192*25 'Verschiebungen' pro Sekunde - das sind nur 2,4 MHz Shift-Out-Frequenz, geteilt durch 6 Kanäle = 400 kHz Shift-Out-Frequenz.
Dies ist mit Arduino (20 MHz wirklich bevorzugt) erreichbar, erfordert jedoch sorgfältige Programmierung und Timing.
Also zu deinen Fragen:
1) Ich denke nicht. 8-Bit-Register würden ein kniffliges PCB-Routing erfordern
2) Wenn Sie 24 Ausgänge hätten, wäre es einfacher. Außerdem wäre es für ein so großes Display schön, genügend internen Speicher für Framebuffer zu haben, um die Programmierung zu vereinfachen. Auf dem Minimum würden Sie 16 KB Speicher benötigen, was Sie bei 8-Bit-AVRs nicht finden können. Mittelklasse-ARMs sind vielleicht besser, aber schwieriger zu entwickeln.
3) Nun, das bist du nicht. Sie verwenden Strom von 595, sie sind nicht sehr leistungsfähig, aber im einfachsten Fall ausreichend (siehe Datenblatt für das jeweilige Modell, das Sie haben).
4,5) Schneller als nötig :-)
Steven Smethurst
davidcary
Steven Smethurst