2. PWM输出 您所在的位置:网站首页 libgpiod库监控gpio 2. PWM输出

2. PWM输出

#2. PWM输出 | 来源: 网络整理| 查看: 265

2. PWM输出¶

在前面章节中,我们通过 python3-libgpiod、python-periphery、Adafruit Blinka 这三个Python库,编写了操作GPIO外设的Python应用程序,最终实现了在鲁班猫板卡上通过Python应用程序, 点亮了板卡上的LED灯以及使用了按键资源。那么在本小节中,我们接着为大家介绍上述库中提供的另外一项功能,PWM波形输出。

本节实验中,会使用到控制LED灯GPIO引脚,做PWM输出。届时大家可以通过LED灯的明暗变化查看到实验现象。

2.1. PWM实验¶

通过控制GPIO引进的高低电平变化,我们可以做些一些简单的控制,比如控制LED灯的亮灭。 如果我们进一步去调整GPIO引脚电平变化的频率、持续的时间,那么基于此,我们可以做的控制就可以变得更加复杂,这就是PWM(脉冲宽度调制)。

通常我们可以利用PWM波形输出实现许多功能,比如控制LED灯的光亮程度、无源蜂鸣器的响度、甚至可以控制小舵机。 本节实验中我们就通过输出PWM,来控制LED灯实现LED呼吸灯效果。

关于PWM究竟是如何产生作用的,我们在此不作过多探究,大家可以自行搜索PWM的原理。 本节重点是提供PWM输出的实例,当然这离不开我们前面介绍的Python库。

2.2. 实验准备¶

在板卡上的部分资源可能默认未被开启,在使用前请根据需要修改 /boot/uEnv.txt 文件, 可添加对应设备树插件的加载,重启系统,以在系统中添加对应资源。

如本节实验中,可能在鲁班猫系统中默认没有使能 PWM 的功能, 所以要将 PWM 的功能开启。 同时本例中使用PWM功能进行演示时,部分鲁班猫板卡会利用到LED灯占用的引脚,所以还要将对应的LED设备树插件取消加载, 否则被占的引脚无法使用libgpiod等的方式进行控制。

方法参考如下:

如若鲁班猫板卡(如鲁班猫i.MX6ULL板卡)演示PWM时使用到的引脚与LED灯引脚复用,需要取消LED设备树插件加载,如下:

添加PWM设备树插件,以使系统支持PWM功能,如下:

# PWM设备树插件内容 dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-pwm.dtbo

如若运行代码时出现“Device or resource busy”或者运行代码卡死等等现象, 请按上述情况检查并按上述步骤操作。

如出现 Permission denied 或类似字样,请注意用户权限,大部分操作硬件外设的功能,几乎都需要root用户权限,简单的解决方案是在执行语句前加入sudo或以root用户运行程序。

# 在终端中输入如下命令,可以查看到PWM资源: ls /sys/class/pwm/

板卡上的PWM资源示例,仅供参考:

2.3. 方式一:使用python-periphery¶

python-periphery 库支持的PWM输出是基于Linux的PWM子系统实现的,所以要想利用该库做PWM输出, 需要板卡提供支持。像鲁班猫板卡,就可以完美使用 python-periphery 库实现PWM输出。 这样这样一来,就不需要我们在软件层面上利用GPIO模拟PWM输出。

关于PWM子系统相关内容,参考 《Linux PWM控制》 。

2.3.1. 安装 python-periphery¶

重要

如在前面小节中安装了此库,务必跳过此操作。

python-periphery 的安装方式如下:

# 在板卡使用如下命令安装 sudo pip3 install python-periphery 2.3.2. periphery输出PWM¶

为方便观察实验现象,建议先将其他两个LDE灯调整为常灭状态, 复制如下命令,在终端中输入并执行:

echo 0 > /sys/class/pwm/pwmchip7/export echo 0 > /sys/class/pwm/pwmchip6/export echo 1000000 > /sys/class/pwm/pwmchip7/pwm0/period echo 1000000 > /sys/class/pwm/pwmchip6/pwm0/period echo "inversed" > /sys/class/pwm/pwmchip7/pwm0/polarity echo "inversed" > /sys/class/pwm/pwmchip6/pwm0/polarity echo 1 > /sys/class/pwm/pwmchip7/pwm0/enable echo 1 > /sys/class/pwm/pwmchip6/pwm0/enable echo 0 > /sys/class/pwm/pwmchip7/unexport echo 0 > /sys/class/pwm/pwmchip6/unexport

使用 python-periphery 库进行PWM输出的示例代码如下:

配套代码 io/periphery/pwm_test.py文件内容¶ 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 36from periphery import PWM import time # 定义占空比递增步长 step = 0.05 # 定义range最大范围 rangeMax = int(1/0.05) try: # 打开 PWM 3, channel 0 ,对应开发板上PWM3外设 pwm = PWM(2, 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 == 1.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 = 1.0 # 释放资源 pwm.close()

代码说明:

第11行,创建了一个PWM对象

第13、15行,分别对该PWM对象的参数做了初始化,分别是PWM输出波形的频率、占空比

第17行,根据对应的参数,使能PWM波形输出

2.3.2.1. 实验操作¶

示例代码使用LubanCat i.MX6ULL板卡,操作如下:

# 确认已安装python-periphery包 # 确认禁用了LED设备树插件并使能了PWM设备树插件 # 在板卡pwm_test.py所在的目录执行如下命令 python3 pwm_test.py # 可看到板载的LED灯会有明暗变化 2.4. 方式二:使用Adafruit Blinka¶

Adafruit Blinka 与 python-periphery 功能类似,PWM输出也是基于Linux的PWM子系统实现的。 只是在代码上的用法略有不同。

2.4.1. 安装Adafruit Blinka¶

重要

如在前面小节中安装了此库,务必跳过此操作。

Adafruit Blinka 的安装方式如下:

# 在板卡使用如下命令安装 sudo apt -y install python3-libgpiod # 注:如已安装,忽略此步 sudo pip3 install Adafruit-Blinka 2.4.2. Adafruit-Blinka输出PWM¶

使用这个 Adafruit Blinka 进行输入输出的示例代码如下:

配套代码 io/blinka/pwm_test.py文件内容¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14import time import board import pwmio led = pwmio.PWMOut(board.PWM1, frequency=5000, duty_cycle=0) while True: for i in range(100): # PWM LED up and down if i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有