Pages Menu
TwitterFacebook



BANNER2_ALT

Posted by on Abr 15, 2014 in Beaglebone | 0 comments

PWM

PWM

Uso del PWM

 Descripción

En este ejemplo se hará uso del PWM, o modulación por ancho de pulso, la cual consiste en modificar el ancho del pulso dejando la frecuencia intacta, el programa aceptara dos entradas, que son los Push Buttons conectados al microcontrolador, y tendrá una salida, que es el LED, el cual indicara el nivel de modulación, a más ancho el pulso mas ciclo de trabajo y el LED se iluminara con mayor intensidad.

 Diagrama Esquemático:

 

PWM

PWM con ATMega8

 Materiales

  • 1 LED
  • 1 Resistencia de 220 Ohms
  • 2 Push Button
  • 2 Resistencias de 10Kohms
  • 1 Microcontrolador ATmega8
  • Programador USBasp V3.0

 INTRODUCCIÒN

PWM

 Modulación por ancho de pulso o PWM (Pulse-Width Modulation), de una señal, es cuando se modifica el ciclo de trabajo o el ancho del pulso de una señal periódica, en este caso representado por una señal cuadrada, uno de los usos del PWM entre muchos otros, es controlar la cantidad de energía, en este caso el voltaje promedio es mayor conforme aumenta el ciclo de trabajo. Para mayor referencia del PWM, favor de visitar el siguiente link: http://es.wikipedia.org/wiki/Modulaci%C3%B3n_por_ancho_de_pulsos

PWM

PWM ancho de pulso

En la imagen anterior sTe puede observar, que el periodo de la señal permanece fijo, por lo tanto, la frecuencia también, solamente cambia el ciclo de trabajo, en la primera se observa que el ciclo de trabajo es de aproximadamente 50% lo cual nos indica que es el porcentaje de voltaje promedio entregado a la carga.

El PWM se puede utilizar en varias cosas, como el control de la velocidad de motores de DC, la posición de un servomotor, fuentes conmutadas, entre otras cosas más.

Programa en C

<pre>#include <avr/io.h>
#include <util/delay.h>

int main(void){

DDRB=0x02;
DDRD=0x00;
TCCR1A=0b10000011;         //Configurar el PWM en modo de fase
TCCR1B=0b00000001;         //Sin preescalador
TCNT1 =0b00000000;         //No se modifica
OCR1A=0;                   //Inicializar el TOP en cero

for(;;){                   //Ciclo infinito
if ( PIND == 0x01 ) {      //Si el boton 1 esta activado

OCR1A++;                   //Incrementar la modulacion
_delay_us(500);
}

if ( PIND == 0x02 ) {      //Si el boton 2 esta activado
OCR1A--;                   //Decrementar la modulacion
_delay_us(500);
}
}
}

 

Detalles del programa

<pre>#include <avr/io.h>

Incluimos la librería avr/io que contiene la informacion de las entradas y salidas del microcontrolador.

<pre>#include <util/delay.h>

Esta librería es necesaria para poder utilizar los retardos de tiempo

<pre>int main (void){

El main es la función principal, es donde el programa inicia, siempre es necesario declarar la función main.

<pre>DDRB=0x02;
DDRD=0x00;

Se declaran el bit 1 del puerto B como salida y el puerto D como entrada.

 

TCCR1A=0b10000011;
TCCR1A

TCCR1A

 

 

Los primeros dos bits del TCCR1A los cuales se observa que tanto en el registro como en la tabla sonWGM11 y WGM10, y como en este caso ambos están activados, podemos ver que el modo de operación es el de PWM en fase de 10 bits.

WGM

WGM

 

 

Acerca del bit 7 este depende de qué tipo de PWM se esté trabajando, ya que en este caso se está trabajando el de corrección de fase, vemos la tabla que le corresponde y vemos que el tenemos el COM1A1 habilitado el cual nos indica que limpia el OC1A en la comparación al incrementar y ajusta el OC1A en la comparación al decremento.

COM1A

COM1A

 

 

A continuación se puede ver en la grafica tomada de la hoja de datos el funcionamiento del PWM en modo de fase:

PWM phase correct

PWM phase correct

 

<pre>TCCR1B=0b00000001;
TCCR1B

TCCR1B

 

Se ajusta el PWM para que no haya preescalador desde el Clk, se puede ver en la tabla de los últimos tres bits del registro.

CS

CS

 

 OCR1A=0;

Se inicializa el valor al que llega el PWM, como se puede ver en la imagen anterior los picos del TCNTn dependen del OCRnx, en este caso es el OCR1A el cual se inicializa en cero.

<pre>for(;;){

En este caso, es otro manera de generar un loop infinito, esta instrucción es equivalente al while(1){

<pre>If ( PIND == 0x01 ) {
OCR1A++;
_delay_us(500);
}
if ( PIND == 0x02 ) {</pre>
OCR1A--;
_delay_us(500);
}

En general lo que se hace en esta sección de código, es que primero verifica si el Push Button1 está siendo presionado al comparar el puerto con un 0x01, en caso de que si este, se incrementa el valor del OCR1A el cual define el ancho del pulso en la modulación, por consiguiente, como se vio previamente, a mayor ancho del pulso se entrega un mayor voltaje promedio. El segundo if funciona de la misma manera, solo que para activarlo hay que presionar el otro botón, y dentro de este el OCR1A se decrementara.

 El retardo se usa ya que como el microcontrolador corre a una velocidad de 1Mhz, para limitar la velocidad del incremento, si no hubiera algún retardo, no podríamos observar que es lo que esta pasado debido a la velocidad del incremento, ya que con solo presionar algún botón un instante de tiempo, el código se repetiría cientos de veces y el OCR1A se incrementaría o decrementaria muy rápido.

Post a Reply

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *