首页 > 解决方案 > 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来生成它。

所以,我的主要问题是:

先感谢您。

---------------2019.4.2更新--------

我自己想出了前面的答案(感谢任何提供帮助的人)。

但正如您从我自己的回答中看到的那样,我仍然无法让 PWM 工作,因为它不能输出稳定的电压。(您可以在下面查看更多详细信息)。

我目前遇到了另一个输出电压根本不稳定的问题。所以,这是我做的测试:

我用占空比设置了PWMRaspberry Pi 3+ Model B和PWM。由于两个设备都有 GPIO 输出 3.3V,我的理论是,它们的输出应该是相同的,但它们不是。EdgeTPU Coral Board50hz5%

以下是使用 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团队的段落/问题:

标签: pythonlinuxpwmtpugoogle-coral

解决方案


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)

PWM 覆盖


推荐阅读