Google EdgeTPU无法使用PWM来使用Python

问题描述 投票:1回答:2

这是我的测试代码:

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)

我在运行qazxsw poi qazxsw poi qazxsw poi时可以看到输出

但是在尝试运行以下内容时收到错误消息:

PWM(0,0)

PWM(0,1)

PWM(0,2)

基于Coral和图书馆网站的文件: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

https://coral.withgoogle.com/tutorials/devboard-gpio/

应该没有问题,我可以看到存在以下目录:

https://github.com/vsergeev/python-periphery

在python-peripheral源代码PWM(1,1)

它应该得到以下路径:

PWM(2,2)如果"\sys\class\pwm\pwmchip0" "\sys\class\pwm\pwmchip1" "\sys\class\pwm\pwmchip2" 不存在,那么它应该调用https://github.com/vsergeev/python-periphery/blob/master/periphery/pwm.py来生成它。

所以,我的主要问题是:

  • 什么是PWM(1,1) ===> /sys/class/pwm/pwmchip1/pwm1pwm1以及如何使用它?
  • 为什么我无法使PWM(1,1)PWM(2,2)工作?

先感谢您。

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

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

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

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

我用export PWM和channel占空比设置了pinRaspberry Pi 3+ Model B。由于两个器件的GPIO输出均为3.3V,我的理论是,它们的输出应该相同,但它们不是。

以下是使用Arduino UNO板测量的电压:EdgeTPU Coral Board vs. 50hz。 (注意:所有电压应除以10)。您可以看到Pi输出中有一个清晰的模式(PWM),交替大约1.8v。但是如果你看一下EdgeTPU输出,你可以看到电压是在各个地方,它的电压要低得多(1.1v对1.8v)。

对我来说,EdgeTPU PWM输出有问题,所以我做了进一步的研究。从(有限的)5%发现,它说

所有GPIO引脚在iMX8M SOC内部都有一个90k下拉电阻,默认情况下在启动时使用,除了I2C引脚,而SOM上的上拉电阻为3.3V。但是,这些都可以通过启动后加载的设备树覆盖进行更改。

这导致我怀疑Pi可能会降低输出电压,因为这个公式EdgeTPU的事实。所以,我正在考虑按照指示更改启动时的document。但是,猜猜看,除了90k pull-down resistor文件中的以下行之外,没有关于如何更改它的文档:

V=IR

我已经搜遍了所有地方,没有关于如何配置Mendel Linux设备树覆盖的文档。所以,我现在卡住了,如果你知道答案,请分享,我将不胜感激。

我也会向珊瑚支持团队分享这个问题,看看他们是否会给我任何回复。(仅供参考,当我发布原始问题时,我确实向他们发送了一些东西,但他们还没有听到任何消息,甚至是他们的网站说device tree overlay)所以,祝我好运。如果听到任何回复,将保持此答案更新。

以下是我想向Google / Google Cloud / Google EdgeTPU / Google Coral Board团队传达的文章/问题:

  • 为什么选择python-peripheral作为默认库来实现GPIO和PWM?
  • 为什么选择Mendel Linux作为默认操作系统,何时没有站点/文档或任何类型?
python linux pwm tpu google-coral
2个回答
1
投票

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

通道映射到Linux sysfs中的驱动程序芯片(例如overlays.txt),并且引脚映射到每个通道上的各个输出。每个通道都有# List of device tree overlays to load. Format: overlay=<dtbo name, no extenstion> <dtbo2> ... overlay= 引脚。

您可以在设备上运行We try to respond to inquiries within one business day — but often you'll get a response even quicker, usually a few hours.命令,以获取有关40引脚连接器上的外设端口及其连接的PWM通道的更多详细信息:

pwmchip0

在该电路板上,每个通道只有一个引脚(npwm返回1)所以外围的引脚数始终为零。

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

根据上面的解释,这里是初始化开发板上每个PWM的有效外设命令:

  • PWM1(引脚32) - > pinout
  • PWM2(引脚33) - > $ 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
  • PWM3(引脚15) - > cat npwm

0
投票

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

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

答:pwm = PWM(0,0)就像pwm = PWM(1,0)好像pwm = PWM(2,0)是高速公路,有些芯片/引脚支持多个Channel,有些则没有,你可以通过使用以下命令来解决这个问题(例如,使用EdgeTPU,其他Linux SOC应该是类似的):lane然后做一个PIN应该显示多个芯片/针像channel,让你说你想知道多少cd /sys/class/pwmls支持,然后你 pwmchip0 pwmchip1 pwmchip2然后channel/lane它应该给你一个数字,为​​EdgeTPU它显示pwmchip0这意味着1 cd pwmchip0支持频道/频道。您可以对cat npwm执行相同的操作(仅供参考,EdgeTPU的所有引脚仅支持1个通道)

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

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

简答:qazxsw poi qazxsw poi

Long Anser:在1中它说你应该将PWM初始化为pin PWM1但是通过查看它的实现,根据pwmchip1 pwmchip2 ... pwmchip#它应该是THEIR DOCUMENT IS WRONG.。和PWM独立模块it should be PWM(Pin,Channel)的另一个很好的例子(强烈建议任何EdgeTPU用户使用这个而不是here)。我有PWM(Channel, Pin)更新他们的文件,但我想说,他们的PWM肯定没有经过任何方式的测试。否则,现在应该注意到误导性信息。 (TBH,该项目似乎已经死亡,一年内没有更新,甚至不确定我的PR是否会合并。未来的工作:如果我的文件更正PR得到批准,我将努力让独立的PWM模块PR到python-peripheral library)

那么,一切正常,因为它假设是在代码中使用PWM之后?

答:很遗憾不是请查看我更新的问题。

© www.soinside.com 2019 - 2024. All rights reserved.