CotroCar/main/pwm_led.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);
}