3

Click here to load reader

Como Crear Un Pwm

Embed Size (px)

DESCRIPTION

Como Crear Un Pwm en C

Citation preview

Page 1: Como Crear Un Pwm

Lenguaje C orientado a µControladores

Preparado por jhuircan. Ver preliminar 1.0 33

Programación PWM El PWM (Pulse Witdh Modulation) en una señal muy utilizada para el control de motores de corriente continua. El PWM consiste en una señal cuadrada que forma un tren de pulsos, cuyo ancho puede ser variado por el usuario manteniendo el periodo original. El concepto radica en que el ancho de pulso permite variar el valor medio de la señal generado (también llamado valor de corriente continua). Este tipo de señales puede ser generada usando los temporizadores en conjunto con las interrupciones disponibles del µC o usando el modulo CCP (Capture/Compare/PWM). Este modulo funciona en conjunto con el timer2, el proceso de interrupción involucrado es transparente para el usuario.

Fig. 14. Generación de PWM.

Generación de un PWM El concepto es el siguiente, se requiere una variable que almacene la duración del periodo, una variable que almacene el ciclo de trabajo y un terminal de salida que permite visualizar la señal. Esto en conjunto con un contador que cuenta ciclos de reloj producido por un temporizador. Dicha cuenta se realiza en una RSI. De esta forma, se pone el terminal de salida en 1, la base de tiempo generada por cada canto de reloj interrumpe, cada interrupción incrementa en uno el contador, si la cuenta es menor al ciclo de trabajo, el terminal de salida se mantiene en 1, sino baja a 0. El contador se sigue incrementando por cada interrupción, pero ahora se pregunta si la cuenta es menor o igual al largo del periodo, es decir, si la cuenta es menor que el largo del periodo, se mantiene el bit de salida en el estado actual, sino, significa que se cumplió el periodo y por lo tanto el contador se hace cero, el bit de salida se hace 1 y se repite el proceso. El ancho del pulso se maneja cambiando el valor de la variable correspondiente. Lo mismo para el periodo. Dependiendo de la frecuencia y la resolución que se requiera del PWM, puede usar algunos de los temporizadores disponibles, ya sea el Timer 0 o el Timer 1. Generando PWM con el TMR0 Esto se hace vía interrupción, necesitará una base de tiempo la cual será proporcionada por el TMR0. La señal de PWM saldrá por el terminal de salida PORTB.7. Primero se debe implementar una señal de reloj cuya frecuencia se lo más grande posible, esto generará una base de tiempo muy pequeña. Así se tiene: PS2,PS1,PS0 con el divisor 1:2 TMR0=254

Esta base de tiempo será el reloj principal para el PWM. El Duty Cycle más pequeño del PWM generado será un periodo de esta señal.

Duty Cycle

Periodo

Page 2: Como Crear Un Pwm

Lenguaje C orientado a µControladores

Preparado por jhuircan. Ver preliminar 1.0 34

Se definen tres variables, el periodo del PWM, llamado TPWM, el Duty Cycle llamado DUTY y un CONTADOR que establece cuando se cumple el DUTY y cuando se cumple el periodo TPWM. Filosofía Se configura la interrupción TMR0 Se inicializa contador=0 Se inicializa TPWM y DUTY Se inicializa TMR0=254 Se define un bit de salida con el valor 1, por ejemplo PORTB.7=1 Cada vez que interrumpe el TMR0, se ejecuta la RSI Cuando entra a la RSI verifica el estado del T0IF y se realizan las siguientes tareas

o Se incrementa el CONTADOR o Si el CONTADOR =DUTY, se hace el PORTB.7=0 o Si el CONTADOR=TPWM, se hace el PORTB.7=1 y contador=0 o Se resetea T0IF=0 o Se inicializa TMR0=254

Por ejemplo si se define TPWM=100 y DUTY=20, durante las primeras 20 interrupciones del TMR0, PORTB.7 será 1 y luego se hará 0 durante las 80 interrupciones siguientes. Al llegar el CONTADOR a 100 se hace un reset al CONTADOR y parte todo de nuevo. Para modificar el ancho del pulso se debe cambiar el valor del DUTY. El siguiente código fuente sería una implementación, la que puede simplificarse programando los registros en forma completa y no por bits. #include "int16CXX.H" #pragma origin 4 char contador, TPWM,DUTY; interrupt servidor_de_int( void) { int_save_registers // W, STATUS (and PCLATH) if(T0IF) { contador++; if(contador==DUTY) PORTB.7=0; if(contador==TPWM) { PORTB.7=1; contador=0; } TMR0=254; T0IF=0; // reset flag de int TMR0 } int_restore_registers // W, STATUS (and PCLATH) } void main() { TPWM=100; DUTY=20; TRISB.7=0; // PORTB.0 de salida PORTB.7=1; // Manda un 1 //Programación del TMR0 OPTION.5=0; // T0CK=0, fuente clock interno OPTION.4=0; // T0SE, Incremento con Canto de subida OPTION.3=0; // PSA=0 Pre escalar asignado al TMR0 OPTION.2=0; // PS2=0 // Pre escalar 1:2 OPTION.1=0; // PS1=0

Page 3: Como Crear Un Pwm

Lenguaje C orientado a µControladores

Preparado por jhuircan. Ver preliminar 1.0 35

OPTION.0=0; // PS0=0 TMR0=254; // Carga con el valor inicial 254 INTCON.5=1; // habilita la int por TMR0 TMR0IE=1 GIE=1; // Habilita todas las int while(1) // Loop forever { } }

Programando el módulo CCP El µC tiene dos módulos, el CCP1 o CCP2 cuya salida son la 13 y 12 respectivamente. Estos módulos interactúan con el timer2. Para la configuración CCP1 se utilizan los registros TRISC, CCP1CON, CCPR1L (registros del modulo CCP1), PR2 y T2CON (registros del modulo Timer2). El PWM tiene una resolución de 1024 cuentas. Las condiciones iniciales serán el periodo del PWM y el clock del sistema.

Se configura el modulo CCP para trabajar en modo PWM programando el registro CCP1CON. Se ingresa el valor codificado en 10 bits del ciclo de trabajo (Duty Cycle) en el registro CCPR1L (que

es de 8 bits) y los dos bits restantes en el registro CCP1CON.4 y CCP1CON.5. Se configura el Timer2, a través de los registros T2CON y PR2. Esto permite definir los pre-escalares

respectivos y la duración del periodo en base a la siguiente expresión lo que permite realizar los ajustes para la frecuencia requerida.

Los siguientes diagramas permiten ilustrar la programación Para CCP1, se configura la palabra de control CCPCON1

CCPxX CCPxY CCPxM3 CCPxM2 CCPxM1 CCPxM0

Modo PWM 1 1 X X

PR2 T2CON

TM2ON T2CKPS1 T2CKPS0

Habilita T2 1

Deshabilita T2 0

Pre-Escalar 1 0 1 Pre-Escalar 4 0 1

Pre-Escalar 16 1 X