python - Google EdgeTPU 无法让 PWM 与 Python 一起使用
问题描述
这是我的测试代码:
from periphery import PWM
import time
# Open PWM channel 0, pin 0
pwm = PWM(0,0)
# Set frequency to 1 kHz
pwm.frequency = 50
# Set duty cycle to 75%
pwm.duty_cycle = 0.02
pwm.enable()
print(pwm.period)
print(pwm.frequency)
print(pwm.enabled)
# Change duty cycle to 50%
pwm.duty_cycle = 0.05
pwm.close()
问题是这部分:
# Open PWM channel 0, pin 0
pwm = PWM(0,0)
运行时可以看到输出PWM(0,0)
PWM(0,1)
PWM(0,2)
但我在尝试运行以下命令时收到错误消息:
PWM(1,1)
PWM(2,2)
mendel@elusive-jet:/sys/class/pwm$ sudo python3 /usr/lib/python3/dist-packages/edgetpuvision/testPWM.py
OSError: [Errno 19] No such device
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/periphery/pwm.py", line 69, in _open
f_export.write("%d\n" % pin)
OSError: [Errno 19] No such device
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/edgetpuvision/testPWM.py", line 5, in <module>
pwm = PWM(1,1)
File "/usr/local/lib/python3.5/dist-packages/periphery/pwm.py", line 44, in __init__
self._open(channel, pin)
File "/usr/local/lib/python3.5/dist-packages/periphery/pwm.py", line 71, in _open
raise PWMError(e.errno, "Exporting PWM pin: " + e.strerror)
periphery.pwm.PWMError: [Errno 19] Exporting PWM pin: No such device
基于来自 Coral 和图书馆网站的文档: https ://coral.withgoogle.com/tutorials/devboard-gpio/
https://github.com/vsergeev/python-periphery
这
PWM(1,1)
PWM(2,2)
应该可以正常工作,我可以看到存在以下目录:
"\sys\class\pwm\pwmchip0"
"\sys\class\pwm\pwmchip1"
"\sys\class\pwm\pwmchip2"
在 python-periphery 源代码 https://github.com/vsergeev/python-periphery/blob/master/periphery/pwm.py
它应该得到如下路径:
PWM(1,1) ===> /sys/class/pwm/pwmchip1/pwm1
如果pwm1
不存在,那么它应该调用export
来生成它。
所以,我的主要问题是:
- 它是什么
channel
以及pin
如何使用它? - 为什么我无法让 PWM(1,1) PWM(2,2) 工作?
先感谢您。
---------------2019.4.2更新--------
我自己想出了前面的答案(感谢任何提供帮助的人)。
但正如您从我自己的回答中看到的那样,我仍然无法让 PWM 工作,因为它不能输出稳定的电压。(您可以在下面查看更多详细信息)。
我目前遇到了另一个输出电压根本不稳定的问题。所以,这是我做的测试:
我用占空比设置了PWMRaspberry Pi 3+ Model B
和PWM。由于两个设备都有 GPIO 输出 3.3V,我的理论是,它们的输出应该是相同的,但它们不是。EdgeTPU Coral Board
50hz
5%
以下是使用 Arduino UNO 板测量的电压:Pi vs. EdgeTPU。(注:所有电压均需除以 10)。您可以看到 Pi 输出中有一个清晰的模式 (PWM),在 1.8v 左右交替。但是如果你看一下 EdgeTPU 的输出,你会发现电压到处都是,而且电压要低得多(1.1v 对 1.8v)。
对我来说,EdgeTPU PWM 输出很明显有问题,所以我做了进一步的研究。从(有限的)文件中发现,它说
所有 GPIO 引脚在 iMX8M SOC 内部都有一个90k 下拉电阻,在启动期间默认使用,除了 I2C 引脚,它在 SOM 上具有上拉至 3.3V。但是,这些都可以通过 bootup 后加载的设备树覆盖来更改。
这让我怀疑90k pull-down resistor
由于这个公式的事实可能会降低输出电压V=IR
。因此,我正在考虑device tree overlay
按照指示更改启动时的设置。但是,猜猜看,除了文件中的以下行之外,没有关于如何更改它的overlays.txt
文档:
# List of device tree overlays to load. Format: overlay=<dtbo name, no extenstion> <dtbo2> ...
overlay=
我到处搜索,没有关于如何配置 Mendel Linux 设备树覆盖的文档。所以,我目前卡住了,如果你知道答案,请分享它,我将不胜感激。
我也会将这个问题分享给珊瑚支持团队,看看他们是否会给我任何回应。(仅供参考,当我发布原始问题时,我确实向他们发送了一些东西,但还没有收到他们的任何消息,即使他们的网站说We try to respond to inquiries within one business day — but often you'll get a response even quicker, usually a few hours.
)所以,祝我好运。如果收到任何回复,将保持更新此答案。
以下是我想传达给Google/Google Cloud/Google EdgeTPU/Google Coral Board团队的段落/问题:
- 为什么选择 python-periphery 作为默认库来实现 GPIO 和 PWM ?
- 为什么选择 Mendel Linux 作为默认操作系统,当没有站点/文档或任何类型可以找到?
解决方案
3.3V PWM 操作似乎仍然存在一个悬而未决的问题(与 2.5 不同,它被正确地记为启用上拉的引脚和具有弱下拉的每个引脚之间的分压器)。
设备树覆盖的引脚配置可在此处找到:https ://coral.googlesource.com/linux-imx/+/refs/heads/master/arch/arm64/boot/dts/freescale/fsl-imx8mq-phanbell .dts#171
那里的数字(0x7f)可以用这个位掩码解码:https://coral.googlesource.com/linux-imx/+/refs/heads/master/Documentation/devicetree/bindings/pinctrl/fsl%2Cimx8mq-pinctrl。 .txt _
2.5V 来自 PUE(上拉使能)设置,而所有 GPIO 都具有弱下拉。如果将其删除(并且您应该删除 LVTTL 和 ODE 以获得最大驱动强度),IO 将驱动 3.3V。这是一个可以做到这一点的叠加层。要启用,请将 pwm.dtbo 复制到 /boot,然后编辑 overlays.txt 以将 pwm 添加到列表中(即 overlays=pwm)
推荐阅读
- google-sheets - 当两个模块都在同一个项目中时,如何从 GCP 的 AI Notebooks 中连接到谷歌表格?
- javascript - 如何使用“文本输入”更改和保存“状态”中的嵌套数据
- ruby-on-rails - Rails 邮件程序:Errno::EPIPE
- python - Pandas DataFrame TypeError:分位数()缺少1个必需的位置参数:'分位数'?
- css - 修复了移动 CSS 上的侧边栏菜单
- ruby-on-rails - Postgis 未在 Rails 应用程序中设置
- spring - 部署在 Google Cloud 上的 java 项目
- ubuntu - Ubuntu Trust OpenSSL 自签名证书
- python - 在 python 中,将 1970 年的秒数转换为 1900 年以来的小时数
- ignite - 通过 IgniteClient 将数据存储到 Ignite 缓存时抛出异常