#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/ledc.h"
#define LED_PIN GPIO_NUM_2
#define LEDC_CHANNEL LEDC_CHANNEL_0
#define LEDC_TIMER LEDC_TIMER_0
#define LEDC_FREQ_HZ 5000
#define LEDC_TIMER_BIT LEDC_TIMER_13_BIT
int fade_amount = 3;
void led_fade() {
/* Timer Configuration */
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_HIGH_SPEED_MODE,
.timer_num = LEDC_TIMER,
.freq_hz = LEDC_FREQ_HZ,
.duty_resolution = LEDC_TIMER_BIT,
.clk_cfg = LEDC_APB_CLK
};
ledc_timer_config(&ledc_timer);
/* Channel Configuration */
ledc_channel_config_t ledc_channel = {
.gpio_num = LED_PIN,
.speed_mode = LEDC_HIGH_SPEED_MODE,
.channel = LEDC_CHANNEL,
.intr_type = LEDC_INTR_DISABLE,
.timer_sel = LEDC_TIMER,
.duty = 0,
.hpoint = 0,
};
ledc_channel_config(&ledc_channel);
/* Change PWM Duty Cycle Using Software */
for (int duty_cycle = 0; duty_cycle <= 255; duty_cycle += fade_amount)
{
ledc_set_duty(ledc_channel.speed_mode, ledc_channel.channel, duty_cycle);
ledc_update_duty(ledc_channel.speed_mode, ledc_channel.channel);
vTaskDelay(20 / portTICK_PERIOD_MS);
}
for (int duty_cycle = 255; duty_cycle >= 0; duty_cycle -= fade_amount)
{
ledc_set_duty(ledc_channel.speed_mode, ledc_channel.channel, duty_cycle);
ledc_update_duty(ledc_channel.speed_mode, ledc_channel.channel);
vTaskDelay(20 / portTICK_PERIOD_MS);
}
}
void app_main() {
while (1)
{
led_fade();
}
}