2. PWM输出¶
在前面章节中,我们通过 python3-libgpiod、python-periphery 这几个Python库,编写了操作GPIO外设的Python应用程序,最终实现了在鲁班猫板卡上通过Python应用程序, 点亮了板卡上的LED灯以及使用了按键资源。那么在本小节中,我们接着为大家介绍上述库中提供的另外一项功能,PWM波形输出。
本节实验中,会使用到控制LED灯GPIO引脚,做PWM输出。届时大家可以通过LED灯的明暗变化查看到实验现象(板卡可能需要外接LED)。
2.1. PWM实验¶
通过控制GPIO引进的高低电平变化,我们可以做些一些简单的控制,比如控制LED灯的亮灭。 如果我们进一步去调整GPIO引脚电平变化的频率、持续的时间,那么基于此,我们可以做的控制就可以变得更加复杂,这就是PWM(脉冲宽度调制)。
通常我们可以利用PWM波形输出实现许多功能,比如控制LED灯的光亮程度、无源蜂鸣器的响度、甚至可以控制小舵机。 本节实验中我们就通过输出PWM,来控制LED灯实现LED呼吸灯效果(以LubanCat 2板卡为例,外接LED)。
关于PWM究竟是如何产生作用的,我们在此不作过多探究,大家可以自行搜索PWM的原理。 本节重点是提供PWM输出的实例,当然这离不开我们前面介绍的Python库。
重要
若无特殊提及,本书教程基于Python 3.8.10版本(extboot分区Ubuntu20.04镜像)进行实验及讲解。
2.2. 实验准备¶
在板卡上的部分GPIO可能会被系统占用,可注释掉某些设备树节点或者设备树插件的加载,重启系统,释放相应的GPIO引脚, 当然也可以换个引脚测试,LubanCat_RK系列板卡的引脚参考下: 《LubanCat-RK系列-40pin引脚对照图》
如出现 Permission denied
或类似字样,请注意用户权限,大部分操作硬件外设的功能,几乎都需要root用户权限,简单的解决方案是在执行语句前加入sudo或以root用户运行程序。
pwm设备树插件的开启方法(以LubanCat 2为例):
# 不同板卡的配置文件和pwm不同,以LubanCat 2为例,配置文件为uEnvLubanCat 2.txt,
# 可以开启pwm8、 pwm9、 pwm10、 pwm14
# 登录系统终端,打开/boot/uEnv/uEnvLubanCat 2.txt文件
sudo vim /boot/uEnv/uEnvLubanCat 2.txt
#进入编辑模式,取消pwm前面的注释,保存并退出文件,重启系统
# 在终端中输入如下命令,可以查看到当前板卡的PWM资源:
ls /sys/class/pwm/
板卡上的PWM资源示例,仅供参考:
pwmchip0是pwm4,用在背光调节,图片中后面的pwmchip1是我们开启设备树添加,对应硬件上的pwm8,依次类推。
2.3. 使用python-periphery¶
python-periphery 库支持的PWM输出是基于Linux的PWM子系统实现的,所以要想利用该库做PWM输出, 需要板卡提供支持。像鲁班猫板卡,就可以完美使用 python-periphery 库实现PWM输出。 这样这样一来,就不需要我们在软件层面上利用GPIO模拟PWM输出。
关于PWM子系统相关内容,参考 《PWM控制》 。
2.3.1. 安装 python-periphery¶
重要
如在前面小节中安装了此库,务必跳过此操作。
python-periphery 的安装方式如下:
# 在板卡使用如下命令安装
sudo pip3 install python-periphery
2.3.2. periphery输出PWM¶
使用 python-periphery 库进行PWM输出的示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | from periphery import PWM
import time
try:
# 定义占空比递增步长
step = 0.05
# 定义range最大范围
rangeMax = int(1/0.05)
# 打开 PWM 8, channel 0 ,对应开发板上PWM8外设
pwm = PWM(1, 0)
# 设置PWM输出频率为 1 kHz
pwm.frequency = 1e3
# 设置占空比为 0%,一个周期内高电平的时间与整个周期时间的比例。
pwm.duty_cycle = 0.00
# 开启PWM输出
pwm.enable()
while True:
for i in range(0,rangeMax):
# 休眠step秒
time.sleep(step)
# 设置占空比每次加 step% , 使用 round 避免浮点运算误差
pwm.duty_cycle = round(pwm.duty_cycle+step,2)
# 常灭1秒
if pwm.duty_cycle == 0.0:
time.sleep(1)
for i in range(0,rangeMax):
time.sleep(step)
pwm.duty_cycle = round(pwm.duty_cycle-step,2)
except:
print("Some errors occur!\n")
finally:
# 退出时熄灭LED
pwm.duty_cycle = 0.0
# 释放资源
pwm.close()
|
代码说明:
第10行,创建了一个PWM对象
第12、14行,分别对该PWM对象的参数做了初始化,分别是PWM输出波形的频率、占空比
第16行,根据对应的参数,使能PWM波形输出
提示
如果不熟悉PWM一些python模块的使用,可以进入python终端交互模式,使用命令 from periphery import PWM 和 help(PWM) ,查看PWM模块相关的帮助。
2.3.2.1. 实验操作¶
示例代码使用LubanCat 2板卡,操作如下:
# 确认已安装python-periphery包
# 使能了PWM设备树插件,确认开启的pwm
# 在板卡pwm_test.py所在的目录执行如下命令
sudo python3 pwm_test.py
如果提示权限问题,可以切换root用户然后运行:
#切换到root,是密码root
su root
如果外接LED可看到板载的LED灯会有明暗变化,或者可以通过示波器查看波形。