class PWM -- 脉冲宽度调制

PWM 类在 Pin 上输出脉冲宽度调制信号。它是现代的、跨端口的 PWM API;在 STM32 OpenMV 摄像头上,它封装了底层的 pyb.Timer 通道机制,因此每个 PWM 实例会占用一个定时器通道。

用法示例:

from machine import PWM, Pin

# 50 Hz PWM on a header pin with a 12.5 % duty.
pwm = PWM(Pin("P7"), freq=50, duty_u16=8192)

pwm.duty_u16(32768)            # change duty to 50 %
pwm.init(freq=5000, duty_ns=5000)  # re-init at 5 kHz, 5 us pulse
pwm.duty_ns(3000)              # 3 us pulse

pwm.deinit()

构造函数

class machine.PWM(dest: Pin | int, *, freq: int | None = None, duty_u16: int | None = None, duty_ns: int | None = None, invert: bool = False)

构造一个驱动 dest(OpenMV 摄像头上的一个 Pin)的 PWM 对象。这些关键字参数等同于在构造后立即调用 init()

  • freq——以 Hz 为单位的 PWM 频率。

  • duty_u16——以 duty_u16 / 65535 比率表示的占空比。

  • duty_ns——以纳秒为单位的脉冲宽度。

  • invert——如果为 True,则反转输出极性。

一次最多只能传入 duty_u16 / duty_ns 中的一个。设置 freq 可能会影响共享同一底层定时器的其他 PWM 实例(在 STM32 上确实如此——给定 TIM 的每个通道都以相同的频率运行)。

方法

init(*, freq: int | None = None, duty_u16: int | None = None, duty_ns: int | None = None) None

重新配置 PWM 输出。只有提供的参数会被更新;其余参数保留之前的值。各参数的含义请参阅构造函数。

deinit() None

禁用 PWM 输出并释放其占用的定时器通道。

freq() int
freq(value: int, /) None

获取或设置 PWM 频率。

不带参数时,返回当前频率(Hz)。

带单个 value 参数时,将频率设置为该值(Hz)。如果频率超出底层定时器可实现的范围,可能会引发 ValueError

duty_u16() int
duty_u16(value: int, /) None

获取或设置占空比,以 0 -- 65535 范围内的无符号 16 位值表示。

不带参数时,返回当前占空比。

带单个 value 参数时,将占空比设置为周期的 value / 655350 始终为低电平,65535 始终为高电平。

duty_ns() int
duty_ns(value: int, /) None

直接以纳秒为单位获取或设置脉冲宽度。

不带参数时,返回当前脉冲宽度。

带单个 value 参数时,将每个周期的高电平时间设置为 value 纳秒。对于脉冲宽度比占空比更有意义的舵机式输出非常有用。

限制

  • 在每个硬件定时器上,PWM 频率与占空比分辨率是相互关联的:在高频率下,一个周期内能容纳的计数步数更少,因此 duty_u16 中有意义的低位也更少。

  • 可实现的 PWM 频率取决于定时器的时钟源和预分频器。在大多数器件上,STM32 TIM2 / TIM5 为 32 位(在 STM32N6 上 TIM3 / TIM4 也是 32 位),从而提供更宽的频率和占空比范围;其余定时器为 16 位。确切范围请参阅相关 MCU 参考手册。

  • 在 STM32 上,同一 TIM 上的多个 PWM 通道共享一个频率。在某个实例上设置 freq() 会改变挂接到该 TIM 上的其他每个通道的输出。