mikrocontroller.net

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


Autor: whatever (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: whatever (Gast)
Datum:

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

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michaels Variante:
x = 0 to n-1
    Für jede Zeile:
        Für jeden Pixel in Zeile:
            Wenn der Pixel heller als x sein soll
               LED an
            Sonst
               LED aus
        nächster Pixel
    nächste Zeile
nächstes x

Meine Variante:
Für jede Zeile:
    x = 0 to n-1
        Für jeden Pixel in Zeile:
            Wenn der Pixel heller als x sein soll
               LED an
            Sonst
               LED aus
        nächster Pixel
    nächstes x
nächste Zeile

Ist das verständlich?

Autor: whatever (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: whatever (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.