Skip to content

第 2 章:无源蜂鸣器(LEDC PWM 音调控制)

2.1 知识要点

  • LEDC(LED Control)外设的定时器与通道配置
  • 通过动态修改 PWM 频率实现音调变化
  • 占空比与音量的关系(50% 占空比驱动无源蜂鸣器)
  • 音符频率表与旋律播放逻辑

2.2 课程内容

无源蜂鸣器需要外部提供特定频率的方波才能发声,频率决定音调。ESP32-S3 的 LEDC 外设可以灵活配置 PWM 频率,非常适合驱动蜂鸣器播放旋律。本章实现 C 大调音阶的上行与下行演奏。

2.3 基础学习

LEDC 外设结构

LEDC 包含 4 个定时器和 8 个通道(低速模式):

  • 定时器:配置时钟源、分辨率(bit 数)、频率
  • 通道:绑定到定时器,配置 GPIO 和占空比

蜂鸣器使用 LEDC_TIMER_1,10-bit 分辨率(1024 步),占空比 512(50%)时输出对称方波。

改变音调只需调用 ledc_set_freq(),无需重新初始化通道。静音时将占空比置 0。

音符频率(Hz)

C4=262  D4=294  E4=330  F4=349
G4=392  A4=440  B4=494  C5=523

2.4 程序学习

初始化定时器与通道:

c
ledc_timer_config_t timer = {
    .speed_mode      = LEDC_LOW_SPEED_MODE,
    .duty_resolution = LEDC_TIMER_10_BIT,
    .timer_num       = LEDC_TIMER_1,
    .freq_hz         = 1000,
    .clk_cfg         = LEDC_AUTO_CLK,
};
ledc_timer_config(&timer);

ledc_channel_config_t ch = {
    .gpio_num   = 42,
    .speed_mode = LEDC_LOW_SPEED_MODE,
    .channel    = LEDC_CHANNEL_2,
    .timer_sel  = LEDC_TIMER_1,
    .duty       = 0,
};
ledc_channel_config(&ch);

播放单个音符:

c
static void buzzer_tone(uint32_t freq_hz, uint32_t duration_ms)
{
    ledc_set_freq(LEDC_LOW_SPEED_MODE, LEDC_TIMER_1, freq_hz);
    ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_2, 512);
    ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_2);
    vTaskDelay(pdMS_TO_TICKS(duration_ms));
    ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_2, 0);
    ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_2);
}

2.5 课程总结

本章学会了使用 LEDC 外设驱动无源蜂鸣器,掌握了通过动态修改频率实现音调控制的方法。LEDC 是 ESP32-S3 上最通用的 PWM 外设,后续章节的 ESC 和舵机控制也将使用它。


Built for OSRCORE robot development board.