Uso del 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
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.
En la imagen anterior se 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 #include
#include 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 ) { OCR1A--; _delay_us(500); } } }
Detalles del programa #include
//Si el boton 2 esta activado //Decrementar la modulacion
Incluimos la librería avr/io que co ntiene la informacion de las entradas y salidas del microcontrolador.
#include Esta librería es necesaria para poder utilizar los retardos de tiempo
int main (void){ El main es la función principal, es donde el programa inicia, siempre es necesario declarar la función main.
DDRB=0x02; DDRD=0x00; Se declaran el bit 1 del puerto B como salida y el puerto D como entrada.
TCCR1A=0b10000011;
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.
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.
A continuación se puede ver en la grafica tomada de la hoja de datos el funcionamiento del PWM en modo de fase:
TCCR1B=0b00000001;
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.
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.
for(;;){ En este caso, es otro manera de generar un loop infinito, esta instrucción es equivalente al while(1){
if ( PIND == 0x01 ) { OCR1A++; _delay_us(500); } if ( PIND == 0x02 ) { 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.