Lieber Besucher, herzlich willkommen bei: RCLine Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

Donnerstag, 4. Dezember 2008, 18:12

LED mit PWM blinken lassen

Suche
ein Programm für ATMEGA 8 mit dem man eine LED mit abwechselnder Helligkeit
blinken lassen kann. Wenn möglich mit guter Auskommentierung.
Endziel ist ein Lauflicht bei dem nacheinander die LEDs angesteuert werden.

Verstehe wohl das Prinzip, jedoch mit der Umsetzung komme ich nicht klar.

jeder Hinweis willkommen

Uwe

Encoder

RCLine Neu User

Wohnort: France

Beruf: Student

  • Nachricht senden

2

Donnerstag, 4. Dezember 2008, 20:40

Halo

vielleicht kann dir das weiter helfen?

http://www.mikrocontroller.net/articles/LED-Fading
Hello

3

Donnerstag, 4. Dezember 2008, 23:19

Zitat

Suche ein Programm für ATMEGA 8 mit dem man eine LED mit abwechselnder Helligkeit blinken lassen kann


Die Aufgabe klingt lapidar hat es aber in sich.
Da der ATMEGA 8 nur 3 interne Hardware PWM's hat muss man für so etwas eine Software PWM programmieren.

Dazu lässt man einen Timer "schnell" - also mit möglichst niedrigem Prescaler - und einem Überlaufzähler laufen.
Dann schaltet man den jeweiligen Ausgang, in der Timer Overflow Interrupt Routine beim Erreichen eines Schwellenwertes ( hier kommt der Überlauftimer ins Spiel ) für den entsprechenden Kanal ab.

Beispiel.
Kanal 1 = Schwellenwert 127
Kanal 2 = Schwellenwert 0
Kanal 3 = Schwellenwert 255
Kanal 4 = Schwellenwert 80

Die Interruptroutine:
Der Überlaufzähler wird den Kanal 2 erst gar nicht anschalten, weil der ja "0" ist.
Als nächstes wird der Kanal 4 beim Zählerstand 80 abgeschaltet.
Dann folgt Kanal 1 beim Zählerstand von 127.
Kanal 3 wird nicht abgeschaltet, weil der ja den maximal möglichen Zählerstand hat.
Somit entsteht für das Auge der Eindruck, das Kanal 4 ein wenig leuchtet, Kanal 1 die halbe Helligkeit hat und Kanal 3 voll leuchtet.
Kanal 2 ist aus.

Dann läuft der Überlaufzähler selbst über und beginn mit Zählerstand 0 wieder von vorne.

Die Frequenz ist so zu wählen, das ein Zählerdurchlauf innerhalb von <20ms erfolgt.
Da man sonst ein Flackern der LED's bemerken wird.

In der Praxis bedeutet das, den Controller mit hohen Taktfrequenzen laufen zu lassen und die Timer Overflow Routine so kurz wie nur möglich zu gestalten.
Ich würd die Overflow Routine in Assembler schreiben und auch die benötigten Register per Hand sichern.
Wenn man den 8Bit Timer benutzen will sollte man eine Prescaler von mindestens 8 benutzen, da sonst alle 256 Takte ( Prescaler = 1 ) ein Interrupt ausgeführt wird und somit keine Zeit mehr für die Abarbeitung der Hauptroutine bleibt.
Auch bei Prescaler 8 sind es maximal nur 2048 Takte, wobei da schon einige für den Aufruf der Interruptroutine verbraten werden.

Ich teste sowas immer mit dem Simulator vom AVR Studio 4.
Da kann man sich schon mal ein Bild machen, ob sowas Timingmässig hinhaut.

Die Hauptroutine kann in einer Hochsprache laufen, da das ja nicht wirklich zeitkritisch ist.
In dieser Hauptroutine werden die jeweiligen Schwellenwerte für die einzelnen Kanäle ermittelt und in Variablen für die Abholung in der Interruptroutine geparkt.

Das mit der nichtlinearen Helligkeitskurve der LED ist natürlich ein Problem.
Am Einfachsten kann man das mit einer Look Up Table lösen . In der dann der errechnete Wert in einen Wert für die PWM umgesetzt wird.
Die Tabelle hat dann 256 Einträge, die bei 0 beginnen und dann so berechnet wird, das sich ein lineares Helligkeitsbild der LED's ergibt.
Die unteren Werte werden dabei etwas schneller ansteigen, als die mittleren bzw. oberen.