Vous êtes sur la page 1sur 32

MICROCONTROLADORES II

MDULO CCP
(CAPTURA/COMPARACIN/PWM)
PROF. LUIS ZURITA
IUT Cuman
MODO CAPTURA
En este modo CCP1 y CCP2 funcionan de forma idntica. (En los
nombres de registros a continuacin x=1,2)
En este modo la pareja de registros CCPRxH:CCPRxL captura el
valor de 16 bits que contiene TMR1 cuando sucede un evento en
la pata RCy/CCPx del PORTC (estos pines deben configurarse
como entradas con un 1 en TRISC).
Los eventos son los configurados en CCPxM3:CCPxM0 del
registro de control CCPxCON, para el modo Captura.
Al realizar la captura se activa el bit de interrupcin CCPxIF y si
la interrupcin est habilitada mediante CCPxIE, se genera una
interrupcin al cargar el CCPRxH:CCPRxL con TMR1.
TMR1 en este modo debe estar configurado como temporizador o
contador sncrono, nunca en modo asncrono.
Al cambiar la condiciones de funcionamiento dentro del modo
captura conviene desactivar el mdulo primero.
Prof. Luis Zurita Microcontroladores II
IUT Cuman
FLUJOGRAMA CCP1 CAPTURA
Prof. Luis Zurita Microcontroladores II
IUT Cuman
MODO COMPARACIN
Los registros CCPRxH:CCPRxL comparan su valor de forma
continua con el valor de TMR1. Cuando coinciden el pin RCy/CCPx
del PORTC (configurado como salida) sufre un evento.
Los eventos son los configurados en CCPxM3:CCPxM0 del
registro de control CCPxCON para el modo Comparacin.
Al coincidir CCPRxH:CCPRxL y TMR1 se activa el bit de
interrupcin CCPxIF y si la interrupcin est habilitada mediante
CCPxIE, se genera un interrupcin.
TMR1 en este modo debe estar configurado como temporizador o
contador sncrono, nunca en modo asncrono.
Si se ha seleccionado el modo disparo especial, el mdulo CCP1 y
CCP2 realizan tareas distintas. El CCP1 pone a 0 el TMR1 y el
CCPR1 funciona como un Registro de Perodo capaz de generar
peridicamente interrupciones. El CCP2 pone a 0 el TMR1 y
adems inicia una conversin del A/D, con lo que se pueden
realizar conversiones peridicas. Aunque TMR1=0 no se genera
interrupcin del timer1.
Prof. Luis Zurita Microcontroladores II
IUT Cuman
FLUJOGRAMA CCP1 COMPARACIN
Prof. Luis Zurita Microcontroladores II
IUT Cuman
MODO PWM
Con este modo se consiguen impulsos, cuya anchura de nivel alto es de
duracin variable y sirven para control de motores y generacin de
seales.
Se utiliza un mdulo CCP, el timer2 y un pin RCy/CCPx de salida.
El comparador entre el valor PR2 y TMR2 cuando detecta la igualdad:
1. Activa 1 el flip-flop de salida.
2. Resetea TMR2.
3. El valor de CCPRxL se carga en CCPRxH.
El periodo de la seal se calcula como:
Periodo=[(PR2)+1]*4*Tosc*(Valor predivisor TMR2)
Se comparan los valores de 10 bits ([CCPRxH:CCP1CON(5:4)]) y TMR2
concatenados con los dos bits de menor peso del reloj interno) cuando
son iguales:
1. Desactiva 0 el flip-flop de salida.
2. No resetea TMR2
El ciclo activo es:
Ancho pulso=(CCPRxL:CCP1CON(5:4))*Tosc*(V. predivisor TMR2)
Prof. Luis Zurita Microcontroladores II
IUT Cuman
FLUJOGRAMA PWM
Prof. Luis Zurita Microcontroladores II
IUT Cuman
SEAL PWM
Periodo=[(PR2)+1]*4*Tosc*(Valor predivisor TMR2)
Duty Cycle=(CCPRxL:CCP1CON(5:4))*Tosc*(V. predivisor TMR2)
Prof. Luis Zurita Microcontroladores II
IUT Cuman
SEAL PWM
Nota: Si el valor del duty cycle de la PWM es ms
largo que el perodo de la PWM, el pin CCP1 no
podr ser puesto a cero
La resolucin mxima en bits viene dada por:
Prof. Luis Zurita Microcontroladores II
IUT Cuman
Modo PWM
Pasos para configurar el PWM:
1. Asignar PR2.
2. Asignar CCPRxL y CCPxCON(5:4).
3. Configurar RCy/CCPx de salida.
4. Asignar Pre-divisor en T2CON.
5. Activar TMR2 en T2CON.
6. Configurar CCPx en modo PWM.
Prof. Luis Zurita Microcontroladores II
IUT Cuman
Bit 7-6: No implementados: Se lee como "0"
Bit 5-4: CCP1X: CCP1Y: bit menos significativos de PWM
Modo Captura sin usar
Modo Comparacin sin usar
Modo PWM: Estos dos bit son los menos significativos del ciclo
de PWM.
Los ocho bits ms significativos se encuentran en CCPR1L.
Bit 3-0: CCP1M3-.CCP1M0; bit de seleccin del modo de
trabajo del mdulo comparador CCP1.
CCP1CON
U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
--- CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0
Bit 7 Bit 0
Prof. Luis Zurita Microcontroladores II
IUT Cuman
CCP1CON
Prof. Luis Zurita Microcontroladores II
IUT Cuman
TABLAS MDULO CCP
Modo CCP Recurso de Timer
Captura Timer1
Comparacin Timer1
PWM Timer2
Prof. Luis Zurita Microcontroladores II
IUT Cuman
EJERCICIOS CCP
Z
o
n
a
d
e
C
o
n
f
i
g
u
r
a
c
i

nSe configuran los bancos


Se configura el mdulo CCP
Se configuran las
Interrupciones (opcional)
Se regresa al Banco 0
Resto del programa
(Tratamiento de la informacin)
Captura:
Medir perodo,
Ton, Toff
Captura:
Comparaciones
Y acciones
Comparacin:
Setpoint 16 bits
PWM:
Genera seal
Comparacin:
Accin sobre RCx
PWM:
En base a accin
Generar Seal
Prof. Luis Zurita Microcontroladores II
IUT Cuman
El compilador C contiene un conjunto de funciones para el
manejo del mdulo CCP.
Para leer el contenido de un mdulo CCP se utiliza:
valor=CCP_x;
donde valor es un entero de 16 bits que se carga con el valor del
CCP respectivo.
Para escribir el contenido de un mdulo CCP se utiliza:
CCP_x=valor;
donde valor es un entero de 16 bits que se carga con el valor del
CCP respectivo.
Configuracin del mdulo CCPX:
setup_ccpx (modo);
modo hace referencia a los bits CCPxM3:CCPxM0 del registro
CCPxCON.
El modo permite configurar al PIC para que trabaje en modo PWM,
Captura o comparacin.
MDULO CCP EN LENGUAJE C
Prof. Luis Zurita Microcontroladores II
IUT Cuman
MDULO CCP EN LENGUAJE C
Setup_CCPx(modo) Modo
Registro CCPxCON
CCP_OFF Deshabilitacin 00000000
CCP_CAPTURE_FE Captura por flanco de bajada 00000100
CCP_CAPTURE_RE Captura por flanco de subida 00000101
CCP_CAPTURE_DIV_4 Captura cada 4 pulsos 00000110
CCP_CAPTURE_DIV_16 Captura cada 16 pulsos 00000111
CCP_COMPARE_SET_ON_MATCH Salida a 1 en comparacin 00001000
CCP_COMPARE_CLR_ON_MATCH Salida a 0 en comparacin 00001001
CCP_COMPARE_INT Interrupcin en comparacin 00001010
CCP_COMPARE_RESET_TIMER Reset TMR1 en comparacin 00001011
CCP_PWM Modo PWM habilitado 00001100
Prof. Luis Zurita Microcontroladores II
IUT Cuman
Los valores para comparar se fijan en los registros
CCPRx. En el compilador C, estos registros estn
definidos en el fichero include, por ejemplo para el
16F87x.h:
MDULO CCP EN LENGUAJE C
long CCP_1; long CCP_2;
#byte CCP_1=0x15 #byte CCP_2=0x1B
#byte CCP_1_LOW=0x15 #byte CCP_2_LOW=0x1B
#byte CCP_1_HIGH=0x16 #byte CCP_2_HIGH=0x1C
set_pwmx_duty(valor);
valor: dato de 8 o 16 bits que determina el ciclo de
trabajo. Este valor, junto con el valor del preescaler del
TMR2, determina el valor del ciclo de trabajo. En la
configuracin del TIMER2, el postcaler debe valer 1.
Prof. Luis Zurita Microcontroladores II
IUT Cuman
#include <16f877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define use_portD_lcd_true
#include <lcd.c>
#byte PIR1=0x0C
int1 nuevopulso=0; //Entra otro pulso
int16 TFF=0,TFI=0,TFTOTAL=0; //Tiempo flancos
float APERIODO=0.0; //Valor final del ancho de pulso
int1 cambio=0; //Cambio de flanco de disparo
#int_ccp1 //Funcin interrupcin por Captura
void ccp1_int(){
if(cambio==0){ //Flanco de subida. Lectura inicial
TFI=CCP_1; //Carga del valor del registro CCPR1 en flanco subida
//setup_ccp1(CCP_CAPTURE_FE); //Configuracin modo Captura en flanco de bajada
cambio=1; //Control de cambio de flanco inicial a final
} else { //Flanco Final
TFF=CCP_1; //Carga del valor del registro CCPR1 en flanco bajada
//setup_ccp1(CCP_CAPTURE_RE); //Configuracin modo Captura en flanco de subida
cambio=0; //Control de cambio de flanco
if(nuevopulso==0){ //Fin de pulso...
nuevopulso=1; //pulso a medir
}
}
}
Ejercicio 1. Medicin de Perodo de una seal
Prof. Luis Zurita Microcontroladores II
IUT Cuman
void main() {
lcd_init();
setup_timer_1(T1_INTERNAL); //Configuracin TMR1
setup_ccp1(CCP_CAPTURE_RE);
//Configuracin modo Captura en flanco de subida
cambio = 0; //Control de cambio a 0
enable_interrupts(int_ccp1); //Habilitacin interrupcin modulo CCP
enable_interrupts(global); //Habilitacin interrupcin global
while(true) {
if(nuevopulso==1){ //Pulso nuevo?
TFTOTAL=(TFF-TFI); //Perodo total.
APERIODO = TFTOTAL*1.0; //Perodo total en microsegundos (a 4MHz:1us)
printf(lcd_putc,"\fMED. FRECUENCIA\n");
printf(lcd_putc,"T = %6.1fuS ", APERIODO);
nuevopulso=0; //Periodo medido, espera nuevo
}
}
}
Ejercicio 1. Medicin de Perodo de una seal
Prof. Luis Zurita Microcontroladores II
IUT Cuman
Ejercicio 1. Medicin de Perodo de una seal
Prof. Luis Zurita Microcontroladores II
IUT Cuman
El CCP en modo comparacin, compara
continuamente el valor del TIMER1 con el valor
precargado en el registro CCPR2H:L; Cuando son
iguales se produce un cambio de nivel en el pin CCP
correspondiente y se puede activar la interrupcin
por comparacin del mdulo CCP si la misma ha sido
habilitada.
En cada cambio de nivel del pin CCP se debe cargar el
valor para obtener una seal cuadrada con un duty
del 50%. Haga los clculos para generar una seal de
2 kHz.
Ejercicio 2. Generacin de una seal cuadrada
mediante la Comparacin con el CCP2
Prof. Luis Zurita Microcontroladores II
IUT Cuman
#include <16f877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
int1 cambio=0; //Variable de control de cambio
#int_ccp2
void ccp2_int(){ //Funcin de interrupcin
if(++cambio==1){ //cambio++;
setup_ccp2(CCP_COMPARE_CLR_ON_MATCH); //Modo Comparacin, cambio a 0
} else{
setup_ccp2(CCP_COMPARE_SET_ON_MATCH); //Modo Comparacin, cambio a 1
}
set_timer1(0); //Borrado de TMR1
CCP_2 = 199; //Inicializacin del registro CCPR2 para un Duty del 50%
}
void main() {
disable_interrupts(global);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); //Configuracin TMR1
setup_ccp2(CCP_COMPARE_SET_ON_MATCH); //Configuracin inicial modulo CCP
CCP_2 = 199; //Inicializacin del registro CCPR2 para un Duty del 50%
enable_interrupts(int_ccp2); //Habilitacin interrupcin modulo CCP2
enable_interrupts(global); //Habilitacin interrupcin general
while (TRUE){
}
}
Ejercicio 2. Generacin de una seal cuadrada
mediante la Comparacin con el CCP2
Prof. Luis Zurita Microcontroladores II
IUT Cuman
Ejercicio 2. Generacin de una seal cuadrada
mediante la Comparacin con el CCP2
Prof. Luis Zurita Microcontroladores II
IUT Cuman
En el siguiente ejercicio se va a generar una seal PWM
con cuatro coeficientes cclicos distintos que dependen
de dos interruptores que seleccionan el modo de la seal
(25%, 50%, 60% y 80%). El modo elegido debe mostrarse
en una pantalla LCD:
#include <16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use fast_io(c)
#use fast_io(d)
#use standard_io(a)
#define use_portd_lcd_true
#include <lcd.c>
byte A=0;
Ejercicio 3. Generacin de una seal PWM
mediante el CCP1
Prof. Luis Zurita Microcontroladores II
IUT Cuman
void main(){
set_tris_c(0xF0);
set_tris_d(0x00);
setup_timer_2(T2_DIV_BY_1,224,1);
setup_ccp1(CCP_PWM);
lcd_init();
while(TRUE){
A=input_a();
switch(A){
case (0):
set_pwm1_duty(0xC8);
printf(lcd_putc,"\fPORC= 25");
break;
case (1):
set_pwm1_duty(0x1F4);
printf(lcd_putc,"\fPORC= 50");
break;
case (2):
set_pwm1_duty(0x2EE);
printf(lcd_putc,"\fPORC= 60");
break;
case (3):
set_pwm1_duty(0x304);
printf(lcd_putc,"\fPORC= 80");
break;}
}
}
Ejercicio 3. Generacin de una seal PWM
mediante el CCP1. Continuacin.
Prof. Luis Zurita Microcontroladores II
IUT Cuman
Ejercicio 3. Generacin de una seal PWM
mediante el CCP1
Prof. Luis Zurita Microcontroladores II
IUT Cuman
Ejercicio 3. Generacin de una seal PWM
mediante el CCP1
Prof. Luis Zurita Microcontroladores II
IUT Cuman
Ejercicio 3. Generacin de una seal PWM
mediante el CCP1
Prof. Luis Zurita Microcontroladores II
IUT Cuman
Ejercicio 3. Generacin de una seal PWM
mediante el CCP1
Prof. Luis Zurita Microcontroladores II
IUT Cuman
EJERCICIO CCP1 COMPARACIN
Configure el Mdulo CCP en modo
Comparacin, donde:
El TMR1 est configurado para contar pulsos
externos, con un prescaler 1:1, flanco
ascendente.
Se debe cargar CCPR1L con la constante
Ncompar, y producir una interrupcin cada vez
que se alcanza el valor fijado.
Al ocurrir esto, RB0 cambia de estado.
RC2, no debe modificar su valor.
Prof. Luis Zurita Microcontroladores II
IUT Cuman
EJERCICIO CCP1 CAPTURA
Realice la medicin de la duracin de un pulso en alto.
Emplear el mdulo CCP1 y capturar el valor del TMR1
cada vez que llegue un flanco ascendente y otro
descendente por la lnea RC2/CCP1. Conocida la
velocidad a la que evoluciona el TMR1, se puede
determinar la duracin del tiempo transcurrido entre
ambos flancos, lo que nos dar la anchura del pulso.
Configure al Timer1 con reloj interno y prescaler 1:1,
para obtener medida mxima de perodo= 65,536 ms.
Cambie la orden de captura de ascendente a
descendente al ocurrir la primera captura. (Dentro de
la RSI).
Prof. Luis Zurita Microcontroladores II
IUT Cuman
EJERCICIO PWM
Generar una seal de onda cuadrada por la lnea
RC2/CCP1 cuyo periodo puede ser modificado as como
la anchura del pulso (Duty Cycle).
Utilice las siguientes frmulas
(Perodo) T=(PR2+1)*4*Tosc*TMR2 preescaler.
(Duty Cycle)=
(DC)=(CCPR1L:CCPCON1<5:4>)*Tosc*TMR2 preescaler.
La seal de salida tiene un periodo determinado por la
constante "Periodo" y una anchura "Duty Cycle
determinada por la constante "Duty"
Prof. Luis Zurita Microcontroladores II
IUT Cuman

Vous aimerez peut-être aussi