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!
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...
Öhm, was genau meinst Du. Multiplexe ich mit einigen kHz oder ändere ich den Wert am Port einige tausend Mal die Sekunde?
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.
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?
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?
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.
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).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.