树莓派3B使用pigpio库控制硬件PWM失效问题求助
哥们,我帮你捋几个实际排查方向,都是玩树莓派3B硬件PWM时踩过的坑:
先确认硬件PWM引脚的合法性:树莓派3B的硬件PWM引脚本来就少,而且PCM时钟模式下还有冲突——当你把时钟设为PCM时,GPIO18、GPIO19会被PCM音频通道占用,这俩引脚就没法用硬件PWM了。你得换成GPIO12(PWM0)或者GPIO13(PWM1)试试,别用错引脚。
检查pigpio守护进程的启动参数:光启动
sudo pigpiod没用,得指定PCM时钟源才行。正确的启动命令应该是:sudo killall pigpiod sudo pigpiod -t 0-t 0就是强制把时钟源设为PCM,不然默认的PWM时钟可能和你设置的模式冲突,导致硬件PWM不工作。验证代码的硬件PWM初始化逻辑:别光看import,得确认代码里有没有正确初始化引脚和设置参数。比如要先判断pigpio连接是否成功,再设置引脚为输出,然后设置频率和占空比:
import pigpio pi = pigpio.pi() # 先确认连接成功,不然白忙活 if not pi.connected: print("pigpio连接失败!") exit() # 用合法的硬件PWM引脚,比如GPIO12 pi.set_mode(12, pigpio.OUTPUT) # PCM时钟是48MHz,设置的频率最好是48MHz的约数,比如1000Hz pi.set_PWM_frequency(12, 1000) # 占空比设为50%(原始值是时钟周期的一半,48000/2=24000) pi.set_PWM_dutycycle(12, 24000)另外,别把软件PWM的逻辑套到硬件PWM上,硬件PWM的占空比范围是0到时钟周期值,不是0-255(除非用
set_PWM_range手动调整)。排查系统服务冲突:树莓派上的音频服务(比如alsa、pulseaudio)会占用PCM相关资源,直接抢硬件PWM的引脚。你可以临时关掉这些服务试试:
sudo systemctl stop alsa-state sudo systemctl stop pulseaudio关完之后重启pigpio守护进程,再测试硬件PWM。
用pigpio自带工具排除代码问题:直接用命令行工具
pigs测试,能快速判断是代码问题还是系统/硬件问题:# 设置GPIO12为输出 pigs m 12 w # 设置频率1000Hz pigs pfs 12 1000 # 设置50%占空比(用0-255范围的话设128) pigs pd 12 128如果这个命令行操作后还是没PWM输出,那基本可以确定是系统配置或硬件的问题,不是代码的锅。
更新pigpio版本:旧版本的pigpio对树莓派3B的PCM模式支持可能有bug,更新到最新版本试试:
sudo apt update sudo apt install --reinstall pigpio python3-pigpio
内容的提问来源于stack exchange,提问作者Ikajiro




