Forum: Mikrocontroller und Digitale Elektronik LED Matrix mit Graustufen, wie?


von whatever (Gast)


Lesenswert?

Hallo,

ich wollte eine 8x6(x3) LED-Matrix  mit sagen wir 16 Graustufen (8 
würden eventuell reichen) bei etwa 30 fps ansteuern. LED-Matrix und PWM 
sind mir klar, aber das Problem ist, ich weiß nicht recht wie ich beide 
kombiniere, vor allem so, dass es schnell wird. Sollte ich die einzelnen 
Bytes an den Port schieben und jedes jeweils so lange an lassen bis die 
Helligkeit erreicht ist und dann zur nächsten Zeile springen? Flimmert 
das dann nicht zu stark? Geht das schnell genug für 50-150 LEDs?
Danke für eure Hilfe!

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Ne Du hast ne "interne Frequenz" von sagen wir mal einigen KHz und Du 
machst ein normales Multiplex. Je nach Graustufenwert schaltest dann 
halt Deine LED nur jedes n-te mal ein... unterm Strich is die 
resultierende Frequenz aber noch gross genug dass nichts flimmert...

von whatever (Gast)


Lesenswert?

Öhm, was genau meinst Du. Multiplexe ich mit einigen kHz oder ändere ich 
den Wert am Port einige tausend Mal die Sekunde?

von Kai G. (runtimeterror)


Lesenswert?

Ich erhöhe normaler Weise die Multiplexing-Frequenz um Faktor n, erhöhe 
die Zeile aber nur alle n Zähler. Auf diese Weise kann ich jedem Pixel n 
mal einen neuen Wert zuweisen. Je mehr von diesen n Stufen an sind, 
desto heller der Pixel.

Ist Geschmackssache. Beide Varianten flimmern auf unterschiedliche Art. 
Auch eine Kombination ist denkbar.

von Kai G. (runtimeterror)


Lesenswert?

Michaels Variante:
1
x = 0 to n-1
2
    Für jede Zeile:
3
        Für jeden Pixel in Zeile:
4
            Wenn der Pixel heller als x sein soll
5
               LED an
6
            Sonst
7
               LED aus
8
        nächster Pixel
9
    nächste Zeile
10
nächstes x

Meine Variante:
1
Für jede Zeile:
2
    x = 0 to n-1
3
        Für jeden Pixel in Zeile:
4
            Wenn der Pixel heller als x sein soll
5
               LED an
6
            Sonst
7
               LED aus
8
        nächster Pixel
9
    nächstes x
10
nächste Zeile

Ist das verständlich?

von whatever (Gast)


Lesenswert?

Das bedeutet doch aber, dass ich jeden Pixel individuell handhaben muss 
und nicht die ganze Zeile auf einmal, oder? Dauert das nicht zu lange im 
AVR?

von Kai G. (runtimeterror)


Lesenswert?

Ist nur Pseudocode - wenn ich jetzt alle Optimierungen reingepackt hätte 
wär's unverständlich geworden.

Aber ja, das was du vorhast ist schon recht aufwändig für den 
Controller. Bei einer normalen PWM bedeuten 8 Farbabstufungen pi mal 
Daumen doppelten Rechenaufwand gegenüber 4 Abstufungen, da etwa doppelt 
so viele Updates an die Ports geschickt werden müssen.

Wie wolltest du die 8x6x3-Matrix mit den Ports verkabeln? Wie viele 
Zeilen/Spalten? Daraus ergibt die die Verteilung für den Rechenaufwand.

von JojoS (Gast)


Lesenswert?

bei der 'Standard' Beschaltung einer LED-Matrix mit z.B. Zeiltentreiber 
und Schieberegister für die Spalten kann man eine LED ja gar nicht 
einzeln ansteuern, sondern eben nur Zeilenweise. Der max. 
Helligkeitswert wäre dann eine Zeile 1/n Zeilen eingeschaltet, für 
weniger muß man das Schieberegister komplett neu laden und umschalten 
während eine Zeile aktiv ist. Da muß man ausrechnen wie lange das dauert 
und ob das mögich ist (mit Latches am Schieberegister sollte das gehen).

von Kai G. (runtimeterror)


Lesenswert?

Wie gesagt, war nur Pseudocode.

Das Aktualisieren der Ports erfolgt in der Regel nach der Berechnung der 
gesamten Zeile. Man kann die je nach Speicherausstattung auch komplett 
vorberechnen. Das reduziert bei hohen Refresh-Raten gegenüber kleinen 
Frameraten der Rechenaufwand enorm.

Bei seiner Matrix-Größe kann man evtl. sogar aus die Schieberegister 
verzichten, wenn er genug I/Os hat und sonst nicht mehr viel anschließen 
will.

von whatever (Gast)


Lesenswert?

Also zusammengefasst bedeutet das in etwa das:

graustufen=8

for k=1:graustufen
   for k=1:zeilenzahl
      Port.B.=muster
   end

   check if leuchtdauer überschritten
   modify muster

end

oder? Stimmt das so?

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.