ESP32 PWM con Arduino IDE (salida analógica)

¿Quieres aprender a utilizar la función PWM de tu ESP32 con Arduino IDE para crear salidas analógicas? ¡Has llegado al lugar indicado! En este artículo te explicaremos paso a paso cómo configurar y utilizar esta herramienta para lograr resultados increíbles en tus proyectos. ¡No te lo pierdas!

Aprenda a generar señales PWM con ESP32 y Arduino IDE. Te explicamos dos métodos diferentes: escritura analogica y usando el API LEDC. Como ejemplo, construyamos un circuito simple para atenuar un LED.

ESP32 PWM con Arduino IDE (salida analógica)

Actualizado el 11 de junio de 2024

Antes de continuar con este tutorial, debes tener el complemento ESP32 instalado en tu IDE de Arduino. Siga el siguiente tutorial para instalar ESP32 en el IDE de Arduino si aún no lo ha hecho.

  • Instalación de la placa ESP32 en Arduino IDE 2 (Windows, Mac OS X, Linux)

Este tutorial es compatible con el complemento de la placa ESP32 desde la versión 3.X; obtenga más información en nuestra guía de migración.

Tabla de contenido

Piezas requeridas

Para seguir este tutorial necesitarás estas piezas:

Puedes utilizar los enlaces anteriores o ir directamente MakerAdvisor.com/tools ¡Para encontrar todas las piezas para tus proyectos al mejor precio!

ESP32 PWM con Arduino IDE (salida analógica)

Controlador ESP32 LED PWM

El ESP32 cuenta con un controlador LED PWM con 6 a 16 canales independientes (dependiendo del modelo de ESP32), que se puede configurar para generar señales PWM con diferentes características.

Hay varias funciones que puede utilizar para generar señales PWM y lograr los mismos resultados. Puedes usar escritura analogica (como en las placas Arduino) o puedes usar funciones LEDC.

escritura analogica

La función más básica es escritura analogica La herramienta acepta como argumentos el GPIO donde se desea generar la señal PWM y el valor del ciclo de trabajo (que va de 0 a 255).

void analogWrite(uint8_t pin, int value);

Por ejemplo:

void analogWrite(2, 180);

Configuración de la frecuencia y la resolución

Puede ajustar la resolución y la frecuencia de la señal PWM en un pin seleccionado resolución de escritura analógica Y frecuencia de escritura analógica Características.

Cómo configurar la resolución:

void analogWriteResolution(uint8_t pin, uint8_t resolution);

Cómo configurar la frecuencia:

void analogWriteFrequency(uint8_t pin, uint32_t freq);

Funciones LEDC

Alternativamente, puede utilizar la API LEDC Arduino-ESP32. Primero necesitas configurar un pin LEDC. Usted puede hacer eso ledcAgregar o ledcAttachChannel Características.

ledcAgregar

El ledcAgregar La función configura un pin LEDC con una frecuencia y resolución específicas. El canal LEDC se selecciona automáticamente.

bool ledcAttach(uint8_t pin, uint32_t freq, uint8_t resolution);

Esta función devuelve VERDADERO si la configuración es exitosa. Si INCORRECTO se devuelve, se produce un error y el canal LEDC no está configurado.

ledcAttachChannel

Si prefiere configurar el canal LEDC manualmente, puede hacerlo usando el ledcAttachChannel funcionar en su lugar.

bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t channel);

Esta función devuelve VERDADERO si la configuración es exitosa. Si INCORRECTO se devuelve, se produce un error y el canal LEDC no está configurado.

ledcEscribir

Después de configurar el pin LEDC con una de las dos funciones anteriores, use el ledcEscribir Función para ajustar el ciclo de trabajo de la señal PWM.

void ledcWrite(uint8_t pin, uint32_t duty);

Esta función devuelve VERDADERO si la configuración del ciclo de trabajo fue exitosa. Si INCORRECTO se devuelve, se produce un error y no se establece el ciclo de trabajo.

Puede encontrar más información y todas las funciones del controlador LEDC PWM aquí Consulta la documentación oficial..

Atenuar un LED con el ESP32

Para mostrarle cómo generar señales PWM con el ESP32, creemos dos ejemplos simples que atenúan el brillo de un LED (aumentan y disminuyen el brillo con el tiempo). Mostramos un ejemplo con escritura analogica y otro utilizando las funciones LEDC.

Esquema

Conecte un LED a su ESP32 como se muestra en el diagrama de cableado a continuación. El LED debe estar conectado a GPIO 16.

ESP32 PWM con Arduino IDE (salida analógica)

(Este esquema utiliza la versión del módulo ESP32 DEVKIT V1 con 30 GPIO; si está utilizando un modelo diferente, verifique la distribución de pines de la placa que está utilizando).

Nota: Puede utilizar cualquier pin siempre que pueda actuar como salida. Todos los pines que pueden actuar como salidas se pueden utilizar como pines PWM. Para obtener más información sobre los GPIO de ESP32, consulte: Referencia de distribución de pines de ESP32: ¿Qué pines GPIO debería utilizar?

Ejemplo de ESP32 PWM con código de escritura analógica

Abra su IDE de Arduino y copie el siguiente código. En este ejemplo, el brillo del LED aumenta y disminuye con el tiempo. Esta voluntad escritura analogica Función.

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp32-pwm-arduino-ide/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.  
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/

// the number of the LED pin
const int ledPin = 16;  // 16 corresponds to GPIO 16

void setup() {
  // set the LED as an output
  pinMode(ledPin, OUTPUT);
}

void loop(){
  // increase the LED brightness
  for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){   
    // changing the LED brightness with PWM
    analogWrite(ledPin, dutyCycle);
    delay(15);
  }

  // decrease the LED brightness
  for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
    // changing the LED brightness with PWM
    analogWrite(ledPin, dutyCycle);
    delay(15);
  }
}

Ver código sin formato

Se empieza definiendo el pin al que está conectado el LED. En este ejemplo, el LED está conectado a GPIO 16.

const int ledPin = 16;  // 16 corresponds to GPIO 16

En el configuración()necesita configurar el LED como salida mediante modo pin() Función.

pinMode(ledPin, OUTPUT);

En el Cinta()varíe el ciclo de trabajo entre 0 y 255 para aumentar el brillo del LED.

// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){   
  // changing the LED brightness with PWM
  analogWrite(ledPin, dutyCycle);
  delay(15);
}

Tenga en cuenta el uso de la escritura analógica() Función de configuración del ciclo de trabajo. Solo necesita pasar el pin del LED y el ciclo de trabajo como argumentos.

analogWrite(ledPin, dutyCycle);

Finalmente, variamos el ciclo de trabajo entre 255 y 0 para reducir el brillo.

// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
  // changing the LED brightness with PWM
  analogWrite(ledPin, dutyCycle);
  delay(15);
}

Probando el ejemplo

Sube el código a tu ESP32. Asegúrese de haber seleccionado la placa y el puerto COM correctos. Mira tu circuito. Debería tener un LED más tenue que aumente y disminuya su brillo con el tiempo.


Ejemplo de ESP32 PWM con el código API LEDC

Abra su IDE de Arduino y copie el siguiente código. Este ejemplo aumenta y disminuye el brillo del LED con el tiempo utilizando las funciones LEDC ESP32.

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp32-pwm-arduino-ide/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.  
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/

// the number of the LED pin
const int ledPin = 16;  // 16 corresponds to GPIO16

// setting PWM properties
const int freq = 5000;
const int resolution = 8;
 
void setup(){
  // configure LED PWM
  ledcAttach(ledPin, freq, resolution);
  
  // if you want to attach a specific channel, use the following instead
  //ledcAttachChannel(ledPin, freq, resolution, 0);
}
 
void loop(){
  // increase the LED brightness
  for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){   
    // changing the LED brightness with PWM
    ledcWrite(ledPin, dutyCycle);
    delay(15);
  }

  // decrease the LED brightness
  for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
    // changing the LED brightness with PWM
    ledcWrite(ledPin, dutyCycle);   
    delay(15);
  }
}

Ver código sin formato

Se empieza definiendo el pin al que está conectado el LED. En este ejemplo, el LED está conectado a GPIO 16.

const int ledPin = 16;

Establece las características de PWM: frecuencia y resolución.

// setting PWM properties
const int freq = 5000;
const int resolution = 8;

Como utilizamos una resolución de 8 bits, el ciclo de trabajo se controla con un valor de 0 a 255.

En el configuración()configure el pin LEDC – use el ledcAgregar Funciona de la siguiente manera.

ledcAttach(ledPin, freq, resolution);

Esto configurará el pin LEDC con la frecuencia y resolución previamente definidas en un canal PWM estándar.

Si desea configurar el canal PWM usted mismo, utilice ledcAttachChannel en cambio. El último argumento de esta función es el número del canal PWM.

ledcAttachChannel(ledPin, freq, resolution, 0);

Finalmente en Cinta()aumentar y disminuir el brillo del LED con el tiempo.

Las siguientes líneas aumentan el brillo del LED.

// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){   
  // changing the LED brightness with PWM
  ledcWrite(ledPin, dutyCycle);
  delay(15);
}

Tenga en cuenta el uso de la escritura analógica() Función de configuración del ciclo de trabajo. Solo necesita pasar el pin del LED y el ciclo de trabajo como argumentos.

analogWrite(ledPin, dutyCycle);

Finalmente, variamos el ciclo de trabajo entre 255 y 0 para reducir el brillo.

// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
  // changing the LED brightness with PWM
  ledcWrite(ledPin, dutyCycle);   
  delay(15);
}

Probando el ejemplo

Sube el código a tu ESP32. Asegúrese de haber seleccionado la placa y el puerto COM correctos. Mira tu circuito. Debería tener un LED más tenue que aumente y disminuya su brillo con el tiempo, como en el ejemplo anterior.


Envolver

En resumen, en este artículo ha aprendido cómo utilizar el controlador LED PWM del ESP32 con el IDE de Arduino para atenuar un LED. Los conceptos aprendidos se pueden utilizar para controlar otras salidas con PWM configurando las características correctas de la señal.

Tenemos otros recursos de ESP32 que te pueden gustar:

  • Comenzando con el módulo de desarrollo ESP32
  • Referencia de distribución de pines de ESP32: ¿Qué pines GPIO debería utilizar?
  • Entradas y salidas digitales de ESP32 (Arduino IDE)
  • ESP32 ADC: lea valores analógicos con Arduino IDE
  • ESP32 con sensor de movimiento PIR mediante interrupciones y temporizadores
  • Más tutoriales y proyectos de ESP32

Este es un extracto de nuestro curso: Aprendiendo ESP32 con Arduino IDE. Si te gusta ESP32 y quieres aprender más sobre él, te recomendamos apuntarte al curso Aprende ESP32 con Arduino IDE.

Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

Generación de señales PWM con ESP32 utilizando Arduino IDE

Aprende a generar señales PWM con el ESP32 utilizando Arduino IDE. Explicaremos dos métodos diferentes: utilizando analogWrite y utilizando la API LEDC. Como ejemplo, construiremos un circuito simple para atenuar un LED.

Tabla de Contenidos

Controlador PWM del ESP32

El ESP32 tiene un controlador LED PWM con 6 a 16 canales independientes (dependiendo del modelo ESP32) que se pueden configurar para generar señales PWM con diferentes propiedades. Hay diferentes funciones que se pueden utilizar para generar señales PWM y lograr los mismos resultados. Puedes utilizar analogWrite (como en placas Arduino) o puedes utilizar funciones LEDC.

analogWrite

La función más básica es analogWrite, que acepta como argumentos el GPIO donde deseas generar la señal PWM y el valor del ciclo de trabajo (que va de 0 a 255).

Función analogWrite: void analogWrite(uint8_t pin, int value).

Ejemplo: void analogWrite(2, 180).

Puedes configurar la resolución y frecuencia de la señal PWM en un pin seleccionado utilizando las funciones analogWriteResolution y analogWriteFrequency.

  • Configurar resolución: void analogWriteResolution(uint8_t pin, uint8_t resolution).
  • Configurar frecuencia: void analogWriteFrequency(uint8_t pin, uint32_t freq).

Funciones LEDC

De manera alternativa, puedes utilizar la API LEDC de Arduino-ESP32. Primero, necesitas configurar un pin LEDC. Puedes utilizar las funciones ledcAttach o ledcAttachChannel.

Función ledcAttach: bool ledcAttach(uint8_t pin, uint32_t freq, uint8_t resolution).

Función ledcAttachChannel: bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t channel).

Finalmente, después de configurar el pin LEDC utilizando una de las dos funciones anteriores, utiliza la función ledcWrite para configurar el ciclo de trabajo de la señal PWM.

Función ledcWrite: void ledcWrite(uint8_t pin, uint32_t duty).

Atenuar un LED con el ESP32

Para mostrarte cómo generar señales PWM con el ESP32, crearemos dos ejemplos simples que atenúan el brillo de un LED (aumentan y disminuyen el brillo con el tiempo). Proporcionaremos un ejemplo utilizando analogWrite y otro utilizando las funciones LEDC.

Esquemático:

Conecta un LED a tu ESP32 como se muestra en el siguiente diagrama esquemático. El LED debe estar conectado al GPIO 16.

(Este esquema utiliza el módulo ESP32 DEVKIT V1 con 30 GPIOs. Si estás utilizando otro modelo, verifica el pinout para la placa que estés utilizando).

Ejemplo PWM de ESP32 utilizando analogWrite – Código

Abre tu Arduino IDE y copia el siguiente código. Este ejemplo aumenta y disminuye el brillo del LED con el tiempo utilizando la función analogWrite.

  1. Definir el pin al que está conectado el LED.
  2. Configurar el LED como salida en el setup().
  3. Variar el ciclo de trabajo para aumentar y disminuir el brillo en el loop().

Código disponible en el enlace: https://RandomNerdTutorials.com/esp32-pwm-arduino-ide/.

Ejemplo PWM de ESP32 utilizando la API LEDC – Código

Abre tu Arduino IDE y copia el siguiente código. Este ejemplo aumenta y disminuye el brillo del LED con el tiempo utilizando las funciones LEDC de ESP32.

  1. Definir el pin al que está conectado el LED.
  2. Configurar las propiedades PWM (frecuencia y resolución).
  3. Configurar el pin LEDC en el setup().
  4. Variar el ciclo de trabajo para aumentar y disminuir el brillo en el loop().

Código disponible en el enlace: https://RandomNerdTutorials.com/esp32-pwm-arduino-ide/.

Conclusión

En resumen, en este artículo has aprendido cómo utilizar el controlador LED PWM del ESP32 con Arduino IDE para atenuar un LED. Los conceptos aprendidos se pueden utilizar para controlar otras salidas con PWM configurando las propiedades correctas de la señal.

Para más información y recursos sobre el ESP32, te recomendamos visitar el enlace: https://RandomNerdTutorials.com/esp32-resources.

2 comentarios en «ESP32 PWM con Arduino IDE (salida analógica)»

  1. ¡Excelente explicación de cómo utilizar la función PWM con el ESP32 en Arduino IDE! Me resultó muy fácil de seguir y ahora puedo utilizar salidas analógicas sin problemas. ¡Gracias por el aporte!

Deja un comentario