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:CPx
M0 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_pwm1_duty(valor); y si queremos
usar el PWM del PIN 16 ponemos set_pwm2_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 PWMFrecuencia 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);
• }
Pwm

Pwm

  • 1.
    PWM EQUIPO 3 MARTÍNEZ SALDAÑAJUAN 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
  • 2.
    • 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.
  • 3.
    CCP • Comparar: Comparael 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.
  • 4.
    INTRODUCCIÓN Nuestro microcontrolador tiene 2mó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
  • 5.
    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
  • 6.
    • De estamanera, 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.
  • 7.
    MODULO CCP ENC • 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:CPx M0 del registro CCPxCON
  • 8.
    • El ciclode 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_pwm1_duty(valor); y si queremos usar el PWM del PIN 16 ponemos set_pwm2_duty(valor);
  • 9.
    • Valor esun 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.
  • 10.
    PERIODO DE LASEÑ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
  • 11.
    • La cargadel 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.
  • 12.
    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 PWMFrecuencia 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..
  • 13.
    • Así, podríamosreescribir 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:
  • 14.
    • Con esevalor 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
  • 15.
    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
  • 16.
    • setup_timer_2(t2_div_by_4,Timer2,Poscaler); //Configuracionde 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); • }