Forum: Mikrocontroller und Digitale Elektronik Fragen zur PWM für LEDs


von Gonzo (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Gonzo (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von MaWin (Gast)


Lesenswert?

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.

von Gonzo (Gast)


Lesenswert?

> 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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

> 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.

von Malte M. (maltem)


Lesenswert?

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
Noch kein Account? Hier anmelden.