Pulsweitenmodulation (PWM)
PWM SignalJeder PIC18 und teilweise auch manche PIC16 besitzen das
Capture, Compare, PWM
(CCP) Modul mit dem man zusammen mit dem Timer2 ein
Pulsweitenmoduliertes Signal (kurz PWM)
erzeugen kann. Ich möchte Euch hier kurz erklären wie Ihr mit dem Modul
umzugehen habt. Der
Timer2 wird mit 1/4 des am PIC angeschlossenen Quarz Taktes gespeist und
kann zusätzlich noch
über einen Vorteiler des Timer2 in drei Stufen geteilt werden (1, 4,
16). Im Prinzip sind für
den PWM Mode nur zwei Register von "Bedeutung": Das Register CCPR1L und
PR2. Während der
Timer2 immer bei 0 beginnt zu zählen wird der aktuelle Zählerstand
(TMR2) immer mit dem Wert
in PR2 und CCPR1L verglichen. Wenn der Zählstand des Timers dem Wert in
CCPR1L entspricht,
dann wird der CCP1 Ausgang (Pin) gelöscht, also auf Low (0V) gesetzt.
Wenn der Wert dem in
PR2 entspricht, dann wird der Ausgang auf High (=5V) gesetzt und der
Timer2 beginnt wieder
von 0 an zu zählen. Hier eine kleine Grafik zur Veranschaulichung (siehe
rechts).
Da man "10 Bit PWM" sagt aber der Timer2 und das PR2/CCPR1L Register ja
eigentlich nur 8 Bit
groß sind, bekommt das CCPR1L Register zwei zusätzliche Bits spendiert,
welche im CCPCON
Register übrig sind. Also lässt sich die Periode trotzdem nur mit 8 Bit
einstellen (Timer2
und PR2) aber das Tastverhältnis kann in 10 Bit eingestellt werden.
Vorgehensweise zum Nutzen des CCP Moduls zur PWM Erzeugung
Timer2 einstellen
Periode einstellen
Tastverhältnis einstellen
PWM aktivieren
Beispiel am PIC18F4550 Nicht vergessen das CCP Pin zum Ausgang zu machen
(TRISx=0)
void PWM_Einstellung(void)
{
PR2=0xFF; // Größt mögliche Periodendauer
CCPR1L=0xFF; // Hier wird das Tastverhältnis eingestellt
CCP1CON=0x0C; // PWM Mode ausgewählt
T2CON=0x79; // 1:16 Postscale, Timer2 aus, Prescale=4
T2CONbits.TMR2ON=1; // Timer2 an
}
Formel zum Errechnen der Periodendauer:
PWM Period = [(PR2) + 1] 4 TOSC * (TMR2 Prescale Value)
Formel zum Errechnen von PR2:
PR2 = [ PWM_Periode / (4 x Tocs x TM2PS) ] -1
Formel zum Errechnen des Tastverhältnissis:
CCPR1L / PR2
Anwendung: Jetzt könnte man das CCPR1L Register verändern und somit das
Tastverhältnis
beeinflussen. Ich benutze dies gerne um bei LCD Displays die Hintergrund
Beleuchtung der
Helligkeit im Raum anzupassen.