RP2350 中的 PWM 外设

RP2350 有一个包含 12 个 PWM 生成器(称为“Slice”)的脉宽调制(PWM)外设。每个 Slice 包含两个输出通道(A 和 B),总共提供 24 个 PWM 输出通道。详细规格请参阅 RP2350 Datasheet 第 1076 页。

让我们快速了解一些核心概念。

PWM 生成器(Slice)

Slice 是生成 PWM 信号的硬件块。12 个 Slice(PWM0–PWM11)中的每一个都是独立的计时单元,拥有自己的 16 位计数器、比较寄存器、控制设置和时钟分频器。这种独立性意味着你可以为每个 Slice 配置不同的频率和分辨率。

通道

每个 Slice 包含两个输出通道:通道 A通道 B。两个通道共享同一个计数器,因此它们运行在相同的频率且完全同步。但是,每个通道都有自己的比较寄存器,允许独立控制占空比。这让你能够从单个 Slice 生成两个相关但不同的 PWM 信号。

PWM 通道到 GPIO 引脚的映射

每个通用输入输出(GPIO)引脚连接到特定的 Slice 和通道。你可以在 RP2350 Datasheet 第 1078 页找到完整的映射表。例如,GP25(板载 LED 灯引脚)映射到 PWM Slice 4 的通道 B,标记为 4B

pico2

初始化 PWM 外设并获取所有 Slice 的访问权限:

#![allow(unused)]
fn main() {
let mut pwm_slices = hal::pwm::Slices::new(pac.PWM, &mut pac.RESETS);
}

获取 PWM Slice 4 的引用以进行配置:

#![allow(unused)]
fn main() {
let pwm = &mut pwm_slices.pwm4;
}

GPIO 到 PWM

我创建了一个小表单,帮助你弄清楚哪个 GPIO 引脚映射到哪个 PWM 通道,并生成示例代码。

选择一个 GPIO 引脚以查看 PWM 映射和生成的代码。

相位修正模式

在标准 PWM(快速 PWM)中,计数器从 0 计数到 TOP,然后立即重置为 0。这会产生不对称的边缘,输出在周期的不同点发生变化。

相位修正 PWM 计数到 TOP,然后倒数回 0,产生三角波形。输出对称切换——一次上升,一次下降。这产生中心对齐的脉冲,边缘相互镜像,减少了电磁干扰并产生更平滑的过渡。代价是相位修正模式在相同的 TOP 值下运行频率是标准 PWM 的一半。

配置 PWM4 以在相位修正模式下运行,以获得更平滑的输出过渡。

#![allow(unused)]
fn main() {
pwm.set_ph_correct();
}

获取 PWM4 通道 B 的可变引用,并将其输出指向 GPIO 引脚 25。

#![allow(unused)]
fn main() {
let channel = &mut pwm.channel_b;
channel.output_to(pins.gpio25);
}