Guten Abend, aktuell arbeite ich an einer RGB-LED Matrix. Dazu habe ich drei Schieberegister, 74HC595, am SPI des Atmels, also Hardware SPI. zusätzlich habe ich einen PORT am Atmel, also 8 IOs. Der Atmel ist ein ATmega8 und hat einen 20 MHz Quarz, was auch problemlos läuft. Als Treiber habe ich noch drei ULNs und ein paar Transistoren im Einsatz. Nun möchte ich ein PWM mit 100-200Hz, und 256 Schritten erzeugen. Dazu habe ich aktuell schon etwas herumprobiert, aber leider bekomme ich ab zwei Spalten und nur einem Schieberegister schon ein Flimmern. Ich Update aktuell im Timer ISR das SPI nun denke ich das das zu dem Problem führt. Wie wäre ein sinnvoller Aufbau dabei ? Leider bin ich noch am Anfang mit Interupt Programmierung und habe noch kein wirkliches Gefühl dafür, wie Kritisch ist so ein Timer ISR ? Gruß Martin
> PWM mit 100-200Hz, und 256 Schritten erzeugen Das sind also dann 200 Hz * 256 = ca. 50 kHz PWM-Frequenz. Also mußt du den Timerinterrupt alle 20 us aufrufen und hast dann wieder maximal diese Zeit, um den SPI abzuhandeln. Bei entsprechender Taktrate auf dem SPI sollte das für die 3 Bytes eigentlich reichen. Oder willst du in einer kompletten Matrix mit 200 LEDs jede einzelne in der Helligkeit einstellbar machen? Zeig doch mal deinen Code (und am besten auch noch den Schaltplan)...
Ich tippe auf eine 8x8 RGB-Matrix in der er jede LED einzeln einstellen möchte, ergibt rechnerisch dann quasi das Gleiche wie lkmiller's 200 einzeln dimmbare LEDs. Wenn wir mal bei 100Hz PWM-Frequenz bleiben ergibt das unterm Strich: 20.000.000MHz / (100Hz 256 8) = ca. 97 Takte um das Bitmuster für die nächste Zeile zu berechnen und per SPI rauszuschieben. Dann natürlich noch Zeile umschalten und SRs latchen. Kann schon klappen bei cleverer Programmierung, aber dann ist der Controller auch voll und macht sonst nix mehr, d.h. für die Berechnung der eigentlichen Effekte (Farbverläufe, HSV->RGB Konvertierung usw.) bleibt nicht mehr wirklich viel Zeit übrig. Evtl. sollte man da auch über ISRs in Assembler nachdenken.
@ Martin H. (martin_h85) >aktuell arbeite ich an einer RGB-LED Matrix. Dazu habe ich drei >Schieberegister, 74HC595, am SPI des Atmels, also Hardware SPI. Also 8x24 LEDs bzw. 8x8 RGB LEDs. zusätzlich habe ich einen PORT am Atmel, also 8 IOs. Der Atmel ist ein >Nun möchte ich ein PWM mit 100-200Hz, und 256 Schritten erzeugen. Dazu >habe ich aktuell schon etwas herumprobiert, aber leider bekomme ich ab >zwei Spalten und nur einem Schieberegister schon ein Flimmern. Was nur logisch ist. Schon mal nachgerechnet? Bei einer 8:1 gemultiplexten LED-Matrix braucht man für 100 Hz Bildwiederholfreqeunz 800 Hz Zeilenfrequenz. Und wenn man die mit 256 Stufen machen will ist man bei 204,8 kHz PWM-Takt, sprich 5us. Das sind 100 Takte bei 20 MHz. Sportlich. >Ich Update aktuell im Timer ISR das SPI nun denke ich das das zu dem >Problem führt. Wie wäre ein sinnvoller Aufbau dabei ? Soft-PWM ohne Multiplexen. >Leider bin ich noch am Anfang mit Interupt Programmierung und habe noch >kein wirkliches Gefühl dafür, wie Kritisch ist so ein Timer ISR ? Wenn die Zahl im einstelligen Mikrosekundenbereich landet, sollte man mal nachrechnen . . . MFG Falk
Mahlzeit, ja das es knapp wird dachte ich mir auch schon, aber es ist ja wirklich sehr knapp geworden. Dann werde ich mich wohl mal mit Assembler Programmierung auseinander setzen müssen. es ist im übrigen eine 8x8 RGB Matrix. Die Daten wollte ich mit der USART einlesen, das sind relativ wenig Takte. Aber bei den aktuellen Tests habe ich dies aber noch nicht drin. Ich habe zum Testen auch einen kleinen Prototypen auf Lochraster aufgebaut, ca. eine Euro groß, Hardwaremäßig funktioniert es auch ganz gut. Nur wie gesagt läuft die Software noch nicht. Aber ich werde wohl mal weiter Ausprobieren müssen. Für Soft-PWM fehlen mir leider die IOs. Aber ich werde mal drüber nachdenken. Gruß Martin
Guten Tag, ich habe mir gerade Gedanken dazu gemacht. Wäre es vom Timing her sinnvoller einen z.B. Mega32 zu nehmen, 24 IOs und ein 74HC164 um nur die Zeilen durchzuzählen ? Gruß Martin
Martin H. schrieb: > Guten Tag, > > ich habe mir gerade Gedanken dazu gemacht. Wäre es vom Timing her > sinnvoller einen z.B. Mega32 zu nehmen, 24 IOs und ein 74HC164 um nur > die Zeilen durchzuzählen ? Damit bist du aber dieses Problem > Schon mal nachgerechnet? Bei einer 8:1 > gemultiplexten LED-Matrix braucht man für 100 Hz > Bildwiederholfreqeunz 800 Hz Zeilenfrequenz. Und wenn man die mit 256 > Stufen machen will ist man bei 204,8 kHz PWM-Takt, sprich 5us. Das sind > 100 Takte bei 20 MHz. Sportlich. immer noch nicht los. Dein 74HC164 realisiert genau das 8:1 Multiplexing
@ Martin H. (martin_h85) >ich habe mir gerade Gedanken dazu gemacht. Wäre es vom Timing her >sinnvoller einen z.B. Mega32 zu nehmen, 24 IOs und ein 74HC164 um nur >die Zeilen durchzuzählen ? Nein. Sinnvoll wäre die Nutzung von 3x TLC5922 oder ähnlichem anstatt der Schieberegister. Dann klappt das auch mit der Dimmung, denn die macht der TLC fast allein. Siehe LED-Matrix. MFG Falk
Zum Thema Assembler würde ich folgendes sagen; wenns mit C nicht mehr geht, dann muss ein schnellerer Controller her. Bringt ja nichts, es allenfalls mit Müh und Not in Assembler gerade noch so hinzukriegen das es läuft nur um festzustellen, dass man später halt doch noch ein Feature mehr braucht, dass dann gerade nicht mehr geht und man dann eh auf eine schnellere Maschine umsteigen muss.
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.