Allgemeines
Einstellung der
Periode
Einstellung des
Tastverhältnisses
CCP-Pin zum Ausgang
machen
PWM einschalten
Beispiel
Beispiel zur
Nutzung beider PWM-Ausgänge
Der PIC16F87x kann (wie viele andere moderne PICs mit CCP-Modul auch) pulsweiten-modulierte Signale erzeugen. Also Rechteckschwingungen, mit einstellbarem Tastverhältnis.
Der PIC16F876 besitzt zwei
Capture/Compare/PWM-Module
(CCP). Da aber beide Module im PWM-Mode den Timer2
benutzen wollen, lässt sich nur ein Modul sinnvoll im
PWM-Mode
betreiben. Das jeweils andere Modul kann aber dabei im Capture- oder
Compare-Mode
arbeiten.
Möglich ist der gleichzeitige Betrieb
beider PWM-Module nur, wenn beide PWMs die gleiche Frequenz (aber
natürlich
unterschiedliche Tastverhältnisse) haben sollen.
Im folgenden beziehe ich mich auf das
CCP1-Modul. Das CCP2-Modul wird in gleicher Art und Weise benutzt.
Einfachere PICs besitzen nur 1 CCP-Modul, und somit nur einen PWM-Ausgang.
In diesem Beispiel beziehe ich mich auf den PIC16F876. In anderen PICs mit CCP-Modul sind die Funktionen im Prinzip identisch, allerdings können Register-Adressen/Bänke und Pin-Bezeichnungen abweichen.
Im PWM-Mode wird der Timer2 mit einem festen Takt gespeist. Er beginnt bei 0 zu zählen. Der Zählwert des Timer2 wird ständig mit den Werten in den Registern CCPR1L und PR2 verglichen. Erreicht der Timer2 den Wert von CCPR1L, dann wird der Ausgang CCP1 auf Low-Pegel gesetzt. Erreicht der Timer2 den Wert vom PR2, dann wird der Ausgang CCP1 auf High-Pegel gesetzt und der Timer2 auf 0 zurückgesetzt. Der Zyklus beginnt von vorn.
Die Periode der Schwingung hängt also neben dem Timer-Takt von PR2 ab. Das Tastverhältnis bestimmt das Verhältnis von PR2 und CCPR1L. Ist CCPR1L größer als PR2, dann bleibt der Ausgang CCP1 immer auf High.
Eigentlich sind sowohl der Timer2, wie auch PR2 und CCPR1L sind nur 8-bittig. Um eine 10-bittige PWM-Auflösung zu erreichen, wird CCPR1L um zwei zusätzliche LSB erweitert, die die Bits 5 und 4 von CCP1CON sind. Zum Vergleich werden neben den 8 Timer2-Bits zwei weitere LSB-Bits herangezogen, die aus dem Vorteiler des Timer2 oder aus dem Toc-Teiler (4:1) stammen.
Folglich lässt sich die Periode der erzeugten Rechteckschwingung nur mit 8 Bit einstellen, während das Tastverhältnis mit bis zu 10-Bit eingestellt werden kann.
Um den PWM-Mode zu nutzen muss man
Die Periode der Rechteckschwingung hängt ab von
PWM_Periode = Tocs x 4 x TM2PS x (PR2+1)wobei Tocs eine Schwingperiode des verwendeten Quarzes (Keramikschwinges) ist, und TM2PS für den Teilwert des Timer2-Vorteilers (1, 4 oder 16) steht. Für eine bestimmte PWM-Periode kann man den Wert für PR2 wie folgt bestimmen:
PR2 = [ PWM_Periode / (4 x Tocs x TM2PS) ] -1Die Auflösung des Tastverhältnises (duty-cycle) kann nie besser sein, als das Vierfache des Wertes PR2. Ist z.B. PR=100, dann kann das Tastverhältnis in 400 Stufen eingestellt werden. Deshalb sollte man immer einen möglichst großen PR2-Wert wählen.
Aus der obigen Formel und der verwendeten PIC-Taktfrequenz ergibt sich auch die maximale Periode, also die kleinstmögliche Rechteckfrequenz. Ein mit 20 MHz getakteter PIC kann am PWM-Ausgang nur Frequenzen ab 1,22 kHz ausgeben. Durch Änderung des Vorteilers lässt sich das auf 19,5kHz steigern. Begnügt man sich mit 8 Bit Auflösung, erreicht man 78kHz.
Folgende Tabelle zeigt
mögliche
PWM-Frequenzen. Der Zahlenwert gilt für 10 Bit Auflösung
(PR2=255).
Bei verringerter Auflösung sind höhere Frequenzen
möglich.
Niedrigere Frequenzen lassen sich aber nicht erreichen.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Den gewählten Wert
für
den Vorteiler des Timer2 stellt man im Register T2CON ein.
Hier
muss
man
den
Timer2 auch einschalten.
bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 | |
Name: | - | TOUTPS3 | TOUTPS2 | TOUTPS1 | TOUTPS0 | TMR2ON |
|
|
|
|
|
|
|
|
|
|
|
Das Einschalten erfolgt durch setzen des Bit 2.
Der Vorteiler-Wert wird
mit
den Bits 0 und 1 eingestellt.
|
|
|
|
|
|
|
|
|
|
|
|
In Folgenden Beispiel wird ein Vorteiler von 16:1 eingestellt:
; Vorteiler 16:1 und Timer2 einschalten
BSF
T2CON,T2CKPS1 ; Vorteiler 16:1
BSF
T2CON,TMR2ON ; Timer2 ein
Bei einem angenommenen PIC-Takt von 20 MHz speist man den Timer2 nun
mit 312,5kHz. Soll ein Rechteck mit 2,5 kHz erzeugt werden, so sind
für
jede Rechteckschwingung 125 solche Takte nötig. In diesem Fall
muss
PR2 auf 124 eingestellt werden.
; Frequenz auf 2,5 kHz einstellen
BSF
STATUS,RP0 ; Bank1
MOVLW
d'124'
MOVWF
PR2
;
2,5
kHz
BCF
STATUS,RP0 ; Bank1
Das Pulsverhältnis wird mit dem
Register
CCPR1L
und
zwei Bits in CCP1CON eingestellt.
Grob kann man sagen, das
das Tastverhältnis wie folgt errechnet werden kann:
DC = CCPR1L / PR2Für ein Tastverhältnis von 50% muss CCPR1L also auf die Hälfte des Werts von PR2 eingestellt werden.
; Tastverhältnis auf 50% einstellen
MOVLW
D'62'
;
MOVWF
CCPR1L ;
50%
von 124
Natürlich muss das Ausgangspin für die Rechteckschwingung als Ausgang konfiguriert sein. In diesem Fall ist das CCP1 (bzw. CCP2). Das geschieht wie für I/O-Pins üblich im TRISC-Register.
; RC2/CCP1 auf Ausgang stellen
BSF
STATUS,RP0 ; Bank1
BCF
TRISC, 2 ; RC2:
output=0
BCF
STATUS,RP0 ; Bank 0
Das Capture-Modul Nr.1 wird mit dem
Register
CCP1CON (Adresse 17h) gesteuert, das Capture-Modul Nr.2 mit dem
Register
CCP2CON (Adresse 1Dh).
bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 | |
Name: | - | - | CCP1X | CCP1Y | CCP1M3 | CCP1M2 | CCP1M1 |
|
|
|
|
|
|
|
|
|
|
Für den PWM-Mode ist CCPxM3=1 und CCPxM2=1 zu setzen.
; CAPTURE MODE mit CCP1 initialisieren
CLRF
CCP1CON ;
CCP1-Modus
aus
BSF
CCP1CON,CCP1M3 ; CCP1-Modus PWM-Mode
BSF
CCP1CON,CCP1M2 ;
Das folgende Beispielprogramm für einen mit 20 MHz getakteten PIC16F876 erzeugt an RC2 eine 2.5 kHz Rechteckschwingung mit 50% Tastverhältnis.
;**************************************************************
;* ;* Pinbelegung ;* ---------------------------------- ;* PORTA: ;* 1 ;* 2 ;* 3 ;* 4 ;* PORTB: ;* 1 ;* 2 ;* 3 ;* 4 ;* 5 ;* 6 ;* 7 ;* PORTC: ;* 1 ;* 2 PWM-Ausgang ;* 3 ;* 4 ;* 5 ;* 6 ;* 7 ;* ;************************************************************** ; ; sprut (zero) Bredendiek 04/2002 ; ; PWM-Lernbeispiel: ; ; 16F876 erzeugt an RC2 ein 2,5 kHz-Signal mit 50% ; Tastverhältnis ; ; ; Prozessortakt: 20 MHz ; ;************************************************************** ; Includedatei für den 16F876 einbinden list p=16f876
ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MES. ;********************************************************** ; Anfangsinitialisierung init ; Frequenz auf 10 kHz einstellen
; Tastverhältnis auf 50%
einstellen ; RC2/CCP1 auf Ausgang stellen
; PWM MODE mit CCP1 initialisieren
loop end ;********************************************************** |
Beispiel zur Nutzung beider PWM-Ausgänge
Das folgende Beispielprogramm für einen mit 20 MHz getakteten PIC16F876 erzeugt:
;**************************************************************
;* ;* Pinbelegung ;* ---------------------------------- ;* PORTA: ;* 1 ;* 2 ;* 3 ;* 4 ;* PORTB: ;* 1 ;* 2 ;* 3 ;* 4 ;* 5 ;* 6 ;* 7 ;* PORTC: ;* 1 PWM-Ausgang 2 (25%) ;* 2 PWM-Ausgang 1 (50%) ;* 3 ;* 4 ;* 5 ;* 6 ;* 7 ;* ;************************************************************** ; ; sprut (zero) Bredendiek 09/2003 ; ; PWM-Lernbeispiel: ; ; 16F876 erzeugt an RC2 & RC1 ein 2,5 kHz-Signal ; an RC2 beträgt das Tastverhältnis 50% ; an RC1 beträgt das Tastverhältnis 25% ; ; ; Prozessortakt: 20 MHz ; ;************************************************************** ; Includedatei für den 16F876 einbinden list p=16f876
ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MES. ;********************************************************** ; Anfangsinitialisierung init ; Frequenz auf 10 kHz einstellen
; Tastverhältnis auf 50% bzw
25% einstellen ; RC2/CCP1 und RC1/CCP2 auf Ausgang
stellen ; PWM MODE mit CCP1 initialisieren
; PWM MODE mit CCP2 initialisieren
loop end ;********************************************************** |