Sei sulla pagina 1di 17

PIC 18F45XX

El mdulo CCP de Comparacin,


Captura y PWM
(Pulse Wide Modulation)

1. El mdulo C.C.P
La mayora de microcontroladores actuales disponen de un perifrico denominado
Mdulo de Captura, Comparacin y PWM o CCP.
Este mdulo consta de un registro de 16bits CCPx que puede operar como registro
de captura de datos, comparacin de datos o como registro para fijar el ciclo de
trabajo de una seal PWM.
El pic 18F4550 dispone de dos mdulos denominados CCP1 y CCP2 asociados a los
registros CCPR1 y CCPR2 pines RC2(CCP1) y RC1/RB3(CCP2)*.
En modo captura el mdulo es capaz de almacenar el valor del TIMER1 o TIMER3
cuando se produce un evento (flanco de subida/bajada, cada 4/16 flancos de
subida/bajada, etc) en los pines CCP1/CCP2.
En modo comparacin el valor del registro CCPRx est siendo constantemente
comparado con el valor del TIMER1 o TIMER3. Cuando los valores coinciden el pin
CCPx puede: ponerse a nivel alto/bajo, cambiar de estado o permanecer en su valor.
(*) La directiva #pragma se utiliza para fijar el pin asociado al modulo CCP2:
#pragma config CCP2MX=ON // CCP2 en RC1
#pragma config CCP2MX=OFF // CCP2 en RB3

2. Caractersticas del mdulo en modo PWM (I)


El mdulo en modo PWM utiliza el Timer2 para generar un tren de
pulsos de amplitud y ciclo de trabajo variable (seal PWM).
Para una frecuencia determinada Fpwm (1-10Khz) obtenemos un periodo
Tpwm. Fijando el ciclo de trabajo (duty_cicle) podemos variar la potencia
entregada en el pin de salida asociado RC2/RC1-RB3.
Para un periodo Tpwm fijo, se puede modificar el tiempo que permanece en alto la
sea o duty_cicle. Si aplicamos esta seal a una carga (lmpara) podemos controlar la
potencia entregada y, por lo tanto, el nivel de iluminacin segn la figura.

3. Caractersticas del mdulo en modo PWM (II)


Podemos utilizar la seal PWM para regular la alimentacin de un motor DC, y
controlar la potencia entregada y, por lo tanto, su velocidad.

Nota: Reducir la potencia entregada a un motor reduce su velocidad, pero tambin se reduce el par en su eje.

4. Funcionamiento del mdulo CCPx en modo PWM

(*) En modo PWM, el pin CCPx puede generar una seal de salida PWM
de 10bits de resolucin. Los pines CCPx deben estar configurados como
salidas para funcionar en modo PWM.

5. Funciones de control en C18 del mdulo PWM (I)


Para configurar y controlar el mdulo PWM, C18 proporciona las siguientes
funciones:
OpenPWM1(valor);
Esta funcin configura el mdulo CCP1 en modo PWM y fija el periodo de
la seal de salida en el pin RC2 segn la expresin
Tpwm = (valor + 1)* 4 * Tosc * TMR2 prescaler
Donde:
Tpwm: Valor del periodo de la seal PWM en us
Tosc: Periodo de la seal de reloj del sistema en us
TMR2 prescaler: Valor del preescaler del Timer2
OpenPWM2(valor);
Configura el mdulo CCP2 en modo PWM igual que en caso anterior
utilizando como pin de salida RC1 o RB3 en funcin del estado de la
directiva:
#pragma config CCP2MX=ON // Seal PWM en RC1
#pragma config CCP2MX=OFF // Seal PWM en RB3
Nota: Se pueden usar los dos mdulo CCP1 y CCP2, pero ambos deben
compartir el mismo valor del periodo de seal PWM.

6. Funciones de control en C18 del mdulo PWM (II)


SetDCPWM1(duty);
Esta funcin configura el tiempo en alto de la seal PWM segn la
expresin:
duty = (Ton * Fosc) / (100*Fpwm*TMR2 preescaler)
Donde:
Ton: Valor del tiempo en alto (duty cicle) de la seal PWM en %.
Fosc: Frecuencia del reloj del sistema en Hz.(*)
Fpwm: Frecuencia del la seal PWM en Hz.
TMR2 preescaler: Valor del preescaler del Timer2
SetDCPWM2(duty);
Realiza la misma funcin sobre el mdulo CCP2 y los pines RC1/RB3. El
valor del ciclo de trabajo de CCP2 puede ser diferente al del CCP1.
--oOo-Nota1: (*) El valor de la Fosc puede ser distinta del valor del Xtal.
Nota2: Se pueden usar los dos mdulo CCP1 y CCP2, pero ambos deben
compartir el mismo valor del periodo de seal PWM.
Nota3: El duty debe ser un valor entero, como mximo de 10bits (0-1023)

7. Funciones de control en C18 del mdulo PWM (III)


SetOutputPWM1(config,modo);
Esta funcin configura el modo en que se generar la seal PWM segn
el valor de los parmetros siguientes:
config:
SINGLE_OUT: Single output.(*)
FULL_OUT_FWD: Full-bridge output forward
HALF_OUT: Half-bridge output
FULL_OUT_REV: Full-bridge output reverse
PWM_OP_MODE_MASK: Mask PWM Output Configuration bits
modo:
PWM_MODE_1: PxA,PxC active high, PxB,PxD active high (*)
PWM_MODE_2: PxA,PxC active high, PxB,PxD active low
PWM_MODE_3: PxA,PxC active low, PxB,PxD active high
PWM_MODE_4: PxA,PxC active low, PxB,PxD active low
PWM_MODE_MASK: Mask PWM Output Configuration bits

ClosePWM1(); / Close PWM2();


Desactiva la mdulo PWM y la seal de salida.
(*) Nota: El modo normal de operacin del PWM es SINGLE_OUT y
MODE_1. Con esta configuracin el pulso PWM se mantiene en el tiempo y
el ciclo de trabajo expresa el tiempo en alto de la seal de salida.

8. Configuracin del mdulo CCP1 (PWM1)


Para configurar el pin RC2 (CCP1) como salida PWM1 debemos seguir los
siguientes pasos:
Incluir en nuestro programa las funciones de control pwm
#include <pwm.h>
Configurar el pin RC2 como salida.
TRISCbits.RC2=0;
Configurar el TIMER2 como temporizador, sin interrupciones y con el
prescaler (PR2) adecuado. El postescaler es ignorado.
OpenTimer2 (TIMER_INT_OFF&T2_PS_1_X); // Donde X=1,4 o 16
Configurar el mdulo CCP en modo PWM y fijar el periodo.
OpenPWM1(valor);
Fijar el ciclo de trabajo
SetDCPWM1(duty);
Poner en marcha el mdulo.
SetOutputPWM1(SINGLE_OUT, PWM_MODE1);

9. Configuracin del mdulo CCP2 (PWM2)


Para configurar el pin RC1/RB3 (CCP2) como salida PWM2 debemos seguir
los siguientes pasos:
Incluir en nuestro programa las funciones de control pwm
#include <pwm.h>
Configurar el pin RC1/RB3 como salida.
TRISCbits.RC1=0; Para (#pragma config CCP2MX=ON)
TRISBbits.RB3=0; Para (#pragma config CCP2MX=OFF)
Configurar el TIMER2 como temporizador, sin interrupciones y con el
prescaler (PR2) adecuado. El postescaler es ignorado.
OpenTimer2 (TIMER_INT_OFF&T2_PS_1_X); // Donde X=1,4 o 16
Configurar el mdulo CCP2 en modo PWM y fijar el periodo.
OpenPWM2(valor);
Fijar el ciclo de trabajo del PWM2
SetDCPWM2(duty);
Poner en marcha el mdulo.
SetOutputPWM1(SINGLE_OUT, PWM_MODE_1);

10. Documentacin de Microchip sobre el mdulo CCPx

11. Ejempo de configuracin del mdulo PWM1 (I)


Supongamos que queremos generar una seal PWM de 2Khz en el pin RC2 con
un ciclo de trabajo del 50%. Para ello suponemos que nuestro oscilador trabaja
a 20Mhz.
Parmetro iniciales:
Fosc: 20Mhz, Tosc: 0,05us
Fpwm: 2Khz, Tpwm: 500us
1) Calculo del periodo: Tpwm = (valor + 1)* 4 * Tosc * TMR2 prescaler
Despejando:
valor=[Tpwm / (4*Tosc * TMR2 prescaler)]-1
Sustituyendo para un preescaler de TMR2=16:
Valor= [500/4*0,05*16]-1 => [500/3,2]-1 = 155,25 = 155 (*)
(*) Elegimos el valor entero ms prximo. Este es el valor que tenemos que
pasar a la funcin OpenPWM1() para conseguir un periodo de la seal PWM de
500us.
OpenPWM1(155);

12. Ejempo de configuracin del mdulo PWM1 (II)


2) Una vez fijado el periodo tenemos que calcular valor de duty que tenemos
que pasar a la funcin SetDCPWM1(duty) para conseguir un ciclo de trabajo del
50%. Para ello utilizamos la expresin:
duty = (Ton * Fosc) / (100*Fpwm*TMR2 preescaler)
Sustituyendo:
Duty = (50 * 20.000.000) / (100*2000*16) = 312,5 => 312
(*) Elegimos el valor entero ms prximo. Este es el valor que tenemos que
pasar a la funcin SetDCPWM1() para conseguir un ciclo de trabajo de 250us.
SetDCPWM1(312);
3) Poner en marcha el mdulo:
SetOutputPWM1(SINGLE_OUT, PWM_MODE_1);

Solucin en C18 (l)

Solucin en C18 (II)

Captura Osciloscopio en Proteus

Observar que la base de tiempos es de 100us y que el periodo de la seal


generada tiene 5 cuadros, es decir 500us (Tpwm) y el ciclo de trabajo es de
dos cuadros y medio, es decir 250us (duty del 50%) como pretendamos.

Simulacin en Proteus

Potrebbero piacerti anche