开发环境:
idf 5.0
VScode + Espressif IDE
芯片:ESP32-S3
问题:
使用 LEDC 外设,输出 PWM 的时候,将输出频率设置为 1Hz 的时候,配置如下:
// LEDC PWM 定时器配置参数
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_LOW_SPEED_MODE, // 低速模式
.timer_num = LEDC_TIMER_0, // 使用 TIMER0 计数器
.duty_resolution = LEDC_TIMER_14_BIT, // 使用 14bit 的计数位
.freq_hz = 1, // 设置频率 1Hz
.clk_cfg = LEDC_USE_APB_CLK // 使用 APB_CLK 时钟
};
提示错误:
E (342) ledc: requested frequency and duty resolution can not be achieved, try reducing freq_hz or duty_resolution. div_param=0
这个通常是因为目标频率无法使用当前的 .freq_hz 和 .duty_resolution 造成的,但是按照计算,输出 1Hz,使用 14bit 的计数器应该是没问题的才对,即使按照提示,将 duty_resolution 降低也是不行。
但是,将目标设置成 2Hz 或以上就可以。
有点懵逼,上来请教。是否我忽略了什么配置或者哪里理解错了?
附上完整测试代码:
#include <stdio.h>
#include "driver/ledc.h"
void app_main(void)
{
// LEDC PWM 定时器配置参数
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_LOW_SPEED_MODE, // 低速模式
.timer_num = LEDC_TIMER_0, // 使用 TIMER0 计数器
.duty_resolution = LEDC_TIMER_14_BIT, // 使用 14bit 的计数位
.freq_hz = 1, // 设置频率 1Hz
.clk_cfg = LEDC_USE_APB_CLK // 使用 APB_CLK 时钟
};
// LEDC PWM 通道配置参数
ledc_channel_config_t ledc_channel = {
.speed_mode = LEDC_LOW_SPEED_MODE, // 低速模式
.channel = LEDC_CHANNEL_0, // 使用通道 0
.timer_sel = LEDC_TIMER_0, // 使用 TIMER0 计数器
.intr_type = LEDC_INTR_DISABLE, // 禁止 LEDC 中断
.gpio_num = 4, // 使用 GPIO11
.duty = 0, // 设置占空比 0%
.hpoint = 0
};
ledc_timer_config(&ledc_timer);
ledc_channel_config(&ledc_channel);
// 使用 14bit,计数器,最大值是 2^14=16384,占空比 50% 对应的数值是 16384/2-1=8192-1=8191
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 8191); // 设置占空比数值
ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0); // 更新占空比数值,使其生效
}