Google EdgeTPU无法使PWM与Python配合使用

时间:2019-03-27 20:31:00

标签: python linux pwm tpu google-coral

这是我的测试代码:

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生成它。

所以,我的主要问题是:

  • channelpin是什么以及如何使用?
  • 为什么我无法使PWM(1,1)PWM(2,2)工作?

先谢谢您。

--------------- 2019.4.2更新-------------------- < / p>

我自己找出了上一个答案(并感谢提供帮助的任何人)。

但是,正如您从我自己的答案中看到的那样,由于输出的电压不稳定,我仍然无法使PWM正常工作。 (您可以在下面查看更多详细信息)。

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

我用Raspberry Pi 3+ Model B占空比的EdgeTPU Coral Board PWM设置了50hz5%。由于两个设备的GPIO输出均为3.3V,我的理论是,它们的输出应相同,但不相同。

以下是使用Arduino UNO板测得的电压:PiEdgeTPU。 (注意:所有电压应除以10)。您会看到Pi输出中有一个清晰的模式(PWM),大约在1.8v左右交替变化。但是,如果您查看EdgeTPU输出,您会发现电压遍布各处,并且电压要低得多(1.1v对1.8v)。

对我来说,EdgeTPU PWM输出显然有问题,所以我做了进一步的研究。从(有限的)document中找到,它说

  

所有GPIO引脚在iMX8M SOC内部具有一个 90k下拉电阻,    在启动期间默认使用I2C引脚,但I2C引脚除外。    而是将SOM上拉至3.3V。但是,这些都可以是    更改为设备树覆盖,该树在启动后会加载

这使我怀疑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 个答案:

答案 0 :(得分:2)

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来自于在所有GPIO均具有弱下拉电阻时设置的PUE(上拉使能)。如果将其卸下(您应卸下LVTTL和ODE以达到最大驱动强度),则IO将驱动3.3V。这是完成此操作的叠加层。要启用该功能,请将pwm.dtbo复制到/ boot,然后编辑overlays.txt以将pwm添加到列表中(即overlays = pwm)

PWM Overlay

答案 1 :(得分:1)

  

什么是通道和引脚以及如何使用?

通道映射到Linux sysfs中的驱动器芯片(例如pwmchip0),而 pin 映射到每个通道上的各个输出。每个通道都有npwm引脚。

您可以在设备上运行pinout命令以获取有关40针连接器上的外围端口以及它们所连接的PWM通道的更多详细信息:

$ pinout
            3.3.V -> 1    2 <- 5V
 I2C2_SDA (i2c-1) -> 3    4 <- 5V
 I2C2_SCL (i2c-1) -> 5    6 <- GND
        UART3_TXD -> 7    8 <- UART1_TX
              GND -> 9   10 <- UART1_RX
        UART3_RXD -> 11  12 <- SAI1_TXC
 GPIO_P13 (gpio6) -> 13  14 <- GND
  PWM3 (pwmchip2) -> 15  16 <- GPIO_P16 (gpio73)
             3.3V -> 17  18 <- GPIO_P18 (gpio138)
        SPI1_MOSI -> 19  20 <- GND
        SPI1_MISO -> 21  22 <- GPIO_P22 (gpio140)
        SPI1_SCLK -> 23  24 <- SPI1_SS0
              GND -> 25  26 <- SPI1_SS1
 I2C3_SDA (i2c-2) -> 27  28 <- I2C3_SCL (i2c-2)
 GPIO_P29 (gpio7) -> 29  30 <- GND
 GPIO_P31 (gpio8) -> 31  32 <- PWM1 (pwmchip0)
  PWM2 (pwmchip1) -> 33  34 <- GND
        SAI1_TXFS -> 35  36 <- GPIO_P36 (gpio141)
GPIO_P37 (gpio77) -> 37  38 <- SAI1_RXD0
              GND -> 39  40 <- SAI1_TXD0

在此板上,每个通道只有一个引脚(cat npwm返回1),因此外围的引脚号始终为零。

  

为什么我无法使PWM(1,1)PWM(2,2)正常工作?

按照上述说明,以下是用于初始化开发板上每个PWM的有效外围设备命令:

  • PWM1(引脚32)-> pwm = PWM(0,0)
  • PWM2(引脚33)-> pwm = PWM(1,0)
  • PWM3(引脚15)-> pwm = PWM(2,0)

答案 2 :(得分:0)

好吧,经过几天的研究,最终再次回答了我自己的问题。这是我发现的:

  

什么是通道和引脚以及如何使用?

答案:Channel就像lane一样,好像PIN是高速公路,有些芯片/引脚支持多个channel,有些则没有。不是,您可以使用以下命令解决这一问题(例如,使用EdgeTPU,其他Linux SOC应该与此类似): cd /sys/class/pwm然后做ls应该显示多个芯片/引脚,例如 pwmchip0 pwmchip1 pwmchip2,假设您想知道channel/lane支持多少pwmchip0,那么您{ {1}},然后是cd pwmchip0,它应该给您一个数字,对于EdgeTPU,它显示cat npwm,这意味着1支持1个通道/车道。您可以对pin PWM1执行相同的操作 (仅供参考,EdgeTPU的所有引脚仅支持1个通道)

  

为什么我无法使PWM(1,1)PWM(2,2)正常工作?

这是有趣的部分,对此我有太多话要说。

短弓箭手pwmchip1 pwmchip2 ... pwmchip# THEIR DOCUMENT IS WRONG.

Long Anser :在here中,您应该将 PWM 初始化为it should be PWM(Pin,Channel),但通过查看其实现,它应该为{根据{{​​3}}的{1}}。还有PWM独立模块code的另一个很好的例子(强烈建议所有EdgeTPU用户使用此模块而不是PWM(Channel, Pin))。 我有here要更新他们的文档,但是我想说,他们的PWM肯定没有经过任何测试。否则,误导性信息应该已经注意到。 (TBH,该项目似乎已死,一年没有更新,甚至不确定我的PR是否会被合并。未来工作:如果我的文档更正PR得到批准,我将致力于将独立的PWM模块PR获得python-periphery库)

  

因此,在使PWM正常工作之后,是否一切都按预期方式工作   代码?

答案::很遗憾,不是。请签出我更新的问题。