- Pines PWM en el microcontrolador AVR Atmega16
- ¿Qué es una señal PWM?
- Componentes requeridos
- Diagrama de circuito
- Programando Atmega16 para PWM
La modulación de ancho de pulso (PWM) es una técnica poderosa en la que el ancho del pulso se cambia manteniendo la frecuencia constante. La técnica se utiliza en muchos sistemas de control en la actualidad. La aplicación de PWM no está limitada y se utiliza en una amplia gama de aplicaciones como control de velocidad del motor, medición, control de potencia y comunicación, etc. En la técnica PWM, se puede generar fácilmente una señal de salida analógica utilizando señales digitales. Este tutorial lo ayudará a comprender PWM, sus terminologías y cómo podemos implementarlo usando un microcontrolador. En este tutorial demostraremos PWM con el microcontrolador AVR Atmega16 variando la intensidad de un LED.
Para comprender los conceptos básicos de PWM en detalle, consulte nuestros tutoriales anteriores sobre PWM con varios microcontroladores:
- Tutorial ARM7-LPC2148 PWM: Control del brillo del LED
- Modulación de ancho de pulso (PWM) usando MSP430G2: Control de brillo de LED
- Generando PWM usando el microcontrolador PIC con MPLAB y XC8
- Modulación de ancho de pulso (PWM) en STM32F103C8: Control de velocidad del ventilador de CC
- Generación de señales PWM en pines GPIO del microcontrolador PIC
- Tutorial de Raspberry Pi PWM
Pines PWM en el microcontrolador AVR Atmega16
Atmega16 tiene cuatro pines PWM dedicados. Estos pines son PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Además, Atmega16 tiene dos temporizadores de 8 bits y un temporizador de 16 bits. Timer0 y Timer2 son temporizadores de 8 bits, mientras que Timer1 es un temporizador de 16 bits. Para generar PWM debemos tener una descripción general de los temporizadores, ya que los temporizadores se utilizan para generar PWM. Como sabemos, la frecuencia es el número de ciclos por segundo a los que se ejecuta el temporizador. Entonces, la frecuencia más alta nos dará un temporizador más rápido. Al generar PWM, una frecuencia PWM más rápida proporcionará un control más preciso sobre la salida porque puede responder más rápido a los nuevos ciclos de trabajo PWM.
En este tutorial de Atmega16 PWM usaremos Timer2. Puede elegir cualquier ciclo de trabajo. Si no sabe qué es el ciclo de trabajo en PWM, analicemos brevemente.
¿Qué es una señal PWM?
La modulación de ancho de pulso (PWM) es una señal digital que se usa más comúnmente en circuitos de control. El tiempo durante el cual la señal permanece alta se denomina "tiempo de activación" y el tiempo durante el cual la señal permanece baja se denomina "tiempo de inactividad". Hay dos parámetros importantes para un PWM como se describe a continuación:
Ciclo de trabajo del PWM
El porcentaje de tiempo en el que la señal PWM permanece ALTA (a tiempo) se denomina ciclo de trabajo.
Al igual que en la señal de pulso de 100 ms, si la señal es ALTA durante 50 ms y BAJA durante 50 ms, significa que el pulso fue medio tiempo ALTO y medio tiempo BAJO. Entonces podemos decir que el ciclo de trabajo es del 50%. De manera similar, si el pulso está en estado ALTO de 25 ms y 75 ms en estado BAJO fuera de 100 ms, entonces el ciclo de trabajo sería del 25%. Tenga en cuenta que solo calculamos la duración del estado ALTO. Puede hacer referencia a la imagen de abajo para una comprensión visual. La fórmula para el ciclo de trabajo es entonces,
Ciclo de trabajo (%) = Hora de encendido / (Hora de encendido + Hora de apagado)
Entonces, al cambiar el ciclo de trabajo, podemos cambiar el ancho de PWM, lo que da como resultado un cambio en el brillo del LED. Tendremos una demostración del uso de diferentes ciclos de trabajo para controlar el brillo del LED. Consulte el video de demostración al final de este tutorial.
Después de seleccionar el ciclo de trabajo, el siguiente paso sería seleccionar el modo PWM. El modo PWM especifica cómo desea que funcione PWM. Existen principalmente 3 tipos de modos PWM. Estos son los siguientes:
- PWM rápido
- PWM de corrección de fase
- PWM con corrección de fase y frecuencia
Fast PWM se utiliza cuando el cambio de fase no importa. Al usar Fast PWM, podemos generar los valores de PWM rápidamente. No se puede usar Fast PWM donde el cambio de fase afecta la operación, como el control del motor, por lo que en dicha aplicación se usan otros modos de PWM. Dado que controlaremos el brillo del LED donde el cambio de fase no afectará mucho, usaremos el modo Fast PWM.
Ahora, para generar PWM, controlaremos el temporizador interno para contar hacia arriba y luego volver a cero en un recuento en particular, por lo que el temporizador contará hacia arriba y luego volverá a cero una y otra vez. Esto establece el período. Ahora tenemos la opción de controlar un pulso, encendiendo un pulso en un conteo específico en el temporizador mientras aumenta. Cuando el contador vuelva a 0, apague el pulso. Hay mucha flexibilidad con esto porque siempre puede acceder al conteo del temporizador y proporcionar diferentes pulsos con un solo temporizador. Esto es genial cuando desea controlar varios LED a la vez. Ahora comencemos a conectar un LED con Atmega16 para PWM.
Consulta todos los proyectos relacionados con PWM aquí.
Componentes requeridos
- Microcontrolador Atmega16 AVR IC
- Oscilador de cristal de 16Mhz
- Dos condensadores de 100nF
- Dos condensadores de 22pF
- Presionar el botón
- Cables de puente
- Tablero de circuitos
- USBASP v2.0
- 2 LED (cualquier color)
Diagrama de circuito
Estamos usando OC2 para PWM, es decir, Pin21 (PD7). Así que conecte un LED en el pin PD7 de Atmega16.
Programando Atmega16 para PWM
El programa completo se da a continuación. Grabe el programa en Atmega16 usando JTAG y Atmel Studio y vea el efecto PWM en el LED. Su brillo aumentará y disminuirá lentamente debido al ciclo de trabajo variable de PWM. Verifique el video que se encuentra al final.
Comience a programar Atmega16 con la configuración de Timer2 Register. Los bits de registro del Timer2 son los siguientes y podemos establecer o restablecer los bits en consecuencia.
Ahora discutiremos sobre todos los bits de Timer2 para que podamos obtener el PWM deseado usando un programa escrito.
Hay principalmente cuatro partes en el registro Timer2:
FOC2 (Force Output Compare for Timer2): el bit FOC2 se establece cuando los bits WGM especifican un modo no PWM.
WGM2 (Modo de generación de ondas para Timer2): estos bits controlan la secuencia de conteo del contador, la fuente del valor máximo del contador (TOP) y el tipo de generación de forma de onda que se utilizará.
COM2 (Comparar modo de salida para Timer2): estos bits controlan el comportamiento de salida. La descripción completa de los bits se explica a continuación.
TCCR2 - = (1 <
Configure los bits WGM20 y WGM21 como ALTO para activar el modo rápido PWM. WGM significa modo de generación de forma de onda. Los bits de selección son los siguientes.
WGM00 |
WGM01 |
Funcionamiento en modo Timer2 |
0 |
0 |
Modo normal |
0 |
1 |
CTC (Clear Timer On Compare Match) |
1 |
0 |
PWM, fase correcta |
1 |
1 |
Modo PWM rápido |
Para obtener más detalles sobre el modo de generación de formas de onda, puede consultar la hoja de datos oficial de Atmega16.
TCCR2 - = (1 <
Además, no hemos utilizado ningún preescalado, por lo que hemos configurado el registro de fuente de reloj como '001'.
Los bits de selección del reloj son los siguientes:
CS22 |
CS21 |
CS20 |
Descripción |
0 |
0 |
0 |
Sin fuente de reloj (temporizador / contador detenido) |
0 |
0 |
1 |
clk T2S / (sin preescalado) |
0 |
1 |
0 |
Clk T2S / 8 (de Prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (de Prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (de Prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (de Prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (de Prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (de Prescaler) |
Además, OC2 se borra en la comparación de coincidencias estableciendo el bit COM21 como '1' y COM20 como '0'.
Las opciones de selección del modo de salida de comparación (COM) para el modo PWM rápido se muestran a continuación:
COM21 |
COM21 |
Descripción |
0 |
0 |
Funcionamiento normal del puerto, OC2 desconectado. |
0 |
1 |
Reservado |
1 |
0 |
Completa OC2 en comparación, establece OC2 en TOP |
1 |
1 |
Establecer OC2 en comparación, borrar OC2 en TOP |
Aumente el ciclo de trabajo de 0% a 100% para que el brillo aumente con el tiempo. Tome el valor de 0-255 y envíelo al pin OCR2.
for (duty = 0; duty <255; duty ++) // 0 al ciclo de trabajo máximo { OCR2 = duty; // aumenta lentamente el brillo del LED _delay_ms (10); }
De manera similar, disminuya el ciclo de trabajo del 100% al 0% para disminuir gradualmente el brillo del LED.
for (duty = 0; duty> 255; duty--) // max to 0 duty cycle { OCR2 = duty; // disminuye lentamente el brillo del LED _delay_ms (10); }
Esto finaliza nuestro Tutorial sobre el uso de PWM en Atmega16 / 32.