#include <stdio.h>
#include "freertos/FreeRTOS.h" // Librería para el sistema de tareas de FreeRTOS
#include "freertos/task.h" // Librería de FreeRTOS para el manejo de tareas
#include "driver/ledc.h" // Librería para el controlador LEDC (PWM)
#include "hal/adc_types.h" // Librería para tipos de datos del ADC
#include "esp_adc/adc_oneshot.h" // Librería para la conversión de ADC en una sola toma
#include "esp_err.h" // Librería para manejo de errores de ESP-IDF
// Definiciones de configuración para PWM y ADC
#define LEDC_TEMPORIZADOR LEDC_TIMER_0 // Temporizador para PWM
#define LEDC_MODO LEDC_LOW_SPEED_MODE // Modo de baja velocidad
#define LEDC_PIN_SALIDA (5) // GPIO de salida para el LED (PWM)
#define LEDC_CANAL LEDC_CHANNEL_0 // Canal 0 de LEDC
#define LEDC_RESOLUCION LEDC_TIMER_13_BIT // Resolución del PWM (13 bits)
#define LEDC_FRECUENCIA (5000) // Frecuencia del PWM: 5 kHz
// Declaración de variables para el ADC y el duty cycle
uint16_t ciclo_duty; // Ciclo de trabajo del LED (PWM) en función del valor de ADC
int adc_bruto; // Variable para almacenar el valor de ADC
adc_oneshot_unit_handle_t manejador_adc1;
// Función para inicializar y configurar el temporizador y canal de PWM para el LED
static void configuracionPWM(int canal, int pin)
{
// Configuración del temporizador para el PWM
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_MODO, // Modo de velocidad (baja en este caso)
.timer_num = LEDC_TEMPORIZADOR, // Temporizador a usar
.duty_resolution = LEDC_RESOLUCION, // Resolución de 13 bits para el duty cycle
.freq_hz = LEDC_FRECUENCIA, // Frecuencia del PWM (5 kHz)
.clk_cfg = LEDC_AUTO_CLK // Configuración automática del reloj
};
ledc_timer_config(&ledc_timer);
// Configuración del canal de PWM para el LED
ledc_channel_config_t ledc_canal = {
.speed_mode = LEDC_MODO, // Modo de velocidad (baja)
.channel = canal, // Canal 0 de LEDC
.timer_sel = LEDC_TEMPORIZADOR, // Selección del temporizador configurado
.intr_type = LEDC_INTR_DISABLE, // Interrupciones deshabilitadas
.gpio_num = 4, // Pin GPIO para la salida PWM
.duty = 0, // Ciclo de trabajo inicial (0%)
.hpoint = 0 // Punto de inicio (0)
};
ledc_channel_config(&ledc_canal);
}
void configuracionADC(){
// Configuración de la unidad ADC y del canal de lectura
adc_oneshot_unit_init_cfg_t config_inicial_adc1 = {
.unit_id = ADC_UNIT_2, // Unidad ADC a utilizar (Unidad 2)
.ulp_mode = ADC_ULP_MODE_DISABLE // Modo ULP desactivado
};
adc_oneshot_new_unit(&config_inicial_adc1, &manejador_adc1);
adc_oneshot_chan_cfg_t config_canal_adc = {
.bitwidth = ADC_BITWIDTH_11, // Resolución de 11 bits para el ADC
.atten = ADC_ATTEN_DB_12, // Sin atenuación (0 dB)
};
adc_oneshot_config_channel(manejador_adc1, ADC_CHANNEL_2, &config_canal_adc);
}
//controla la intencidad del led
// Calcular el ciclo de trabajo del LED en función de la lectura del ADC
void calculoDutyCycle(){
ciclo_duty = (uint16_t)(adc_bruto * 4); // Escala de 0 a 4094 (para 50% de 13 bits)
// Ajustar el duty cycle (ciclo de trabajo) del PWM
ledc_set_duty(LEDC_MODO, LEDC_CANAL, ciclo_duty);
// Actualizar el ciclo de trabajo para que el LEDC aplique el nuevo valor
ledc_update_duty(LEDC_MODO, LEDC_CANAL);
// Imprimir el valor de duty cycle en la consola
printf("Valor de duty cycle: %u\n", ciclo_duty);
}
void app_main(void)
{
// Inicialización del LED para el control de PWM
configuracionPWM(LEDC_CANAL, LEDC_PIN_SALIDA);
configuracionADC();
// Bucle principal para leer el valor del ADC y ajustar el PWM
while(1) {
// Leer el valor del ADC en bruto (0 a 2047 en 11 bits)
adc_oneshot_read(manejador_adc1, ADC_CHANNEL_2, &adc_bruto);
calculoDutyCycle();
// Esperar 100 ms antes de la siguiente lectura y ajuste
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}