En este tutorial aprenderás qué es la modulación por ancho de pulsos (PWM) y cómo crear diferentes señales PWM desde tu microcontrolador Arduino, ESP8266 o ESP32.
En dos ejemplos detallados cambias el brillo de un LED y controlas la velocidad de un motor de corriente continua utilizando la señal PWM del microcontrolador.
¿Cómo funciona PWM para microcontroladores?
Las entradas / salidas digitales de su microcontrolador tienen un voltaje constante de 3.3 V (para placas ESP8266 y ESP32) o 5 V (para placas Arduino). Pero en algunos casos, desea controlar el voltaje a un valor específico entre 0 V y el voltaje máximo.
En el caso de PWM, una señal pulsada entre ALTA (3.3V o 5V) y BAJA (0V). La frecuencia a la que la señal cambia entre ALTA y BAJA está definida por la frecuencia PWM. La frecuencia PWM en los pines de Arduino es de 976 ciclos por segundo (Herz), para el ESP8266 hasta 1 kHz y para el ESP32 hasta 40 MHz.
Para generar una señal PWM, utilice la función analogWrite (pin, value). Esta función crea una señal PWM de onda cuadrada. Puede controlar la forma de la señal PWM con el ciclo de trabajo de (valor / 255). Un ciclo de trabajo de 0% a 100% corresponde a un valor entre 0 y 255.
La siguiente tabla muestra en líneas generales la relación entre el ciclo de trabajo y el voltaje de salida promedio si el voltaje máximo es 5V para el microcontrolador Arduino y 3.3V para el microcontrolador ESP8266 y ESP32.
Ciclo de trabajo | Tensión de salida (Arduino) | Tensión de salida (ESP8266 y ESP32) | analogWrite(X) |
---|---|---|---|
0% | 0V | 0V | 0 = 0%*255 |
0,25% | 1,25V | 0,825V | 63,75 = 25%*191,25 |
0,5% | 2,5V | 1,65V | 127,5 = 50%*255 |
0,75% | 3,75V | 2,475V | 191,25 = 75%*255 |
100% | 5V | 3,3V | 255 = 100%*255 |
Usé mi osciloscopio para medir los ciclos de trabajo de la tabla anterior para el voltaje de salida de Arduino. Por lo tanto, conecté el pin digital 11 del Arduino Uno a mi PicoScope y configuré una medida para el ciclo de trabajo. Puede hacer exactamente la misma medición para el ESP8266 o ESP32
El código para la medición rápida es el siguiente. Para cada medición, cambié el valor de la función analogWrite.
Ciclo de trabajo del 0%
Tenga en cuenta que el ciclo de trabajo del 0% se mide al 100% porque no hay onda cuadrada al 0% y también al 100%. Por lo tanto, preste atención a cómo se mide el ciclo de trabajo. En mi caso, necesito ver si el voltaje es 0 al 100% del ciclo de trabajo.

Ciclo de trabajo del 25%

Ciclo de trabajo del 50%

Ciclo de trabajo 75%

Ciclo de trabajo del 100%

La siguiente tabla le brinda una descripción general de todos los componentes y partes que utilicé para este tutorial. Recibo comisiones por compras realizadas a través de los enlaces de esta tabla.
Arduino Nano | Amazon | AliExpress |
Arduino Pro Mini | Amazon | AliExpress |
Arduino Uno | Amazon | AliExpress |
Arduino Mega | Amazon | AliExpress |
ESP32 ESP-WROOM-32 | Amazon | AliExpress |
ESP8266 NodeMCU | Amazon | AliExpress |
ESP8266 WeMos D1 Mini | Amazon | AliExpress |
Resistencia y LED en el paquete | Amazon | AliExpress |
Motor DC | – | AliExpress |
Módulo controlador de motor L298N | – | AliExpress |
Motor de CC con el módulo controlador de motor L298N | Amazon | AliExpress |
Cómo cambiar el brillo de un LED por PWM
En el siguiente ejemplo, queremos cambiar el brillo de un LED cambiando el ciclo de trabajo de la señal PWM relevante.
Los siguientes bocetos impresionantes muestran el circuito realizado con diferentes placas de microcontroladores Arduino, ESP8266 y ESP32. Necesitamos asegurarnos de que el LED esté conectado a un pin de microcontrolador compatible con PWM.
Recomiendo obtener el libro electrónico Hoja de datos del microcontrolador donde puede encontrar los pines para las diferentes placas del microcontrolador, que incluye la información sobre qué pines son capaces de usar PWM. Obtienes el eBook gratis si te suscribes al boletín DIYI0T.
Cableado entre LED y microcontrolador Arduino para PWM
Las siguientes imágenes muestran el cableado entre diferentes placas Arduino, el LED que queremos controlar y una resistencia de 220Ω para evitar que el LED tenga un voltaje demasiado alto.
Para este ejemplo, estoy usando el pin digital 11 que es capaz de crear señales PWM, pero también puede usar cualquier otro pin compatible con PWM.
- Arduino Nano
- Arduino Pro Mini
- Arduino Uno
- Arduino Mega
Arduino Nano

Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini

Arduino Uno

Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega

Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.
Cableado entre LED y microcontrolador ESP8266 para PWM
Las siguientes imágenes muestran la conexión entre diferentes placas ESP8266 como ESP8266 NodeMCU o ESP8266 WeMos D1 Mini y el LED, así como la resistencia de 220Ω.
Necesitamos una resistencia en serie para el LED para evitar que el LED tenga voltajes demasiado altos.
Puede elegir cualquier pin de E / S digital del ESP8266 para este ejemplo, porque todos los pines de E / S digitales del ESP8266 son capaces de crear señales PWM, pero asegúrese de cambiar también el pin en el script del programa. Estoy seleccionando el pin D4 para este ejemplo.
- ESP8266 NodeMCU
- ESP8266 WeMos D1 Mini
ESP8266 NodeMCU

ESP8266 WeMos D1 Mini

Cableado entre LED y microcontrolador ESP32 para PWM
La siguiente imagen muestra el cableado entre la placa del microcontrolador ESP32 ESP-WROOM-32, el LED y la resistencia de 220Ω para evitar que el LED tenga voltajes excesivamente altos.
Dado que cualquier pin de E / S digital en el ESP32 es capaz de crear señales PWM, puede elegir cualquier otro pin digital, pero asegúrese de cambiar el script del programa. En mi caso, conecto el pin 4 del ESP32 al LED.
ESP32 ESP-WROOM-32

Código de programa para cambiar el brillo de un LED por PWM
El código del programa es bastante simple. Necesitamos configurar los pines y algunas variables de tiempo y altura para incrementar el brillo del LED. Si quieres saber cómo cambiar el color de los LED multicolores, utilizando diferentes señales PWM, lo encontrarás en mi tutorial de LED.
int LEDpin = 11; // for Arduino microcontroller //int LEDpin = D4; // for ESP8266 microcontroller //int LEDpin = 4; // for ESP32 microcontroller int bright = 0; // initial value of LED brightness int incremt = 5; // incremental change in PWM frequency int time = 100; // time period the PWM frequency is changing void setup() { pinMode(LEDpin, OUTPUT); // define the LEDpin as output pin } void loop() { analogWrite(LEDpin, bright); // set LED brightness as PWM signal delay(time); // wait for a time period bright = bright + incremt; // increment LED brightness // if the brightness is out of range, reduce brightness if (bright <=0 || bright >=255) incremt = - incremt; }
En la primera parte del código Arduino, definimos el pin que conecta el LED al microcontrolador. Dado que este script es para microcontroladores Arduino, ESP32 y ESP8266, debe comentar dos de las tres primeras líneas que definen el pin.
También necesitamos definir tres variables adicionales:
- brillante: valor inicial de la luminosidad del LED y por tanto 0 para apagar el LED.
- incremento: el cambio incremental de la frecuencia PWM. Con cada incremento, el LED aumenta y disminuye el brillo.
- tiempo: el período en milisegundos para cada ciclo PWM.
En la función de configuración, estamos ajustando el pin, que configuramos como el pin LED al comienzo del script, como el pin de salida para usar el pin con PWM.
Iniciamos la función loop, con la función analogWrite (pin, value) establecemos el valor analógico (onda PWM) para el brillo en el pin LED. Después del retraso de 0,1 segundos, se incrementa el brillo. Si el brillo alcanza el valor mínimo (0) o máximo (255), el incremento cambia de un valor positivo a un valor negativo.
El siguiente video muestra el cambio en el brillo del LED debido a la función PWM.
Cómo controlar la velocidad de un motor de CC mediante PWM
El segundo ejemplo muestra cómo podemos cambiar la velocidad de un motor de CC usando una señal PWM. Usamos el módulo de controlador de motor L298N para conectar Arduino, ESP8266 o ESP32 al motor de CC. También se recomienda alimentar el motor de CC con una fuente de alimentación externa. Por lo tanto, estoy usando 4 pilas AA, cada una con 1,5 V, por lo que en total 6 V.
Quiero centrarme en la señal PWM en este ejemplo. Por lo tanto, no describo más el ejemplo del motor de CC. Pero si está interesado en los motores de CC, escribiré un artículo adicional sobre motores de CC, que lo explica todo en detalle.
Cableado entre el motor de CC y el microcontrolador Arduino para PWM
Las siguientes imágenes muestran las conexiones para controlar la velocidad de un motor de CC a través de la señal PWM del microcontrolador Arduino. El motor de CC está conectado al controlador del motor L298N.
Usamos 4 pilas AA o fuente de alimentación de laboratorio para alimentar el controlador del motor L298N. El microcontrolador Arduino se alimenta a través de USB o también a través de la fuente de alimentación del laboratorio
Para controlar la velocidad y el sentido de giro del motor DC, conectamos los pines ENA, INT1 e INT2 a los pines digitales de la placa Arduino.
- Arduino Nano
- Arduino Pro Mini
- Arduino Uno
- Arduino Mega
Arduino Nano

Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini

Arduino Uno

Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega

Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.
Cableado entre el motor de CC y el microcontrolador ESP8266 para PWM
El cableado entre la placa ESP8266, la fuente de alimentación, el controlador del motor L298N y el motor de CC se muestra en la siguiente imagen.
Se pueden usar cuatro baterías AA de una fuente de alimentación de laboratorio como fuente de alimentación para el controlador del motor. La tarjeta ESP8266 se alimenta mediante la conexión USB y la masa está conectada entre ellos.
La velocidad y la dirección de rotación del motor de CC se controlan a través de los pines ENA, INT1 e INT2 del controlador del motor L298N y se conectan a los pines digitales de la placa ESP8266. El motor de CC en sí está conectado directamente al controlador del motor.
- ESP8266 NodeMCU
- ESP8266 WeMos D1 Mini
ESP8266 NodeMCU

ESP8266 WeMos D1 Mini

Cableado entre el motor de CC y el microcontrolador ESP32 para PWM
La siguiente imagen muestra cómo conectar un motor de CC al ESP32 ESP-WROOM-32. Para la fuente de alimentación de 6 V, puede utilizar 4 pilas AA o una fuente de alimentación de laboratorio. La tarjeta ESP32 se alimenta mediante la conexión USB o también mediante la fuente de alimentación del laboratorio.
Para controlar el motor de CC, no podemos conectar el motor de CC directamente al ESP32, pero necesitamos el controlador de motor L298N. Los pines ENA, INT1 e INT2 para controlar la velocidad y el sentido de rotación del motor de CC están conectados a tres pines digitales del ESP32. Luego, el motor de CC se conecta al controlador del motor L298N.
ESP32 ESP-WROOM-32

Código de programa para controlar la velocidad de un motor de CC por PWM
Para el código del programa, queremos aumentar la velocidad del motor cada segundo. En el arranque, el voltaje suministrado por la señal PWM es demasiado bajo para arrancar el motor. Esta es la razón por la que se necesitan algunos intervalos en el bucle for hasta que el motor esté en funcionamiento.
// Arduino connection to L298N int enA = 10; // PWM for Motor A int in1 = 9; // Control Rotation of Motor A int in2 = 8; // Control Rotation of Motor A // ESP8266 connection to L298N //int enA = D4; // PWM for Motor A //int in1 = D5; // Control Rotation of Motor A //int in2 = D6; // Control Rotation of Motor A // ESP32 connection to L298N //int enA = 4; // PWM for Motor A //int in1 = 0; // Control Rotation of Motor A //int in2 = 2; // Control Rotation of Motor A int motor_speed = 0; void setup() { // set all the motor control pins to outputs pinMode(enA, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); } void loop() { // run the motor between 0 and 250 in increments of 10 digitalWrite(in1, LOW); // Input1 LOW = move forward digitalWrite(in2, HIGH); // Input2 HIGH = move forward for(motor_speed = 0; motor_speed < 250; motor_speed += 10) { analogWrite(enA, motor_speed); // PWM output delay(1000); } }
En la primera parte del script, definimos los pines que conectan el microcontrolador al módulo L298N, que está conectado al motor de CC. En total, necesitamos definir 3 pines:
- enA: transfiere la señal PWM al módulo L298N y debe ser un pin capaz de producir una señal PWM.
- int1 e int2: controlan la dirección de rotación del motor. La siguiente tabla muestra cómo controlar int1 e int2 para detener el motor, avanzar y retroceder.
Como este script es para placas de microcontroladores Arduino, EPS8266 y ESP32, debe seleccionar solo las filas para su microcontrolador y comentar las otras filas. El script real está comentado de alguna manera, es decir, para placas Arduino.
Para aumentar la velocidad del motor, la velocidad debe almacenarse en una variable que llamamos motor_speed y que tiene un valor inicial de 0.
En la función de configuración definimos como salidas todos los pines digitales que conectan la placa al L298N.
Comenzamos la función de bucle configurando int1 LOW e int2 HIGH. Por lo tanto, el motor de CC gira hacia adelante. En el bucle for, aumentamos la velocidad del motor cada segundo en 10 entre 0 y 250. La velocidad del motor se escribe como una salida analógica (señal PWM) en la conexión enA.
El siguiente video muestra el script Arduino en acción para Arduino Uno como ejemplo.
Conclusión
Espero que hayas recomendado este artículo sobre la señal PWM. La señal PWM es una herramienta muy útil que se usa mucho en ejemplos prácticos. Se recomienda saber cómo funciona PWM. Por lo tanto, si tiene más preguntas, use la sección de comentarios a continuación para hacerlas.