TEMA 21 PWM MODULACION DE ANCHURA DE PULSO INTRODUCCIÓN Seguidamente comenzamos el estudio de la modulación por anchura de impulsos PWM, como ya conocemos el PIC 16F876 dispone de dos módulos CCP captura/comparación/modulación de anchura de impulsos. Comenzaremos con el estudio del CCP1, este módulo se multiplexa con el latch del puerto C y en particular nos da la señal por el pin RC2. El recurso que se utiliza es el TIMER2, por lo que deberemos programarlo. Cuando generamos un PWM, y realizamos la programación en C y en concreto con el compilador CCS, deberemos utilizar las siguientes funciones : setup_timer_2(mode,period,postscale); set_pwm1_duty(duty) que pasamos a comentar CCFF D.P.E. MÓDULO DE PROYECTOS 2 setup_timer_2 (mode, period, postscale) Su función es inicializar el el TIMER2 (T2 es un contador temporizador de 8 bits), los parámetros que incluye esta función son: MODO: especifica el divisor para el reloj del microprocesador, tiene 4 opciones: T2_DISABLED T2_DIV_BY_1 T2_DIV_BY_4 T2_DIV_BY_16 → → → → T2_Desactivado Se divide por 1 Se divide por 4 Se divide por 16 PERIOD (periodo): Es un INT de 0 a 255, que nos indica el número de impulsos necesarios para el overflov del timer recordemos que T2 es un contador CCFF D.P.E. MÓDULO DE PROYECTOS 3 de 8 bits. POSTSCALE (postescaler): es un número de 1 a 16 que especifica el número de desbordamientos del T2 que se deben producir para que se solicite una interrupción. En el modo PWM no tiene significado y se suele poner a 1 . Los parámetros que introduzcamos en esta función, será los que determinen la frecuencia de del PWM. Veamos un ejemplo: Dispositivo 16F876, con un reloj a 20 MHz, o lo que es lo mismo, un periodo de oscilador de 0,05 μs. La función está definida: setup_timer_2(T2_DIV_BY_4,191,1); CCFF D.P.E. MÓDULO DE PROYECTOS 4 Sin divisor de frecuencia, El contador (T2) aumentaría su cuenta cada 4 ciclos de reloj o sea cada 0,2 μs, pero como el mode indica que está divido por 4, lo hará cada 0,8 μs. Por otra parte el periodo es 191, luego se desborda cada (191+1) * 0,8 μs = 153,6 μs F = 1/ 153,2 μs = 6.527 KHz. En resumen el ciclo del PWM viene determinado por la expresión: F(pwm) = (1/clock) * 4 *T2DIV*(period+1) De todos modos es el propio compilador el que realiza los cálculos y nos da el valor de cada uno de ellos siempre y cuando utilicemos PIC WIZAR. CCFF D.P.E. MÓDULO DE PROYECTOS 5 set_pwm1_duty(value) Esta función es la encargada de escribir los 10 bits que determinarán el tiempo en alta del PWM (ciclo de trabajo). El valor de value se obtiene despejando en la siguiente expresión expresión: duty= value*(1/clock)*t2div Donde duty es el tiempo que deseamos que esté en alta la señal En nuestro caso: Frecuencia de reloj 20 MHz, frecuencia del PWM:6,527 KHz → T = 153,6 μs Tiempo en alta que deseamos 50%= 76,8 μs(duty) value = 0.0000768 s* (reloj/modo) value = 0.0000768 s * (20.000.000/ 4)= 384 CCFF D.P.E. MÓDULO DE PROYECTOS 6 Realicemos ahora un ejercicio práctico, cuyo enunciado respondería a: Deseamos generar un PWM a través del pin RC2/CCP1 con un PIC 16F876, el reloj del microcontrolador es de 4 MHz, la frecuencia de la señal PWM será de 1 KHz, y deseamos que el ciclo de trabajo sea del 50%. Comenzamos arrancando el seleccionamos project, PIC WIZAR compilador, CCFF D.P.E. MÓDULO DE PROYECTOS y 7 En la pantalla general fijamos los parámetro usuales del microcontrolador como son: frecuencia de funcionamiento, código no protegido, tipo de oscilador etc. CCFF D.P.E. MÓDULO DE PROYECTOS 8 El fichero.h que se genera con todas las opciones seleccionadas es: Seguidamente pulsamos sobre la pestaña Oters, con lo que nos abre la siguiente ventana de selección CCFF D.P.E. MÓDULO DE PROYECTOS 9 En esta ventana seleccionamos: PWM, y posteriormente l en CCPX, CCP1 Una vez que hemos seleccionado modo PWM y que deseamos trabajar con CCP1, picamos sobre More options, emergerá una nueva ventana CCFF D.P.E. MÓDULO DE PROYECTOS 10 Ene esta nueva ventana introducimos el valor de la frecuencia de PWM deseada en nuestro caso 1000Hz., y validamos picando en OK CCFF D.P.E. MÓDULO DE PROYECTOS 11 Si picamos sobre View Code Generated.. Obtenemos el sentencia que se insertará en la función main CCFF D.P.E. MÓDULO DE PROYECTOS 12 El código y el fichero.h generados son: Importante T2DIV = 4 CCFF D.P.E. MÓDULO DE PROYECTOS 13 Nos resta editar el resto de código, en concreto fijar el ciclo de trabajo del PWM. En nuestro caso ya que deseamos un ciclo de 50%, deseamos que duty sea igual a 500 μs =0,5 ms = 0,0005 s. Como ya conocemos valor duty* (F reloj/T2DIV), observando en el código (página anterior) obtenemos que T2DIV = 4. Operando obtendríamos que Valor = 500; No olvide que la variable valor se debe incluir como un long. Una vez realizados estos cálculos pasamos a escribir el resto de sentencias: CCFF D.P.E. MÓDULO DE PROYECTOS 14 CCFF D.P.E. MÓDULO DE PROYECTOS 15 Nos resta simular el programa, para ello construimos el siguiente circuito en Proteus: CCFF D.P.E. MÓDULO DE PROYECTOS 16 Simulación en modo contínuo, en el osciloscopio se puede observar la señal PWM generada. CCFF D.P.E. MÓDULO DE PROYECTOS 17 Mediante el análisi digital comprobamos la frecuencia del PWM. CCFF D.P.E. MÓDULO DE PROYECTOS 18 Medición del ciclo de trabajo: CCFF D.P.E. MÓDULO DE PROYECTOS 19