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.