Forum: Mikrocontroller und Digitale Elektronik 16x10_RGB-Matrix


von Peter (Gast)


Lesenswert?

Hallo Zusammen ich habe eine Frage bezüglich meines Vorhabens eine 16x10 
RGB Matrix mittels eines AVRs anzusteuern (8-Bit Auflösung).

Habe mir schon diverse Beiträge zu dem Thema durchgelesen und auch die
Soft-PWM und LED-Fading Artikel implementiert.

Im Soft-PWM Artikel ist mir sogar ein Fehler aufgefallen:
Im Versuch 2 werden die Ausgänge nicht zurück gesetzt,
so dass die Rechenzeit doch höher ist als angegeben.

Nun zu meiner Frage:

Um ein Bild mit 200 Hz (100 würden reichen aber nicht bewegt) 
darzustellen,
benötige ich für jede Spalte eine PWM-Frequenz von 2kHz?
Um jede Farbe noch einzeln zu steuern ergeben sich 6 kHz.
Oder habe ich hier einen Denkfehler?

Leider lässt sich mit der Variante aus dem Soft-PWM Artikel nur eine 
PWM-Frequenz von ca. 600Hz realisieren.

Kennt ihr eine andere Lösung per Software-PWM eine solch hohe 
PWM-Frequenz zu realisieren?

Sonst bleibt mir nur die Möglichkeit auf PWM Module umzusteigen,
da ich eine Lösung mit mehreren AVRs vermeiden möchte.

Oder gibt es einen bezahlbaren AVR, der mir 10/16 HW-PWM-Channels zu 
Verfügung stellt?

Vielen Dank für eure Antworten.

(Bitte um ernstgemeinte Antworten und nicht nur "sinnfreie" Verlinkungen 
auf ähnliche Beiträge, da ich hier schon sehr viele durchforstet habe 
hier aber nicht wirklich eine Lösung präsentiert wird.)

Viele Grüße,
Peter

von Lisa (Gast)


Lesenswert?

Schau dir diesen Baustein an: TLC5940

von Kaj (Gast)


Lesenswert?

Peter schrieb:
> Oder gibt es einen bezahlbaren AVR...

Bezahlbar sind die alle...
ATmega2560: 4x 8-bit PWM, 12x 2 bis 16-bit PWM

von Oliver P. (mace_de)


Lesenswert?

Evtl. wäre es praktikabel eine Subframe-Ansteuerung zu verwenden so wie 
es beispielsweise bei der Ansteuerung eines Plasma Displays gemacht 
wird.
Es wäre müßig das verfahren hier noch mal im einzelnen darzulegen. Im 
Netz gibt es genug Quellen wo das gut erklärt ist. Einfach mal nach 
"plasma subframe" suchen.

von Jobst M. (jobstens-de)


Lesenswert?

Peter schrieb:
> Um ein Bild mit 200 Hz (100 würden reichen aber nicht bewegt)
> darzustellen,
> benötige ich für jede Spalte eine PWM-Frequenz von 2kHz?
> Um jede Farbe noch einzeln zu steuern ergeben sich 6 kHz.
> Oder habe ich hier einen Denkfehler?

Du meinst also, jede Spalte wird 10x so häufig angesteuert, wie jede LED 
..!?

Da liegt eindeutig ein Denkfehler vor.



Gruß

Jobst

von Peter (Gast)


Lesenswert?

@ Lisa: Danke für die Info den Chip hab ich mir schon mal angeschaut,
werd wohl darauf oder PCA 9532 zurückgreifen falls sich keine 
Software-PWM Lösung findet.

@Kai: Der 2560 ist bezahlbahr aber auch nicht günstig
und die 100 Pins sind mir fast schon wieder zuviel.
Muss mir das aber nocheinmal überlegen.

@Oliver: Kannst du das mit der Subframe-Ansteuerung etwas genauer 
erleutern?
Meinst du damit Bit Angle Modulation?
Falss ja ist es ein Ansatz habe aber immer noch Probleme auf die 
gewünschte PWM Frequenz zu kommen.

@Jobst

Meine Matrix besteht aus 10 Spalten mit 16 Zeilen zu drei Farben.
Die 16 Zeilen werden über 2 Ports angesteuert und die Spalten 
durchgeschalten (Multiplex).
Um nun für das Gesamtbild 200 Herz zu bekommen muss ich doch jede Zeile 
in einem Zehntel der Zeit ansprechen.
=> 2 kHz bzw 6 für RGB betrieb.
Falls du denkst ich irre mich bitte um genaue Erklärung.

Viele Grüße,
Peter

von Jobst M. (jobstens-de)


Lesenswert?

Peter schrieb:
> Um nun für das Gesamtbild 200 Herz zu bekommen muss ich doch jede Zeile
> in einem Zehntel der Zeit ansprechen.

Korrekt.

> => 2 kHz bzw 6 für RGB betrieb.

Nein, die Frequenz ändert sich dadurch nicht. Du hast nur 1/10 der Zeit, 
aber es wird nicht 10x so häufig wiederholt.


Gruß

Jobst

von Sean G. (atmega318)


Lesenswert?

Ich habe vor kurzem eine 16x16 RGB Matrix gemacht:
4 Einzelmatritzen 8 Anoden 24 Kathoden (8*RGB) verschaltet als Multiplex 
1:8 (insgesamt 8 Anoden und 96 Kathoden)
Transistoren für die 8 Anoden
12 * TLC5916 an die 96 Kathoden
Atmega1284 per HW SPI an die TLC, ein Port an Transis.
BAM, 8 Bit / Farbe, 5 Bit nach Korrektur.
IIRC 1khz Update @ 20mhz, dh 1000 ganze Multiplexzyklen

von Sean G. (atmega318)


Lesenswert?

Ich habe nochmal nachgeschaut, es sind doch nur ca. 150 Hz, weil ich die 
Prozessorlast minimieren wollte, sodass noch eine kleine Grafik - Engine 
drauf läuft.

von Peter (Gast)


Lesenswert?

Jobst M. schrieb:
> Nein, die Frequenz ändert sich dadurch nicht. Du hast nur 1/10 der Zeit,


Um in einem 1/10 der Zeit einen kompletten PWM Zyklus unterzubringen 
muss die PWM höher takten, sonst wird sie abgeschnitten, oder etwa 
nicht.

Daraus folgt, dass die PWM-Frequenz bei 2/6 kHz liegt.


Würde ich die Multiplexfrequenz stark hochsetzen, folgt dadurch ein 
erheblicher Daten-Umladeaufwand, der mir meiner jetzigen Überlegung nach 
das ganze zu sehr bremst bzw. unmöglich macht.

Falls ich dennoch falsch liege, würde ich mich freuen wenn du es mir 
bitte genauer erklären würdest warum.

@Sean: Hast du ein Bild davon?

Viele Grüße,
Peter

von Sean G. (atmega318)


Lesenswert?

Peter schrieb:
> @Sean: Hast du ein Bild davon?

Im Moment läuft es leider nicht, habe gerade keine Zeit es wieder in 
Betrieb zu nehmen. Ich habe aber noch ein Video, mit einer einfachen 
Endlosschleife, die etwa so aussieht:
while(1)
{
     drawRectangle(rand() % 16, rand() % 16, rand() % 32, rand() % 32, 
rand() % 32);
     _delay_ms(300);
}
http://www.youtube.com/watch?v=PLY8A_yAaQs

von Jobst M. (jobstens-de)


Lesenswert?

Peter schrieb:
> Daraus folgt, dass die PWM-Frequenz bei 2/6 kHz liegt.

Ach, das meinst Du. Ja.

Dann brauchst Du nur noch 16 PWMs, die einen Zyklus von 6kHz haben - 
also 6kHz * 256 = 1,5MHz Takt.

Als Hardware schwer zu syncronisieren, in Software bekommst Du 
vielleicht 4 Stück davon hin.


Gruß

Jobst

von Highii H. (highii)


Lesenswert?

Sean Goff schrieb:
> 8 Bit / Farbe, 5 Bit nach Korrektur

8 Bit / Farbe verstehe ich. Aber was heißt "5 Bit nach Korrektur"?

von Sean G. (atmega318)


Lesenswert?

Mit Korrektur meine ich Anpassung an die Nichtlinearität des Auges. Hier 
ein guter Artikel dazu: 
http://www.mikrocontroller.net/articles/LED-Fading
Von dort kommt auch die Tabelle, die ich verwende:
1
const uint16_t pwmtable_8D[32] PROGMEM =
2
{
3
    0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11, 13, 16, 19, 23,
4
    27, 32, 38, 45, 54, 64, 76, 91, 108, 128, 152, 181, 215, 255
5
};

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.