Source: http://microcontroladores-mrelberni.com/ccp-pic-modo-pwm/
Timestamp: 2017-09-24 15:46:30+00:00

Document:
CCP PIC modo PWM modulación por ancho de pulso - MICROCONTROLADORES
Inicio » CCP PIC modo PWM modulación por ancho de pulso
CCP PIC modo PWM, esto es modulación por ancho de pulso, en esta forma de trabajo del módulo CCPx donde x puede ser 1 o 2 dependiendo del módulo CCP utilizado, lo que se logra con el uso del módulo CCPx en modo PWM es obtener por el pin CCPx una señal periódica, este pin debe ser configurado como una salida digital mediante el correspondiente TRISC, con parte de la señal obtenida en alto y parte de la señal en bajo, lo interesante de este modo de trabajo del módulo CCP PIC modo PWM es que de la señal periódica obtenida por el pin CCPx se puede modificar el tiempo que la señal estará en alto.
Una señal PWM es aquella en la que su periodo representado por T se tiene que mantener constante, dentro de este periodo hay momentos en que la señal estará en alto o a uno y momentos en que la señal estará en bajo o a 0, en la señal PWM el tiempo que la señal está en alto Talto se le conoce como ancho de pulso y si está expresado en porcentaje como ciclo de trabajo, este tiempo que la señal esta en alto se puede modificar, de esta manera si la señal PWM se conecta a una carga, sobre esta dependiendo del Talto le llegará una tensión media, cuando mayor sea Talto mas será la tensión media que le llegue a la carga siendo la mayor cuando Talto ocupa todo el periodo de la señal, y la menor cuando el Talto sea 0, con lo que la tensión media también será 0, por ejemplo si la carga es un motor de continua al variar la tensión media que le llegará mediante la señal PWM, se puede variar la velocidad de giro de ese motor, o si la carga es una bombilla se puede variar su brillo variando la tensión media que le llegue mediante la señal PWM.
El ciclo de trabajo cuando se utiliza el CCP PIC modo PWM es el ancho de pulso expresado en porcentaje se obtienen mediante la siguiente relación:
Ciclo de trabajo=(Talto/T)*100%
El ciclo de trabajo puede ser desde un 0% cuando el Talto=0, hasta un 100% cuando el Talto es igual al periodo de la señal PWM Talto=T, si el tiempo en alto es igual a la mitad del periodo entonces el ciclo de trabajo será del 50%.
A este proceso de cambiar o modificar el tiempo en alto de la señal PWM es lo que se llama la modificación por ancho de pulso que por sus siglas del inglés se le llama justamente PWM, lo cual es muy fácil lograr con el módulo CCP PIC modo PWM.
Para el PIC 16F877A que será para el cual se comente el módulo CCP PIC modo PWM el ancho de pulso o ciclo de trabajo puede tener una como máximo una resolución de salida de hasta 10 bits, lo que dependerá del periodo de la señal PWM generada, esto quiere decir que el valor que representa el ancho de pulso estará representado por un número binario que como máximo tendrá 10 bits.
Para la parte de la señal PWM obtenida por el pin CCPx en alto o a 1, que es el ciclo de trabajo o el ancho de pulso y por lo tanto la parte variable de la señal PWM, de los 10 bits que puede tener como máximo, los 8 bits de mas peso se encuentran en el registro CCPRxL y los 2 bits de menos peso en los bits 5 y 4 del registro CCPxCON , mientras que para el periodo de la señal PWM y por lo tanto la parte de la señal que no cambiará será el valor almacenado en el registro PR2, el cual es es uno de los registros utilizados con el timer2, por lo que para el uso del timer2 con el módulo CCP PIC modo PWM es necesario conocer los registros TMR2 y su registro compañero PR2.
😎 La forma utilizar el timer2 se puede ver aquí, es muy importante conocer el funcionamiento de los registros TMR2 y PR2 para poder hacer uso del modo PWM del módulo CCP.
Al utilizar el módulo CCP PIC modo PWM, cuando el valor del registro TMR2 se hace igual al valor del registro PR2 ocurre lo siguiente:
El registro TMR2 se hace igual a 0 esto es se borra y vuelve a contar desde 0 hasta que se hace igual nuevamente al valor del registro PR2 tras lo cual nuevamente se borra; este lapso de tiempo para que ocurra esto es lo que constituye el periodo de la señal PWM. El pin CCPx se pone a 1, que es lo mismo que decir que se obtiene un alto por este pin, menos cuando el ciclo de trabajo del modo PWM sea del 0%, en este caso este pin no se pondrá a 1.
El valor almacenado en el registro CCPRxL que es el valor que representa el ciclo de trabajo de la señal PWM esto es el tiempo que la señal obtenida por el pin CCPx se mantiene a 1, se cargará en el registro CCPxH.
El valor del registro CCPxH se compara permanentemente con el valor que va tomando el registro TMR2 y cuando se hacen iguales el pin CCPx se pondrá a 0, de esta manera se fija el ancho de pulso, y como el TMR2 seguirá aumentando de valor hasta que este se haga igual nuevamente al valor almacenado en el registro PR2, momento en el cual el registro TMR2 se hará igual a 0 y el ciclo anterior volverá a repetirse.
Entonces al utilizar el CCP PIC modo PWM para obtener una salida PWM por el pin CCPx se tienen que cumplir 2 cosas establecer el periodo de la señal mediante un valor cargado en el registro PR2 el cual no tendrá que ser cambiado y establecer un ciclo de trabajo mediante un valor cargado en el registro CCPRxL el cual si puede ser cambiado para obtener en el pin CCPx tensiones medias variables para el control de diverso dispositivos.
CCP PIC modo PWM cálculos del periodo y del ancho de pulso
Para calcular el periodo TPWM de la señal PWM generada con el módulo CCP PIC modo PWM, se utiliza la siguiente fórmula:
TPWM = (PR2+1)*(4/Fosc)*prescalerTMR2
Donde PR2 es el valor cargado en el registro PR2, Fosc es la frecuencia del reloj o cristal utilizado para el funcionamiento del PIC y prescalerTMR2 es alguno de los posibles prescaler del TMR2 que se pueden utilizar.
El valor máximo que puede tomar el registro PR2 es 255 ya que es de 8 bits, y el prescaler máximo es de 16, luego el máximo valor para el TPWM dependerá del oscilador o cristal utilizado, por lo que si se usa un cristal de 4Mhz el valor máximo para el periodo del TPWM será:
TPWMmax=(255+1)*(4/4Mhz)*16=4,096ms
Por lo que el máximo periodo de la señal PWM obtenida con el módulo CCP PIC modo PWM cuando se utiliza un cristal o un oscilador de 4Mhz será de 4,096ms; por supuesto que esto puede variar si se utilizan cristales de mayor frecuencia de oscilación.
Como la frecuencia es la inversa del periodo se tendrá que en este caso la frecuencia mas baja para la señal PWM será FPWMmin=(1/4,096ms)=244,1Hz
Para calcular el ancho de pulso Talto de la señal PWM generada con módulo CCP PIC modo PWM, se utiliza la siguiente fórmula:
Talto=(CCPRxL:CCPxCON<5:4>)*(1/Fosc)*prescalerTMR2
Donde CCPRxL:CCPxCON<5:4> son los 8 bits cargados en el registro CCPRxL y los 2 bits cargados en los bits 5 y 4 del registro CCPxCON, que vienen a ser los 10 bits de la resolución del ancho de pulso, Fosc es la frecuencia del reloj o cristal utilizado para el funcionamiento del PIC y prescalerTMR2 es alguno de los posibles prescaler del TMR2 que se pueden utilizar.
Cuando el ancho de pulso toma su máximo valor, este tiene que ser igual al periodo de la señal PWM, cuando se escoge un periodo para la señal PWM, generada con el módulo CCP PIC modo PWM, hay que calcular cuantos bits se necesitan para representar en forma binaria ese periodo, lo cual es justamente la resolución del ancho de pulso y no tiene que ser mayor a 10 bits.
Para calcular la resolución del ancho de pulso de la señal PWM generada con módulo CCP PIC modo PWM, se parte de que Talto máximo tiene que ser igual al periodo de la señal PWM, esto es Talto=TPWM, luego entonces de
Talto=(CCPRxL:CCPxCON<5:4>)*(1/Fosc)*prescalerTMR2 si se realizan algunos cambios en esta fórmula para cuando el Talto o el ancho de pulso sea máximo se tendrá:
Talto=TPMW=1/FPWM el periodo es la inversa de la frecuencia
CCPRxL:CCPxCON<5:4>, consta de 10 bits pero para el TPWM que se busca, el valor cargado en estos bits estará formado por una cantidad bits que dependerán del periodo TPWM o la frecuencia FPWM elegida, donde FPWM es la inversa de TPWM, esta cantidad de bits necesarios para obtener el TPWM buscado se puede representar como n, donde n podrá ser como máximo 10, entonces para el Talto máximo el valor de CCPRxL:CCPxCON<5:4> tendrá que ser máximo para lo cual tiene que ser igual a 2n-1, luego si se reemplaza en la fórmula anterior se tendrá:
TPWM=1/FPWM=(2n-1)*(1/Fosc)*prescalerTMR2 de aquí si se reordena se tendrá
2n-1=(Fosc/(FPWM*prescalerTMR2)) si se aplican logaritmos a ambos lados de la igualdad y se despeja n se obtendrá, la cantidad de bits necesarios en CCPRxL:CCPxCON<5:4> de los cuales no se debe pasar, para obtener el periodo o la frecuencia de la señal PWM buscada.
n=(log(Fosc/(FPWM*prescalerTMR2)/log2) bits a esta cantidad de bits obtenidos se le llama la resolución y será necesario comprobar siempre que no se pase de los 10 bits.
Resolución=(log(Fosc/(FPWM*prescalerTMR2)/log2) bits
Donde Fosc es la frecuencia del oscilador o cristal utilizado, FPWM es la frecuencia de la señal PWM que se quiera obtener, la que viene a ser la inversa de periodo TPWM de la señal PWM.
Mediante la resolución se obtiene con cuantos bits se representa en forma binaria el valor del ancho de pulso para una determinad FPWM elegida, siendo el máximo valor 1023 que es 210 ya que la resolución es de 10 bits como máximo.
Por ejemplo, al utilizar el módulo CCP PIC modo PWM, si se necesita una frecuencia de la señal PWM de 4Khz, y se utiliza con el microcontrolador PIC con un oscilador o cristal de 4Mhz, se tendrían que realizar los siguientes cálculos:
Primero se calculará la resolución para ver si se cuentan con suficientes bits para todo el ancho de pulso o ciclo de trabajo de la señal que se quiere obtener con el módulo CCP PIC modo PWM, la resolución no tiene que tener mas de 10 bits, si en el cálculo salen mas de 10 bits hay que elegir otra frecuencia para la señal PWM, o un oscilador o cristal con una frecuencia diferente de tal forma que la resolución no sea mayor a los 10 bits, también hay que elegir el prescaler que se utilizará con el timer2 para obtener la FPWM buscada, por ejemplo si se elige un prescaler de 16 en este caso para la resolución se tendrá:
Resolución=(log(4Mhz/(4Khz*16)/log2) bits =5,9658 bits
Lo que es menor a los 10bits máximos, eso indica que es posible obtener una FPWM de 4Khz utilizando un cristal de 4Mhz, ademas el valor cargado en CCPRxL:CCPxCON<5:4> no tiene que ser mayor a 25,9658 = 62,5 para obtener el máximo ancho de pulso para la FPWM de 4Khz, luego el máximo valor cargado en CCPRxL:CCPxCON<5:4> para que la FPWM sea de 4Khz tiene que ser a lo mucho 63, de lo contrario la señal obtenida en el pin CCPx utilizado mediante el módulo CCP PIC modo PWM no será de los 4khz que se quieren.
El periodo TPWM para la frecuencia de FPWM=4Khz será 1/4Khz lo que es TPWM=0,250ms=250us.
Por lo que el valor a cargar en el registro PR2 se encuentra a partir de la fórmula para el cálculo del periodo de la señal PWM TPWM = (PR2+1)*(4/Fosc)*prescalerTMR2, en la cual se ve que dependerá del prescaler que se decida utilizar, por ejemplo si se utiliza un prescaler de 16, se obtiene que el valor de PR2=14,625 pero en el registro PR2 solo se pueden cargar valores enteros, por lo que se cargará con el valor mas cercano, en este caso el valor a cargar en el registro PR2=15, para obtener una frecuencia de 4Khz o un periodo de 0,250ms=250us.
Si se quiere variar el ancho de pulso o ciclo de trabajo para la frecuencia FPWM=4Khz, esto se logra cambiando los valores de los bits CCPRxL:CCPxCON<5:4>, por cualquier valor comprendido entre 0 y 63, si es 0 el ancho de pulso será 0 o tendrá un ciclo de trabajo del 0% y la salida por el pin CCPx sera 0, si 63 el ancho de pulso será igual al periodo TPWM o tendrá un ciclo de trabajo del 100% y la salida por el pin CCPx será 1, si se quiere el ancho de pulso sea del 50% se tendrá que cargar el valor de 32, con lo que en el pin CCPx se tendrá una señal que irá alternando entre 1 y 0 cada 2Khz esto es estará 2Khz a 1 y 2 khz a 0 haciendo un periodo de 4khz, el tiempo que se obtengan 1 o 0 variará de acuerdo al ciclo de trabajo elegido.
CCP PIC modo PWM: Registro CCPxCON
Mediante este registro se elige en modo de trabajo del módulo CCPx, en la siguiente imagen se muestra el registro con los respectivos nombres de los bits que lo conforman.
Los bits 7 y 6 de este registro no se utilizan por lo que se les pone a 0.
Los bits 5 y 4 en el uso del módulo CCP PIC modo PWM, estos bits son los 2 bits menos significativos del ciclo de trabajo del módulo CCP PIC modo PWM el cual es de 10 bits, los 8 bits mas significativos se encuentran en el registro CCPRxL
Los bits 3, 2, 1 y 0 son los que se utilizarán para elegir el modo de trabajo del módulo CCP, si estos 4 bits se ponen a 0 el módulo CCP estará deshabilitado; para el uso del módulo CCP PIC modo PWM los valores asignados a estos pines serán como se indican en la siguiente tabla.
Como se ve al poner los bits 3 y 2 a 1 es suficiente par indicar que se ha elegido utilizar el módulo CCP PIC modo PWM, siendo indiferente lo que se coloque en los bits 1 y 0, pero se acostumbra a ponerlos a 0.
Pasos a seguir para la utilización del módulo CCP PIC modo PWM
Establecer el periodo de la señal PWM obtenida mediante el módulo CCP PIC modo PWM, para ello cargar el registro PR2 con el valor obtenido mediante la fórmula TPWM = (PR2+1)*(4/Fosc)*prescalerTMR2.
Establecer el ancho de pulso o el ciclo de trabajo cargando los bits CCPRxL:CCPxCON<5:4>, con valores que no sobrepasen el máximo valor obtenido mediante la obtención de la resolución para el periodo o frecuencia elegida para la señal PWM.
Establecer el pin CCPx utilizado como una salida digital mediante su registro TRISC, o el que le corresponda de acuerdo a microcontrolador PIC utilizado.
Configurar el módulo CCP PIC modo PWM, esto es para que el módulo CCP trabaje en el módulo PWM.
CCP PIC modo PWM con el MPLAB XC8
Ejemplo 1, se realizará el ejemplo comentado lineas arriba para el PIC16F877A que estará trabajando con un oscilador de Fosc=4Mhz, el ejemplo consiste en obtener una señal PWM con el módulo CCP PIC modo PWM de una frecuencia FPWM de 4Khz que es lo mismo que de un periodo de TPWM=0,250ms=250us.
Luego mediante la fórmula para el cálculo del periodo se despeja el valor a cargar en el registro PR2 para obtener el periodo de 0,250ms, la fórmula es la siguiente:
en este caso se ha utilizado un prescaler de 16, se puede utilizar otro de los posibles prescaler para el timer 2, siempre y cuando el valor a cargar en el registro PR2 no sea mayor a 255 estará bien; al reemplazar los valores elegidos y despejar PR2 se obtiene PR2=14,625, este sería el valor a cargar en PR2 para obtener justo los 250us de periodo o una frecuencia de 4Khz, pero en el registro PR2 no se pueden cargar valores que no sean enteros por lo que se carga el mas cercano que en este caso será PR2=15, con lo que el periodo buscado variará ligeramente de los 250us.
Se calcula si se tendrán suficientes bits en CCPRxL:CCPxCON<5:4> los cuales como máximo deben de ser de 10, para obtener la frecuencia que se pide que es de 4Mhz; para hallar la cantidad de birs se utiliza la fórmula de la resolución, la cual es:
al reemplazar los valores se obtiene que la resolución es de 5,9658 bits, luego el máximo valor a cargar en CCPRxL:CCPxCON<5:4> será 25,9658 que es 62,5 por lo que para este ejemplo como máximo se podrá cargar con 63, si se carga un valor mayor el módulo CCP PIC modo PWM no responderá bien para la frecuencia de 4Khz buscada, al cargarlo con 63 se obtendrá el máximo ancho de pulso de la señal PWM, esto es todo el periodo de la señal estará a 1, o el ciclo de trabajo será del 100%.
En el código siguiente para el ejemplo para el PIC16F877A se utilizará el módulo CCP2, por lo que se ha cargado CCPR2L:CCP2CON<5:4> con 32 para obtener aproximadamente un ciclo de trabajo del 50%, 32 en un número binario de 10 bits es 0000100000, de los cuales los primeros 8 bits que son 00001000 se han cargado en el registro CCPR2L y en los bits 5 y 4 del registro CCP2CON se han cargado los otros 2 que son 00.
El código preparado para la utilización del módulo CCP PIC modo PWM en el ejemplo, permitirá obtener una señal PWM con un periodo muy próximo a los 250us que se ha buscado, esta señal se obtendrá por el pin CCP2 el que tiene que ser configurado como salida, la señal se obtendrá con un ciclo de trabajo del 50%, en cada línea de código esta comentado el porque de esa línea de código en el XC8.
La siguiente es la imagen del circuito simulado, se puede ver que el periodo es poco mas de 250us, lo que ocurre porque la carga del registro PR2 no puede ser PR2=14,625 ya que tiene que ser un valor entero cercano y se eligio 15, como se puede ver en el código, ademas se obtiene un ciclo de trabajo del 50% para la señal PWM, que es lo que se quiere con esta parte del ejemplo.
Si en el código anterior se cambia el valor cargado en CCPR2L:CCP2CON<5:4> con 62 se verá que el ciclo de trabajo casi es del 100%, 62 en binario de 10 bits es 0000111110, de los cuales los primeros 8 bits que son 00001111 se cargarán en el registro CCPR2L y en los bits 5 y 4 del registro CCP2CON se cargará en el bit 5 con 1 y el bit 4 con 0, esto es 10, en la siguiente imagen de la simulación se tiene el resultado de este cambio, se puede ver que el ancho de pulso de la señal PWM casi que ocupa todo el periodo de la señal PWM obtenida de 4Khz con el módulo CCP PIC modo PWM.
Ejemplo 2, en este caso

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