PWM-Steuerung - Blinkendes Dauerleuchten

 

Materialbedarf

 

Anz. Bezeichnung Datenblatt
1 Batterie/Spannungsquelle 9V  
1 Spannungsregler 7805
1 ATMega8 AVR-Prozessor
1 Widerstand 220 Ohm  
1 Widerstand 10 kOhm  
1 Elektrolytkondensator 100 µF/16V  
1 Kondensator 100nF  
2 Mikrotaster
1 Standard-Leuchtdiode 3mm oder 5mm 3mm, 5mm

 

 

Ein Blinken wird zum Leuchten

 

Eine sehr schöne Eigenschaft der AVRs ist es, dass der ATmega von Haus aus PWM-Steuerung beherrscht. Was ist aber PWM?

 

Möchte man Lampen, Leuchtdioden etc. dimmen, kann man dies einfach über Widerstände oder Potentiometer tun. Diese Methode hat aber den sehr großen Nachteil, dass ein sehr großer Anteil der Energie eben an diesem Widerstand verloren geht.

Bei einer PWM-Steuerung entfällt dieser Nachteil. Hier wird der entsprechende Verbraucher für einen kurzen Moment eingeschaltet und dann wieder abgeschaltet. Dieses Ein- bzw. Ausschalten geht so schnell, dass unser Auge dies nicht mitbekommt und so ein Dauerleuchten sieht. Die Helligkeit wird nun dadurch gesteuert, dass man das Verhältnis von Einschalt- zur Ausschaltzeit ändert. Je größer die Einschaltzeit ist, desto heller leuchtet z.B. die Leuchtdiode. Dies erklärt auch die Abkürzung PWM. PWM bedeutet ausgeschrieben: Puls-Weiten-Modulation.

Der ATmega8 stellt uns 3 PWM-Ausgänge zur Verfügung. Diese Ausgänge werden dann mit Hilfe von Timern gesteuert. An Port B Pin 1 und Pin 2 befinden sich die PWM-Ausgänge 1a und 1b (OC1A und OC1B) welche durch den Timer 1 gesteuert werden können. Port B Pin 3 enthält den PWM-Ausgang, welcher durch Timer 2 gesteuert werden kann (OC2).

Hier werden wir uns aber nur mit dem PWM-Ausgang OC1A befassen. Daher schließen wir dort eine Leuchtdiode an. 

 

 

Jetzt brauchen wir hierzu natürlich wieder ein kleines Programm.

Wird das nachfolgende Programm auf den AVR übertragen leuchtet die LED hell auf. Sofern ist das ja nichts besonderes. Dieses hatten wir in anderen Lehrgängen schon des Öfteren.

 

$regfile "m8def.dat"
$crystal = 1000000

Config Portb.1 = Output

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1

Compare1a = 1

Do
Loop

 

Interressant wird es erst dann, wenn wir die Anweisung 'Compare1a=1' ändern. Setzen wir anstelle den Wert 1 z.B. 128 ein und übertragen das Programm erneut, leuchtet die LED schon um einiges dunkler. Diesen Wert können wir bis 255 erhöhen und je größer dieser gemacht wird, desto dunkler wird die Leuchtdiode.

 

Um das genau zu verstehen, müssen wir uns die Config-Anweisung einmal genauer ansehen:

 

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1

 

Als erstes teilen wir dem AVR mit der Anweisung 'Timer1=Pwm' mit, dass dieser min. einen PWM-Ausgang steuern soll. Mit 'Pwm=8' wird festgelegt, dass für die PWM-Erzeugung nur die unteren 8 Bit des Timers verwendet werden soll. Da der Timer 1 ein 16 Bit-Timer ist, kann man hier auch 9 Bit (Pwm=9) oder 10 Bit (Pwm=10) verwenden. Höhere Bitzahlen haben den Vorteil, dass die Steuerung feiner erfolgt. In der Regel dürfte aber eine Abstufung mit 256 Schritten ausreichend sein.

 

Ein sehr wichtiger Parameter ist die 'Compare A Pwm = Clear Up' Anweisung. Hiermit wird festgelegt, dass sich der PWM-Ausgang beim erreichen des Vergleichswertes einschalten soll. Es ist auch 'Compare A Pwm = Clear Down' möglich. Hier wird der Ausgang beim erreichen des Vergleichswertes ausgeschaltet.

 

In der Config-Anweisung für Timer 1 ist es auch möglich die PWM-Steuerung für den OC1B-Ausgang (Port B Pin 2) festzulegen. Hier muss man dann nur 'Compare B Pwm= xxxx' hinzufügen.

 

Wird Timer 1 als PWM-Timer verwendet, steuert dieser immer beide PWM-Ausgänge. Nun kommt es aber vor, dass nur 1 PWM-Ausgang benötigt wird und man den anderen Pin als normalen Ausgang oder Eingang verwenden möchte. Hier muss man dann das Statemant 'Compare A/B Pwm = Disconnect' einfügen. Damit wird dem Timer verboten den entsprechenden Ausgang zu steuern.

 

Anschließend folgt noch der Taktvorteiler mit 'Prescale=1'. Wer möchte, kann diesen einmal um einiges erhöhen. Dann kann man das Umschalten der Leuchtdiode sichtbar machen.

 

Um nun die PWM-Ausgabe zu starten muss nur noch das Vergleichsregister mit 'Compare1a = xxx' geladen und der Timer 1 gestartet werden. Nun muss man nur das Vergleichsregister neu setzen, wenn die Helligkeit geändert werden soll. Ansonsten läuft die PWM-Steuerung vollautomatisch.

 

 

Ein Dimmer entsteht

 

Nun ist es nicht mehr sonderlich schwer aus unserem AVR einen kleinen LED-Dimmer zu bauen. Hierzu müssen nur 2 Taster ergänzt werden.

 

 

Nach der Übertragung des Programms kann man mit S2 die Helligkeit der Leuchtdiode erhöhen. Mit S1 wird die Leuchtkraft verringert.

 

$regfile "m8def.dat"
$crystal = 1000000

Dim Pwmval As Byte

Config Portb.1 = Output
Config Portd.0 = Input
Config Portd.1 = Input

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1

Portd.0 = 1 : Portd.1 = 1

Compare1a = 255
Pwmval = 1

Do
  If Pind.0 = 0 Then
    If Pwmval < 255 Then Incr Pwmval
    Waitms 50 : Compare1a = Pwmval
  End If
  If Pind.1 = 0 Then
    If Pwmval > 1 Then Decr Pwmval
    Waitms 50 : Compare1a = Pwmval
  End If
Loop

 

 

Zurück zur Auswahlseite            Zur Hauptseite