Pfad:
Home ==>
Mikrobeginner ==> 5. LED mit PWM
This page in English (external):
Lektion 5: Eine LED über eine PWM einstellen
Bis jetzt war Blinken mit der LED angesagt. Jetzt geht das Geblinke weiter, aber mit einer
sehr hohen Frequenz. Dafür verändern wir jetzt die LED-Helligkeit von ganz schwach
bis ganz hell. Und zwar echt linear und nicht mit einem nichtlinearen Strom.
5.0 Übersicht
- Einführung in den PWM-Modus des Timers
- Hardware, Bauteile, Aufbau
- Timer im Fast-PWM-Modus
- Timer im phasenkorrekten PWM-Modus
5.1.1 8-Bit-PWM
PWM heißt Puls-Weiten-Modulation. Dazu setzt der Timer beim Neustart einen Ausgang
(OCA, OCB) und wechselt bei Erreichen der Vergleicherwerte (OCRA, OCRB) dessen Polarität.
Mit Erreichen des höchsten Wertes (255) und mit dessen Überschreitung wird wieder
der Ausgangswert am Pin hergestellt.
Je später im Zählbereich der Vergleich eintritt, desto länger wird die erste
Phase und desto kürzer wird die zweite Phase mit umgekehrter Polarität. Dieses
Verhalten kann dazu dienen, mit dem Ausgangssignal Antriebsleistungen von Motoren oder eben
auch LED-Helligkeiten zu regeln.
Die Bits COM0A1 und COM0A0 im Port TCCR0A legen fest, wie sich der Ausgang OC0A verhält.
Mit 10 wird der Ausgang zu Beginn auf Eins gesetzt, mit 11 auf Null. Analog kontrollieren
COM0B1 und COM0B0 den Ausgang OC0B.
Dies hier zeigt die Impulsfolge am Ausgang OC0A, die sich bei Fast-PWM mit TOP=255 bei einem
Vergleicherwert von 100 ergibt.
Bei Fast PWM kann durch die Wahl des Timer-Vorteilers die PWM-Frequenz beeinflusst werden. Bei
den folgenden Taktfrequenzen ergeben sich bei den verschiedenen Vorteilern die folgenden
PWM-Frequenzen.
Takt | P=1 | P=8 | P=64 | P=256 | P=1.024 |
9,6 MHz | 37,5 kHz | 4,69 kHz | 586 Hz | 146,5 Hz | 36,6 Hz |
1,2 MHz | 4,69 kHz | 586 Hz | 73,2 Hz | 18,3 Hz | 4,6 Hz |
128 kHz | 500 Hz | 62,5 Hz | 7,8 Hz | 1,95 Hz | 0,49 Hz |
Bei 1,2 MHz liegen alle PWM-Frequenzen im hörbaren Bereich (bei Motorsteuerungen
wegen der Nebengeräusche wichtig). Ein Takt von 128 kHz kommt für PWM kaum in
Frage.
5.1.2 Phasenkorrekte 8-Bit-PWM
Das ist der Signalverlauf bei einer phasenkorrekten PWM. Hier zählt der Zähler
auf- und abwärts, jeweils bei Erreichen des Vergleichswerts erfolgt das Umschalten des
Ausgangssignals. Das bedingt eine Halbierung der PWM-Frequenz.
Die phasenkorrekte PWM-Version kommt dann zum Einsatz, wenn sich der Vergleichswert sehr
häufig und in großen Beträgen verändert. Dann zittert das Signal deutlich
weniger als im Fast-Modus.
5.1.3 PWM mit unterschiedlicher Auflösung
Mit einer Kombination des PWM-Modus mit der CTC-Steuerung des Timers lassen sich niedriger
auflösende PWM einstellen. So ist z. B. für eine Motorsteuerung eine PWM mit
acht Bit Auflösung (256 Stufen, 0,39% Genauigkeit) meistens überkandidelt. Um die
PWM-Frequenz zu steigern, könnte eine verkürzte Zykluszeit gewählt werden.
Setzt der Timer bei 16 zurück, erhält man eine 4-Bit-PWM, die sich in 16 Stufen
verstellen lässt (6,25% Genauigkeit).
Da bei einem 16-Bit-Timer der Vergleicher A für die CTC verwendet wird, kann nur der
Vergleicher B für PWM verwendet werden. Hat der AVR auch einen 16-Bit-Timer, dann ist
PWM wegen der extrem langen Zyklen (65.536 Takte, 0,0015% Genauigkeit) nur sinnvoll, wenn
dessen Auflösung auf die Anwendung sinnvoll verringert wird. Bei 16-bittigen Timern ist
daher ein weiterer Vergleicher verfügbar (ICR), mit dem der CTC-Modus gesteuert werden
kann, so dass die beiden Kanäle A und B für PWM-Signalerzeugung frei sind. Der
ATtiny13 hat keinen 16-Bit-Timer.
Takt | P=1 | P=8 | P=64 | P=256 | P=1.024 |
9,6 MHz | 37,5 kHz | 4,69 kHz | 586 Hz | 146,5 Hz | 36,6 Hz |
1,2 MHz | 4,69 kHz | 586 Hz | 73,2 Hz | 18,3 Hz | 4,6 Hz |
128 kHz | 500 Hz | 62,5 Hz | 7,8 Hz | 1,95 Hz | 0,49 Hz |
Für die PWM-Regelung kommt die gleiche Hardware zum Einsatz, wie wir sie schon in
Lektion 2 aufgebaut haben.
Eine PWM-Anwendung für eine Motorsteuerung. Hier treibt der OC0B-Ausgang einen
NPN-Transistor, der den 12V-Motor per PWM-Signal antreibt.
Mit den bisher dargestellten Funktionsweisen, Eigenschaften und Methoden lässt sich die
PWM-Ansteuerung der LED leicht programmieren. Als Zyklusfrequenz wählen wir 1,2 MHz
(Vorteiler = 1) geteilt durch 256 = 4,7 kHz. Das ist sowohl für das menschliche Auge
als auch für handelsübliche Digitalkameras schnell genug.
5.3.1 Programm
Indem wir die Polarität der PWM umkehren, heben wir die Umkehr durch die LED (0 = aus,
1 = ein) wieder auf (Quellcode hier).
;
; *******************************************
; * PWM-Ansteuerung einer LED im Fast-Modus *
; * (C)2016 by www.gsc-elektronic.net *
; *******************************************
;
.NOLIST
.INCLUDE "tn13def.inc"
.LIST
;
; -------- Register -------------------------
.def rmp = R16
;
; -------- Programm -------------------------
; Ausgang OC0A initiieren
sbi DDRB,DDB0 ; OC0A als Ausgang
; PWM-Wert in Timer 0
ldi rmp,20 * 256 / 100 ; 20% Helligkeit
out OCR0A,rmp ; in Vergleichsregister A
; Timer 0 in Fast PWM Modus, Output A zu Beginn Low
ldi rmp,(1<<COM0A1)|(1<<COM0A0)|(1<<WGM01)|(1<<WGM00)
out TCCR0A,rmp ; in Kontrollregister A
; Timer 0 mit Vorteiler 1 starten
ldi rmp,1<<CS00 ; Vorteiler auf 1
out TCCR0B,rmp ; in Kontrollregister B
; Schlafen ermoeglichen
ldi rmp,1<<SE ; Sleep enable
out MCUCR,rmp ; in Universal-Kontrollregister
Schleife:
sleep ; schlafen legen
nop ; Aufwachen
rjmp Schleife ; wieder schlafen legen
;
; Ende Quellcode
;
5.3.2 Ergebnis
Das geht recht einfach. Und das hier ist das Ergebnis:
0% | 1% | 2% | 3% | 4% |
 |
 |
 |
 |
 |
5% | 10% | 20% | 50% | 100% |
 |
 |
 |
 |
 |
Die Unterschiede in der Helligkeit sind klar erkennbar.
Entscheidend ist, dass sich die PWM in Wirklichkeit nie auf Null drehen lässt: immer wird
der erste Taktimpuls aktiviert, auch wenn das Vergleichsregister auf Null steht. Wer also
tatsächlich ausschalten will, entkoppelt OC0A vom Timer und setzt den Portpin auf Null
oder Eins.
5.3.3 Simulation des PWM-Modes
avr_sim
kann dazu verwendet werden, um das Timing im PWM-Mode zu überprüfen.
Nach 6,67 µs ist der Timer im Fast-PWM-Modus. Der Vergleichswert
in A ist 51, Ausgangspin PB0 wird beim Vergleichswert auf Eins (LED aus) und
zu Beginn auf Null (LED an) gesetzt.
Der Port B nach der Initiierung, Pin PB0 ist als Ausgang gesetzt. Das
bedeutet, dass die LED über die ersten (51 + 1) Zyklen an ist und
bis 256 (Null) aus, was 20,3% Einschaltdauer entspricht.
Das ist der Zähler, wenn der erste Match aufgetreten ist. Die
bis dahin verbratenen 42,5 µs sind korrekt.
Das erste Vergleichsereignis setzt PORTB0 und schaltet damit die LED aus.
Der erste Überlauf von 255 auf Null erfolgt nach
212,5 µs, was einer PWM-Frequenz von 1.200 / 256 =
4,7 kHz entspricht.
Der Überlauf hat das Portbit PORTB0 zurückgesetzt, die LED ist
wieder an und der PWM-Zyklus beginnt erneut.
Den phasenkorrekten PWM-Modus kriegen wir, indem wir das WGM01-Bit im obigen Quellcode auf
Null setzen (aus der zu setzenden Bitliste im Quellcode entfernen). Die PWM arbeitet dann
mit der halben Frequenz, 2,34 kHz. Immer noch schnell genug für diese Anwendung,
aber ein Motor dürfte jetzt deutlich hörbar summen.
©2016 by http://www.gsc-elektronic.net