Configuramos el módulo CCP1 (PIN_C2) para que genere una señal cuadrada (PWM). En PIN_C2 tenemos conectado un LED. El ciclo de trabajo (duty cycle) de la señal PWM variará de 0% (apagada) a 100% (totalmente encendida), pasando por 4 estados intermedios, de forma que veremos como va cambiando la intensidad luminosa del LED de manera progresiva.
Código fuente: PWM.c
T_PWM = (PR2+1)*prescaler*4*Tosc
Duty cycle (CCPRxx): valor mínimo=0 (0%), valor máximo=PR2 (100%)
El PIC18F2550 tiene dos puertos que pueden generar automáticamente señales PWM: CCP1 (PIN_C2) y CCP2 (PIN_C1).
En nuestro ejemplo, el período de la señal PWM sería:
T_PWM = (255+1) * 16 * 4 * (1/48MHz) = 341us (2.93KHz)
Duty cycle: CCPR1L = (0 – 255)
Registros para configurar el PWM (para generar el PWM, el PIC18F2550 trabaja con el timer2):
CPxCONbits.CCPxM: configura el módulo CCPx en modo PWM, o en modo Comparación o en modo Mejorado de Captura.
PR2: Similar al valor máximo del duty cycle, para una resolución de 8 bits.
T2CONbits.TMR2ON: Habilita el timer2.
T2CONbits.T2CKPS: Prescaler del timer2. El postscaler del timer2 no se usa en el PWM.
CCPRxL: El valor del duty cycle puede tener una resolución de 8 bits o de 10 bits. Los 8 bits más significativos se almacenan en el resgistro CCPRxL. Los dos bits menos significativos estarían en CPxCONbits.DCxB. En la mayoría de los casos, una resolución de 8 bits (0-255) sería suficiente, por lo que tan solo habría que dar un valor a CCPRxL para cambiar el duty cycle.