70 lines
2.2 KiB
C
70 lines
2.2 KiB
C
#include <stdio.h>
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/task.h"
|
|
#include "driver/ledc.h"
|
|
#include "esp_err.h"
|
|
#include "esp_log.h"
|
|
|
|
#define LEDC_TIMER LEDC_TIMER_0
|
|
#define LEDC_MODE LEDC_LOW_SPEED_MODE
|
|
#define LEDC_OUTPUT_IO (13) // IO13 对应的引脚
|
|
#define LEDC_CHANNEL LEDC_CHANNEL_0
|
|
#define LEDC_DUTY_RES LEDC_TIMER_13_BIT // 设置占空比分辨率为 13 位
|
|
#define LEDC_FREQUENCY (5000) // PWM 频率设置为 5 kHz
|
|
|
|
const char* TAG = "pwm_led";
|
|
|
|
extern bool is_broadcast;
|
|
|
|
void LedPwmSet(void *pvParameters) {
|
|
// 配置 LEDC 定时器
|
|
ledc_timer_config_t ledc_timer = {
|
|
.duty_resolution = LEDC_DUTY_RES, // 分辨率
|
|
.freq_hz = LEDC_FREQUENCY, // 频率
|
|
.speed_mode = LEDC_MODE, // 模式
|
|
.timer_num = LEDC_TIMER // 定时器编号
|
|
};
|
|
ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));
|
|
|
|
// 配置 LEDC 通道
|
|
ledc_channel_config_t ledc_channel = {
|
|
.channel = LEDC_CHANNEL,
|
|
.duty = 0, // 初始占空比为 0
|
|
.gpio_num = LEDC_OUTPUT_IO,
|
|
.speed_mode = LEDC_MODE,
|
|
.hpoint = 0,
|
|
.timer_sel = LEDC_TIMER
|
|
};
|
|
ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
|
|
|
|
// 渐变调光效果
|
|
while (1) {
|
|
if(is_broadcast){
|
|
for (int duty = 0; duty <= (1 << LEDC_DUTY_RES) - 1; duty += 500) {
|
|
ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty));
|
|
ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
|
|
vTaskDelay(pdMS_TO_TICKS(50));
|
|
}
|
|
for (int duty = (1 << LEDC_DUTY_RES) - 1; duty >= 0; duty -= 500) {
|
|
ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty));
|
|
ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));
|
|
vTaskDelay(pdMS_TO_TICKS(50));
|
|
|
|
}
|
|
ESP_LOGI(TAG, "led_pwm: start");
|
|
}
|
|
else {
|
|
ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE,LEDC_CHANNEL,1<<LEDC_DUTY_RES));
|
|
ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE,LEDC_CHANNEL));
|
|
while(!is_broadcast){
|
|
vTaskDelay(pdMS_TO_TICKS(50));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
vTaskDelete(NULL);
|
|
}
|