【发布时间】:2019-03-27 20:31:00
【问题描述】:
这是我的测试代码:
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 工作,因为它不能输出稳定的电压。 (您可以在下面查看更多详细信息)。
我目前遇到了另一个问题,即输出电压根本不稳定。所以,这就是我所做的测试:
我使用50hz PWM 和5% 占空比设置了Raspberry Pi 3+ Model B 和EdgeTPU Coral Board。由于两个设备都有 GPIO 输出 3.3V,我的理论是,它们的输出应该是相同的,但它们不是。
以下是使用 Arduino UNO 板测量的电压:Pi 与 EdgeTPU。 (注:所有电压均需除以 10)。您可以看到 Pi 输出中有一个清晰的模式 (PWM),在 1.8v 左右交替。但是如果你看一下 EdgeTPU 的输出,你会发现电压到处都是,而且电压要低得多(1.1v 对 1.8v)。
EdgeTPU PWM 输出显然有问题,所以我做了进一步的研究。从(有限的)document 发现,它说
所有 GPIO 引脚在 iMX8M SOC 内部都有一个 90k 下拉电阻 在启动期间默认使用,除了 I2C 引脚,它 而是在 SOM 上上拉至 3.3V。但是,这些都可以 使用启动后加载的设备树覆盖更改。
这让我怀疑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 设备树覆盖的文档。所以,我目前卡住了,如果你知道答案,请分享它,我将不胜感激。
我也会将此问题分享给 Coral 支持团队,看看他们是否会给我任何回复。(仅供参考,我在发布原始问题时确实向他们发送了一些东西,但还没有收到他们的任何消息,即使他们的网站上写着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 和脉宽调制?
- 为什么在没有站点/文档或任何类型可找到的情况下选择 Mendel Linux 作为默认操作系统?
【问题讨论】:
-
很难从提供的样本中确定波形的任何内容,因为采样率太低且读取间隔不一致。 50Hz 信号每 20 毫秒循环一次,这意味着您需要每 10 毫秒或更长时间采样一次才能获得准确的读数。这些样本在 75-115 毫秒之间变化,这太慢了,无法准确测量信号。
-
@Devunwired 好的,你说的对我有意义。我将尝试增加采样率以再次测试它。但是只要比较 Pi 和 Coral 板的结果,你就可以看出有明显的不同,对吧? (具有相同的频率和占空比)
-
您无法说出任何有价值的信息,因为不清楚您在波形中的哪个点收集样本(并且 ADC 在切换期间携带残余电压)。你真的需要在示波器上验证一下,看看输出时序是否正确
-
附带说明一下,我只是将示波器连接到所有三个 PWM 输出,并且它们的信号参数与外围代码无关。
-
@Devunwired 我今天再次对其进行了测试,看来 PWM 确实适用于小型 LED 灯(我可以通过调暗灯光来确认它是否正常工作)。但我仍然无法让它与 SG90 伺服(ee.ic.ac.uk/pcheung/teaching/DE1_EE/stores/sg90_datasheet.pdf)一起工作,我可以使用 Raspberry Pi 轻松控制伺服。我仍然怀疑下拉电阻可能会过度消耗电压。您能分享一下如何在 Mendel Linux 上设置设备树覆盖吗?谢谢。
标签: python linux pwm tpu google-coral