第 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=5232.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 和舵机控制也将使用它。