// Franzininho WiFi ESP-IDF PWM Example
//
// https://wokwi.com/arduino/projects/324607736698372690
//
// Copyright (C) 2022, Anderson Costa
#include <math.h>
#include <stdio.h>
#include "driver/ledc.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "hal/ledc_types.h"
#define LED_PWM_CHANNEL_1 LEDC_CHANNEL_1
#define LED_PWM_CHANNEL_2 LEDC_CHANNEL_2
#define LED_PWM_TIMER LEDC_TIMER_1
#define LED_PWM_BIT_NUM LEDC_TIMER_8_BIT
#define LED_PWM_PIN 15
void led_pwm_init(void)
{
ledc_channel_config_t ledc_channel1 = {0}, ledc_channel2 = {0};
ledc_channel1.gpio_num = LED_PWM_PIN;
ledc_channel1.speed_mode = LEDC_LOW_SPEED_MODE;
ledc_channel1.channel = LED_PWM_CHANNEL_1;
ledc_channel1.intr_type = LEDC_INTR_DISABLE;
ledc_channel1.timer_sel = LED_PWM_TIMER;
ledc_channel1.duty = 0;
ledc_timer_config_t ledc_timer;
ledc_timer.speed_mode = LEDC_LOW_SPEED_MODE;
ledc_timer.duty_resolution = LED_PWM_BIT_NUM;
ledc_timer.timer_num = LED_PWM_TIMER;
ledc_timer.freq_hz = 25000;
ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel1));
ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel2));
ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));
}
void led_pwm_set(float duty_fraction)
{
uint32_t max_duty = (1 << LED_PWM_BIT_NUM) - 1;
uint32_t duty = lroundf(duty_fraction * (float)max_duty);
ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LED_PWM_CHANNEL_1, duty));
ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LED_PWM_CHANNEL_1));
}
extern "C" void app_main()
{
led_pwm_init();
while (1) {
// Increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++) {
// Changing the LED brightness with PWM
led_pwm_set(dutyCycle);
vTaskDelay(3 / portTICK_PERIOD_MS);
}
// Decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--) {
// Changing the LED brightness with PWM
led_pwm_set(dutyCycle);
vTaskDelay(3 / portTICK_PERIOD_MS);
}
}
}