Source: http://pickey.es/uso-practico-del-pic12f683--ix-,-ccp1-pwm.html
Timestamp: 2017-09-23 21:34:03+00:00

Document:
Uso practico del Pic12F683 (IX), CCP1 PWM - PICKEY ELECTRÓNICA
Uso practico del Pic12F683 (IX), CCP1 PWM
Uso Practico del PIC12F683 (IX)
PIC12F683 (PIN: 8, FLASH: 2048, RAM: 128, EEPROM: 256):
.Lo primero sobre el Pic12F683:
El microcontrolador Pic12F683 pertenece a la familia de los llamados "enanos" al igual que el ya estudiado en esta web el Pic12F675, tiene una gran similitud en su configuración con el, pero el Pic12F683 entra dentro de la gama de micros mejorados, por distinguirlo del Pic12F675 y similares. Al 12F683 se le ha añadido un módulo CCP (captura/comparación/PWM), se han ampliado las funciones del módulo comparador analógico, su oscilador interno puede trabajar hasta 8Mhz estando ya calibrado de fabrica y algunas otras mejoras.
.Bits calibrados en fabrica y susceptibles de ser borrados por el usuario:
Se han mejorado los registros sujetos a calibración; oscilador interno y Bandgap. La calibración de los registros es realizada en fabrica y está protegida frente al borrado general previo a la programación del micro. Esto no quiere decir que no se deba realizar una lectura previa de los registros, porque dichos registros permiten su reconfiguración por el usuario y una vez modificados por el programador pierden su valor de fabrica de forma permanente.
En la captura de pantalla del WinPic800-v3.61 se pueden ver los mencionados bits de calibración de un Pic12F683; se observa en la imagen que la opción "Actualizar calibración" está deshabilitada.
Articulos: PIC12F683.
PRACTICAS: MnEBasic con módulo CCP (captura/comparación/PWM).
.Modulo CCP (capture/compare/PWM):
El módulo de captura/comparación/PWM es un periférico que permite al usuario saber la duración y control de diferentes eventos. En el modo de captura, el periférico permite conocer la duración de un evento. En el modo de comparación permite al usuario activar un evento cuando una determinada cantidad de tiempo ha pasado. En el modo PWM se pueden generar diferentes frecuencias e incluso variar el duty cycle manteniendo la misma frecuencia, esto último permite el control de potencia de una forma muy eficiente como puede ser la velocidad de un motor.
Según el modo de trabajo programado en el módulo CCP acapara de forma exclusiva uno de los siguientes timer del pic, véase la siguiente tabla:
Imagen extraída del datasheets de Microchip dispuesto para el Pic12F683
El registro de control del módulo es el CCP1CON y en el siguiente gráfico se puede ver la descripción de sus correspondientes bits:
.Modulo CCP trabajando en modo PWM:
La primera práctica que se ha elegido el módulo CCP se configura en modo PWM, control de potencia por modulación del ancho de pulso, que es la utilización más conocida, pero también es el más complejo de configuración, una vez terminada ésta práctica los restantes modos resultarán más simple de configurar.
En la imagen se puede ver su estructura interna:
.Preparándose para la configuración del módulo trabajando en modo PWM:
Módulo CCP1 en modo PWM:
El modulo CCP1 del PIC12F683 puede trabajar en distintos modos, en esta ocasión se configura utilizándolo en el modo PWM, en este modo puede generar una serie de frecuencias a las que si procede se les puede variar el duty cycle, esto quiere decir que se puede elegir el tiempo que la señal se mantendrá a nivel alto con respecto al nivel bajo sin variación del periodo, cumpliéndose siempre que tiempo estado alto más tiempo estado bajo es igual al periodo de la frecuencia elegida. Si el duty cycle se configura al 50% se obtiene una señal de onda cuadrada de la frecuencia programada. Y por supuesto el margen de frecuencias queda sujeto a la frecuencia de trabajo elegida para el oscilador del Pic.
Ejemplos de distintos ducty cycle, como se puede observar se representan en %
El modulo se puede utilizar como generador de frecuencias dentro de un margen determinado, pero en este caso se va a utilizar como control de potencia por modulación del ancho de pulso, y para eso se configura con una frecuencia fija que no variará de valor durante todo el proceso, y se irá variando el duty cycle de la señal (duty cycle es igual al tiempo en que la señal se encuentra en estado alto con respecto al estado bajo, téngase en cuenta, que mientras la suma de tiempos del estado alto y estado bajo sea igual al periodo establecido, no habrá cambio de frecuencia) y, como consecuencia de esta variación se consiguen distintas luminosidades para el led de la placa MnEBasic. El modulo trabajando en modo pwm acapara el TMR2 del PIC, de este timer se utiliza el prescaler y su registro interno como contador. En PR2 (8Bit) se establece el periodo de la frecuencia de trabajo elegida, cuando TMR2 es igual al del PR2 el pin de salida del modulo CCP cambia de estado, nivel alto, exceptuando si el PWM duty cycle es cero, y se reinicia TMR2. Al mismo tiempo el pic hace una copia del registro de 10Bit CCPR1L+CCP1CON5:4 al registro CCPR1H+2Bit internos de almacenamiento, y en este mismo momento, el contador del timer2 es concatenado con dos bits internos para pasar a tener una longitud de 10Bit. Cuando este contador contiene el mismo valor del registro CCPR1H+2Bits, el pin del modulo cambia de nuevo de valor, borra TMR2 de nuevo, iniciándose todo el ciclo completo indefinidamente. En el registro CCPR1L+CCP1CON5:4 previamente se ha cargado el valor del duty cycle.
El modulo una vez programado y como ultimo paso activado el TMR2 queda indefinidamente trabajando y, por supuesto, se puede apagar o volver a activar al igual que cambiar su configuración todo esto en tiempo de ejecución; como se ha visto el registro que controla el duty cycle tiene una longitud de 10Bit, por lo que se puede decir que se tendrá una resolución máxima de 10Bit (1024 puntos). En realidad esta resolución no se alcanza siempre, dependerá de la frecuencia elegida con el registro PR2 y la frecuencia de reloj del pic. El valor del duty cycle máximo es de 1023 o al 100% (expresado en %), en el caso de que la resolución máxima sea inferior no se sobrepasará el nuevo valor máximo, si se sobrepasa la salida no cambiará de estado. Por esto es necesario calcular el valor máximo (100%) a cargar en el registro de control del duty cycle, de esta forma siendo el valor máximo conocido no se cometerá el error de sobrepasarlo y, se recordará que en el mejor de los casos nunca será superior a 1023. Cuanto menor sea el nuevo valor máximo obtenido para la frecuencia de trabajo con respecto al posible valor máximo del módulo 1023, mayor será la perdida de resolución. Por todo esto, siempre que la frecuencia no sea un valor critico, se suelen hacer varios cálculos para frecuencias distintas próximas a la deseada para elegir la que mejor resolución de al sistema.
El pin del módulo CCP tiene que ser configurado como salida mediante el correspondiente bit del registro TRISIO.
Como aclaración el postscaler del Timer2 no interviene en la obtención de la frecuencia del PWM. También hay que aclarar que el valor mínimo del duty cycle es 0 y el valor máximo es 1023, pero el total duty cycle de resolución posibles es de 1024, ya que el cero se cuenta como punto de resolución. Lo mismo se establece para cualquier otro registro como puede ser PR2 que es un registro de 8bits, su valor mínimo es igual a 0 y su valor máximo es 255, pero la cantidad de valores diferentes que puede tomar es de 256, porque se entiende que 0 es un valor. El datasheets del microcontrolador Pic12F683 especifica que cuando la resolución para el duty cycle es inferior a 10bits, en el caso de elegir un valor fuera de rango (superior) el pin de salida del módulo no variará de valor, pero hay que tener en cuenta que en la mayoría de los casos el valor previo a este será el 100% por lo que la salida seguramente quedará a nivel alto en casi todas las aplicaciones en las que se cometa este error. Para un valor cero en el duty cycle la salida se mantendrá siempre a cero.
La salida del modulo CCP1 del Pic12F683 no es configurable, esto quiere decir, que no se puede elegir el pin de salida del módulo como ocurre con otros modelos de pic.
Registros asociados con PWM y TIMER2
Ejemplo de forma de onda de salida para el PWM con su relación directa con el TIMER2
Valor máximo del registro PR2 = 255 (periodo de la frecuencia) y siendo su resolución de 256.
Valor máximo del registro CCPR1L+DC1B1:DC1B0 = 1023 (duty cycle) y siendo su resolución de 1024.
Prescaler del Timer2 = 1, 4 o 16.
En la siguiente tabla se muestran los valores de prescaler del TIMER2 y valor para el registro PR2 y sus respectivas resoluciones para varias frecuencias, trabajando el microcontrolador con frecuencias de reloj de 20 y 8Mhz.
.Fórmulas y programación de valores en los registros asociados:
Calculo de la frecuencia a generar por el módulo para 500Hz:
PR2 = ((1/Fr) / (4/Fosc * Prs)) -1
PR2 = ((1/500Hz) / (4/8000000Hz * 16)) -1
PR2 = 249 = 11111001Bin
Calculo del duty cycle máximo (100%):
PWM Duty Cycle = (1/Fr) / ((1/Fosc) * Prs)
(CCPR1L:CCP1CON<5:4>) = (1/Fr) / ((1/Fosc) * Prs)
(CCPR1L:CCP1CON<5:4>) = (1/500) / ((1/8000000Hz) * 16)
(CCPR1L:CCP1CON<5:4>) = 1000 = 1111101000Bin
Asignando el valor anterior:
CCPR1L = 11111010Bin
CCP1CON. DC1B1 = 0Bin
CCP1CON. DC1B0 = 0Bin
Fr = Frecuencia deseada en Hz, en este caso 500Hz
Fosc = Frecuencia del Reloj del Pic en Hz, en este caso 8Mhz
4/Fosc = Tiempo de ejecución maquina
Prs = Prescaler del Timer2, puede tomar valores entre 1, 4 y 16, en este caso 16
(CCPR1L:CCP1CON<5:4>) = PWM Duty Cycle = Tiempo en estado alto de la señal
También se pueden nombrar de otra manera:
CCP1CON.5 = CCP1CON. DC1B1
CCP1CON.4 = CCP1CON. DC1B0
Duty Cycle =0, la salida del módulo siempre estará a estado bajo.
Duty Cycle = 100%, en este caso 1000, la salida del modulo estará siempre a estado alto.
Duty Cycle > 100%, no hay cambios en la salida.
Esto implica que a valores máximo y mínimo no hay oscilación.
.Configuración y descripción para el Ejemplo1:
'Lee el valor de voltaje del cursor de la resistencia ajustable de la placa
'se reescala el valor y se utiliza como dato para el duty cycle.
'Configuración del CCP1 en modo PWM, genera frecuencia de 500hz.
'Configuración del módulo ADC con formato de salida a 10bits.
'Habilitación de un puerto RS232 optoacoplado, por software (simulación).
'Trabajando con el reloj interno a 8Mhz.
'Programación del microcontrolador en placa (ICSP).
'RS232: Los datos los recibirá el programa hyperterminal del Windows
'Configuración del hyperterminal del Pc:
'Bits por segundo: 9600
'Bits de parada: 1
'Fin configuración hyperterminal de Windows.
ANSEL (ADCS2:ADCS0), asigna el tipo de reloj y su conversión al módulo ADC.
ANSEL (ANS3:ANS0), selecciona los pin que trabaján como analógicos.
TRISIO bits se asignan como entradas o salidas (I/O).
Configura reloj interno a 8Mhz:
Módulo reloj utiliza la calibración de fabrica:
OSCTUNE = 0x00 'Módulo oscilador reloj funcionando con la calibración interna
Desconecta el módulo comparador:
CMCON0 = 0x07 'Módulo comparador a off
Tensión de referencia para el módulo comparador apagada:
VRCON = 0x00 'Vref para el módulo comparador a off.
Configuración del módulo ADC con reloj de 8Mhz, AN3 analógico y resto I/O:
ANSEL = %01011000 'Fosc/16 (8Mhz=2uSeg.), AN3 analógico y resto I/O (bit 3-0)
Configuración del módulo ADC con formato de salida a 10bits, Vref = 5V, canal AN3 y módulo ADC conectado:
ADCON0 = %10001101 'Adc a 10bit, vdd reference, canal AN3 (bit 3-2), adc on
Configura los pin como entradas o salidas, normalmente los pin que no se usan se activan como salidas:
TRISIO = 0xff 'Se definen los pin como entradas
TRISIO.4 = 1 'GP4/AN3 pin, como entrada, lectura de la resistencia ajustable
TRISIO.2 = 0 'GP2/AN2 pin, como salida, control led por PWM
TRISIO.5 = 0 'GP5 pin, como salida, puerto serie Tx
Configura Timer2 y el módulo CCP1 en modo PWM:
Configura la frecuencia, registro de 8bits:
PR2 = %11111001 'TMR2, periodo de la señal para 500Hz
Configura el duty cycle, registro de 8bits más dos adicionales, total 10bits:
CCPR1L = %00000000 'CCP1, duty cycle = 0 (RB3 = 0), max. duty cycle 1111101000 = 1000
CCP1CON.DC1B1 = 0
CCP1CON.DC1B0 = 0
Configura el modo de trabajo pwm:
CCP1CON.CCP1M3 = 1 'CCP1, modo pwm
CCP1CON.CCP1M1 = 0
CCP1CON.CCP1M0 = x 'En este modo indiferente
Configura el timer2 con prescaler 16:
T2CON.T2CKPS0 = 1 'TMR2, prescaler, 1x = 1:16
T2CON.T2CKPS1 = 1
Activa el timer2:
T2CON.TMR2ON = 1 'TMR2, activa el Timer2
%, significa que el número siguiente esta expresado en binario.
x, significa valor indiferente.
Ejemplo1: Módulo CCP en modo PWM
.Modulo CCP trabajando en modo comparación:
Ejemplo2, trabajando con el módulo CCP en modo comparador con interrupciones:
Se configura el módulo CCP1 del Pic12F683 trabajando en modo comparador, para ser más exactos en el modo especial (trigger special event). En este modo el módulo CCP1 acapara el Timer1. La configuración del timer1 se realiza como ya se hizo en los anteriores ejemplos. El módulo CCP utiliza el timer1 como contador, por lo que las interrupciones del timer1 no se activarán, será el CCP el que genera la interrupción cuando el valor del registro de 16bit del timer1 sea igual al programado en el registro de 16bit del módulo CCP trabajando en modo comparador, al mismo tiempo al estar configurado el modulo CCP en modo especial obligará al ADC a realizar una lectura, siempre y cuando este último este habilitado.
Lo interesante de todo esto es que el modulo se configura una sola vez y ya todo lo de más es automático, de esta forma se consigue una mayor precisión en las rutinas, en este caso en las bases de tiempos que se han creado para controlar el flujo del programa, así como posibles eventos.
Registros asociados para el modo captura, comparación y TIMER1
.Configuración y descripción para el Ejemplo2:
Descripción Ejemplo2:
'Se crean bases de tiempos para el control del flujo del programa y eventos.
'Parpadeo led, parpadeo etiqueta en hyperterminal, interrupciones y lectura ADC cada 1mSeg.
'Configuración del CCP1 como comparador y trigger special event (cada 1mSeg.).
'Configuración del módulo ADC con formato de salida a 8bits.
'Lee el valor de voltaje del cursor de la resistencia ajustable de la placa y se envia al hyperterminal.
La función del sistema SEROUT, que se encarga de simular el puerto serie RS232 en modo Tx, necesita medir tiempo de forma exacta para poder generar la trama de datos a enviar al hyperterminal a 9600baudios, por lo que las interrupciones le interfieren en su funcionamiento, así que hay que desconectarlas antes de llamarla, al terminar de enviar los datos al hyperterminal se vuelven a activar.
INTCON.GIE = 0 'Para interrupciones
Serout rs232tx, 9600, "Hola mundo" 'Envia trama de datos al puerto RS232
INTCON.GIE = 1 'Activa interrupciones
Configuración Ejemplo2:
Configuración del módulo ADC con formato de salida a 8bits, Vref = 5V, canal AN3 y módulo ADC conectado:
TRISIO.2 = 0 'GP2/AN2 pin, como salida, control led
Configura Timer2 y el módulo CCP1 como comparador y trigger special event:
T1CON.TMR1CS = 0 'Asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0 'Factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0 'Factor del preescales del timer1, 0
T1CON.TMR1ON = 1 'Habilitacion del TMR1, comienza a incrementarce
Módulo CCP1:
CCPR1H = 0x07 'Registro más significativo del comparador CCP1, 1mSeg.
CCPR1L = 0xd0 'Registro menos significativo del comparador CCP1, 1mSeg.
CCP1CON.CCP1M3 = 1 'Compare mode, trigger special event (CCP1M3...0).
CCP1CON.CCP1M2 = 0
CCP1CON.CCP1M1 = 1
CCP1CON.CCP1M0 = 1
Interrupciones con el módulo CCP en modo comparador y trigger special event para el Ejemplo2:
Se añade la configuración de la mascara para la activación de las interrupciones del módulo CCP.
Cada vez que se entra en la rutina de interrupciones se realiza la lectura del valor de conversion del ADC en el registro ADRESH y también se actualizan los contadores de las bases de tiempos usadas para el control del flujo del programa.
PIE1.CCP1IE = 1, habilita la interrupción del módulo CCP.
INTCON.PEIE = 1, habilita las interrupciones de periféricos.
INTCON.GIE = 1, habilita las interrupciones generales.
Los tres bits anteriores habilitan las interrupciones del módulo CCP. Los bits GIE y PEIE son bits genéricos que afectan a todos los módulos del pic que permiten interrupciones, son bits generales. El bit CCP1IE es el especifico para el módulo tratado.
Cuando termina la comparación se activa el flag de interrupción CCP1IF=1 y con la actual configuración también se genera una conversión del ADC, esto provoca que una vez terminada de ejecutarse la instrucción en proceso, se salta a una dirección determinada donde estará ubicada la rutina de interrupciones.
PIR1.CCP1IF = 0 'Borra el flag de interrupción del módulo CCP1.
Si se quiere que una nueva comparación del módulo usado produzca un nuevo salto a la rutina de interrupciones, hay que recordar que se tiene que borrar la bandera de interrupción de la siguiente manera:
Borrado del flag especifico de interrupciones del módulo, en este caso el bit CCP1IF, esto es PIR1.CCP1IF=0.
Ejemplo2: Módulo CCP1 en Compare Mode
Ejemplo2: Captura hyperterminal

References: resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución