Control total del PWM de Arduino
PWM que proviene del ingles Pulse-Width Modulation o modulación por ancho de pulsos es una técnica en la cual se modifica el ciclo útil de una señal periódica. En este articulo nos enfocaremos en entender los pormenores del los PWM que incluyen los chips ATMega168 y ATMega328 del Arduino UNO (datasheet). Para un control preciso del PWM es necesario trabajar con los registros internos del micro-controlador.
Basicamente el PWM es una signal digital cuadrada, la cual tiene una frequencia definida, pero a la que se le puede cambiar el tiempo en el cual la señal esta activa (llamado ciclo de trabajo). En la siguiente image pueden cambiar el ciclo de trabajo, para que vean el efecto en la señal.
El PWM puede ser usado para multiples tareas:
- Controlar la intensidad luminosa de leds.
- Controlar la velocidad en motores de corriente continua.
- Generar señales de audio.
- Generar señales moduladas, como las usadas en controler remotos y sus leds infrarojos.
- Tener una señal analogica a traves de un filtrado de la señal digital.
Simple PWM utilizando la función analogWrite
Programar un PWM con arduino es relativamente sencillo, solor tiene que escribir analogWrite(pin,dutyCycle). En donde dutyCycle es el ciclo de trabajo que esta dando entre 0 y 255 para un 100%. pin indica el pin de salida del PWM, para el Arduino UNO, tenemos salida PWM en los pines 3, 5, 6, 9, 10 y 11. Esta función no te permite tener control alguno sobre la frequencia del PWM, adémas, aunque el nombre de la función hace una alución a una salida analogica, la señal es digital, como vimos en la imagen de arriba.
Si quieres tener un mayor control sobre el PWM sigue leyendo.
PWM generado por software
Puedes usar tu Arduino para generar señales "PWM" utilizando un programa para ello, por ejemplo:
void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
// Aproximadamente 10% del ciclo de trabajo
// a una frequencia de 1kHz
digitalWrite(13, HIGH);
delayMicroseconds(100);
digitalWrite(13, LOW);
delayMicroseconds(900);
// 100us HIGH de (100+900) 1000us de periodo
}
En este caso puedes controlar el ciclo de trabajo y la frequencia de cualquier pin, pero no podras hacer nada mas con tu Arduino, cualquier interrupción afectaria el periodo de esta PWM. Esto mismo podras hacerlo controlando los registros internos del microcontrolador de una forma mas eficiente, y dejando libre la funcion principale de Arduino para otras cosas.
Controlando los registros del ATMega 168P/328P
Los chips ATMega 168P/328P tienes 3 contadores o TIMER, quienes controlan 6 PWM en Arduino. Estos contadores, son referenciados como TIMER0, TIMER1 y TIMER2. Cada uno controla dos PWM, la salida del PWM cambia cuando el contador supera el valor indicado en el registro de cada PWM, estos comparten la misma frequencia pero no el ciclo de trabajo, el cual depende de cada registro (un registro es un lugar en la memoria que guarda un numero de forma binaria).
Cada TIMER incrementa su valor siguiendo los pulso del reloj del Arduino que tiene una frequencia de 16MHz, la velocidad del incremento se puede modificar via Prescalers o divisores, quienes dividen la frequencia principal a frequencia mas bajas, los divisores son potencias de 2: 1, 8, 64, 265, 1024. Los valores dependen de cada TIMER.
A demas del control del prescaler y los registros para cada PWM, estos chips ofrecen diferentes modos de funcionamiento para el PWM, que seran descritos a continuación.
Comentarios
Publicar un comentario