MÓDULO CCP (Captura/Comparación/PWM)
MÓDULO CCP (Captura (Captura/Comparación/PWM) /Comparación/PWM) • Un
CCP.
microcontrolador de la gama media de los PIC16 puede tener hasta 2 módulos
• Cada módulo CCP tiene un registro de 16 bits que se puede utilizar de 3 formas
distintas: 1. Como registro de 16 bits para captura de tiempo al producirse un evento. 2. Como registro de 16 bits para compararlo con el valor de cuenta del temporizador TMR1, pudiendo provocar un evento cuando se alcanza el valor contenido en este registro. 3. Como registro de 10 bits del ciclo de trabajo de una señal PWM generada gen erada por el microcontrolador. • Los 2 módulos CCP disponibles se comportan casi idénticamente, salvo el caso
delfuncionamiento por disparo de evento especial (special event trigger) que tiene una pequeña diferencia si se trata del módulo CCP1 ó del módulo CCP2. • Tras un reset, el módulo CCP está apagado (al forzar los bits de configuración al valor 0).
MÓDULO CCP (Captura/Comparación/PWM) La siguiente tabla muestra qué temporizadores utiliza el módulo CCP en cada uno de sus modos de funcionamiento:
La siguiente tabla muestra las posibles interacciones entre los módulos CCP, donde CCPxes uno de los módulos y CCPy es el otro:
CCPxCON -- CCP1CON (17h) Y CCP2CON (1Dh): Registros de control de cada módulo CCP
BITS
MODO
CCPxM3…. CCPxM0
00 01
10
00 00 01 10 11 00
Desactivar módulo CCP Cada flanco de bajada Cada flanco de subida CAPTURA Cada 4 flancos de subida Cada 16 flancos de subida El terminal CCPx es iniciado en bajo y se pone en alto cuando el resultado de la comparación es positivo. El bit CCPxIF es puesto a 1.
01
El terminal CCPx es iniciado en altoo y se pone en bajo cuando el resultado de la comparación es positivo. El bit CCPxIF es puesto a 1.
10
11
COMPARADOR
El bit CCPIF es puesto a 1 cuando el resultado de la comparación positivo. No se afecta el terminal CCPx Modo comparación, generación de disparo de evento especial (special event trigger). CCPIF se pone a 1. El pin CCPx no se ve afectado. CCP1 resetea el TMR1; CCP2 resetea el TMR1 y lanza una conversión A/D nueva (si el módulo del conversor A/D está habilitado.
MODO CAPTURA •En modo Captura, los registros CCPRxH:CCPRxL toman el valor de 16 bits que tenga el TMR1 cuando se
produce un determinado evento en el pin CCPx (RC2/CCP1 para el módulo CCP1 y RC1/T1OSI/CCP2 para el módulo CCP2). Los posibles eventos son: • Cada flanco de bajada. • Cada flanco de subida. • Cada 4 flancos de subida. • Cada 16 flancos de subida.
El evento se configura con los bits CCPxM3:CCPxM0 de los registros CCP1CON y CCP2CON respectivamente. • El bit CCP1IF (PIR1<2>) ó CCP2IF (PIR2<0>) se ponen a “1” cuando se produce el evento configurado,
pudiendo provocar un salto a la rutina de interrupción. El correspondiente flag debe limpiarse por software. •Si se produce otra captura antes de que se lea el valor del registro CCPRx, el último valor sobreescribe el valor anterior (que se pierde). • En modo captura, el pin RC2/CCP1
y/o el pin RC1/T1OSI/CCP2 deben configurarse como entrada por puesta a uno de los bits TRISC<2> y TRISC<1> respectivamente. Si el bit RC2/TRISC1 y/o RC1/CCP2 se configura como salida, una escritura a este pin del puerto podría originar una captura.
MODO CAPTURA
EJEMPLO DE INICIALIZACIÓN EN MODO CAPTURA
MODO COMPARACIÓN
• En modo comparación, el valor de 16 bits reservado en los registros CCPRx es comparado perennemente con el valor de los registros del TMR1. Cuando se produce una igualdad, el pin CCPx puede experimentar o no un evento, que puede ser: • Puesta a “1”. • Puesta a “0”. • Sin cambio. • El evento viene establecido por el valor de los bits CCPxM3:CCPxM0 (CCPxCON<3:0>) • Al mismo tiempo que se produce un evento en el pin se puede originar una interrupción ya que el flag CCPxIF (de PIR1 ó PIR2) se pone a “1”.
Configuraciones para modo Comparación
MODO COMPARACION
CCPx PARA MODO COMPARACION: El pin CCPx que quiera verse modificado debe configurarse como salida, limpiando el bit del registro TRISC correspondiente. En el momento que se selecciona el modo de comparación deseado, el pin CCP se pone al nivel contrario al que tiene que cambiar cuando se produzca la igualdad entre los registros CCPRx y TMR1. Si la igualdad no afecta al pin CCPx, este tendrá el valor que se le haya dado previamente en el registro PORTC. • CONFIGURACION DEL PIN
En este modo, el pin CCPx no se ve afectado, solo se activará al flag CCPxIF a 1 y se generará la interrupción si está habilitada. • MODO INTERRUPCION SOFTWARE:
Cuando se produce la igualdad, el registro TMR1 se resetea convirtiéndose por tanto, en un registro que marca la periodicidad del evento. En el caso del módulo CCP2, además de resetear el TMR1 se lanza una nueva conversión A/D (si el módulo de conversión A/D está activo) permitiendo programar la conversión A/D a periodos de tiempo fijos. • MODO DISPARO DE EVENTO ESPECIAL :
Al no funcionar el TMR1 (modo síncrono) en modo dormido, el módulo CCP en modo comparación no funciona. El pin CCPx tendrá • FUNCIONAMIENTO EN MODO DORMIDO :
el valor que tenía antes de entrar en modo SLEEP y “despertará” con ese valor. • TRAS UN RESET:
El módulo CCP está apagado.
EJEMPLO DE INICIALIZACIÓN EN MODO COMPARACIÓN CLRF CCP1CON ; Modulo CCP1 OFF CLRF TMR1H ; limpio TMR1H CLRF TMR1L ; limpio TMR1L ;aquí podriamos cargar el valor de la comparación en CCPR1H y CCPR1L CLRF INTCON ; Deshabilito interrupciones BSF STATUS, RP0 ; Banco 1 BCF TRISC, CCP1 ; Pin RC2/CCP1 SALIDA CLRF PIE1 ; Deshabilito interrupciones de periféricos BCF STATUS, RP0 ; Banco 0 CLRF PIR1 ; limpio flags de interrupciones de periféricos MOVLW 0x08 ; Modo comparación, a 1 el pin CCP1 cuando se ; iguale MOVWF CCP1CON ; BSF T1CON, TMR1ON ; Timer 1 ON ; En este ejemplo no usamos la interrupciones del CCP1 ; se muestrea el flag de CCP para detectar cuando se produce la igualdad de la comparación ; Si se quisiera utilizar interrupciones habría que habilitarlas en el proceso de ; inicialización Evento_comparacion BTFSS PIR1, CCP1IF GOTO Evento_comparacion ; ; Si llegamos aquí es que se ha producido una igualdad entre TMR1 y CCP1RH:CCP1RL ; BCF PIR1, CCP1IF ; Se debe limpiar el flag para una nueva ; comparación
MODO PWM
MODO PWM • En modo PWM (MODULACIÓN DE ANCHO DE PULSO - Pulse Width Modulation), el objetivo es obtener a través de alguna de las patitas CCPx una forma de onda como la mostrada en la figura, donde tanto el periodo como el ciclo de trabajo (Duty cycle) puede variar con el objetivo, por ejemplo, de regular la velocidad de un motor, la luminosidad de una bombilla, etc.
• El periodo de la señal viene fijado por la configuración de TMR2 y por el contenido del registro PR2 (0x92). Este registro de 8 bits contiene los 8 bits más significativos de una cuenta de 10 bits. • El ciclo de trabajo o ciclo útil (duty cycle) viene definido por el contenido del valor del registro CCPRxL junto con los bits CCP1CON<5:4> antes de comenzar un nuevo periodo. •El temporizador base con el que se compara el contenido de estos registros es el TMR2.
MODO PWM
• PERIODO DE LA ONDA PWM: Se calcula utilizando la siguiente fórmula: T = (PR2 + 1) · 4 · TOSC · PRESCALER TMR2 Cuando TMR2 es igual a PR2, en el siguiente incremento de ciclo se producen tres acciones:
1. El TMR2 se resetea. 2. El pin CCPx se pone a 1. Salvo si el ciclo de trabajo esta fijado a 0 donde el pin CCPx no se pondrá a 1 nunca (el biestable RS es de borrado prioritario). 3. El nuevo ciclo de trabajo es cargado desde el registro CCPRxL al registro CCPRxH que es el que realmente se compara con el TMR2 para fijar el ciclo ce trabajo.
MODO PWM
CICLO DE TRABAJO DE LA ONDA PWM: • El ciclo de trabajo viene definido por el valor que se carga en el registro CCPR1L (8bits más significativos) junto con los bits CCP1CON<5:4> (2 bits menos significativos). Por tanto se consigue una resolución de 10 bits (DCxB9:DCxB0). La siguiente ecuación se utiliza para calcular el ciclo de trabajo (duty cycle) de la onda PWM: T ON = (CCPRxL:CCPxCON<5:4>) · TOSC · PRESCALERTMR2 • Los registros CCPR1L y los bits CCP1CON<5:4> pueden escribirse en cualquier instante de tiempo, pero no se cargan en CCPR1H y por tanto, no tiene efecto, hasta que finalice el periodo de la onda PWM actual. • Si el ciclo de trabajo de la onda PWM es mayor que el periodo, la señal que sale por la patilla CCPx está siempre a 1.
MODO PWM Configuraciones para MODO PWM
MODO PWM • La máxima resolución (máximo nº de bits que resultan útiles para definir el ciclo de trabajo) que se puede obtener para una onda PWM generada en este módulo viene dada por la siguiente fórmula:
• La máxima resolución (en tiempo) viene fijada por el prescaler escogido para el TMR2:
• La siguiente tabla muestra frecuencias y resoluciones que se pueden obtener con un
oscilador de 20 MHz
(fosc= 20MHz)
MODO PWM Pasos para configurar el módulo CCP para funcionar en modo PWM: 1. Definir el periodo de la onda PWM escribiendo en el registro PR2. 2. Definir el ciclo de trabajo (tiempo en estado alto) escribiendo en los registros CCPRxL y en los bits CCPxCON<5:4>. 3. Definir el pin CCPx como salida, poniendo a “0” el bit TRISC<2> (para CCP1) y/o el bit TRISC<1> (para CCP2). 4. Seleccionar el valor del prescaler del TMR2 y habilitar el TMR2 por puesta a 1 del nit TMR2ON (T2CON<2>). 5. Configurar el módulo CCP1 para funcionar en modo PWM En modo SLEEP, el TMR2 no se incrementa y por tanto el estado del módulo CCP no cambia. Si el pin CCPx está a un determinado nivel (0 ó1) cuando se ejecuta la instrucción SLEEP, el pin continuará en ese valor y se despertará con ese valor. No se puede generar una onda periódica en esa situación.
MODO PWM Ejemplo: Cálculo de PR2 para obtener una onda PWM cuya frecuencia sea de 78,125 kHz. La Fosc es de 20 MHz y el prescaler del TMR2 = 1. 1/78,125kHz = [(PR2)+1] * 4 * 1/20MHz * 1 12,8us = [(PR2)+1] * 4 * 50ns * 1 PR2 = 63 Encontrar la máxima resolución del ciclo de trabajo que puede usarse con una frecuencia PWM de 78,125 KHz y un oscilador de 20 MHz
Por tanto, un ciclo de trabajo con una resolución de 8 bits es la que se obtiene si se quiere obtener una onda PWM de 78,125 kHz de frecuencia con un oscilador de 20 MHz. Es decir los valores a cargar para el ciclo de trabajo estan en el margen 0 ≤ DCxB9:DCxB0 = 255. Cualquier valor mayor de 255 provocará que el ciclo de trabajo sea del 100% del periodo de la onda PWM. La resolución será mayor si la frecuencia de la onda PWM es menor. Si la frecuencia crece, la resolución decrece.
MODO PWM ; Suponemos T2CON a 00h, por tanto, prescaler a 1 y apagado. Suponemos oscilador de 20 MHz CLRF CCP1CON ; Módulo CCP off CLRF TMR2 ; limpio Timer2 MOVLW 0x7F ; PR2 = 7Fh = 127 MOVWF PR2 ; PeriodoPWM= (127 + 1) * 4 * 50ns * 1 = 25,6 us MOVLW 0x1F ; 8 bits altos del registro del duty a b’00011111’ MOVWF CCPR1L ; CLRF INTCON ; Deshabilito interrupciones BSF STATUS, RP0 ; Banco 1 BCF TRISC, PWM1 ; Pin RC2/CCP1 salida PWM CLRF PIE1 ; Deshabilito interrupciones de periféricos BCF STATUS, RP0 ; Banco 0 CLRF PIR1 ; Limpio flags de periféricos MOVLW 0x2C ; modo PWM, 2 LSBs del duty a b’10’ ; registro del duty b’0001111110’ = 126d MOVWF CCP1CON ;por tanto duty = 126 * 50ns * 1 = 6,3 us 6,3us/25,6us = 24,6% de duty BSF T2CON, TMR2ON ; Timer2 ON ; ; La interrupción de CCP1 no está activa en este modo PWM ; el final del periodo se detecta por muestreo del TMR2IF ; Periodo_PWM BTFSS PIR1, TMR2IF GOTO Periodo_PWM ;OJO, solo se detecta el final del periodo si el postscaler del TMR2 está a 1:1 BCF PIR1, TMR2IF
MODO PWM EJEMPLO PRACTICO – GENERACION DE UN RING TELEFONICO PLANTEAMIENTO Se trata de realizar el diseño del programa encargado de generar el “ring de llamada de un teléfono”. Para eso empleamos el módulo CCP1 de un PIC16F877. Se emplea un oscilador de 4MHz para el microcontrolador.
MODO PWM Planteamiento: Se utiliza el módulo CCP1 en modo PWM para generar dos ondas cuadradas con frecuencias de emisión 320Hz y 480Hz. Para reducir armónicos, se hace que éstas ondas sean cuadradas (t en estado alto = t en estado bajo) Se utiliza el temporizador TMR0 para temporizar intervalos de 25ms, mediante interrupción. Un segundo se contabiliza por 40 interrupciones de TMR0 y 2 segundos por 80 interrupciones de TMR0. Cuando entra una interrupción, se evalúa el estado actual y las posibles modificaciones en el mismo de acuerdo con el siguiente diagrama de estados:
MODO PWM
MODO PWM Algoritmo utilizado –PROGRAMA PRINCIPAL:
•INICIALIZACIÓN •Puertos: PORTC con RC2 como salida •TMR0 como temporizador y prescaler de 256 •Carga de PR2 para generar 320Hz (0xC2) •CCP1 en modo PWM •TMR2 con prescaler de 16 •Inicializamos variable ESTADO con código de onda de 320Hz •Ponemos a cero CONTADOR de interrupciones •Cargamos registro de ancho del pulso (duty) CCPR1L (0x61) •Precarga de TMR0 para desbordar tras 25ms (0x9E) •Borramos flag T0IF y activamos interrupciones de TMR0 •Ponemos en marcha TMR2 •BUCLE PRINCIPAL INFINITO (Del que sólo se saldrá por interrupción debida a TMR0)
MODO PWM