谷歌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)工作李>
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。您也可以这样做rpwmchip1 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