跳转至

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:  EIC/EXTINT[11]   *SERCOM4/PAD[3]   TC5/WO[1]   TCC0/WO[5]
         外部中断          默认=SPI SCK     定时器5输出   高级定时器TCC0输出

结论:PB11 可以直接输出硬件 PWM,不是只能 GPIO 电平切换。

功能 类型 说明
TC5/WO[1] 16 位基本定时器 单通道方波/PWM,简单够用
TCC0/WO[5] 高级定时器 功能更强(双斜坡、死区插入、通道同步),WO4-7 为主通道扩展输出

固件配置要点(硬件 PWM 步骤)

  1. GCLK:给 TC5/TCC0 配置时钟源和分频
  2. 定时器寄存器
  3. PER = 周期(决定频率/音调)
  4. CC = 比较值(决定占空比/音量)
  5. 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-蜂鸣器驱动回路与替换评估|驱动回路与替换评估]]