乐鑫技术交流
直播中

郭大

10年用户 949经验值
擅长:嵌入式技术
私信 关注
[问答]

ESP32-C6的LEDC PWM讯号在light sleep时无法持续产生是怎么回事?

我使用IDF里的”ledc_basic” example code,并加入了esp_light_sleep_start()进入light sleep。我有参考一些相关问题的帖子,在进入前有设置了ledc timer clock为LEDC_USE_RC_FAST_CLK;及RC_FAST在sleep mode电源打开;并将ledc的gpio 禁止sleep模式。这样的设定,仍无法在light sleep模式下持续产生LEDC讯号。想请问大家是否能提供一些建议? 謝謝。

IDF version: (master)5.4.0
Development board: ESP32-C6-DevKitM-1
Development Platform: Windows, VS Code

底下是我目前使用的程序:Code: Select all
#include #include "freertos/FreeRTOS.h"#include "freertos/task.h"#include "driver/ledc.h"#include "esp_err.h"#include "esp_sleep.h"#define LEDC_TIMER              LEDC_TIMER_0#define LEDC_MODE               LEDC_LOW_SPEED_MODE#define LEDC_OUTPUT_IO          (7) // Define the output GPIO#define LEDC_CHANNEL            LEDC_CHANNEL_0#define LEDC_DUTY_RES           LEDC_TIMER_10_BIT #define LEDC_DUTY               (16) #define LEDC_FREQUENCY          (4000) static void example_ledc_init(void){    // Prepare and then apply the LEDC PWM timer configuration    ledc_timer_config_t ledc_timer = {        .speed_mode       = LEDC_MODE,        .duty_resolution  = LEDC_DUTY_RES,        .timer_num        = LEDC_TIMER,        .freq_hz          = LEDC_FREQUENCY,          .clk_cfg          = LEDC_USE_RC_FAST_CLK    };    ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));    // Prepare and then apply the LEDC PWM channel configuration    ledc_channel_config_t ledc_channel = {        .speed_mode     = LEDC_MODE,        .channel        = LEDC_CHANNEL,        .timer_sel      = LEDC_TIMER,        .intr_type      = LEDC_INTR_DISABLE,        .gpio_num       = LEDC_OUTPUT_IO,        .duty           = 0,         .hpoint         = 0    };    ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));}static void ledc_task(void *args){    // Set the LEDC peripheral configuration    example_ledc_init();    ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, LEDC_DUTY));    ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL));    esp_sleep_pd_config(ESP_PD_DOMAIN_RC_FAST, ESP_PD_OPTION_ON);    gpio_sleep_sel_dis(LEDC_OUTPUT_IO);       while(1)     {        printf("Entering light sleepn");         /* Enter sleep mode */        esp_light_sleep_start();        vTaskDelay(100/portTICK_PERIOD_MS);    }}void app_main(void){    xTaskCreate(ledc_task, "ledc_task", 4096, NULL, 6, NULL);}
                                                                           

回帖(1)

王涛

2024-6-5 17:45:54
根据您提供的信息,您正在使用ESP32-C6开发板和ESP-IDF v5.4.0,并尝试在light sleep模式下持续产生LEDC PWM信号。您已经尝试了一些解决方案,但仍然无法实现。

在这种情况下,我建议您尝试以下步骤:

1. 确保您的ESP-IDF版本是最新的,因为新版本可能修复了一些已知的问题。您可以使用以下命令来更新ESP-IDF:

```
git pull
git submodule update --init --recursive
```

2. 在进入light sleep模式之前,确保您已经正确地配置了LEDC。以下是一些建议的配置:

```c
ledc_timer_config_t ledc_timer = {
    .duty_resolution = LEDC_TIMER_13_BIT, // 设置分辨率为13位
    .freq_hz = 5000, // 设置频率为5000Hz
    .clk_cfg = LEDC_USE_RC_FAST_CLK, // 使用内部快速RC振荡器作为时钟源
    .speed_mode = LEDC_HIGH_SPEED_MODE, // 使用高速模式
    .timer_num = LEDC_TIMER_0 // 使用定时器0
};
ledc_timer_config(&ledc_timer);
```

3. 在进入light sleep模式之前,确保您已经正确地配置了LEDC通道。以下是一些建议的配置:

```c
ledc_channel_config_t ledc_channel = {
    .gpio_num = 4, // 设置GPIO 4为PWM输出
    .speed_mode = LEDC_HIGH_SPEED_MODE, // 使用高速模式
    .channel = LEDC_CHANNEL_0, // 使用通道0
    .intr_type = LEDC_INTR_DISABLE, // 关闭中断
    .timer_sel = LEDC_TIMER_0 // 使用定时器0
};
ledc_channel_config(&ledc_channel);
```

4. 在进入light sleep模式之前,确保您已经正确地设置了LEDC的占空比:

```c
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 50); // 设置占空比为50%
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0); // 更新占空比
```

5. 在进入light sleep模式之前,确保您已经正确地启用了LEDC:

```c
ledc_fade_func_install();
```

6. 在进入light sleep模式时,确保您已经正确地设置了唤醒源。以下是一些建议的设置:

```c
esp_light_sleep_start();
```

7. 如果以上步骤仍然无法解决问题,您可以尝试在ESP-IDF的GitHub仓库中查找类似的问题或报告新的issue,以便获得更多帮助。

希望这些建议能帮助您解决问题。如果您有其他问题,请随时提问。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分