这是我的测试代码:
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
来生成它。
所以,我的主要问题是:
- 它是什么
channel
以及pin
如何使用它? - 为什么我无法让 PWM(1,1) PWM(2,2) 工作?
先感谢您。
---------------2019.4.2更新--------
我自己想出了前面的答案(感谢任何提供帮助的人)。
但正如您从我自己的回答中看到的那样,我仍然无法让 PWM 工作,因为它不能输出稳定的电压。(您可以在下面查看更多详细信息)。
我目前遇到了另一个输出电压根本不稳定的问题。所以,这是我做的测试:
我用占空比设置了PWMRaspberry Pi 3+ Model B
和PWM。由于两个设备都有 GPIO 输出 3.3V,我的理论是,它们的输出应该是相同的,但它们不是。EdgeTPU Coral Board
50hz
5%
以下是使用 Arduino UNO 板测量的电压:Pi vs. EdgeTPU。(注:所有电压均需除以 10)。您可以看到 Pi 输出中有一个清晰的模式 (PWM),在 1.8v 左右交替。但是如果你看一下 EdgeTPU 的输出,你会发现电压到处都是,而且电压要低得多(1.1v 对 1.8v)。
对我来说,EdgeTPU PWM 输出很明显有问题,所以我做了进一步的研究。从(有限的)文件中发现,它说
所有 GPIO 引脚在 iMX8M SOC 内部都有一个90k 下拉电阻,在启动期间默认使用,除了 I2C 引脚,它在 SOM 上具有上拉至 3.3V。但是,这些都可以通过 bootup 后加载的设备树覆盖来更改。
这让我怀疑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 作为默认操作系统,当没有站点/文档或任何类型可以找到?