树莓派Python开发第8课: PWM实验

article/2025/8/26 14:36:14

第一课:什么是树莓派
第二课:树莓派能做什么
第三课:购买您的第一个树莓派
第四课:如何安装树莓派系统
第五课:树莓派Python编程手册
第六课:树莓派Python Led实验
第七课:树莓派Python 按键实验
第八课:树莓派Python开发 PWM实验
视频链接

什么是PWM

PWM是Pulse Width Modulation (PWM)的缩写,意思是脉冲宽度调制,那什么是脉冲呢?

脉冲

脉冲是一种信号,我们平常听到 “脉搏” 这个词,我们这里的脉冲和这个脉搏其实很相似,脉搏是跳动的,有规律的,脉冲也是这样,是有规律的,这个规律在编程领域叫频率,或者叫周期。如果要给脉冲下一个定义的话:
脉冲是一种电压反复在高和低(H和L)之间改变的电信号
就像下面这张图:
在这里插入图片描述

什么是脉宽调制

脉宽很好理解,就是脉冲的宽度,高电平表示有脉冲信号,低电平表示没有脉冲信号,这个宽度就是高电平的持续时间,或者叫长度也行。
那么,调制呢,就是这个高电平的持续时间是可以调整的,可以通过程序改变,动态的改变,当然也可以通过硬件电路实现调整,比如我们用得比较多的旋钮,可以把台灯调到最亮,或者最暗。

树莓派如何实现PWM

有了上面的知识铺垫,就可以来理解树莓派的实现原理了。
首先,树莓派有一个专门类叫pwm,这个类的使用非常简单。
我们可以先通过help查看帮助,就像这样:
在这里插入图片描述
但是,真正使用,你看这个帮助还是看不到实际有价值的内容,这就是用Python控制树莓派的一些弊端,因为它很多的理论和原理是基于C语言的,所以一般开发我们要结合C,不清楚的去查看C的代码,这里并非说用python不好,其实有些地方用python非常简单,比如I2C,SPI这些比较复杂的,如果有人用Python整合好了,直接安装模块就可以使用,没必要再去造轮子。
所以呢,有我帮大家总结出来了,大家收藏我这篇博客就行了。
步骤是这样的:

step1: 生产pwm类对象

PR = gpio.PWM(18,50)
上面这条语句是调用gpio模块中的PWM类,生成一个对象PR,PWM是类名,也是构造函数,传进去的两个参数,第一个是引脚编号,第二个参数是PWM的频率,50代表50HZ。

step2: 启动pwm

PR.start(0) #这个函数是启动pwm功能,里面有一个参数,这个参数如果填0,代表脉冲宽度为0,也就是没有脉冲,在led灯上表现就是不亮,如果是电机,表现就是轮子不转。

step3: 改变脉冲宽度

PR.ChangeDutyCycle(dc) #改变脉冲宽度是通过ChangeDutyCycle函数,这个函数你可以传进去你要设置的脉冲宽度值,这个值只能是0~100.

step4: 停止pwm

PR.stop() #停止pwm
当你要停止pwm的时候,可以调用stop函数。不需要传参数。

实验方法

我们只需要接一个led灯到18号引脚,然后配置为输出功能,接着就按照上面的步骤就可以编程了。G和B不需要连接。
在这里插入图片描述

实现呼吸灯

#coding:utf-8 #设置中文编码模式,支持中文注释

  1. 导入模块
    import RPi.GPIO as gpio #导入树莓派模块RPi.GPIO
    import time #导入时间模块,方便后面做延时
    R = 18 #设置BCM模式第18号引脚作为led灯控制引脚
    gpio.setwarnings(False) #屏蔽警告

  2. 设置BCCM编码模式
    gpio.setmode(gpio.BCM) #设置引脚模式BCM

  3. 设置引脚功能
    gpio.setup(R,gpio.OUT) #设置引脚方向为输出 ,Python中,PWM功能是软件模拟的,就是通过控制高电平宽度来实现
    #所以,引脚必须设置输出
    PR = gpio.PWM(R,50) #这种PWM频率为50Hz
    PR.start(0) #设置启动脉冲宽度,0表示开始没有脉冲,你可以把这个参数想象成起步的速度是多少码,
    #是20码起步,还是0速度
    4)实现呼吸灯

    while 1:
    for dc in range(0,100,5): #python中调试pwm,规定pwm宽度范围是0~100,5是每次循环累加的步长
    PR.ChangeDutyCycle(dc) #PWM真正调制的地方就在这里
    time.sleep(0.5) #不用太快,否则人眼看不到变化
    time.sleep(1)
    for dc in range(100,0,-5): #由亮到暗的过程
    PR.ChangeDutyCycle(dc)
    time.sleep(0.5)
    完整代码:

pi@xiajiashan:~/pi-python-blog$ cat pwm_led.py 
#!/usr/bin/python
#coding:utf-8
import RPi.GPIO as gpio
import time
R = 18
gpio.setwarnings(False)#屏蔽警告
gpio.setmode(gpio.BCM)#设置引脚模式BCM
gpio.setup(R,gpio.OUT)#设置引脚11方向输出
PR = gpio.PWM(R,50)
PR.start(0)
try:                 #try和except是一对,通过它来捕捉在执行while 1的时候,是否按下了ctrl+c按键,crtl+c是终止程序while 1:for dc in range(0,100,5):PR.ChangeDutyCycle(dc)time.sleep(0.5)time.sleep(1)for dc in range(100,0,-5):PR.ChangeDutyCycle(dc)time.sleep(0.5)
except KeyboardInterrupt:     #如果按下了ctrl+c进行异常处理,让pwm停止,释放引脚PR.stop()gpio.cleanup()    
pi@xiajiashan:~/pi-python-blog$ 

直接运行(python无需编译)

在这里插入图片描述
效果请看视频教程
https://edu.csdn.net/course/play/28043/383541?spm=1002.2001.3001.4143

软件PWM

Python中的PWM功能是通过软件模拟的,软件模拟的意思就是它的脉冲宽度是我们程序打高电平来实现的,不是cpu硬件做到的,C语言中有一个引脚(BCM的第18脚)可以实现硬逻辑,但是python里面不可以。
python中的PWM是通过C语言的函数实现的,python只不过是做了一个整合调用而已,其实整个的树莓派中,Python编程都是用的C语言函数库,其实这也没什么,大家不要说python没有技术含量之类的话,本来就不需要造轮子,但是你要理解核心,需要看懂C语言中的代码。
具体软件PWM模拟的原理,请大家参考我C语言中的讲解。
软件PWM内部实现原理

如何通过软件PWM实现三色灯的呼吸功能

因为上面原理性的东西已经介绍得很详细了,这里就只给大家源码,下面有注释

pi@xiajiashan:~/pi-python-blog$ cat pwm_rgb.py 
#coding:utf-8
import RPi.GPIO as gpio
import time
R = 16  #设置红色灯接到第16(BCM编码模式)
G = 20  #设置绿色灯接到第20(BCM编码模式)
B = 21  #设置蓝色灯接到第21(BCM编码模式)
gpio.setwarnings(False)  #去掉警告信息
gpio.setmode(gpio.BCM)  #设置引脚为BCM编码模式
gpio.setup(R,gpio.OUT)  #PWM功能控制引脚,需要改引脚设置为输出
gpio.setup(G,gpio.OUT)  #
gpio.setup(B,gpio.OUT)  #
PWMR = gpio.PWM(R,50)  #设置R为PWM功能,并且设置频率为50HZ,也就是PWM周期是20ms
PWMG = gpio.PWM(G,50)  #设置G为PWM功能,并且设置频率为50HZ,也就是PWM周期是20ms
PWMB = gpio.PWM(B,50)  #设置B为PWM功能,并且设置频率为50HZ,也就是PWM周期是20ms
PWMR.start(0)  #启动R 的PWM
PWMG.start(0)  #启动G 的PWM
PWMB.start(0)  #启动B 的PWM
try:  #捕捉ctrl+c按键while 1:#R慢慢变亮for dc in range(0,100,5): #定义循环变量dc从0~100,每次增加5PWMR.ChangeDutyCycle(dc)  #调制PWM周期time.sleep(0.5)time.sleep(2)#R慢慢变暗for dc in range(100,0,-5): #循环变量从100~0,每次递减5PWMR.ChangeDutyCycle(dc)  #调制PWM周期time.sleep(0.5)#G慢慢变亮for dc in range(0,100,5): #定义循环变量dc从0~100,每次增加5PWMG.ChangeDutyCycle(dc)  #调制PWM周期time.sleep(0.5)time.sleep(2)#R慢慢变暗for dc in range(100,0,-5): #循环变量从100~0,每次递减5PWMG.ChangeDutyCycle(dc)  #调制PWM周期time.sleep(0.5)#B慢慢变亮for dc in range(0,100,5): #定义循环变量dc从0~100,每次增加5PWMB.ChangeDutyCycle(dc)  #调制PWM周期time.sleep(0.5)time.sleep(2)#R慢慢变暗for dc in range(100,0,-5): #循环变量从100~0,每次递减5PWMB.ChangeDutyCycle(dc)  #调制PWM周期time.sleep(0.5)
except KeyboardInterrupt:PWMB.stop()    #捕捉到ctrl+c信号后停止pwmgpio.cleanup() #释放引脚资源
pi@xiajiashan:~/pi-python-blog$ 

END

想通过视频学习的可以购买我的视频教程:
https://edu.csdn.net/course/play/28043/383541?spm=1002.2001.3001.4143
希望本文能帮到各位,如果怕忘了就收藏吧!
第一课:什么是树莓派
第二课:树莓派能做什么
第三课:购买您的第一个树莓派
第四课:如何安装树莓派系统
第五课:树莓派Python编程手册
第六课:树莓派Python Led实验
第七课:树莓派Python 按键实验
第八课:树莓派Python开发 PWM实验
视频链接


http://chatgpt.dhexx.cn/article/ncA7B9IT.shtml

相关文章

教你用树莓派Python打造一个音乐播放器

买了个树莓派3B,装好系统后灰落了好厚一层都不知道要干嘛。。。最近突发奇想:用树莓派做一个音乐播放器,每天6:30-7:20自动播放英语听力,强迫自己练习英语,也治治自己的懒床习惯,平时也可以用来听听歌。在这…

4步树莓派python3安装opencv,无需编译

4步树莓派python3安装opencv,无需编译 测试器件:树莓派4b 最近配置树莓派环境,装opencv时上网搜索发现教程挺麻烦而且过于老旧,现有一个简单方法分享一下 0.安装树莓派64位系统 可以使用官方软件安装系统 记得烧录前右下角高级设置配置ss…

树莓派 python驱动蜂鸣器

Author: Runsen 有问题,底部评论 蜂鸣器分为两种类型:“有源蜂鸣器”和“无源蜂鸣器”。 有源蜂鸣器内部具有多振动器,只需要在外部提供工作电压,它就能发出固定频率的声音。 无源蜂鸣器没有内部振荡源,需要外部驱动…

树莓派Python3安装运行OpenCV

1、安装 打开树莓派的命令行界面,输入命令即可完成安装。执行命令的时间更网速有关,请耐心等待。 sudo apt-get install python-opencv 是安装在python2 上的 sudo apt-get install python3-opencv 是安装在python3 上的 2、在Python3上测试OpenCV 安装…

树莓派Python开发教程:什么是树莓派

第一课:什么是树莓派 第二课:树莓派能做什么 第三课:购买您的第一个树莓派 第四课:如何安装树莓派系统 楔子 树莓派C语言版本的基础教程差不多写完了,原计划这个十一期间着手写Python部分,但是前几天又冒…

树莓派Python编程手册

第一课:什么是树莓派 第二课:树莓派能做什么 第三课:购买您的第一个树莓派 第四课:如何安装树莓派系统 第五课:树莓派Python编程手册 树莓派可以使用C语言,java,Python,而用python控…

树莓派 python3.9降级为python3.7

今天烧录了一个官方烧录器中的最新的镜像,打开之后python的版本是3.9的,之前做的一些东西都是基于python3.7的,再重新架构十分麻烦,于是干脆就把python3.9进行降级,降为python3.7. 这个镜像不像之前的一些镜像&#x…

第1.2.1章 树莓派python编程环境

树莓派3B,默认的python版本是2.7.13,但是操作系统自带了python3.5.3的IDE 因为现在主流都是用python3,那么我怎么讲python的环境切换到3呢? 1 python环境切换 参考将树莓派内置的 Python2.7 升级成 Python3 # 卸载 python2.7 su…

用python在树莓派上编程,你可以将项目扩展到令人难以置信的规模

树莓派是一个非常廉价的、只有手掌大小的完全可编程的计算机。虽然树莓派的体积小,但是它的潜力无限。你可以像使用常规台式计算机一样在树莓派上创建一个非常酷的工程。例如,你可以用树莓派搭建你自己的家用云存储服务器。 树莓派用什么语言编程&#x…

树莓派基础设置以及编程环境(python语言)

基础条件: 硬件:树莓派 3b 固件:2018-04-18-raspbian-stretch.img IO:树莓派3B的IO是3.3V,5V有风险。 一、python 使用方法 1.1、python2.7进入编程界面 左上角树莓派图标----->Programming----->Python2&…

树莓派教程(基于python编程)--入门篇

一:格式化SD卡 SD卡插入读卡器连接电脑,使用SDFormatter对SD卡进行格式化 (重装烧录也要进行着SD卡格式化操作) 二:下载官方镜像 http://downloads.raspberrypi.org/raspbian_latest 三:烧录SD卡 使用…

unity学习开发小球吃方块小游戏(从制作到发布程序,超详细全教程包你学会)

unity小球吃方块开发过程 你将学会用unity开发小游戏的基础知识吃方块游戏超详细全教程,保姆式教学包你学会一、创建对象创建PlayBall小球吃金币游戏项目,创建地面和小球。 二、添加脚本创建脚本使小球动起来,并用键盘控制小球的运动。 三、控…

python小游戏开发——井字棋

一家懂得用细节留住客户的3年潮牌老店我必须支持!➕🛰:luyao1931 案例介绍 本案例采用 python 实现了一个简单的井字棋游戏。该游戏在控制台界面中进行,有游戏提示。游戏棋盘为 3 X 3 的九宫格样式,每个棋格与数字键盘…

使用Vue框架开发的贪吃蛇小游戏

注意&#xff1a;尽量不要用谷歌浏览器运行&#xff0c;因为谷歌浏览器会把GameValue翻译成中文&#xff0c;使游戏掉帧卡顿 解决办法&#xff1a;1.使用Edge浏览器&#xff0c;2.把谷歌浏览器的自动中文翻译关闭即可 游戏截图&#xff1a; 源码如下&#xff1a; <!DOCTY…

QT大作业——自制小游戏

The RPGgame with QT 一、 系统架构 该项目有4个ui组成&#xff0c;其中mainwindow作为项目程序入口&#xff0c;窗口跳转流程为&#xff1a;mainwindow->gamegraph->area_prairrie->playerstastus。 主要游戏功能装载在gamegraph和area_prairrie两个ui中&#xff0…

webpack + typescript 开发微信小游戏实践

源码地址 微信小游戏版本技术选型使用typescript开发 但是微信小游戏原生不支持 typescript 开发&#xff0c;于是探索一下使用ts开发微信小游戏 1. 创建小游戏 使用测试号&#xff0c;创建一个使用官方示例的小游戏 会生成一个可以直接运行的打飞机小游戏 2. 准备工作 …

小游戏开发引擎CocosCreator

小游戏 六彩跳棋 已经通过审核并且发布了好几天了&#xff0c;对跳棋感兴趣的朋友可以去看看&#xff0c;在微信游戏里搜索 六彩跳棋 &#xff0c;点击 立即玩 吧&#xff01;进去游戏后&#xff0c;需要点击 获取头像昵称 才能得到玩家数据&#xff0c;然后 划动屏幕 选择游戏…

unity开发微信小游戏1

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、准备工作二、官方文档三、WX开发者工具四、获得Appid五、获得AppidError: app.json: app.json六、资源下载失败404总结 前言 最开使用unity3d开发微信小游…

【微信小游戏】微信小游戏开发设置竖屏

微信小游戏开发环境默认横屏&#xff0c;对竖屏游戏非常不方便。 设置竖屏的入口十分隐蔽&#xff0c;以至于一度令我以为不能设置竖屏。 网上也根本搜不到解决方法&#xff0c;经过我的不懈努力&#xff0c;最终还是找到了设置方法。 原本是横屏的 按下面路径设置竖屏 开发…

使用pygame开发一个小游戏

学习了pygame&#xff0c;身为一个IKUN所以&#xff0c;做了一个简单的小游戏。游戏规则是&#xff0c;使用键盘的方向键控制坤坤&#xff0c;当坤坤触碰到篮球&#xff0c;就会爆发出音乐”只因你太美“。代码如下&#xff1a; import random import sys import pygame pygam…