Ich hätte ein paar Fragen. Vielleicht könnt ihr mir mit eurer Erfahrung weiter helfen, ob meine Gedanken so richtig sind. Grundsätzlich möchte ich eine Menge LEDs mit einem Atmel AVR ansteuern. Über 30 Stück insgesamt. Dabei wollte ich einen großen atmega mit vielen Portpins benutzen. Natürlich kann ich dabei nicht auf Hardware-PWM zurückgreifen, weil es schlicht zu wenig Kanäle gibt. Angenommen, ich habe eine Taktfrequenz von 14 MHz. Reichen 100 Hz, um eine flimmerfreie LED-PWM hinzubekommen? Reichen 7 bit als Auflösung? Dann würde ich nämlich einen Timer-Interrupt programmieren mit 2^7*100Hz. Das wären rund 13 kHz. Das heißt, ich hätte in meiner Interrupt-Routine rund 1000 Zyklen Zeit. Nutze ich nur 100, wäre die CPU zu etwa 10% ausgelastet und ich hätte noch genug Kapazität frei, um die am USART eingehenden Daten zu verarbeiten oder sonstige Dinge zu erledigen. 100 Zyklen solltenja locker reichen, um zig Kanäle ein- oder auszuschalten. Sehr ihr irgendwelche Probleme dabei?
Gonzo schrieb: > Grundsätzlich möchte ich eine Menge LEDs mit einem Atmel AVR ansteuern. > Über 30 Stück insgesamt. Dabei wollte ich einen großen atmega mit vielen > Portpins benutzen. Das wird aber eng. Du hast ja auch noch eine 2-te Beschränkung. Du kannst nicht beliebig viel Strom durch die Spannungsanschlüsse des Mega jagen. Alternative: eine Schieberegisterkette. Dann reicht auch ein kleiner Mega > Natürlich kann ich dabei nicht auf Hardware-PWM > zurückgreifen, weil es schlicht zu wenig Kanäle gibt. exakt > Angenommen, ich habe eine Taktfrequenz von 14 MHz. Reichen 100 Hz, um > eine flimmerfreie LED-PWM hinzubekommen? normalerweise ja. Obwohl es Leute gibt, die sagen sie könnten die 100Hz sehen. Speziell wenn die LED am Bildfeldrand sind, kann es sein, dass sich da etwas merkwürdies tut. > Reichen 7 bit als Auflösung? Kommt drauf an, wieviele nutzbare Abstufungen du wirklich brauchst und wie 'linear' der optische Helligkeitsverlauf sein soll. > Interrupt-Routine rund 1000 Zyklen Zeit. Nutze ich nur 100, wäre die CPU > zu etwa 10% ausgelastet und ich hätte noch genug Kapazität frei, um die > am USART eingehenden Daten zu verarbeiten oder sonstige Dinge zu > erledigen. > > 100 Zyklen solltenja locker reichen, um zig Kanäle ein- oder > auszuschalten. Das sind pro Kanal 3 Takte. Wird eng. Aber du musst ja nicht bei 10% bleiben. UART über Interrupt und für den Rest bleibt dann noch einiges an Zeit übrig. Summa Summarum, solltest du mit 30 LED noch keine Probleme haben.
Karl Heinz, danke schonmal. Ich brauche keine "sanften" Helligkeitsübergänge, es gibt auch kein häufiges Update der Helligkeitswerte. Im Prinzip geht es nur darum, Statusanzeigen mittels Photodiode an die Umgebungshelligkeit anzupassen. Gehe ich recht in der Annahme, dass ich in der ISR für jeden einzelnen Kanal einen 8bit-Vergleich machen muss? Kann man da die Toggle-Funktion der neueren megaAVRs vielleicht geschickt ausnutzen? Ich glaube, ich male mir das mal auf ein Blatt Papier auf. Jetzt mal abgesehen von der Software, so 30 LEDs per PWM machen doch eine ziemliche EMV-Verseuchung, oder? Was kann man da standardmäßig machen? Ach so, wegen der Portpins... Treibertransistoren sind natürlich vorgesehen.
Gonzo schrieb: > Karl Heinz, danke schonmal. > > Ich brauche keine "sanften" Helligkeitsübergänge, es gibt auch kein > häufiges Update der Helligkeitswerte. Im Prinzip geht es nur darum, > Statusanzeigen mittels Photodiode an die Umgebungshelligkeit anzupassen. ? Alle gleich? Wozu brauchst du dann 30 Kanäle? Dann reicht doch einer. > Gehe ich recht in der Annahme, dass ich in der ISR für jeden einzelnen > Kanal einen 8bit-Vergleich machen muss? Mehr oder weniger > Kann man da die Toggle-Funktion > der neueren megaAVRs vielleicht geschickt ausnutzen? Nicht wirklich. Sie wird dir hier nichts bringen. > Jetzt mal abgesehen von der Software, so 30 LEDs per PWM machen doch > eine ziemliche EMV-Verseuchung, oder? Nicht so wild. > Ach so, wegen der Portpins... Treibertransistoren sind natürlich > vorgesehen. Äh. OK. Dann treibst du aber trotzdem eine Menge Aufwand. Mit einm 74HC595 kann man jeweils 8 LED treiben (4 gegen Vcc, 4 gegen GND) oder aber man nimmt gleich einen TPIC595, der kann dann überhaupt gleich mehr Stromg. 4 Stück davon hintereinander, an 3 Pins vom Mega angeschlossen und fertig ist deine LED Ansteuerung inclusive Treiber. Hab sowas mal mit 60 Led, 6-Bit PWM und 11.iregdnwasMhz gemacht. Ist vom Timing her noch kein Problem und es bleibt noch genug Zeit für eine UART und etwas Rechnerei übrig. Und da hab ich mich noch nicht einmal bemüht, die PWM möglichst clever aufzubauen :-)
Ein einzelner ATMega kann locker tausende von LEDs mit individuellen Helligkeiten per PWM steuern - wenn man ein ordentlich effektives Programm schreibt und die LEDs nicht zu blöde angeschlossen sind. Es liegt an dir, nicht am uC. So lange der Kopf ruhig ist, reichen 50Hz, aber bei bewegen des Kopfes flimmert so ein Bild. Man sollte über 170Hz erreichen.
> Ein einzelner ATMega kann locker tausende von LEDs mit individuellen > Helligkeiten per PWM steuern - wenn man ein ordentlich effektives > Programm schreibt und die LEDs nicht zu blöde angeschlossen sind. Wie?
Gonzo schrieb: >> Ein einzelner ATMega kann locker tausende von LEDs mit individuellen >> Helligkeiten per PWM steuern - wenn man ein ordentlich effektives >> Programm schreibt und die LEDs nicht zu blöde angeschlossen sind. > > Wie? Als Matrix verschalten. OK, Tasuend-e ist vielleicht ein wenig hoch gegriffen. Aber auf jeden Fall: eine ganze Menge! Mehr als deine 30 auf jeden Fall. Mehr als meine 60 auf jeden Fall.
> Wie? Wie wie ? Wie angeschlossen ? Entweder direkt (was bei mehr als PortPins vorhanden sind ein Problem wird), oder mit externen Porterweiterungen, üblich sind da 74HC273 oder 74HC595. Man kann problemlos in unter 128us jeweils 128 bit in 8 parallele Stränge aus je 16 74HC595 schieben um 1024 LEDs mit gespeicherten Helligkeitswerten zu versorgen, das ganze 128 mal wiederholen und bleibt immer noch über 60Hz Widerholfrequenz. Mit ein wenig Nachdenken bliebt dabei der Prozessor auch noch zu 95% für andere Tasks frei, z.B. um das Array der Helligkeiten überhaupt erst mal zu berechnen. Schwierig wäre es halt, wenn die LEDs so angeschlossen sind, daß schon die Datenaufbereitung und das hinschicken zu erheblichem Programmaufwand führt.
Das schöne am 595 ist ja der Enable-Pin !G. Den kann man einfach per (Hardware-)PWM befeuern, und steuert so die Helligkeit aller LEDs gleichzeitig. Wenns eh nur Statusanzeigen sind, wird sich deren Wert selten ändern, dann hat der Controller praktisch nix mehr zu tun.
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.