92 lines
2.4 KiB
C
92 lines
2.4 KiB
C
#include <stdio.h>
|
|
#include <stdint.h>
|
|
|
|
#include "sdkconfig.h"
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/task.h"
|
|
#include "freertos/event_groups.h"
|
|
#include "driver/ledc.h"
|
|
|
|
#define LED_R_PIN (4)
|
|
#define LED_G_PIN (3)
|
|
#define LED_B_PIN (5)
|
|
|
|
#define LED_R_CHANNEL LEDC_CHANNEL_0
|
|
#define LED_G_CHANNEL LEDC_CHANNEL_1
|
|
#define LED_B_CHANNEL LEDC_CHANNEL_2
|
|
|
|
#define FADE_MS 250
|
|
|
|
TaskHandle_t xTaskDiscoLEDHandle = NULL;
|
|
void vTaskDiscoLED(void *pvParameters) {
|
|
ledc_timer_config_t ledc_timer = {
|
|
.duty_resolution = LEDC_TIMER_13_BIT,
|
|
.freq_hz = 7500,
|
|
.speed_mode = LEDC_LOW_SPEED_MODE,
|
|
.timer_num = LEDC_TIMER_0,
|
|
.clk_cfg = LEDC_AUTO_CLK
|
|
};
|
|
|
|
ledc_timer_config(&ledc_timer);
|
|
|
|
ledc_channel_config_t ledc_channels[3] = {
|
|
{
|
|
.channel = LED_R_CHANNEL,
|
|
.duty = 0,
|
|
.gpio_num = LED_R_PIN,
|
|
.speed_mode = LEDC_LOW_SPEED_MODE,
|
|
.hpoint = 0,
|
|
.timer_sel = LEDC_TIMER_0,
|
|
.flags.output_invert = 0
|
|
},
|
|
{
|
|
.channel = LED_G_CHANNEL,
|
|
.duty = 0,
|
|
.gpio_num = LED_G_PIN,
|
|
.speed_mode = LEDC_LOW_SPEED_MODE,
|
|
.hpoint = 0,
|
|
.timer_sel = LEDC_TIMER_0,
|
|
.flags.output_invert = 0
|
|
},
|
|
{
|
|
.channel = LED_B_CHANNEL,
|
|
.duty = 0,
|
|
.gpio_num = LED_B_PIN,
|
|
.speed_mode = LEDC_LOW_SPEED_MODE,
|
|
.hpoint = 0,
|
|
.timer_sel = LEDC_TIMER_0,
|
|
.flags.output_invert = 0
|
|
}
|
|
};
|
|
|
|
for(uint8_t i = 0; i < 3; i++) {
|
|
ledc_channel_config(&ledc_channels[i]);
|
|
}
|
|
|
|
ledc_fade_func_install(0);
|
|
|
|
uint32_t pwm_data[3];
|
|
|
|
for(;;) {
|
|
|
|
for(uint8_t i = 0; i < 3; i++) {
|
|
uint32_t pwm_new;
|
|
uint32_t delta;
|
|
do {
|
|
pwm_new = esp_random() / 0x80000; // 0-8191
|
|
if(pwm_new > pwm_data[i]) delta = pwm_new - pwm_data[i];
|
|
else delta = pwm_data[i] - pwm_new;
|
|
} while(delta < 2 * FADE_MS);
|
|
pwm_data[i] = pwm_new;
|
|
}
|
|
|
|
for(uint8_t i = 0; i < 3; i++) {
|
|
ledc_set_fade_with_time(ledc_channels[i].speed_mode,
|
|
ledc_channels[i].channel, pwm_data[i], FADE_MS);
|
|
ledc_fade_start(ledc_channels[i].speed_mode,
|
|
ledc_channels[i].channel, LEDC_FADE_NO_WAIT);
|
|
}
|
|
|
|
vTaskDelay(pdMS_TO_TICKS(FADE_MS));
|
|
}
|
|
} |