You are on page 1of 6

MDULO COMPARACIN/CAPTURA/PWM (CCP) DEL MICROCONTROLADOR PIC18F4550 Tiene tres modos de funcionamiento: Modo de Captura.

Se utiliza para medir eventos externos como la duracin de pulsos digitales. Modo de Comparacin. Genera seales digitales como temporizaciones programables. Es til para control de etapas de potencia para convertidores DC/DC, DC/AC, AC/DC, AC/AC. Modo PWM. Genera seales moduladas en ancho de pulso para control de motores DC, servomotores y motores paso a paso. Este tambin para control de potencia en cargas resistivas. Existe tambin el mdulo de comparacin/captura/PWM mejorado ECCP. Este trabaja en los mismos modos anteriores. MODO PWM El modo PWM (Pulse Width Modulation) o Modulacin de Ancho de pulso, obtiene en los pines CCPx (CCP1, CCP2; pines RC1 y RC2 del puerto C) una seal peridica modificable el factor de trabajo (Duty Cycle). O sea, se puede variar el tiempo en alto (Ton), aumentando o disminuyendo el tiempo en bajo (Toff) de la seal. La figura indica lo mencionado.

Figura. Seales PWM. El perodo de la seal PWM se obtiene de configurar el TIMER2 y el registro PR2 (direccin 0x92). El periodo de la seal se puede calcular: TPWM = (1/clock)*4*t2div*(PR2+1) Donde: clock es la frecuencia del oscilador, t2div el preescalar del TMR2 (1, 4 y 16), PR2 es el valor del registro PR2 (0 a 255). Define el periodo de la seal.

Cuando el TMR2 se iguala al valor de PR2, ocurren los siguientes eventos: TMR2 se borra. El pin CCPx se pone en alto, segn el Duty Cycle.

Si el ciclo de trabajo es mayor de la onda PWM es mayor que el periodo de la seal que sale del pin CCPx siempre ser 1. La resolucin mxima en bits viene dada por la expresin:

El compilador C suministra varias funciones para el manejo del mdulo CCP. Entre estas tenemos: setup_ccpx(modo); modo hace referencia a los bits CCPxM3:CCPxM0 del registro CCPxCON. Los posibles valores se indican en la tabla:

Tabla 1. Modos de SETUP_CCPx(modo). Por ejemplo: setup_ccp1(CCP_PWM); configura el CCP1 para PWM. Ciclo de trabajo. Set_pwmx_duty(value); Value dato de 8 o 16 bits, que determina el ciclo de trabajo. Junto con el preescalar del TMR2 determina el ciclo de trabajo. Si value es LONG INT: Duty cycle = value*(1/clock)*t2div Si value es INT: Duty cycle = value*4*(1/clock)*t2div

Por lo general el preescalar vale 1. El TMR2 se configura se configura en conjunto con el PR2, mediante la funcin: setup_timer_2 (mode, period, postscale); mode: define el preescalar: T2_DISABLED, T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16

period: es un int 0-255 que determina cuando el valor del reloj se resetea. postscale es un nmero 1-16 que determina el nmero de temporizador se desborda antes

de una interrupcin: (1 significa que una vez, 2 significa dos veces, y as sucesivamente). Ejemplo. Con un clock=12000000 y periodo= 255 determinar el Periodo y la frecuencia del PWM para el preescalar de 1, 4 y 16. TPWM = (1/12000000)*4*1*256 = 85.33 us 11.72 khz TPWM = (1/12000000)*4*4*256 = 341.33 us 2.92 khz TPWM = (1/12000000)*4*16*256= 1365.33 us 732 Hz Proyecto: Realizar un programa para obtener una seal cuadrada usando CCP1, para los valores del ejemplo anterior. /************* Realizado por: **********/ #include <18f4550.h> #fuses HS,NOWDT,NOPROTECT,NOPUT, NOPBADEN #use delay (clock=12000000) //Fosc=12Mhz #include <stdlib.h> void main(void) { /* PWM PARA PICS DE 8-BIT */ int value= 127; setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM //setup_timer_2(T2_DIV_BY_1, 255, 1); // setup_timer_2(T2_DIV_BY_4, 225, 1); setup_timer_2(T2_DIV_BY_16, 255, 1); while( TRUE ){ set_pwm1_duty(value); } } El circuito usado para la simulacin se muestra en la figura.

MODO DE CAPTURA En modo de captura, el CCPR (H y L) capturan el valor de los 16 bits del registro TMR1 cuando ocurre un evento en el pin CCP1 o CCP2. Los posibles eventos son: Flanco de bajada Flanco de subida 4 flancos de subida 16 flancos de subida. En la tabla 1 del MODO PWM, se indic la configuracin del CCP para trabajar en modo de captura. Ejemplo: Medir el ancho del pulso mediante el mdulo CCP. //MEDICIN DEL ANCHO DE PULSO EXTERNO USANDO EL MODULO CCP /*************** Realizado por rafa reinoso srv picmaniatico ****************/ #include <18F4550.h> #fuses XT, NOPROTECT, NOWRT, NOPUT, NOWDT, NOLVP, NOCPD //Ordenes para el programador #use delay (clock=4000000) #byte PIR1 = 0X0C #include <lcd.c> int16 TFB = 0, TFS = 0, TF = 0; //Tiempo para los flancos float Ap = 0.0; //Valor del ancho del pulso int1 nuevopulso = 0; //Ingresa un nuevo pulso int1 cambio =0; //Controla el cambio de flanco #int_ccp1 void ccp1_int() //Funcin para la interrrupcin { if (cambio ==0) //Flanco de subida { TFS = CCP_1; //Carga el valor del registro CCPR1 en flanco de subida setup_ccp1(CCP_CAPTURE_FE); //Configuracin en modo de captura en flanco de bajada cambio = 1; //Control de cambio de flanco } else { TFB = CCP_1; //Carga el valor del registro CCPR1 en flanco de bajada setup_ccp1(CCP_CAPTURE_RE); //Configuracin en modo de captura en flanco de subida cambio = 0; //Control de cambio de flanco if (nuevopulso ==0) //Fin de pulso { nuevopulso = 1; //Nuevo pulso a medir } } } void main(void) { lcd_init();

setup_timer_1(T1_INTERNAL); setup_ccp1(CCP_CAPTURE_RE); cambio = 0; enable_interrupts(int_ccp1); enable_interrupts(global); while(TRUE){ if (nuevopulso == 1){ TF=TFB - TFS; Ap= TF*1.0; //4MHz = 0.25 us*4CM = 1.0 us lcd_gotoxy(4,1); //sita el cursor en 3 columna, 1 fila lcd_putc("RAFA REINOSO"); printf(lcd_putc,"\nPulso= %6.1f uS", Ap); nuevopulso = 0; } } } Para el ejemplo se ha inyectado una onda cuadrada de 1KHz al CCP1.

PROCEDIMIENTO 1.- Realizar el circuito de la figura puesto 2.- Se pide hacer un programa para generar la onda PWM con el periodo y la frecuencia establecido 3.- Se propone un programa para realizar el proyecto 4.- Simular el sistema y grbar el programa 5.- Realizar las pruebas Nota: Programa propuesto

#include <16f876A.h> //Ajusta los valores de la palabra de configuracin durante el ensamblaje: //Proteccin de cdigo y datos=OFF, LVP=OFF, WDT=OFF y OSC=XT #fuses NOPROTECT,NOCPD,NOLVP,NOWDT,XT // Con estas directivas las funciones "input" y "output_bit" no reprograman // el pin de la puerta cada vez que son utilizadas. Si no se indica el // modo fast_io se asume por defecto standard_io el cual reprograma el pin // siempre antes de ser utilizadas estas funciones. #use fast_io (A) #use fast_io (B) #use fast_io (C) #use delay(clock=4000000) int periodo=200; //Periodo de 3200uS (200*16*1)

int resultado;

//Variable para el resultado de la conversin AD

main() { set_tris_c(0b11111011); //RC2 salida setup_adc_ports(AN0); //RA0 entrada analgica //El TMR2 trabaja con un preescaler 1:16 por lo que con una frecuencia de 4MHz evoluciona //cada 16uS ((4*Tosc)*16) setup_timer_2(T2_DIV_BY_16,periodo-1,1); //Carga el periodo y TMR2 en ON //El mdulo CCP1 acta en el modo PWM con salida de seal por RC2/CCP1 setup_ccp1(CCP_PWM); //Modo PWM para el CCP1 setup_adc(adc_clock_div_32); //Ajusta frecuencia de muestreo del ADC while(1) { //Se activa el ADC y se selecciona el canal RA0/AN0. set_adc_channel(0); //Seleccin del canal 0 (RA0) CCP_1_LOW=read_adc(); //Inicia la conversin y carga la anchura del pulso } } 6.-Diga 5 aplicaciones 7.- conclusiones Nota: 1.-Adjuntar un diagrama de flujo del programa 2.- si se cambia el cristal para una frecuencia de f0sc=20 MHZ. Que cambios realiza en el programa 3.- Si la tensin analgica se aplica por el pin RA1 que cambos hara en el programa