PWM en Arduino

PWM, o Modulación por Ancho de Pulso (Pulse Width Modulation), es una técnica que permite simular una señal analógica mediante el control de la duración de los pulsos en una señal digital. Básicamente, la señal cambia entre encendido (HIGH) y apagado (LOW) de manera tan rápida que, a los ojos del mundo analógico, parece estar en algún punto intermedio. Es como un interruptor que se enciende y apaga a gran velocidad.

Esta técnica es especialmente útil para controlar dispositivos que no son simplemente ON o OFF, como LEDs que necesitan variar su brillo, motores que requieren diferentes velocidades, o incluso altavoces para emitir diferentes tonos.

PWM en Arduino: ¿Cómo Funciona?

Cuando trabajas con PWM en Arduino, estás utilizando la capacidad de la placa para cambiar rápidamente el estado de los pines digitales. Pero, ¿cómo hace esto Arduino? Vamos a profundizar un poco más.

Arduino usa temporizadores para generar señales PWM. En los modelos más comunes de Arduino, como el Uno, Nano o Mega, hay ciertos pines que están marcados con un símbolo ‘~’, lo que indica que son pines PWM. Para generar una señal PWM, usamos la función analogWrite(pin, valor) de Arduino.

El valor en analogWrite() varía de 0 a 255:

  • 0 significa que la señal estará en LOW todo el tiempo.
  • 255 significa que la señal estará en HIGH todo el tiempo.
  • 127 significa que la señal estará en HIGH la mitad del tiempo y en LOW la otra mitad (ciclo de trabajo del 50%).

Esto es posible gracias a que Arduino genera una señal cuadrada en estos pines, alternando entre encendido y apagado tan rápido que, para muchos componentes, parece ser un valor analógico suave.

Aquí tienes un ejemplo básico para controlar el brillo de un LED:

int ledPin = 9; // Pin PWM

void setup() {
pinMode(ledPin, OUTPUT);
}

void loop() {
for (int i = 0; i <= 255; i++) {
analogWrite(ledPin, i);
delay(10);
}
for (int i = 255; i >= 0; i--) {
analogWrite(ledPin, i);
delay(10);
}
}

En este código, el LED conectado al pin 9 (un pin PWM) incrementará y disminuirá su brillo de forma gradual. El rango de valores que `analogWrite()` puede tomar es de 0 a 255, donde 0 significa que la señal está siempre en LOW y 255 que está siempre en HIGH.

Duty Cycle y Frecuencia: Los Dos Pilares de PWM

Para entender cómo controlar PWM en Arduino, es importante conocer dos conceptos clave: el ciclo de trabajo (duty cycle) y la frecuencia.

1. Duty Cycle (Ciclo de Trabajo): Es la proporción de tiempo durante el cual la señal está en HIGH en comparación con el ciclo total. Por ejemplo, un duty cycle del 50% significa que la señal está en HIGH la mitad del tiempo y en LOW la otra mitad.

pwm arduino duty cycle

2. Frecuencia: Es la cantidad de veces que la señal completa un ciclo de HIGH y LOW en un segundo. En los Arduinos, la frecuencia de los pines PWM es generalmente de 490 Hz (excepto los pines 5 y 6 del Arduino Uno que tienen una frecuencia de 980 Hz).

La mayoría de las aplicaciones básicas, como el control de brillo de un LED o la velocidad de un motor DC, no requieren que ajustes la frecuencia PWM. Sin embargo, en aplicaciones más avanzadas, como audio o comunicación, podrías necesitar manipular estos parámetros.

Ajuste de la Frecuencia del PWM en Arduino

Por defecto, la frecuencia del PWM en los pines de Arduino Uno es de aproximadamente 490 Hz para la mayoría de los pines PWM, y de 980 Hz para los pines 5 y 6. Sin embargo, es posible cambiar esta frecuencia manipulando los registros del temporizador (timers). Esto es avanzado, pero es esencial cuando necesitas frecuencias específicas, como en el caso del control de motores o generación de sonidos.

pwm arduino frecuencia y amplitud

Un ejemplo de cómo cambiar la frecuencia del PWM en los pines 9 y 10 sería:

void setup() {
  // Cambiar la frecuencia del PWM del pin 9 y 10 a 31250 Hz
  TCCR1B = TCCR1B & 0b11111000 | 0x01;
}

void loop() {
  // Tu código aquí
}

 

Aplicaciones Comunes de PWM en Arduino

PWM tiene un montón de aplicaciones en el mundo Arduino. Aquí te dejo algunas de las más comunes:

Control de Brillo de LEDs: Usando la función `analogWrite()` y variando el duty cycle, puedes ajustar el brillo de un LED.
Control de Motores DC: Los motores necesitan señales PWM para regular su velocidad. Con un transistor o un driver de motor, puedes usar Arduino para enviar señales PWM y controlar la velocidad.
Servomotores: Aunque no se usa PWM de manera directa, los servos usan una técnica similar llamada “Pulso de Anchura Variable” que es controlada con la librería `Servo.h` de Arduino.
Control de Calentadores: En sistemas de calefacción, el PWM se puede usar para mantener la temperatura variando el tiempo de encendido de un calentador.

Controlando Motores con PWM y Arduino

El control de motores es probablemente una de las aplicaciones más emocionantes del PWM Arduino. Aquí, vamos a explorar cómo usar PWM para controlar motores de corriente continua.

Para este propósito, necesitamos un transistor o un controlador de motor como el L298N. A continuación, te muestro un ejemplo sencillo de cómo controlar un motor DC usando PWM:

int motorPin = 3;  // Pin PWM 3

void setup() {
  pinMode(motorPin, OUTPUT);  // Configura el pin como salida
}

void loop() {
  analogWrite(motorPin, 150);  // Motor funcionando a velocidad media
  delay(2000);  // Espera 2 segundos

  analogWrite(motorPin, 255);  // Motor funcionando a máxima velocidad
  delay(2000);  // Espera 2 segundos

  analogWrite(motorPin, 0);  // Motor apagado
  delay(2000);  // Espera 2 segundos
}

 

Este código controla un motor DC con tres estados: velocidad media, velocidad máxima y apagado. La clave aquí es el uso del analogWrite() para modificar la velocidad del motor.

Manipulación Avanzada de PWM: Controlando los Temporizadores

El PWM en Arduino está controlado por los temporizadores internos de la placa. Cada pin PWM está asociado a uno de estos temporizadores (Timer0, Timer1, Timer2, etc.). Si quieres un control más preciso sobre las señales PWM, puedes manipular directamente estos temporizadores, aunque esto requiere un conocimiento más profundo de los registros del microcontrolador AVR.

Aquí tienes un ejemplo básico de cómo ajustar la frecuencia del pin 9 (controlado por Timer1) en un Arduino Uno:

void setup() {
// Configura el pin 9 como salida
pinMode(9, OUTPUT);

// Configura Timer1 para cambiar la frecuencia PWM
TCCR1B = (TCCR1B & 0b11111000) | 0x01;
}

void loop() {
analogWrite(9, 128); // 50% Duty Cycle
}

 

Usando Librerías Externas para Mejorar el Control de PWM

Además de la función `analogWrite()`, hay librerías en Arduino que permiten un control más sofisticado del PWM. Algunas de las librerías más populares incluyen:

PWM.h: Esta librería permite un control más detallado de la frecuencia y el duty cycle de cada pin.
Servo.h: Aunque está más orientada al control de servos, es una buena manera de entender cómo se pueden manejar señales tipo PWM de manera más precisa.

Ejemplos Prácticos de Proyectos PWM

Aquí hay algunos proyectos en los que el PWM juega un papel crucial:

1. Controlador de Ventilador Inteligente: Usando un sensor de temperatura y PWM, puedes construir un ventilador que ajuste su velocidad automáticamente dependiendo de la temperatura.

2. Luces LED Fades Automáticas: Crea un sistema de iluminación donde los LEDs cambian de color o brillo de manera gradual, utilizando PWM para controlar cada color RGB de los LEDs.

3. Brazo Robótico Controlado por Servos: Utiliza señales PWM y la librería `Servo.h` para controlar múltiples servos en un brazo robótico. El PWM es fundamental para mover los servos a posiciones precisas.

4. Generador de Tono: Con un altavoz piezoeléctrico, puedes usar PWM para generar diferentes tonos y crear música o sonidos de advertencia.

Otros artículos relacionados de nuestro Curso Arduino que pueden interesarte: