Fundamentos · 6 min de lectura

¿Qué es PWM? Guía de analogWrite, ciclo de trabajo y frecuencia en Arduino

Qué es PWM (modulación por ancho de pulso) y cómo funciona. Ciclo de trabajo y frecuencia, pines PWM de Arduino, brillo de LED y velocidad de motor con analogWrite, diferencia con los servos, LEDC del ESP32 y PWM de la Pico.

Los pines digitales de Arduino solo conocen dos estados: 0 V o 5 V. Entonces, ¿cómo bajas un LED a la mitad de brillo o haces que un motor gire despacio? La respuesta es el PWM (Pulse Width Modulation, modulación por ancho de pulso). El pin se enciende y se apaga muy deprisa y, cambiando la proporción de tiempo que está encendido, se ajusta la potencia media que llega a la carga. Los reguladores de LED, el control de velocidad de motores, los servos, la generación de sonido e incluso los cargadores de móvil usan esta técnica.

LED controlado con PWM desde Arduino
Con PWM enciendes y apagas un LED cientos de veces por segundo para ajustar su brillo al nivel que quieras.

¿Cómo funciona el PWM?

Una señal PWM es una onda cuadrada: está un rato en HIGH, luego en LOW, y el ciclo se repite sin parar. La duración de un ciclo de encendido y apagado es el periodo, y la proporción del periodo en que la señal está en HIGH es el ciclo de trabajo (duty cycle). Con un 25 % de ciclo de trabajo la señal está encendida una cuarta parte del tiempo, así que un pin de 5 V se comporta de media como 1,25 V. El LED parpadea unas 490 veces por segundo; el ojo no puede seguirlo y solo ve el brillo medio. Un motor, gracias a su inercia, suaviza los pulsos y gira a la velocidad media.

Ciclo de trabajoValor de analogWriteTensión media (5 V)LED
0 %00 VApagado
25 %641,25 VTenue
50 %1272,5 VMedio brillo
75 %1913,75 VBrillante
100 %2555 VBrillo máximo

Nuestros ojos no responden a la luz de forma lineal: notan muy bien los cambios con poca luz y mucho menos con mucha. Por eso un LED al 50 % de ciclo de trabajo parece bastante más brillante que la mitad. Para una atenuación que parezca natural se usa la corrección gamma que verás más abajo.

Frecuencia: ¿qué tan rápido es el PWM?

La frecuencia es cuántas veces por segundo se enciende y apaga la señal. En el Arduino Uno, los pines 5 y 6 funcionan a unos 980 Hz y los pines 3, 9, 10 y 11 a unos 490 Hz. Para un LED es más que suficiente. En los motores, en cambio, 490 Hz está dentro de lo audible y el motor puede silbar un poco; en el ESP32 y la Pico puedes subir la frecuencia a 20 kHz para que no se oiga. Subirla mucho más de lo necesario, eso sí, hace que los transistores y MOSFET se calienten.

PlacaPines PWMFrecuencia por defectoResolución
Arduino Uno / Nano3, 5, 6, 9, 10, 11490 Hz (5 y 6: 980 Hz)8 bits (0–255)
Arduino Mega2–13, 44–46490 Hz (4 y 13: 980 Hz)8 bits (0–255)
ESP32Casi todos los pines de salidaAjustable (analogWrite: 1 kHz)1–16 bits
Raspberry Pi PicoTodos los GPIOAjustable16 bits (0–65535)

Brillo de un LED con analogWrite

En Arduino el PWM se genera con analogWrite(pin, valor), con un valor entre 0 y 255. Aunque el nombre confunde, esta orden no produce una tensión analógica real, sino PWM. Solo funciona en los pines marcados con ~. El código siguiente enciende y apaga un LED despacio con un efecto de «respiración»:

Arduino (C++)
1const int LED_PIN = 9;   // ~ işaretli PWM pini / PWM pin marked with ~
2
3void setup() {
4  pinMode(LED_PIN, OUTPUT);
5}
6
7void loop() {
8  for (int v = 0; v <= 255; v++) {   // yavaşça yan / fade in
9    analogWrite(LED_PIN, v);
10    delay(8);
11  }
12  for (int v = 255; v >= 0; v--) {   // yavaşça sön / fade out
13    analogWrite(LED_PIN, v);
14    delay(8);
15  }
16}
Para una atenuación más natural, eleva el valor al cuadrado: analogWrite(LED_PIN, (long)v * v / 255);. El (long) es importante: en el Uno un int no admite números mayores de 32.767, y 255 × 255 se desborda.

Controlar el brillo con un potenciómetro

Si conectas un potenciómetro a A0, puedes ajustar a mano el brillo del LED. analogRead() devuelve de 0 a 1023; al dividir entre 4 obtienes el rango 0–255 que espera analogWrite. La conexión del potenciómetro está en ¿Qué es un potenciómetro?

Arduino (C++)
1void loop() {
2  int pot = analogRead(A0);   // 0–1023
3  analogWrite(9, pot / 4);    // 0–255
4}

Velocidad de un motor DC con PWM

Hasta un motor DC pequeño consume cientos de miliamperios, mientras que un pin de Arduino solo da con seguridad unos 20 mA. Por eso el motor se maneja con un transistor, un MOSFET o un controlador de motores como el L298N, y la señal PWM va a la entrada de velocidad del controlador. En el L298N esa entrada es el pin ENA (y ENB para el segundo motor); para usar PWM hay que quitarle el puente. Los pines IN1 e IN2 fijan el sentido de giro.

Módulo controlador de motores L298N
Controlador L298N: el PWM en los pines ENA y ENB ajusta por separado la velocidad de dos motores DC.
Arduino (C++)
1const int ENA = 9;   // hız (PWM) / speed (PWM)
2const int IN1 = 8;   // yön / direction
3const int IN2 = 7;
4
5void setup() {
6  pinMode(ENA, OUTPUT);
7  pinMode(IN1, OUTPUT);
8  pinMode(IN2, OUTPUT);
9  digitalWrite(IN1, HIGH);   // ileri / forward
10  digitalWrite(IN2, LOW);
11}
12
13void loop() {
14  analogWrite(ENA, 255);  delay(2000);   // tam hız / full speed
15  analogWrite(ENA, 150);  delay(2000);   // orta hız / medium speed
16  analogWrite(ENA, 0);    delay(2000);   // dur / stop
17}
Nunca conectes un motor directamente a un pin de Arduino; la corriente que consume y la tensión inversa que genera destrozan el pin. Además, con ciclos de trabajo muy bajos el motor solo zumba sin girar; la mayoría necesita un valor mínimo de unos 80–120 para arrancar.

¿Servomotor y PWM son lo mismo?

Los servos también se controlan con pulsos, pero con otra lógica: la posición la marca el ancho del pulso, no el ciclo de trabajo. Un servo espera 50 pulsos por segundo (50 Hz); un pulso de 1 milisegundo significa unos 0°, 1,5 ms son 90° y 2 ms son 180°. analogWrite no puede generar esa temporización, por eso los servos usan la librería Servo. Los detalles están en ¿Qué es un servomotor?

Una tensión analógica real a partir del PWM: el filtro RC

A veces necesitas de verdad una tensión estable, por ejemplo como referencia para un amplificador operacional o para sacar audio. En ese caso pasas el PWM por un filtro paso bajo hecho con una resistencia y un condensador. Con 10 kΩ y 10 µF la constante de tiempo es de 0,1 segundos; la salida queda bastante lisa pero responde despacio a los cambios. Puedes probar otros valores con la calculadora Constante de tiempo RC. El ESP32 clásico tiene además dos DAC en los GPIO 25 y 26 con salida analógica real.

PWM en el ESP32: LEDC

En el ESP32 el PWM lo genera un hardware llamado LEDC, y tú eliges la frecuencia y la resolución. En el núcleo de Arduino 3.x se usan ledcAttach(pin, frecuencia, resolución) y ledcWrite(pin, valor); las versiones 2.x antiguas tenían las órdenes por canales ledcSetup y ledcAttachPin. El ejemplo siguiente atenúa un LED a 5 kHz y 8 bits:

Arduino (C++)
1const int LED_PIN = 2;
2
3void setup() {
4  ledcAttach(LED_PIN, 5000, 8);   // 5 kHz, 8 bit (0–255) — ESP32 Arduino core 3.x
5}
6
7void loop() {
8  for (int d = 0; d <= 255; d++) { ledcWrite(LED_PIN, d); delay(5); }
9  for (int d = 255; d >= 0; d--) { ledcWrite(LED_PIN, d); delay(5); }
10}

PWM en la Raspberry Pi Pico (MicroPython)

En la Pico todos los GPIO pueden dar PWM. En MicroPython se usa la clase PWM: la frecuencia se fija con freq() y el ciclo de trabajo con duty_u16(), que admite valores de 0 a 65535:

MicroPython
1from machine import Pin, PWM
2import time
3
4led = PWM(Pin(15))
5led.freq(1000)                        # 1 kHz
6
7while True:
8    for d in range(0, 65536, 512):    # yavaşça yan / fade in
9        led.duty_u16(d)
10        time.sleep_ms(5)
11    for d in range(65535, -1, -512):  # yavaşça sön / fade out
12        led.duty_u16(d)
13        time.sleep_ms(5)

Ideas de proyectos con PWM

  • LED que respira: una luz de estado que se enciende y apaga despacio, como los aparatos en reposo.
  • Lámpara de escritorio regulable: una lámpara LED cuyo brillo ajustas con un potenciómetro.
  • Ventilador según la temperatura: acelera el ventilador a medida que sube la temperatura medida con un DHT11.
  • Mezcla de colores: crea millones de colores en un LED RGB con tres canales PWM.
  • Coche robot: suaviza los giros ajustando por separado la velocidad de dos motores.
  • Lámpara amanecer: sube poco a poco la luz durante 15 minutos antes de que suene el despertador.

Errores comunes y cómo solucionarlos

  • analogWrite en un pin sin PWM: en el Uno, los pines sin ~ solo pueden estar encendidos o apagados; de 128 hacia arriba cuenta como encendido y por debajo como apagado.
  • Pines 9 y 10 con la librería Servo: en el Uno la librería Servo usa el Timer1 y desactiva el PWM de esos dos pines; pasa el LED o el motor a otro pin PWM.
  • Pines 3 y 11 con tone(): tone() usa el Timer2 y estropea el PWM de esos pines.
  • Conectar un motor directamente a un pin: usa siempre un transistor, un MOSFET o un controlador de motores.
  • Desbordamiento en el cálculo gamma: v * v supera el límite de int; añade la conversión a (long).
  • Creer que el PWM es analógico de verdad: el multímetro muestra la media, pero la señal sigue saltando entre 0 y 5 V; para circuitos sensibles usa un filtro RC o un DAC.

El PWM es una de las ideas más útiles que aprenderás con Arduino: LED, motores, ventiladores y altavoces se controlan con este sencillo truco. Para lo básico, echa un vistazo a ¿Qué es un LED?; en la app BlueGrays encontrarás proyectos de atenuación de LED con PWM, brillo con potenciómetro y transiciones de color RGB, paso a paso y con código.

Preguntas frecuentes

¿Qué es el PWM en pocas palabras?

El PWM ajusta la potencia media que recibe una carga encendiendo y apagando un pin muy deprisa y cambiando la proporción de tiempo que está encendido (el ciclo de trabajo). Así, un pin digital que solo da 0 o 5 V puede atenuar un LED o frenar un motor.

¿Qué pines del Arduino Uno admiten PWM?

En el Uno y el Nano admiten PWM los pines 3, 5, 6, 9, 10 y 11, marcados con ~ en la placa. En el Mega pueden dar PWM los pines 2–13 y 44–46.

¿analogWrite da una salida analógica real?

No. analogWrite genera PWM; el pin salta rápidamente entre 0 y 5 V. Ajusta la tensión media, pero para una tensión realmente estable hay que pasar el PWM por un filtro RC o usar un DAC como el del ESP32.

¿Cómo se calcula el ciclo de trabajo?

El ciclo de trabajo es el tiempo en HIGH dividido entre el periodo completo: (tiempo en HIGH / periodo) × 100. En Arduino se calcula dividiendo el valor de analogWrite entre 255 y multiplicando por 100; por ejemplo, 64 es más o menos un 25 %.

¿Cómo cambio la frecuencia del PWM en Arduino?

analogWrite no cambia la frecuencia. En el Uno puede ajustarse modificando los registros de los temporizadores (por ejemplo, TCCR1B para los pines 9 y 10), pero eso puede afectar a millis y a algunas librerías. En el ESP32 se fija directamente con ledcAttach, y en la Pico con freq().

¿El PWM puede dañar un LED?

No. El LED se enciende con la corriente completa en cada pulso, pero esa corriente ya está limitada por la resistencia en serie y la corriente media baja en proporción al ciclo de trabajo. Con la resistencia correcta, el PWM no acorta la vida del LED.

Ver todos los proyectos
ESP32 LED Fade con PWM
#110Principiante
Premium

ESP32 LED Fade con PWM

Cambiar el brillo del LED suavemente de 0 a max, de max a 0. Controlamos PWM con analogWrite() como en Arduino - la misma sintaxis con ESP32 Arduino Core 3.0+ funciona sin problemas. Pin definición + pinMode + analogWrite es suficiente.

4.8(36)
54
Raspberry Pi Pico PWM LED Fade (Efecto Respiración, GP14)
#160Principiante
Premium

Raspberry Pi Pico PWM LED Fade (Efecto Respiración, GP14)

¡El LED ya no solo parpadea — respira! 🌬️ Con el **PWM** (modulación por ancho de pulso) del Raspberry Pi Pico, el brillo sube y baja lentamente. Aprende la clase machine.PWM, duty_u16() (brillo de 16 bits 0–65535), la frecuencia PWM, bucles range() y salida tipo analógica. Base para mezcla de color RGB, control de motores, servos y buzzer.

0.0(0)
4
Brillo de LED con Potenciómetro en ESP32 (Analógico → PWM)
#115Intermedio
Premium

Brillo de LED con Potenciómetro en ESP32 (Analógico → PWM)

En este proyecto controlamos el brillo de un LED de forma analógica mediante un potenciómetro. El pin ADC del ESP32 lee la tensión de 0-3,3 V procedente del potenciómetro y este valor se convierte en una señal PWM (modulación por ancho de pulso) que se envía al LED. Al girar el potenciómetro, el LED se enciende y se apaga gradualmente. Con Arduino Core 3.0+ se usa directamente `analogWrite()`; en el ESP32-S2/S3, la resolución del ADC es de 12 bits.

4.5(19)
32
Transición de color suave con Led RGB
#40Principiante
Premium

Transición de color suave con Led RGB

Proyecto que crea un suave efecto arco iris cambiando gradualmente los colores del LED RGB con analogWrite. Enseña la lógica de la mezcla de colores y la animación de transiciones con PWM.

4.8(58)
76
ESP32 RGB LED de control
#111Principiante
Premium

ESP32 RGB LED de control

Generación ilimitada de colores con un solo LED RGB en lugar de 3 LEDs separados. Hacemos transición arco iris estableciendo valores R/G/B con analogWrite() como en Arduino. La teoría del color (como rojo+verde=amarillo) se ve de forma práctica.

4.6(28)
50
Raspberry Pi Pico LED RGB Ciclo de Colores (PWM de 3 Canales, GP11-13)
#161Principiante
Premium

Raspberry Pi Pico LED RGB Ciclo de Colores (PWM de 3 Canales, GP11-13)

¡Un LED, millones de colores! 🌈 Un LED RGB contiene 3 LEDs: rojo, verde y azul. Con un canal PWM del Pico para cada uno, los colores se mezclan: rojo + verde = amarillo, verde + azul = cian, los tres = blanco. El LED recorre 8 colores. Aprende múltiples canales PWM, funciones (def), mezcla RGB, conversión de 8 a 16 bits (x257) y cátodo común vs ánodo común.

0.0(0)
6
Servomotor ESP32 (control mediante potenciómetro)
#118Intermedio
Premium

Servomotor ESP32 (control mediante potenciómetro)

En este proyecto controlamos un servomotor SG90 mediante un potenciómetro. Ajustamos el ángulo del servo asignando el valor analógico leído en el potenciómetro al rango de 0 a 180 grados. Gracias a la biblioteca ESP32Servo, cualquier GPIO del ESP32 puede generar una señal PWM. Este es un método de control básico para brazos robóticos, cardanes de cámara y mecanismos de puertas automáticas.

4.3(29)
42
Lámpara con mezclador de colores ESP32 (3 potenciómetros + LED RGB + OLED)
#138Avanzado
Premium

Lámpara con mezclador de colores ESP32 (3 potenciómetros + LED RGB + OLED)

¡Una lámpara mezcladora de colores inteligente que combina el color que quieras girando tres potenciómetros con el ESP32! A medida que giras los potenciómetros de rojo, verde y azul, el LED RGB de cátodo común cambia de color al instante. En la pantalla OLED SSD1306 se muestran en tiempo real los valores de cada color en un rango de 0 a 255, barras de relleno visuales y el código de color HEX para la web (como #FF8040). Un miniestudio de color profesional: enseña la teoría del color RGB, la lect

4.7(6)
10

Aprende cómo un pin digital atenúa un LED y frena un motor, qué significan el ciclo de trabajo y la frecuencia, cómo usar bien analogWrite y cómo funciona el PWM en el ESP32 y la Pico.

¿Qué es PWM? Guía de analogWrite, ciclo de trabajo y frecuencia en Arduino | BlueGrays