SAMD21G 引脚复用与硬件 PWM(PB11)
📅 2026-08-26 建立 · 来源:确认板上蜂鸣器控制引脚能否硬件 PWM
SAMD21G 简介
- Microchip/Atmel ARM Cortex-M0+ 32 位 MCU,48 pin 封装(SAMD21G18A 等)
- 48MHz 主频,最多 256KB Flash / 32KB SRAM
- 引脚全部多路复用:每个物理引脚可在 GPIO、SERCOM(串口)、TC/TCC(定时器)、ADC 等之间切换
PB11(第 20 脚)复用表
数据手册 I/O Multiplexing 表(与 Arduino Zero 官方 variant 一致,第 24 脚即 PB11):
结论:PB11 可以直接输出硬件 PWM,不是只能 GPIO 电平切换。
| 功能 | 类型 | 说明 |
|---|---|---|
| TC5/WO[1] | 16 位基本定时器 | 单通道方波/PWM,简单够用 |
| TCC0/WO[5] | 高级定时器 | 功能更强(双斜坡、死区插入、通道同步),WO4-7 为主通道扩展输出 |
固件配置要点(硬件 PWM 步骤)
- GCLK:给 TC5/TCC0 配置时钟源和分频
- 定时器寄存器:
PER= 周期(决定频率/音调)CC= 比较值(决定占空比/音量)- PINMUX:把 PB11 从 GPIO 切换为对应外设功能(功能编号字母查 datasheet 的 I/O Multiplexing 表)
配置完成后 PWM 由硬件定时器自动输出,CPU 完全不碰引脚,不需要软件模拟翻转 GPIO。 频率覆盖:几十 Hz ~ 几十 kHz,蜂鸣器常用的 262Hz 到几 kHz 完全在射程内。
⚠️ SAMD21 定时器约束(坑)
同一个 TCC 模块的所有通道共享同一个时基(PER 周期) → TCC0 的各路 PWM 频率必须一致。
- 要做"多路不同频率"(如双音报警)→ 必须用不同 TCC/TC 模块
- TCC0 各通道可映射到多个 GPIO 引脚,实现单定时器驱动多路 PWM 且严格同步
工程提醒
- 硬件能力 ≠ 该不该用:PB11 能出 PWM 不代表用 PWM 调它驱动的一切负载都合适。
- 当前板上蜂鸣器是自励式(有源)→ 用 PWM 调音量必然变音色(见 [[01-蜂鸣器自励式与他励式]])。
- 想真正实现"多档音量且不破音" → 换他励式蜂鸣器 + 硬件回路基本不动(见 [[02-蜂鸣器驱动回路与替换评估]])。
参考
- [[01-蜂鸣器自励式与他励式|蜂鸣器:自励式与他励式]]
- [[02-蜂鸣器驱动回路与替换评估|驱动回路与替换评估]]