Die Nutzung des 10-Bit PWM


zurück zu Input/Output , PIC-Grundlagen , PIC-Prozessoren , Elektronik , Homepage

Allgemeines
Einstellung der Periode
Einstellung des Tastverhältnisses
CCP-Pin zum Ausgang machen
PWM einschalten

Beispiel
Beispiel zur Nutzung beider PWM-Ausgänge


Allgemeines

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

nach oben

Einstellung der Periode

Die Periode der Rechteckschwingung hängt ab von

Die Periode kann man mit folgender Formel ausrechnen:
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) ] -1
Die 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.
 

PWM-Frequenz  (für 10 Bit Auflösung) je nach PIC-Takt Tosc
TM2PS
20 MHz
10 MHz
4 MHz
1 MHz
1:1
> 19,53 kHz
> 9,7 kHz
> 3,9 kHz
> 976 Hz
4:1
> 4,88 kHz
>2,44 kHz
>976 Hz
>244 Hz
16:1
> 1,22 kHz
>610 Hz
>244 Hz
> 61 Hz

Den gewählten Wert für den Vorteiler des Timer2 stellt man im Register T2CON ein. Hier muss man den Timer2 auch einschalten.
 
 

T2CON: TIMER2-CONTROL (ADDRESS 12h):

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
Name: - TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON
T2CKPS1
T2CKPS0
Wert:
-
-
-
-
-
1
0 oder 1
0 oder 1

Das Einschalten erfolgt durch setzen des Bit 2.

Der Vorteiler-Wert wird mit den Bits 0 und 1 eingestellt.
 

Teiler
T2CKPS1
T2CKPS0
1:1
0
0
4:1
0
1
16:1
1
egal

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

nach oben

Einstellung des Pulsverhältnisses (duty-cycle)

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 / PR2
 Fü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

nach oben

CCP-Pin zum Ausgang machen

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
 

nach oben


PWM einschalten

Das Capture-Modul Nr.1 wird mit dem Register CCP1CON (Adresse 17h) gesteuert, das Capture-Modul Nr.2 mit dem Register CCP2CON (Adresse 1Dh).
 
 
 

CCP1CON: CAPTURE/COMPARE/PWM-1-CONTROL (ADDRESS 17h):

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
Name: - - CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1
CCP1M0
Wert:
-
-
0 oder 1
0 oder 1
1
1
-
-

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    ;
 

nach oben

Beispiel

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
    #include <P16f876.INC>

    ERRORLEVEL      -302        ;SUPPRESS BANK SELECTION MES.

;**********************************************************

; Anfangsinitialisierung

init
; Vorteiler 16:1 und Timer2 einschalten
    BSF    T2CON,T2CKPS1  ; Vorteiler 16:1
    BSF    T2CON,TMR2ON   ; Timer2 ein

; Frequenz auf 10 kHz einstellen
    BSF    STATUS,RP0     ; Bank1
    MOVLW  D'124'
    MOVWF  PR2            ; 2,5 kHz
    BCF    STATUS,RP0     ; Bank1

; Tastverhältnis auf 50% einstellen
    MOVLW  D'62'
    MOVWF  CCPR1L         ; 50% von 124

; RC2/CCP1 auf Ausgang stellen
    BSF    STATUS,RP0     ; Bank1
    BCF    TRISC, 2       ; RC2: output=0
    BCF    STATUS,RP0     ; Bank 0

; PWM MODE mit CCP1 initialisieren
    CLRF   CCP1CON        ; CCP1-Modus aus
    BSF    CCP1CON,CCP1M3 ; CCP1-Modus PWM-Mode
    BSF    CCP1CON,CCP1M2

loop
    GOTO    loop

    end

;**********************************************************

nach oben

Beispiel zur Nutzung beider PWM-Ausgänge

Das folgende Beispielprogramm für einen mit 20 MHz getakteten PIC16F876 erzeugt:

Da die Periode beider Schwingungen von Timer2 und PR2 bestimmt werden, sind beide Signale synchron.
 ;**************************************************************
;*
;* 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
    #include <P16f876.INC>

    ERRORLEVEL      -302        ;SUPPRESS BANK SELECTION MES.

;**********************************************************

; Anfangsinitialisierung

init
; Vorteiler 16:1 und Timer2 einschalten
    BSF    T2CON,T2CKPS1    ; Vorteiler 16:1
    BSF    T2CON,TMR2ON     ; Timer2 ein

; Frequenz auf 10 kHz einstellen
    BSF    STATUS,RP0       ; Bank1
    MOVLW  D'124'
    MOVWF  PR2              ; 2,5 kHz
    BCF    STATUS,RP0       ; Bank1

; Tastverhältnis auf 50% bzw 25% einstellen
    MOVLW  D'62' 
    MOVWF  CCPR1L           ; 50% von 124
    MOVLW  D'31' 
    MOVWF  CCPR2L           ; 25% von 124

; RC2/CCP1 und RC1/CCP2 auf Ausgang stellen
    BSF    STATUS,RP0       ; Bank1
    BCF    TRISC, 2         ; RC2: output=0
    BCF    TRISC, 1         ; RC1: output=0
    BCF    STATUS,RP0       ; Bank 0

; PWM MODE mit CCP1 initialisieren
    CLRF   CCP1CON          ; CCP1-Modus aus
    BSF    CCP1CON,CCP1M3   ; CCP1-Modus PWM-Mode
    BSF    CCP1CON,CCP1M2

; PWM MODE mit CCP2 initialisieren
    CLRF   CCP2CON          ; CCP2-Modus aus
    BSF    CCP2CON,CCP2M3   ; CCP2-Modus PWM-Mode
    BSF    CCP2CON,CCP2M2

loop
    GOTO    loop

    end

;**********************************************************

nach oben

zurück zu Input/Output , PIC-Grundlagen , PIC-Prozessoren , Elektronik , Homepage
Autor: sprut
erstellt: 14.04.2002
letzte Änderung: 08.03.2005