树莓派资料
显示屏资料
系统下载
树莓派Pico
首页 动态 发帖 版块 我的
 退出
游客  
等级:
金币:
经验值:

PWM(脉冲宽度调制) 树莓派Pico RP2040【入门级教程】

  5861 
 0
 3
趣    

Image



PWM介绍

PWM(脉冲宽度调制)是一种通过快速数字信号模拟模拟信号的技术,在树莓派 Pico主板通过 RP2040 芯片可以轻松实现。PWM 广泛应用于控制 LED 亮度、电机速度、舵机角度等场景。


1.PWM原理,控制LED灯亮度的强弱

PWM 通过快速切换引脚的高低电平来工作,周期:完成一次高低电平切换的时间,占空比:在一个周期内高电平所占的百分比,例如:50% 占空比表示高低电平各占一半时间,树莓派 Pico 上几乎所有 GPIO 引脚都可以配置为 PWM 输出,每个引脚都关联到一个 PWM 通道。


下面是一个使用主板GP0引脚通过 PWM 控制一颗 LED灯亮度的示例:将LED灯的长脚正极接线到GP0,短脚负极接线到GND。 我们通过编程来控制GP0引脚输出PWM信号,能实现控制LED灯强弱变化!


from machine import Pin, PWM
import time

# 初始化PWM,使用GP0引脚
pwm = PWM(Pin(0))

# 设置PWM频率为1000Hz
pwm.freq(1000)

# 从暗到亮逐渐变化
for duty in range(0, 65536, 512):
    pwm.duty_u16(duty)
    time.sleep(0.05)

# 从亮到暗逐渐变化
for duty in range(65535, -1, -512):
    pwm.duty_u16(duty)
    time.sleep(0.05)

# 关闭PWM
pwm.deinit()
    


初始化 PWM:PWM(Pin(0)) 将 GP0引脚配置为 PWM 模式


设置频率:pwm.freq(1000) 设置 PWM 频率为 1000Hz


频率选择取决于应用:LED 常用 1000-2000Hz,舵机通常用 50Hz


设置占空比:pwm.duty_u16(duty)


RP2040 使用 16 位精度,所以占空比范围是 0-65535


0 表示完全关闭(0% 占空比)


65535 表示完全开启(100% 占空比)


关闭 PWM:pwm.deinit() 释放 PWM 资源



2.控制舵机旋转角度

机通常需要 50Hz 的 PWM 信号,通过不同的脉冲宽度来控制角度

舵机控制说明:舵机需要特定频率(通常 50Hz)的 PWM 信号

角度控制通过脉冲宽度实现:

0.5ms 脉冲对应 0 度

1.5ms 脉冲对应 90 度

2.5ms 脉冲对应 180 度

不同品牌舵机可能需要微调占空比范围


将舵机信号线接入主板GP0引脚, 通过编程来控制GP0引脚输出PWM信号,能实现控制舵机旋转角度!

from machine import Pin, PWM
import time

# 初始化舵机PWM,使用GP0引脚
servo = PWM(Pin(0))

# 舵机通常需要50Hz的频率
servo.freq(50)

def set_servo_angle(angle):
    # 将角度转换为16位占空比
    # 舵机通常在0.5ms-2.5ms脉冲之间对应0-180度
    # 50Hz频率的周期是20ms,所以占空比范围约为2.5%-12.5%
    min_duty = 1638  # 约2.5% (65535 * 0.025)
    max_duty = 8192  # 约12.5% (65535 * 0.125)
    duty = min_duty + (max_duty - min_duty) * angle // 180
    servo.duty_u16(duty)

# 让舵机从0度转到180度再转回来
while True:
    for angle in range(0, 181, 5):
        set_servo_angle(angle)
        time.sleep(0.1)
    for angle in range(180, -1, -5):
        set_servo_angle(angle)
        time.sleep(0.1)
    time.sleep(1)
    

3.高级用法:PWM 切片(Slices)

RP2040 芯片有 8 个 PWM 切片(slices),每个切片可以控制 2 个引脚(通道 A 和 B):

from machine import Pin, PWM
import time

# 初始化两个PWM引脚,使用同一个切片
pwm1 = PWM(Pin(0))  # 切片0,通道A
pwm2 = PWM(Pin(1))  # 切片0,通道B

# 同一切片的频率必须相同
pwm1.freq(1000)

# 两个通道可以有不同的占空比
pwm1.duty_u16(32768)  # 50% 占空比
pwm2.duty_u16(16384)  # 25% 占空比

# 也可以通过切片对象设置频率
slice = pwm1.slice()
PWM(slice=slice).freq(2000)  # 同时改变两个引脚的频率

time.sleep(5)

# 关闭PWM
pwm1.deinit()
pwm2.deinit()
    

切片特性说明

每个切片控制两个引脚,共享相同的频率,同一切片的两个通道可以有不同的占空比,可以通过 slice() 方法获取切片对象,统一控制频率。


总结

树莓派 Pico 的 PWM 功能具有特点:几乎所有 GPIO 引脚都可配置为 PWM 输出,16 位精度的占空比控制(0-65535),8 个 PWM 切片,每切片控制 2 个通道,灵活的频率设置,适应不同应用场景。


通过 PWM 技术,你可以实现精确的模拟量控制,为各种项目(如机器人、灯光控制、电机驱动等)提供强大支持。使用时注意查看引脚图,了解哪些引脚共享同一 PWM 切片,以便更好地规划电路设计。



此文章仅针对RP2040 MicroPython固件,以源码为准,本文根据编写时官方源码编写,用于为初学者提供便利,仅供于参考,如有能力者建议自行查询:MicroPython源码


标签:
作者签名:    楼主  2024-11-29 15:48:21
回复列表
Powered by RASPI _VERSION
© 2017-2025 树莓派极客版权
您的IP: 18.97.9.171 , 2025-11-12 20:02:17
Powered by RASPI _VERSION
© 2017-2025 树莓派极客版权