这是我的测试代码:
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/pwm1
和pwm1
以及如何使用它?先感谢您。
--------------- 2019.4.2更新--------------------
我自己想出了以前的答案(感谢任何提供帮助的人)。
但正如你从我自己的答案中看到的那样,我仍然无法使PWM工作,因为它不是输出稳定的电压。 (您可以在下面查看更多详细信息)。
我目前正遇到输出电压根本不稳定的另一个问题。所以,这是我做的测试:
我用export
PWM和channel
占空比设置了pin
和Raspberry 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团队传达的文章/问题:
什么是通道和引脚以及它是如何使用的?
通道映射到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的有效外设命令:
pinout
$ 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
好吧,经过几天的研究,最后再回答我自己的问题。这是我发现的:
什么是通道和引脚以及它是如何使用的?
答:pwm = PWM(0,0)
就像pwm = PWM(1,0)
好像pwm = PWM(2,0)
是高速公路,有些芯片/引脚支持多个Channel
,有些则没有,你可以通过使用以下命令来解决这个问题(例如,使用EdgeTPU,其他Linux SOC应该是类似的):lane
然后做一个PIN
应该显示多个芯片/针像channel
,让你说你想知道多少cd /sys/class/pwm
是ls
支持,然后你
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之后?
答:很遗憾不是请查看我更新的问题。