El modo PWM (Pulse WidthModulalion) o MODUL.ACIÓN DE ANCHO DE PULSO, permite obtener en los pines CCPx una señal periódica en la que se puede modificar su ciclo de trabajo (Duty Cicle). Es decir, puede variarse el tiempo en el cual la señal está a nivel alto (Ton) frente al tiempo que está a nivel bajo (Toff); ver la figura a. De esta forma, la tensión te nsión media aplicada a la carga es proporcional al Ton, controlando, por ejemplo, la velocidad de motores, luminosidad de lámparas, etc. Ton Vpromedio t
T
Vpromedio
Vpromedio Ton T = Constante
Ton t
T
Figura 1. Señal PWM La resolución de salida es de hasta 10 bits. Para que este módulo funcione correctamente, el Pin debe estar configurado como salida, mediante la configuración del TRIS correspondiente. El periodo de la señal PWM se obtiene de configurar el TIMER2 y el contenido del registro PR2 (dirección 0x92). Este registro de 8 bits contiene los 8 bits más significativos de una cuenta de 10 bits. Para calcular el periodo de la señal PWM se utiliza la siguiente ecuación:
El periodo de la onda PWM está determinado por el tiempo que dura el conteo del TMR2 desde 0 hasta el valor del registro PR2. Esto es:
Donde: -
PR2 = Valor del registro PR2 (entre 0 y 255). Fosc = Frecuencia del XTAL. Prescaler = Prescaler del Timer2 (1, 4 ó 16). Se configura en el registro T2CON.
El Timer2 tiene un Postscaler, pero es una etapa posterior y no interviene directamente en el avance del Timer2. Este documento impreso se considera COPIA NO CONTROLADA
En la práctica es mucho más habitual hablar de la frecuencia del PWM. Como ésta es la inversa del periodo, de la fórmula anterior surge la siguiente:
El duty cycle es la cantidad de tiempo que en un periodo la salida PWM permanece en estado alto. Este tiempo queda determinado por el valor del registro CCPR1L. Mientras TMR2 sea menor que CCPR1L la salida PWM será un 1 lógico. Apenas TMR2 alcance a CCPR1L, la salida será 0. En caso de que este tope sea superior al periodo, la salida ya no conmutará a 0. En consecuencia, el dutycycle se controla variando el valor del registro CCPR1L. L a fórmula que da su valor en tiempo es:
Donde:
CCPR1L = Valor del registro CCPR1L (entre 0 y 255). Fosc = Frecuencia del XTAL. Prescaler = Prescaler del Timer2 (1, 4 ó 16).
También es mucho más ilustrativo hablar del duty cycle en términos de porcentajes. Un 0% significa que la salida es siempre bajo, 100% es un alto continuo, un 50% significa una onda cuadrada simétrica, y así. Para esto solo hay que dividir el dutycycle (en tiempo) entre el periodo y multiplicarlo por 100%. Realizando esta operación con las fórmulas presentadas anteriormente llegaremos a:
Esta fórmula es fácil de interpretar: el numerador CCPR1L representa al dutycycle y el denominador PR2+1, al periodo. La siguiente figura indica que cada periodo se divide en PR2+1 tramos equitativos y que CCPR1L es la cantidad de tramos que están en alto. Eso es una PWM.
Figura 2. Duty cycle de la onda PWM. Este documento impreso se considera COPIA NO CONTROLADA
Calcular el valor de PR2 que permita generar una frecuencia de PWM de 5Khz; utilizando un pre escalador en el Timer2 de 16 y una frecuencia del oscilador de 20Mhz Solución:
5kHz = PR2 =
20MHz 4×(PR2 + 1)×16 20MHz 5KHz×4×16
-1 = 62,5 63
La función el lenguaje C que permite configurar este valor en el timer2 es: -
setup_timer_2 (modo , periodo , postscale ).
Los parámetros son los siguientes: Modo T2_DISABLED T2_DIV_BY_1 T2_DIV_BY_4 T2_DIV_BY_16
Periodo Es un entero entre 0 y 255
Post- escala Es un valor entre 1 y 16
Con el valor de PR2 se configura el Timer2 de la siguiente manera: setup_timer_2(T2_DIV_BY_16, 63, 1); El compilador C suministra una serie de funciones para el manejo del módulo CCP. : -
modo hace referencia a los bits CCPxM3:CCPxM0 del registro CCPxCON, si se desea configurar el modulo como PWM se debe definir como sigue: setup_ccp1(CPP_PWM); : -
);
valor: dato de 8 o 16 bits que determina el ciclo de trabajo. Este valor, junto con el valor del preescaler del TMR2, determina el valor del ciclo de trabajo. En la configuración del TIMER2, el postcaler debe valer 1. Este documento impreso se considera COPIA NO CONTROLADA
Ejemplo2: calcular CCPR1L para ajustar el PWM en un 50%, con la frecuencia del ejercicio anterior
50 = CCPR1L =
CCPR1L
×100 PR2 + 1 50 × ( PR2 + 1) 100
= 32
Ejemplo 3: Con los datos obtenidos en los ejercicios 1 y 2, realizar un programa en lenguaje C que permita generar una señal PWM de 5kHz y un ciclo de trabajo del 50%. Solución: #include <16F877.h> #byte trisc=0x87 void main() { trisc= 0b11111011; //RC2 es la salida PWM del módulo CCP1 setup_ccp1(CCP_PWM); // Configura el módulo CCP1 como PWM setup_timer_2(T2_DIV_BY_16, 63, 1); //configura el Timer2 y con el valor del PR2 para una frecuencia de 5kHz set_pwm1_duty( 32 ); // escribe el valor de CCPR1L con el valor del dutycycle while (1){ // programa }// fin while }// fin main
:
-
www.mundomicros.com Compilador C CCS y simulador PROTEUS para microcontroladores PIC. Eduardo García Breijo.Alfaomega- Marcombo.
Andrey Julián Rentería Scarpetta
Este documento impreso se considera COPIA NO CONTROLADA