跳到主要内容

3.3.3 PWM 使用说明

本文档介绍如何使用 gpiozero 库结合 lgpio 引脚工厂,在 Bianbu Robot 开发平台上实现 PWM(Pulse Width Modulation,脉宽调制)功能。PWM 广泛应用于控制舵机、调节 LED 亮度、调速电机等场景。

环境准备

确保系统或虚拟环境中已正确安装 gpiozero 库:

pip install gpiozero

关于环境配置与引脚工厂的设置方法,请参考 《3.3.2 GPIO 应用说明》

PWM 引脚说明

启用 PWM 功能前,请查阅 《3.3.1 引脚定义说明》,确认所使用开发板支持的 硬件 PWM 引脚。此类引脚由 SoC 内部定时器控制,具备更高的频率稳定性与精度,适合对时序要求较高的应用(如音频输出、舵机控制)。

⚠️ 即使某些 GPIO 引脚不支持硬件 PWM,只要支持基本输出功能,仍可通过 gpiozero 实现 软件 PWM,适用于精度要求不高的场景。

此外,请确保目标引脚未被系统服务(如音频、红外)占用。若存在资源冲突,请先释放相关服务。

PWM 控制示例:舵机驱动

以下示例展示如何通过 GPIO-70 引脚输出 PWM 信号以控制标准舵机的角度。

物理连接

舵机线色功能连接方式
红线电源接开发板 5V 引脚
黑线地线接开发板 GND
黄线信号线接开发板 GPIO-70 引脚

具体地,连接如图所示:

测试代码

# 配置 lgpio 引脚工厂
from gpiozero.pins.lgpio import LGPIOFactory
from gpiozero import Device
Device.pin_factory = LGPIOFactory(chip=0)

# 引入 Servo 控制类
from gpiozero import Servo
from time import sleep

pin_number = 70 # PWM 信号输出引脚

# 初始化 Servo 对象,配置脉宽参数
servo = Servo(
pin_number,
min_pulse_width=0.0005, # 最小脉宽(秒)
max_pulse_width=0.0025, # 最大脉宽(秒)
frame_width=0.02 # PWM 周期(秒)= 20ms(50Hz)
)

# 控制循环:通过用户输入控制舵机角度
while True:
user_input = input("请输入一个 -1 到 1 之间的浮点数(控制角度):")
try:
value = float(user_input)
if -1 <= value <= 1:
servo.value = value
sleep(0.3)
servo.detach() # 停止信号输出,防止舵机抖动
else:
print("输入超出范围,请输入 -1 到 1 之间的数值。")
except ValueError:
print("无效输入,请输入合法的浮点数。")

控制说明:

  • 输入 -1 → 对应舵机最小角度(约 0°)
  • 输入 0 → 对应舵机中位(约 90°)
  • 输入 1 → 对应舵机最大角度(约 180°)