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。
初始化 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 通道,并生成示例代码。
相位修正模式
在标准 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); }