Pwm

eliudhernandez37 876 views 17 slides Nov 29, 2016
Slide 1
Slide 1 of 17
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17

About This Presentation

pic pwm 16f877a


Slide Content

PWM EQUIPO 3 Martínez Saldaña juan Manuel Hernández Zavala juan Eliud Ortiz cruz juan Guillermo nava de león Erick nicolai quintero García JORGE Eduardo Martínez san juan José Roberto

El PWM, es una de las señales más utilizadas para realizar control con nuestros microcontroladores. Para poder generar esta señal con nuestro PIC, se hace uso de los  módulos CCP (Comparador, Captura y PWM). Dicho módulo permite realizar tres funciones básicas.

ccp Comparar:  Compara el valor del temporizador con el valor de un registro y provoca una acción en el PIC. Captura:  Obtiene el valor del temporizador en un momento dado, fijado por la acción de un terminal del PIC. PWM:  Genera una señal modulada en amplitud de pulso.

Introducción Nuestro microcontrolador tiene  2 módulos CCP  como se puede apreciar en la siguiente figura, los cuales corresponden a los  PINES 16 y 17 (Correspondientes al puerto C, RC1 y RC2) . Figura 1. Distribución pines del pic16F877A

El módulo  PWM  (Pulse With Modulation ),permite obtener de los pines CCP1 (Pin 17) y CCP2 (Pin 16) una señal periódica (Es decir que se repite en el tiempo) la cual podemos modificar su ciclo de trabajo ( Duty Cycle  en ingles). Dicho PWM puede tener una resolución  máxima de 10 BITS . En otras palabras. Como sabemos que el PIC trabaja con voltajes binarios (0V o +5V), podemos configurar el PWM para que trabaje un determinado tiempo en +5V ( Ton ) frente al tiempo que está en nivel bajo 0V ( Toff ), tal y como lo podemos apreciar en la siguiente figura. Figura 2. Modulación de ancho de pulso

De esta manera, la tensión media aplicada a la carga, es proporcional al tiempo en que la señal estuvo en +5V ( Ton ) y asi  podemos por  ejemplo controlar la luminosidad de lamparas , o la velocidad de un motor. La resolución de salida del modulo CCP es de 10 bits, y para que funcione correctamente, no debemos olvidar configurarlo como salida en el TRIS C. Figura 3. control de luminosidad de una lámpara.

MODULO CCP EN C El compilador nos suministra dos instrucciones basicas para el manejo del PWM. Para configurar el módulo CCP: setup_ccpx (modo); El modo hace referencia a los bits CCPxM3:CPxM0 del registro CCPxCON

El ciclo de trabajo para el PWM se define como: set_pwmx_duty (valor); Donde el  x  hace alusión al modulo CCP a utilizar, en el caso del PIC16F887A solo tiene CCP1 y CCP2, así que si queremos usar el PWM del PIN 17 ponemos  set_pwm 1 _duty(valor);  y si queremos usar el PWM del PIN 16 ponemos  set_pwm 2 _duty(valor);

Valor  es un dato de 10 bits que determina el ciclo de trabajo o ancho de pulso, es decir ese valor va a determinar el porcentaje (En bytes) en que la señal de PWM se va a mantener encendida. Este valor junto con el valor del  preescaler  del TMR2 definen el ciclo de trabajo. En la configuración del TIMER 2 el  postcaler  debe valer 1.

Periodo de la señal Para generar una señal de PWM con el PIC, tenemos que utilizar el TIMER 2, el cual es un Timer de 8 Bits. Internamente el PIC, usa el TIMER 2 como base de tiempo para la modulación del PWM utilizando el módulo CCP. Con la siguiente formula podemos calcular la frecuencia de salida

La  carga del Timer 2 (conocido como PR2) , también podría ser llamada como el  Periodo de la Señal  y puede tomar valores entre 0 y 255, debido a que es un registro de 8 bits. Considerando que vamos a utilizar un cristal de cuarzo de 4Mhz, calculemos cual seria la frecuencia mínima para dicho cristal. El Prescaler del TIMER 2 Puede ser 1, 4 o 16.

Resolución del pwm calcular  la Resolución  que vamos a usar en nuestro PWM. Para eso, sabemos que la máxima resolución del PWM es 10 bits o 1024 bytes. Si observamos la ecuación de frecuencia del PWM PWM Frecuencia en su denominador los dos parámetros (carga del TIMER2 + 1)*4 hacen referencia a la resolución que se puede alcanzar con el PWM, note que si la carga del timer2 fuera su valor máximo (255) el resultado de esa operación nos daría 1024. Entonces para saber cuantos bits tenemos en una señal PWM a la frecuencia que nosotros deseamos, podriamos representar ese termino como (carga del TIMER2 + 1)*4=(2^n)-1 donde  n  es el numero de bits que como máximo sería 10 bits..

Así, podríamos reescribir la ecuación de la frecuencia del PWM como: Y como lo que queremos es determinar la resolución, simplemente despejamos  n  de la ecuación anterior aplicando logaritmos a ambos lados de la igualdad:

Con ese valor de resolución de ancho de pulso ( n ) sabremos cuanto es el BYTE que debemos colocar en la variable  valor  de la instrucción que habíamos comentado en la parte de arriba: set_pwmx_duty (valor); Donde: Valor=2

ejemplo # include <16f887.h> # device ADC=10 #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,INTRC_IO #use delay ( clock =4000000) int16 duty =0; int Timer2,Poscaler; void main () { // Generemos una Señal cuadrada de 1 Khz Timer2=249; //Se carga timer 2 con 249 como lo vimos en la pagina // Preescaler =4; // Preescaler solo puede tomar valores de: 1 - 4 - 16 //Para el preescaler colocamos "t2_div_by_4" Poscaler =1; // Preescaler solo puede tomar valores de: 1

setup_timer_2(t2_div_by_4,Timer2,Poscaler); // Configuracion de Timer 2 para establecer frec . PWM a 1kHz setup_ccp1( ccp_pwm ); //Configurar modulo CCP1 en modo PWM setup_adc_ports ( all_analog ); //Configurar ADC setup_adc ( adc_clock_internal ); while (1) { set_adc_channel (0); delay_us (100); duty = read_adc (); set_pwm1_duty( duty ); }
Tags