#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/adc.h"
#include "driver/ledc.h"
#include "esp_err.h"
#define POTENTIOMETER_ADC_CHANNEL ADC1_CHANNEL_2 // GPIO15 -> ADC1_CHANNEL_2
#define LEDC_OUTPUT_IO 16 // GPIO16
#define LEDC_TIMER LEDC_TIMER_0
#define LEDC_MODE LEDC_HIGH_SPEED_MODE
#define LEDC_CHANNEL LEDC_CHANNEL_0
#define LEDC_DUTY_RES LEDC_TIMER_10_BIT // Resolução de 10 bits (0-1023)
#define LEDC_FREQUENCY 5000 // 5 kHz
void app_main(void)
{
// 1. Configurar o ADC
adc1_config_width(ADC_WIDTH_BIT_12); // Resolução de 12 bits (0-4095)
adc1_config_channel_atten(POTENTIOMETER_ADC_CHANNEL, ADC_ATTEN_DB_11); // Atenuação para 3.3V
// 2. Configurar PWM com LEDC
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_MODE,
.duty_resolution = LEDC_DUTY_RES,
.timer_num = LEDC_TIMER,
.freq_hz = LEDC_FREQUENCY,
.clk_cfg = LEDC_AUTO_CLK
};
ledc_timer_config(&ledc_timer);
ledc_channel_config_t ledc_channel = {
.speed_mode = LEDC_MODE,
.channel = LEDC_CHANNEL,
.timer_sel = LEDC_TIMER,
.intr_type = LEDC_INTR_DISABLE,
.gpio_num = LEDC_OUTPUT_IO,
.duty = 0,
.hpoint = 0
};
ledc_channel_config(&ledc_channel);
while (1) {
// 3. Ler valor do potenciômetro
int adc_reading = adc1_get_raw(POTENTIOMETER_ADC_CHANNEL);
// 4. Converter para PWM (10 bits)
uint32_t duty = (adc_reading * 1023) / 4095;
// 5. Atualizar duty cycle do PWM
ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty);
ledc_update_duty(LEDC_MODE, LEDC_CHANNEL);
printf("ADC: %d -> Duty: %d\n", adc_reading, duty);
vTaskDelay(pdMS_TO_TICKS(100));
}
}