news 2026/6/9 16:05:37

树莓派4b引脚功能图配置PWM输出:Raspberry Pi OS实战案例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
树莓派4b引脚功能图配置PWM输出:Raspberry Pi OS实战案例

用树莓派4B的GPIO玩转PWM:从引脚图到实战调光,一次讲透

你有没有试过在树莓派上控制LED亮度,却发现它只能“开”或“关”,没法像台灯那样缓缓变亮?又或者想驱动一个直流电机调速,结果一启动就抖得像震动模式?

问题不在于你的代码写错了——而很可能是因为你用了不支持硬件PWM的引脚

别急。今天我们就来彻底搞清楚一件事:如何根据树莓派4B的真实引脚功能图,正确配置并使用PWM输出。我们不会堆砌术语,而是带你一步步从原理、选脚、接线到编程,完整走通整个流程。哪怕你是第一次接触PWM,也能照着做出来。


为什么树莓派需要PWM?因为它没有DAC

树莓派是数字系统,它的GPIO口只有两种状态:高电平(3.3V)和低电平(0V)。不像Arduino那样有模拟输入/输出引脚(ADC/DAC),所以如果你想让某个设备获得“中间值”电压——比如给LED供电1.65V让它半亮——直接靠GPIO做不到。

那怎么办?

答案就是:用数字的方式模拟出模拟效果,这就是PWM的精髓。

PWM是怎么“骗”负载的?

想象你在快速开关水龙头,每秒开关100次,其中60%的时间开着,40%的时间关着。虽然水流是一断一续的,但从平均来看,相当于持续流出60%的水量。

PWM干的就是这事:

  • 频率:每秒开关多少次(Hz)
  • 占空比:每次周期里高电平占的比例(0% ~ 100%)

例如,在3.3V下,如果你设置占空比为50%,那么等效电压就是:

3.3V × 50% =1.65V

这个“平均电压”足以让LED看起来半亮、电机慢转、舵机停在中间位置。

关键来了:要实现这种精准控制,必须依赖硬件PWM通道,而不是自己用Python循环去翻转IO——后者叫软件PWM,容易受系统卡顿影响,波形抖动严重,根本带不动电机。


树莓派4B哪些引脚能输出真正的PWM?

这是最容易踩坑的地方。很多人随便找一个GPIO开始实验,结果发现没反应、波形不对、频率漂移……归根结底,是没看懂这张图:

树莓派4B引脚功能图

但注意!不是所有引脚都能输出硬件PWM。只有连接到专用PWM控制器的几个特定引脚才行。

硬件PWM到底有几个?在哪?

树莓派4B有两个独立的硬件PWM通道:

PWM通道支持的GPIO物理引脚
PWM0GPIO12引脚32
GPIO18引脚12
PWM1GPIO13引脚33
GPIO19引脚35

📌重点推荐使用 GPIO18 和 GPIO19,因为它们默认启用,兼容性最好,而且物理位置也方便布线。

其他GPIO虽然可以通过RPi.GPIO库设置为PWM模式,但其实是软件模拟,不适合对稳定性要求高的场景。

⚠️ 小贴士:
不要迷信“任何GPIO都能PWM”。如果你要用H桥驱动大功率电机、做音频发生器、或闭环调速,一定要上硬件PWM


实战:用Python控制LED呼吸灯

我们现在就动手做一个经典的“呼吸灯”效果——LED亮度缓慢上升再下降,像人在呼吸一样。

第一步:接线

准备材料:
- 树莓派4B
- LED一个
- 限流电阻(220Ω~1kΩ)
- 杜邦线若干

连接方式:
- LED正极 → 通过电阻接到GPIO18(物理引脚12)
- LED负极 → 接GND(可用物理引脚14)

🔌 安全提醒:小功率LED可以直接由GPIO供电;若驱动灯带或电机,请务必外接电源,并通过MOSFET隔离!

第二步:环境准备

确保你运行的是标准版 Raspberry Pi OS(32位或64位均可)。

打开终端,更新系统并安装GPIO库:

sudo apt update sudo apt install python3-rpi.gpio -y

注:wiringPi已被官方弃用,不要再用了!

第三步:编写PWM程序

创建文件breathing_led.py

import RPi.GPIO as GPIO import time # 使用BCM编号(芯片级编号) GPIO.setmode(GPIO.BCM) # 设置PWM引脚和频率 PWM_PIN = 18 # 必须是支持硬件PWM的引脚 FREQ = 1000 # 1kHz频率,适合LED调光 # 初始化 GPIO.setup(PWM_PIN, GPIO.OUT) pwm = GPIO.PWM(PWM_PIN, FREQ) # 创建PWM实例 try: pwm.start(0) # 初始占空比为0% print("呼吸灯启动 (Ctrl+C退出)") while True: # 渐亮:0% → 100% for duty in range(0, 101): pwm.ChangeDutyCycle(duty) time.sleep(0.02) # 渐暗:100% → 0% for duty in range(100, -1, -1): pwm.ChangeDutyCycle(duty) time.sleep(0.02) except KeyboardInterrupt: print("\n收到中断,停止输出") finally: pwm.stop() GPIO.cleanup() # 释放资源

保存后运行:

python3 breathing_led.py

看到LED慢慢亮起又熄灭了吗?恭喜你,已经成功驾驭了树莓派的硬件PWM!


背后发生了什么?深入一点看看

当你调用GPIO.PWM()时,RPi.GPIO 库会与内核模块pwm-bcm2835通信,请求分配对应的PWM通道。这个模块负责管理树莓派SoC内部的PWM控制器,设定时钟分频、计数周期和比较值,最终生成稳定的方波信号。

这意味着:
- 即使你的Python脚本暂停了几毫秒,PWM仍在后台稳定运行;
- CPU占用率极低,不影响其他任务;
- 波形精度高,不受系统负载干扰。

这正是硬件PWM的强大之处。


常见问题排查清单

❌ 没有输出?先查这些

  1. 是否用了正确的引脚?
    - 错误示例:用GPIO21、GPIO26等非PWM引脚。
    - 正确选择:GPIO18 或 GPIO19。

  2. 是否加载了PWM模块?

执行命令检查:

bash lsmod | grep pwm

如果看不到pwm_bcm2835,手动加载:

bash sudo modprobe pwm-bcm2835

通常不需要手动操作,只要启用了GPIO就会自动加载。

  1. 权限问题?

确保以普通用户身份运行(如pi用户),不要用root。RPi.GPIO依赖sysfs接口访问GPIO,普通用户即可操作。

  1. 程序崩溃后引脚锁死?

运行完记得执行GPIO.cleanup(),否则下次运行可能报错“Channel already in use”。


进阶应用思路

一旦掌握了基础PWM,你可以轻松扩展以下项目:

🌀 直流电机调速

  • 使用GPIO19输出PWM → 控制MOSFET栅极
  • 频率设为10kHz以上,避免听到高频啸叫
  • 加续流二极管保护电路

🎯 舵机角度控制

  • 舵机需要50Hz PWM(周期20ms)
  • 占空比对应角度:
  • 2.5% ≈ 0°
  • 7.5% ≈ 90°
  • 12.5% ≈ 180°
  • 推荐使用gpiozero库简化控制:

python from gpiozero import Servo servo = Servo(18) servo.value = 0.5 # 中间位置

🌡️ 智能风扇温控

  • 读取CPU温度
  • 根据温度动态调整PWM占空比
  • 实现静音与散热的平衡

最佳实践建议

项目推荐做法
引脚选择固定使用GPIO18(PWM0)、GPIO19(PWM1)
PWM频率LED:1kHz;电机:1~20kHz;舵机:50Hz
编程库优先选RPi.GPIOgpiozero
大功率负载必须外接电源 + MOSFET/H桥驱动
调试工具用万用表测平均电压,用逻辑分析仪看波形
安全设计加保险丝、TVS二极管防反接和浪涌

写在最后:别再乱试引脚了

很多初学者花几小时调试PWM失败,最后才发现只是引脚选错了。记住一句话:

树莓派4B的硬件PWM只存在于少数几个引脚上,且必须参考真实引脚功能图来确认。

掌握这一点,你就已经超过了80%的入门者。

PWM不仅是调光调速的技术,更是通往嵌入式控制世界的大门。下一步,你可以尝试结合PID算法做闭环调速,或者把PWM接入Web界面远程调节亮度。

技术的魅力就在于:一点点知识,就能点亮一片光

如果你正在做类似的项目,欢迎留言交流经验。遇到具体问题也可以贴出来,我们一起解决。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 16:57:37

ESP-IDF下载常见问题解析:Wi-Fi模块适配

为什么你的 ESP-IDF 下载总是失败?Wi-Fi 模块的这些“小脾气”你得懂最近在带几个新人做基于 ESP32 的物联网项目时,几乎每个人都卡在一个看似简单的问题上:idf.py flash执行后,串口一直报超时,根本连不上芯片。Failed…

作者头像 李华
网站建设 2026/6/8 22:57:18

健康160自动挂号脚本终极指南:告别手动抢号烦恼

健康160自动挂号脚本终极指南:告别手动抢号烦恼 【免费下载链接】health160 健康160自动挂号脚本,用魔法对抗魔法,禁止商用🖖 项目地址: https://gitcode.com/gh_mirrors/he/health160 还在为健康160平台抢号难而烦恼吗&am…

作者头像 李华
网站建设 2026/6/6 21:56:51

ESP32双核架构深度剖析:超详细版硬件原理讲解

ESP32双核架构深度剖析:从硬件原理到实战调优在物联网设备飞速迭代的今天,开发者早已不再满足于“能连Wi-Fi就行”的基础功能。越来越多的应用场景——比如智能家居中枢、工业边缘网关、语音交互终端——都对实时响应能力和多任务并发处理提出了严苛要求…

作者头像 李华
网站建设 2026/6/6 7:25:04

YOLOv5智能瞄准系统:穿越火线AI辅助完整使用手册

想要在穿越火线中拥有神级瞄准能力?YOLOv5智能瞄准系统基于深度学习技术,为你提供革命性的游戏辅助体验。这套完整的AI瞄准解决方案能够实时检测敌人目标并自动控制瞄准,让你在激烈对抗中占据绝对优势。 【免费下载链接】aimcf_yolov5 使用yo…

作者头像 李华
网站建设 2026/6/6 22:19:36

huggingface镜像网站缓存清理?避免旧模型干扰IndexTTS2

如何清理 Hugging Face 镜像缓存,避免旧模型干扰 IndexTTS2 升级 在语音合成系统快速迭代的今天,一个看似微不足道的操作——本地模型缓存管理,往往成为决定新功能能否顺利上线的关键。尤其当你满怀期待地升级到 IndexTTS2 V23 版本&#xff…

作者头像 李华
网站建设 2026/6/6 22:02:20

Visual C++运行库终极解决方案:从零开始的完整部署指南

Visual C运行库终极解决方案:从零开始的完整部署指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist Visual C运行库是Windows系统中最基础但最重要的…

作者头像 李华