谷歌EdgeTPU可以';我无法使用Python

谷歌EdgeTPU可以';我无法使用Python,python,linux,pwm,tpu,google-coral,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.en

以下是我的测试代码:

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)

在python外围源代码中

它应该获得如下路径:

PWM(1,1)==>/sys/class/PWM/pwmchip1/pwm1
如果
pwm1
不存在,那么它应该调用
导出
来生成它

因此,我的主要问题是:

  • 什么是
    频道
    pin
    以及如何使用
  • 为什么我不能让PWM(1,1)PWM(2,2)工作
先谢谢你

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

我自己找到了前面的答案(感谢所有提供帮助的人)。

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

我现在遇到了另一个问题,输出电压根本不稳定。下面是我做的测试:

我用
50hz
PWM设置了
5%占空比的
Raspberry Pi 3+型号B
EdgeTPU Coral Board
。由于两个设备都有3.3V的GPIO输出,我的理论是,它们的输出应该是相同的,但它们不是

以下是使用Arduino UNO板测量的电压:vs。(注:所有电压应除以10)。您可以看到Pi输出中有一个清晰的模式(PWM),在1.8v左右交替。但是如果你看EdgeTPU的输出,你可以看到电压到处都是,它的电压要低得多(1.1v vs 1.8v)

很明显,EdgeTPU PWM输出有问题,所以我做了进一步的研究。它说,这是从(有限公司)那里发现的

所有GPIO引脚在iMX8M SOC内都有一个90k下拉电阻器 在启动过程中默认使用,但I2C引脚除外 相反,SOM上的上拉电压为3.3V。然而,这些都可以 使用启动后加载的设备树覆盖进行更改

这使我怀疑
90k下拉电阻器
可能由于以下公式的事实而降低了输出电压
V=IR
。因此,我想在引导时按照指示更改
设备树覆盖。但是,你猜怎么着,除了
overlays.txt
文件中的以下行之外,没有关于如何更改它的文档:

# List of device tree overlays to load. Format: overlay=<dtbo name, no extenstion> <dtbo2> ...
overlay=
#要加载的设备树覆盖列表。格式:覆盖=。。。
覆盖层=
我搜索了所有地方,没有关于如何配置Mendel Linux设备树覆盖的文档。所以,我现在陷入困境,如果你知道答案,请分享,我将不胜感激

我将把这个问题分享给Coral支持团队,看看他们是否会给我任何回应。(仅供参考,当我发布原始问题时,我确实给他们发了一些回复,但还没有收到他们的任何消息,即使他们的网站上说,
我们尝试在一个工作日内回复询问,但通常你会更快地得到回复,通常是几个小时。
)所以,祝我好运。如果有任何反馈,我会及时更新这个答案

以下是我想向谷歌/谷歌云/谷歌EdgeTPU/谷歌珊瑚板团队传达的段落/问题:

  • 为什么选择python外围设备作为实现GPIO的默认库 还有PWM
  • 为什么选择孟德尔Linux作为默认操作系统,而没有找到任何站点/文档或任何种类

经过几天的研究,我终于再次回答了自己的问题。以下是我的发现:

什么是通道和pin以及如何使用

回答:
通道
就像
车道
好像
引脚
是一种高通道,有些芯片/引脚支持多个
通道
有些不支持,您可以使用以下命令来解决这个问题(例如使用EdgeTPU,其他Linux SOC应该类似):
cd/sys/class/pwm
然后执行
ls
应显示多个芯片/引脚状

pwmchip0 pwmchip1 pwmchip2
,假设您想知道有多少个
channel/lane
pwmchip0
支持,那么您
cd pwmchip0
然后
cat npwm
它应该给您一个数字,对于EdgeTPU,它显示
1
,这意味着
引脚PWM1
支持1个channel/lane。您也可以这样做r
pwmchip1 pwmchip2…pwmchip
(仅供参考,EdgeTPU的所有引脚仅支持1个通道)

为什么我不能让PWM(1,1)PWM(2,2)工作

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

短Anwser:
他们的文档错误。
应该是PWM(引脚、通道)

Long Anser:其中说您应该将PWM初始化为
PWM(通道,引脚)
,但通过查看其实现,根据。和另一个PWM独立模块的伟大示例,它应该是
PWM(通道,引脚)
(强烈建议任何EdgeTPU用户使用此选项,而不是使用
python外围设备
)。 我必须更新他们的文档,但我想说的是,他们的PWM绝对没有经过任何方式的测试。否则,误导性的信息现在应该已经注意到了。(TBH,项目似乎已经结束,一年内没有更新,甚至不确定我的PR是否会被合并。未来的工作:如果我的文档更正PR获得批准,我将致力于将独立的PWM模块PR发送到python外围库)

那么,一切都按照预期的方式运行了吗
"\sys\class\pwm\pwmchip0"
"\sys\class\pwm\pwmchip1"
"\sys\class\pwm\pwmchip2"
# List of device tree overlays to load. Format: overlay=<dtbo name, no extenstion> <dtbo2> ...
overlay=
$ 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