El periférico de control de LED (LEDC) está diseñado principalmente para controlar la intensidad de los LED, aunque también se puede utilizar para generar señales PWM para otros fines. Tiene 16 canales ( del 0 al 15) que pueden generar formas de onda independientes que se pueden utilizar, por ejemplo, para controlar dispositivos LED RGB.
Esto viene a significar que variando el ciclo de trabajo (duty), variaremos el brillo de un led dentro de una frecuencia recomendable entre 1 y 10 Khz, en los ejemplos se utiliza siempre 5 Khz, pero si lo que queremos es variar la velocidad de un motor paso a paso, lo que variaremos es la frecuencia como se muestra en mi proyecto de control de tres motores .
Los canales LEDC se dividen en dos grupos de 8 canales cada uno. Un grupo de canales LEDC opera en modo de alta velocidad. Este modo está implementado en hardware y ofrece un cambio automático y sin fallas del ciclo de trabajo de PWM. El otro grupo de canales opera en modo de baja velocidad, el ciclo de trabajo de PWM debe ser cambiado por el controlador en el software. Cada grupo de canales también puede utilizar diferentes fuentes de reloj.
El “duty” puede tener resoluciones de 1 a 16 bits. Si se usa resolución de 8 bits, podría controlar el brillo de un LED con un valor de 0 a 255 (28-1). Con 10 bits “duty=210-1=1023″.
Para expresar la resolución acudimos a ledc_timer_bit_t
.
PRIMER EJEMPLO
Declararemos tres constantes: la frecuencia el canal y la resolución, por eso “ledcSetup” lo situamos en “void setup”. Igualmente con “ledAttachPin”. En el “void Loop” situaremos la función “for” con una variacion en incremento y decremento entre 0 y 255 y la api “ledcWrite”
// the number of the LED pin
const int ledPin = 4; // 16 corresponds to GPIO4
// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
void setup(){
// configure LED PWM functionalitites
ledcSetup(ledChannel, freq, resolution);
// attach the channel to the GPIO to be controlled
ledcAttachPin(ledPin, ledChannel);
}
void loop(){
// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
}
EJEMPLO 2
Este sketch es el que viene dentro del ide Arduino seccion esp32, y utiliza la funcion “ledcAnalogWrite”
/*
LEDC Software Fade
This example shows how to software fade LED
using the ledcWrite function.
*/
// use first channel of 16 channels (started from zero)
#define LEDC_CHANNEL_0 0
// use 13 bit precission for LEDC timer
#define LEDC_TIMER_13_BIT 13
// use 5000 Hz as a LEDC base frequency
#define LEDC_BASE_FREQ 5000
// fade LED PIN (replace with LED_BUILTIN constant for built-in LED)
#define LED_PIN 4
int brightness = 0; // how bright the LED is
int fadeAmount = 5; // how many points to fade the LED by
// Arduino like analogWrite
// value has to be between 0 and valueMax
void ledcAnalogWrite(uint8_t channel, uint32_t value, uint32_t valueMax = 255) {
// calculate duty, 8191 from 2 ^ 13 - 1
uint32_t duty = (8191 / valueMax) * min(value, valueMax);
// write duty to LEDC
ledcWrite(channel, duty);
}
void setup() {
// Setup timer and attach timer to a led pin
ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);
ledcAttachPin(LED_PIN, LEDC_CHANNEL_0);
}
void loop() {
// set the brightness on LEDC channel 0
ledcAnalogWrite(LEDC_CHANNEL_0, brightness);
// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;
// reverse the direction of the fading at the ends of the fade:
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
La frecuencia PWM de 5 kHz puede tener la resolución máxima de trabajo de 13 bits. Esto significa que el “duty cycle” se puede establecer en cualquier lugar de 0 a 100% con una resolución de ~ 0.012% (2 ** 13 = 8192 niveles discretos de la intensidad del LED). Sin embargo, tenga en cuenta que estos parámetros dependen de la señal de reloj que marca el temporizador del controlador LED PWM que, a su vez, sincroniza el canal (consulte la configuración del temporizador y el Manual de referencia técnica de ESP32
El LEDC se puede utilizar para generar señales a frecuencias mucho más altas que sean suficientes para sincronizar otros dispositivos, por ejemplo, un módulo de cámara digital. En este caso, la frecuencia máxima disponible es de 40 MHz con una resolución de servicio de 1 bit. Esto significa que el ciclo de trabajo se fija al 50% y no se puede ajustar.
EJEMPLO 3:
En este ejempo solo variaremos la frecuencia para obtener un barrido de ondas cuadradas entre 100hz y 10 Khz en saltos de 100 Hz. Ajustaremos el valor de “delay” para ajustar el tiempo de muestreo. Lo importante es colocar el “ledcSetup” en el “void loop” para que la freq pueda variar en cada incremento y sacar por el pin 4 la señal PWM .
const int ledPin = 4;
int dutyCycle = 127;// no influye para nuestro proposito
// setting PWM properties
int freq = 100;
const int ledChannel = 0;// eleccion canal 0
const int resolution = 8;// Con esta resolución tendrán respuesta buena tanto bajas como altas frecuencias
void setup() {
// configure LED PWM functionalitites
ledcSetup(ledChannel, freq, resolution);
// attach the channel to the GPIO to be controlled
ledcAttachPin(ledPin, ledChannel);
}
void loop() {
for (freq = 100; freq <= 10000; freq = freq + 100) {//INCREMENTO DE 100 EN 100 hZ)
ledcSetup(ledChannel, freq, resolution);
ledcWrite(ledChannel, dutyCycle);
delay(50);
}
}