Compare capture pwm mode 5

18
Compare Capture PWM mode Compare Capture PWM mode Compare Capture PWM mode Compare Capture PWM mode El modulo CCP se puede configurar en tres maneras: Comparador Captura PWM El modulo incluye también el TIMER1 y TIMER3 es un registro de control para establecer de funciones lógicas (Conocido como CCP) que aumentan la operación de los TIMERS y puede simplificar tus aplicaciones. Este hardware podría permitirte hacer múltiples funciones para ejecutar al mismo tiempo. Si el microcontrolador tiene 2 CCP, entonces uno es conocido como CCP1 y el otro como CCP2. Si tenemos dos módulos entonces todos los registros están identificados con el CCP1 o CCP2. Modo Captura El primer modulo Captura que es usado para funciones de repetición para el tiempo o para determinar el ancho de pulso. Se debe de configurar que tipo de flaco de debe de detectar y que timer usar para copiar el contenido del TIMER al registro de CCPxL (bajo byte) CCPxH (Alto byte). Diagrama de Operación en Modo Captura Un ejemplo sencillo es como se muestra en el diagrama siguiente: El timer empezara a incrementar hasta llegar a su valor de desbordamiento, si hemos configurado nuestro canal CCP en modo captura

Transcript of Compare capture pwm mode 5

Compare Capture PWM modeCompare Capture PWM modeCompare Capture PWM modeCompare Capture PWM mode

El modulo CCP se puede configurar en tres

maneras:

Comparador

Captura

PWM

El modulo incluye también el TIMER1 y TIMER3

es un registro de control para establecer de

funciones lógicas (Conocido como CCP) que

aumentan la operación de los TIMERS y puede

simplificar tus aplicaciones. Este hardware

podría permitirte hacer múltiples funciones

para ejecutar al mismo tiempo. Si el

microcontrolador tiene 2 CCP, entonces uno es

conocido como CCP1 y el otro como CCP2. Si

tenemos dos módulos entonces todos los

registros están identificados con el CCP1 o

CCP2.

Modo Captura

El primer modulo Captura que es usado para

funciones de repetición para el tiempo o para

determinar el ancho de pulso. Se debe de

configurar que tipo de flaco de debe de

detectar y que timer usar para copiar el

contenido del TIMER al registro de CCPxL (bajo

byte) CCPxH (Alto byte).

Diagrama de Operación en Modo Captura

Un ejemplo sencillo es como se muestra en el

diagrama siguiente:

El timer empezara a incrementar hasta llegar a

su valor de desbordamiento, si hemos

configurado nuestro canal CCP en modo captura

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 43

que cada vez que detecte un flaco de subida

rápidamente copie el valor de TIMER y lo

guarde en el registro CCPxH:CCPxL.

En este caso si tenemos el TIMER configurado

en 16 bit y el microcontrolador opera a 4Mhz,

como mínimo valor de captura será:

Timer configurado al mínimo:

Tick – 1uS

~1uS capturara nuestro modulo como minina

resolución para tener el máximo simplemente

multiplicamos:

1 �� ∗ 65535 = 65.535�� Máxima resolución de captura.

Nota: Estos valores pueden cambiar

dependiendo de la velocidad de trabajo del

Microcontrolador.

Si usamos los dos módulos CCP en modo

Captura podemos obtener el valor de ancho de

pulso del un PWM.

Al tener los dos valores guardados en los

registros CCPxH:L procedemos a restar el valor

guardado:

� �ℎ� �� ����� = ���2�: � − ���1�: �

Automáticamente tendremos el ancho de pulso,

pero recuerde que tenemos limitante de

captura con relación a la frecuencia de trabajo

del microcontrolador.

Para poner a prueba el modo captura del CCP,

realizaremos una práctica donde capture el

ancho de pulso de un generador de PWM.

Los primero pasos son básicos en la

programación se debe de configurar primero los

puertos del microcontrolador como entradas o

salidas respectivamente a cada modulo que

vallamos a usar, después se Configurara el

TIMER1 a 16 bit y un prescalar de 1, para que

ticks sean cada ciclo del microcontrolador.

Después Configuraremos el modulo CCP1 como

captura con un flanco de interrupción de

subida, después configuraremos el CCP2 sin

interrupción pero con un flaco de bajada.

Se realiza esta estrategia para esperar

exactamente los flancos de subida y bajada,

cuando configuramos el canal CCP1 en modo

captura y que cada

interrupción surja con

un flanco de subida esto

hace que cuando por

primera vez al conectar

nuestro circuito espera

hasta que realmente

este en un flanco de

subida y empiece a

contar el TIMER al

realizar esta acción

rápidamente se

desactiva la interrupción

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 44

del CCP1 y a la vez activa el siguiente canal CCP

para que empiece el canal a contar el pulso positivo y cuando detecte el flaco de bajada detenga el timer

y lo copie al registro CCP2H:L, después restamos los registros CCP2H:L-CCP1H:L .

Ahora bien configuramos el USART (modo hardware) esto sirve para enviar el dato obtenido de la

operación anterior, como nuestro resultado tendrá un valor mayor que 2 bytes, debemos de separarlos

y enviar uno tras otro a nuestro software ‘Capture’

El programa que contiene el Microcontrolador es el siguiente:

/////////////////////////////////////////////////// ///// // USO CCP modo Captura //// //Autor: george.manson.69 //// //Lugar: Mexico //// //Compilador: HI TECH PIC18 (LITE MODE) //// /////////////////////////////////////////////////// ///// #include<htc.h> #include<stdio.h> /////////////////////////////////////////////////// ////////// //Configuracion para trabajar Con oscilador interno de 8Mhz __CONFIG(1,INTIO & FCMDIS & IESODIS & PLLDIV5 & PLL POSTDIV2 & CPUDIV1 & USBOSC); /////////////////////////////////////////////////// ////////// __CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BOR V45 & WDTPS32K); __CONFIG(3,PBDIGITAL & LPT1DIS & MCLREN); __CONFIG(4,STVRDIS & LVPDIS & ICPORTDIS & DEBUGDIS) ; __CONFIG(5,UNPROTECT); __CONFIG(6,UNPROTECT); __CONFIG(7,UNPROTECT); ////////////////////////////// //Frecuencia FOSC 8Mhz ////////////////////////////// #define _XTAL_FREQ 8000000 //////////////////////////////

Software para visualizar el ancho de pulso

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 45

//Variable Globales // ////////////////////////////// unsigned int valor1; unsigned int valor2; unsigned int result; unsigned char flag; unsigned char buffer[2]; ////////////////////////////// //FUNCION DE 1 SEG // ////////////////////////////// void DELAY1S(void){ unsigned char time; for(time=0;time<100;time++){ __delay_ms(10); } } ///////////////////////////////////////////////// //Funcion de interrupcion //Si no se usa simplemente no hacemos nada... //Esto sirve para direccionar lo los datos //en un lugar muy cercano al Inicio de la memoria //de datos //////////////////////////////////////////////// static void interrupt isr(void){ if(CCP2IF && CCP2IE){ CCP1IE=0; CCP2IF=0; valor1=ReadCapture1(); valor2=ReadCapture2(); result=valor2-valor1; flag=1; } if(CCP1IF && CCP1IE){ CCP2IE=1; } } ////////////////////////////// //FUNCION PRINCIPAL ////////////////////////////// void main(void){ OSCCON=0x70; NOP();NOP();NOP();NOP(); /////////////////////////////////////////////////// /////////////////// // Configuracion de Puertos /// /////////////////////////////////////////////////// /////////////////// TRISC=0x86; /*---------------------Fin de Conf. Puertos-------- -----------------*/ /////////////////////////////////////////////////// /////////////////// // Configuracion de Timer1 /// /////////////////////////////////////////////////// /////////////////// OpenTimer1(TIMER_INT_OFF &//Interrupcion De sactivada T1_16BIT_RW &//valor de 16 bit T1_SOURCE_INT &//Corriente desde el oscilador principal T1_PS_1_1 &//Preescalar de 1

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 46

T1_OSC1EN_OFF & T1_SYNC_EXT_OFF & T1_SOURCE_CCP); //Sincronismo desactivado /*---------------------Fin de Conf. TIMER1--------- -----------------*/ /////////////////////////////////////////////////// /////////////////// // Configuración de CCP1 (Captura) /// /////////////////////////////////////////////////// /////////////////// OpenCapture1(CAPTURE_INT_ON & //Interrupción Desac tivada C1_EVERY_RISE_EDGE);//Cada elevación /*---------------------Fin de Conf. CCP1----------- -----------------*/ /////////////////////////////////////////////////// /////////////////// // Configuracion de CCP2 (Captura) /// /////////////////////////////////////////////////// /////////////////// OpenCapture2(CAPTURE_INT_OFF & //Interrupcion Acti vada C2_EVERY_FALL_EDGE);//Cada CAIDA /*---------------------Fin de Conf. CCP2----------- -----------------*/ /////////////////////////////////////////////////// //////////////////// // Configuración del USART /// /////////////////////////////////////////////////// //////////////////// OpenUSART(USART_TX_INT_OFF &//Interrupción por Tr ansmisión apagado USART_RX_INT_OFF &//Interrupción por Recepció n Apagado USART_ASYNCH_MODE &//Modo Asincronico USART_EIGHT_BIT &//8-bit de transmision USART_CONT_RX &//Recepcion Continua USART_BRGH_HIGH, //Alta velocidad de baudios 25); //para alta Velocidad: // FOSC / (16 * (spbrg + 1)) // spbrg=(FOS/baud*16)-1 //Para baja Velocidad: // FOSC / (64 * (spbrg + 1)) /*---------------------Fin de Conf. USART---------- ------------------*/ WriteTimer1(0); GIE=1; //INTERRUPCIONES GLOBALES ACTIVADAS PEIE=1; //ACTIVA INTERURPCIONES POR PERIFERICOS while(1){ if(flag){ DELAY1S(); buffer[0]=result&0xFF; buffer[1]=(result>>8)&0xFF; WriteUSART(buffer[0]); WriteUSART(buffer[1]); WriteTimer1(0); flag=0; CCP1IE=1; } } }

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 47

El circuito a manejar es el siguiente:

Al armar nuestro circuito procure primero

conectar el software, y después alimente el

circuito ya conectado a la entrada del serial y

listo.

Si usted no tiene un puerto Serial puede

adquirir un cable de USB-SERIAL para simular un

puerto Serial en una entrada de USB, es muy

eficiente realizar eso, ya que últimamente las

computadoras portátiles no tienen este puerto

de comunicación.

También es muy eficiente realizar

un circuito impreso del MAX232

para hacer enlaces más rápido, en

lugar de armar la conexión en el

protoboard todas las veces

necesarias, si realizamos esto

podemos ahorrar mucho tiempo

para hacer la práctica.

Al realizar la

práctica usted

verá en el

software el

tiempo que

corresponde

al acho de

pulso.

Esto Puede ser

en ‘mS’ o ‘uS’.

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 48

Modo PWM

Esta configuración del CCP en modo PWM, nos

proporciona un control del ancho de pulso a

una frecuencia muy estable más que usar

timers para realizar dicha acción.

El uso es muy sencillo cada canal CCP se debe

de configurar primero a la frecuencia deseada,

si se cuenta con más canales CCP cada uno de

ellos debe de tener la misma frecuencia lo único

que se puede cambiar individualmente es su

ancho de pulso.

Antes de entrar a la configuración del canal

PWM se debe de definir el timer2.

Este TIMER proporciona la frecuencia deseada

dependiendo del prescalar y postescalar.

La función de configuración del timer2 es la

siguiente:

OpenTimer2(unsigned char config);

Config puede tener los siguientes parámetros

separados por un ‘&’.

Establecer interrupción por TIMER2.

TIMER_INT_ON

TIMER_INT_OFF

Valor de Prescalar:

T2_PS_1_1

T2_PS_1_4

T2_PS_1_16

Valor postesclar:

T2_POST_1_1

T2_POST_1_2

...

T2_POST_1_15

T2_POST_1_16

Después que configuramos el TIMER2, ya

podemos poner la función de configuración del

PWM.

OpenPWM1(char period); Period puede ser cualquier valor de 0x00 a 0xFF. Para calcular el periodo se requiere la siguiente

fórmula:

��� ��� �� = !"��� ��# + 1% ∗ 4 ∗ '(��∗ '�)2 ������*�

Del cual podemos despejar “period”

��� �� = + 1, ∗ - 4'���. ∗ '�)2������*�/ − 1

Tosc =corresponde a la frecuencia del Cristal

interno o externo.

F= a la frecuencia a trabajar

TMR2presclar = es el valor antes definido en la

función de OpenTimer2

Después tenemos la función de:

SetDCPWM1(unsigned int dutycycle);

Dutycycle = es de 0 a 512 que corresponde el

porcentaje del ancho de pulso.

Para entender mejor el uso del PWM, se hará

un ejemplo sencillo para el de este modulo.

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 49

El esquema a manejar para este ejemplo es el siguiente:

Como vemos es muy simple nuestro proyecto simplemente hay que medir el ancho de pulso con un

osciloscopio para ver el resultado.

El programa que contiene el Microcontrolador es el siguiente:

/////////////////////////////////////////////////// ///// // USO DEL PWM //// //Autor: george.manson.69 //// //Lugar: Mexico //// //Compilador: HI TECH PIC18 (LITE MODE) //// /////////////////////////////////////////////////// ///// #include<htc.h> /////////////////////////////////////////////////// ////////// //Configuracion para trabajar Con oscilador interno de 8Mhz __CONFIG(1,INTIO & FCMDIS & IESODIS & PLLDIV5 & PLL POSTDIV2 & CPUDIV1 & USBOSC); /////////////////////////////////////////////////// ////////// __CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BOR V45 & WDTPS32K); __CONFIG(3,PBDIGITAL & LPT1DIS & MCLREN); __CONFIG(4,STVRDIS & LVPDIS & ICPORTDIS & DEBUGDIS) ; __CONFIG(5,UNPROTECT); __CONFIG(6,UNPROTECT); __CONFIG(7,UNPROTECT); //////////////////////////////

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 50

//Frecuencia FOSC 8Mhz ////////////////////////////// #define _XTAL_FREQ 8000000 ///////////////////////////////////////////////// //Funcion de interrupcion //Si no se usa simplemente no hacemos nada... //Esto sirve para direccionar lo los datos //en un lugar muy cercano al Inicio de la memoria //de datos //////////////////////////////////////////////// static void interrupt isr(void){} ////////////////////////////// //FUNCION PRINCIPAL ////////////////////////////// void main(void){ /////////////////////////////////////////////// //Configuramos el Oscilador Interno a 8Mhz //// /////////////////////////////////////////////// OSCCON=0x70; NOP();NOP();NOP();NOP(); /////////////////////////////////////////////////// //////////////////// // Configuracion del TIMER2 /// /////////////////////////////////////////////////// //////////////////// OpenTimer2(TIMER_INT_OFF & T2_PS_1_16 & T2_POST_1_1); /*---------------------Fin de Conf. TIMER2--------- ------------------*/ /////////////////////////////////////////////////// /////////////////// // Configuracion de PWM /// /////////////////////////////////////////////////// /////////////////// OpenPWM1(124); //1kHZ de PWM //PWM period = [(period ) + 1] x 4 x Tosc x TMR 2 prescaler //PWM period = [(255)+1]x(4/4Mhz)x16 // [.001s/((4/8Mhz)*16)]-1=period // [1/(f*(4/Tosc)*preescalar)]-1=period SetDCPWM1(255);//Establece 50%de duty cycle /*---------------------Fin de Conf. PWM------------ ------------------*/ GIE=0; //INTERRUPCIONES GLOBALES ACTIVADAS PEIE=0; //ACTIVA INTERURPCIONES POR PERIFERICOS while(1); }

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 51

La desventaja de este método es que se debe de programar las veces que sea necesarias para cambiar el

ancho de pulso, entonces se realiza una pequeña practica para cambiar el ancho de pulso vía serial con

un software que fue realizado en Visual C# 2010 Express.

Este ejemplo controlara el giro de un motor DC vía serial, usando solo un canal CCP modo PWM.

El programa a manejar es el siguiente:

/////////////////////////////////////////////////// ///// // USO DEL PWM (Control de Motor) //// //Autor: george.manson.69 //// //Lugar: Mexico //// //Compilador: HI TECH PIC18 (LITE MODE) //// /////////////////////////////////////////////////// ///// #include<htc.h> #include<stdio.h> /////////////////////////////////////////////////// ////////// //Configuracion para trabajar Con oscilador interno de 8Mhz __CONFIG(1,INTIO & FCMDIS & IESODIS & PLLDIV5 & PLL POSTDIV2 & CPUDIV1 & USBOSC); /////////////////////////////////////////////////// //////////

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 52

__CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BOR V45 & WDTPS32K); __CONFIG(3,PBDIGITAL & LPT1DIS & MCLREN); __CONFIG(4,STVRDIS & LVPDIS & ICPORTDIS & DEBUGDIS) ; __CONFIG(5,UNPROTECT); __CONFIG(6,UNPROTECT); __CONFIG(7,UNPROTECT); ////////////////////////////// //Frecuencia FOSC 8Mhz ////////////////////////////// #define _XTAL_FREQ 8000000 ////////////////////////////// //Variables globales ////////////////////////////// unsigned char buffer[2]; unsigned char flag=0; unsigned int pwm; ///////////////////////////////////////////////// //Funcion de interrupcion //Si no se usa simplemente no hacemos nada... //Esto sirve para direccionar lo los datos //en un lugar muy cercano al Inicio de la memoria //de datos //////////////////////////////////////////////// static void interrupt isr(void){ if(RCIF && RCIE){ //Resivimos dos bytes getsUSART(buffer,2); RCIF=0; flag=1; } } ////////////////////////////// //FUNCION PRINCIPAL ////////////////////////////// void main(void){ /////////////////////////////////////////////// //Configuramos el Oscilador Interno a 8Mhz //// /////////////////////////////////////////////// OSCCON=0x70; NOP();NOP();NOP();NOP(); /////////////////////////////////////////////////// /////////////////// // Configuracion de Puertos /// /////////////////////////////////////////////////// /////////////////// TRISC=0x80; /*---------------------Fin de Conf. Puertos-------- -----------------*/ /////////////////////////////////////////////////// //////////////////// // Configuracion del USART /// /////////////////////////////////////////////////// //////////////////// OpenUSART(USART_TX_INT_OFF &//Interrupcion por Tr ansmision apagado USART_RX_INT_ON &//Interrupcion por Recepcion ENCENDIDO USART_ASYNCH_MODE &//Modo Asincronico USART_EIGHT_BIT &//8-bit de transmision USART_CONT_RX &//Recepcion Continua USART_BRGH_HIGH, //Alta velocidad de baudios

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 53

25); //para alta Velocidad: // FOSC / (16 * (spbrg + 1)) // spbrg=(FOS/baud*16)-1 //Para baja Velocidad: // FOSC / (64 * (spbrg + 1)) /*---------------------Fin de Conf. USART---------- ------------------*/ /////////////////////////////////////////////////// //////////////////// // Configuracion del TIMER2 /// /////////////////////////////////////////////////// //////////////////// OpenTimer2(TIMER_INT_OFF & T2_PS_1_16 & T2_POST_1_1); /*---------------------Fin de Conf. TIMER2--------- ------------------*/ /////////////////////////////////////////////////// /////////////////// // Configuracion de PWM /// /////////////////////////////////////////////////// /////////////////// OpenPWM1(124); //1kHZ de PWM //PWM period = [(period ) + 1] x 4 x Tosc x TMR 2 prescaler //PWM period = [(255)+1]x(4/4Mhz)x16 // [.001s/((4/8Mhz)*16)]-1=period // [1/(f*(4/Tosc)*preescalar)]-1=period SetDCPWM1(0);//Establece duty cycle /*---------------------Fin de Conf. PWM------------ ------------------*/ GIE=1; //INTERRUPCIONES GLOBALES ACTIVADAS PEIE=1; //ACTIVA INTERURPCIONES POR PERIFERICOS while(1){ if(flag==1){ RCIE=0; //Convertimos los dos bytes a unsigned int pwm=(unsigned int)buffer[0]; pwm+=(unsigned int)buffer[1]<<8; SetDCPWM1(pwm);//Establece duty cycle flag=0; RCIE=1; } } }

Al armar nuestro circuito, primero conecte el

software y después conecte el circuito, y

empiece a mover la barra deslizadora y vera

que el motor empezara a girar lento

rápidamente depende como vallamos

moviendo el trackbar

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 54

Imágenes del Circuito Terminado:

Observe que el motor debe ser activado por

medio de un transistor 2N2222

He usado un cable de USB a serial para hacer el

interfaz en mi LABTOP.

Modo Comparador

El modo comparador cambia el estado de pin

CCPx del PIC cuando el contenido del TMR1

concuerda con el valor registros CCPRxH y

CCPRxL como se muestra en el esquema

siguiente:

Este modo es usado para switchar después de

un tiempo específico.

El evento que puede ser programado es para

establecer el pin CCPx a 0 o 1, y el reset para el

tiemer1. Cuando se usa el pin CCPx, debe ser

configurado como una salida entonces debe de

estar apropiadamente el bit del registro TRIS a

0. En todos los casos cuando el resultado de la

comparación es positivo, el bit CCPxIF en el

registro PIR es puesto a 1. Este bit puede ser

checado por el programa. Si el Modulo CCP la

interrupción es establecido, genera una

búsqueda de interrupción.

Uno de los eventos que puede ser generado

como el resultado de la comparación es iniciar

positivo es para resetear el timer1. Esta

operación incrementa las posibilidades para

timer1, como puede trabajar como un

comprador de 16 bit con un modulo contador

igual para el valor guardado en los registros

CCPRxH y CCPRxL en el modulo CCP.

Nuestra practica para entender mas sobre este

modo comparador, se tratara de configurar

correctamente el modulo y el timer para

empezar la comparación de un valor puesto en

los registros CCPPRxH:L, y cada vez que se de

esta igualdad surja una interrupción y podamos

cambiar de estado un pin determinado.

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 55

El programa que contiene el Microcontrolador es el Siguiente:

/////////////////////////////////////////////////// ///// // USO DEL COMPARADO //// //Autor: george.manson.69 //// //Lugar: Mexico //// //Compilador: HI TECH PIC18 (LITE MODE) //// /////////////////////////////////////////////////// ///// #include<htc.h> /////////////////////////////////////////////////// ////////// //Configuracion para trabajar Con oscilador interno de 8Mhz __CONFIG(1,INTIO & FCMDIS & IESODIS & PLLDIV5 & PLL POSTDIV2 & CPUDIV1 & USBOSC); /////////////////////////////////////////////////// ////////// __CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BOR V45 & WDTPS32K); __CONFIG(3,PBDIGITAL & LPT1DIS & MCLREN); __CONFIG(4,STVRDIS & LVPDIS & ICPORTDIS & DEBUGDIS) ; __CONFIG(5,UNPROTECT); __CONFIG(6,UNPROTECT); __CONFIG(7,UNPROTECT); ////////////////////////////// //Frecuencia FOSC 8Mhz ////////////////////////////// #define _XTAL_FREQ 8000000 ///////////////////////////////////////////////// //Funcion de interrupcion //Si no se usa simplemente no hacemos nada... //Esto sirve para direccionar lo los datos //en un lugar muy cercano al Inicio de la memoria //de datos //////////////////////////////////////////////// static void interrupt isr(void){ //Espera por interrupcion if(CCP1IF && CCP1IE){ RC0=~RC0;//cambia estado CCP1IF=0;//reset flag de interrupcion WriteTimer1(0);//inicializa a cero } } ////////////////////////////// //FUNCION PRINCIPAL ////////////////////////////// void main(void){ /////////////////////////////////////////////// //Configuramos el Oscilador Interno a 8Mhz //// /////////////////////////////////////////////// OSCCON=0x70; NOP();NOP();NOP();NOP(); /////////////////////////////////////////////////// /////////////////// // Configuración de PUERTOS //// /////////////////////////////////////////////////// /////////////////// TRISC=0x00;//Puerto C como salida /*---------------------Fin de Conf. PUERTOS-------- -----------------*/

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 56

/////////////////////////////////////////////////// /////////////////// // Configuración de TIMER1 //// /////////////////////////////////////////////////// /////////////////// OpenTimer1(TIMER_INT_OFF &//Desactiva Interrupcio n por timer T1_16BIT_RW &//Contador de 16 bit T1_SOURCE_INT &//Corriente del Oscilador inte rno T1_PS_1_1 &//Prescalar de 1 T1_OSC1EN_OFF &//Oscilador del timer desactiv ado T1_SYNC_EXT_OFF &//Sincronismo Externo Desact ivado T1_SOURCE_CCP); //Ambos CCP tiene el Timer1 /*---------------------Fin de Conf. TIMER1--------- -----------------*/ /////////////////////////////////////////////////// /////////////////// // Configuración de Compare /// /////////////////////////////////////////////////// /////////////////// CCP1CON=0b00001010; //Evento de Interrupción al ser iguales TMR1 y //CCPRxH:L CCP1IE=1; //Activa Interrupción por CCP CCPR1L=30000&0xFF; //Inicializa registros de C CPRxH:L CCPR1H=(30000>>8)&0xFF;//Con un valor de 30000 WriteTimer1(0); // /*---------------------Fin de Conf. PWM------------ ------------------*/ GIE=1; //INTERRUPCIONES GLOBALES ACTIVADAS PEIE=1; //ACTIVA INTERURPCIONES POR PERIFERICO S while(1);//ciclo perpetuo }

Cuando cargamos el registro CCPRx con un valor de 30000 nuestro periodo es calculado con la formula:

��� �� = 30000 ∗ 0.5�� ��� �� = 0.015 �

0.5uS es el valor que corresponde a los pasos que estará incrementando el timer1 en este caso como

vemos el valor corresponde a la frecuencia de trabajo del microcontrolador.

Cuando se cumpla la igualdad en TIMER1 y CCPRx generara una interrupción del cual se tuvo que

esperar 15mS para que siguiera tal interrupción después cambiamos de estado el pin deseado, al hacer

esto estamos generando una frecuencia de 33Hz.

El diagrama a Manejar es el siguiente:

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 57

Ahora si deseamos realizar un variador de frecuencia que tenga de rango 1Khz a 15 Hz usando un

Potenciómetro y una entrada análoga podemos hacerlo, simplemente se trata de que el valor leído del

canal análogo pase por una operación simple donde se convierte en un valor de 16 bit.

�����1 = "*�� ∗ 65535#/1023

El resultado se deposita en el registro CCPRxH:L y listo, al variar el potenciómetro variara la frecuencia:

El esquema a manejar es el siguiente:

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 58

El programa que tiene el microcontrolador es e siguiente:

/////////////////////////////////////////////////// ///// // USO DEL COMPARADO //// //Autor: george.manson.69 //// //Lugar: Mexico //// //Compilador: HI TECH PIC18 (LITE MODE) //// /////////////////////////////////////////////////// ///// #include<htc.h> /////////////////////////////////////////////////// ////////// //Configuracion para trabajar Con oscilador interno de 8Mhz __CONFIG(1,INTIO & FCMDIS & IESODIS & PLLDIV5 & PLL POSTDIV2 & CPUDIV1 & USBOSC); /////////////////////////////////////////////////// ////////// __CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BOR V45 & WDTPS32K); __CONFIG(3,PBDIGITAL & LPT1DIS & MCLREN); __CONFIG(4,STVRDIS & LVPDIS & ICPORTDIS & DEBUGDIS) ; __CONFIG(5,UNPROTECT); __CONFIG(6,UNPROTECT); __CONFIG(7,UNPROTECT); ////////////////////////////// //Frecuencia FOSC 8Mhz ////////////////////////////// #define _XTAL_FREQ 8000000 ////////////////////////////// //Variable Globales // ////////////////////////////// unsigned int result; ///////////////////////////////////////////////// //Funcion de interrupcion //Si no se usa simplemente no hacemos nada... //Esto sirve para direccionar lo los datos //en un lugar muy cercano al Inicio de la memoria //de datos //////////////////////////////////////////////// static void interrupt isr(void){ //Espera por interrupcion if(CCP1IF && CCP1IE){ RC0=~RC0;//cambia estado CCP1IF=0;//reset flag de interrupcion WriteTimer1(0);//inicializa a cero } } ////////////////////////////// //FUNCION PRINCIPAL ////////////////////////////// void main(void){ /////////////////////////////////////////////// //Configuramos el Oscilador Interno a 8Mhz //// /////////////////////////////////////////////// OSCCON=0x70; NOP();NOP();NOP();NOP();

[MODULO CCP] 2011

MicroCursos | Curso de Hi tech Compiler For PIC18 59

/////////////////////////////////////////////////// /////////////////// // Configuracion de PUERTOS //// /////////////////////////////////////////////////// /////////////////// TRISC=0x00;//Puerto C como salida TRISA=0x01;// /*---------------------Fin de Conf. PUERTOS-------- -----------------*/ /////////////////////////////////////////////////// /////////////////// // Configuracion de ADC /// /////////////////////////////////////////////////// /////////////////// OpenADC(ADC_FOSC_RC &//Internal Oscilador Intern o ADC_RIGHT_JUST &//Justificacion a la derecha (10 -bit) ADC_20_TAD, //Tiempo de Adquisicion (TAD) ADC_CH0 &//CANAL 0 analogo ADC_INT_OFF &//Interrupcion por ADC APAGDO ADC_REF_VDD_VSS, //V+ref=VCC,V-ref=GND 1); //AN0=analogo,resto digitales /*---------------------Fin de Conf. ADC------------ ------------------*/ /////////////////////////////////////////////////// /////////////////// // Configuracion de TIMER1 //// /////////////////////////////////////////////////// /////////////////// OpenTimer1(TIMER_INT_OFF &//Desactiva Interrupcio n por timer T1_16BIT_RW &//Contador de 16 bit T1_SOURCE_INT &//Corriente del Oscilador inte rno T1_PS_1_1 &//Prescalar de 1 T1_OSC1EN_OFF &//Oscilador del timer desactiv ado T1_SYNC_EXT_OFF &//Sincronismo Externo Desact ivado T1_SOURCE_CCP); //Ambos CCP tiene el Timer1 /*---------------------Fin de Conf. TIMER1--------- -----------------*/ /////////////////////////////////////////////////// /////////////////// // Configuracion de Compare /// /////////////////////////////////////////////////// /////////////////// CCP1CON=0b00001010; //Evento de Interrupcion al se r iguales TMR1 y //CCPRxH:L CCP1IE=1; //Activa Interrupcion por CCP CCPR1L=30000&0xFF; //Inicializa registros de CCPR xH:L CCPR1H=(30000>>8)&0xFF;//Con un valor de 30000 WriteTimer1(0); // /*---------------------Fin de Conf. PWM------------ ------------------*/ GIE=1; //INTERRUPCIONES GLOBALES ACTIVADAS PEIE=1; //ACTIVA INTERURPCIONES POR PERIFERICO S while(1){ __delay_ms(10); ConvertADC(); //Empieza Conversion while(BusyADC()); //Espera a terminar result=ReadADC(); //lee resultado result=(unsigned int)(((unsigned long)result*6553 5)/1023); CCPR1L=result&0xFF; //Inicializa registros de CCP RxH:L CCPR1H=(result>>8)&0xFF;//Con un valor } }