2

这是我的测试代码:

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 Board50hz5%

以下是使用 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 作为默认操作系统,当没有站点/文档或任何类型可以找到?
4

3 回答 3

2

3.3V PWM 操作似乎仍然存在一个悬而未决的问题(与 2.5 不同,它被正确地记为启用上拉的引脚和具有弱下拉的每个引脚之间的分压器)。

设备树覆盖的引脚配置可在此处找到:https ://coral.googlesource.com/linux-imx/+/refs/heads/master/arch/arm64/boot/dts/freescale/fsl-imx8mq-phanbell .dts#171

那里的数字(0x7f)可以用这个位掩码解码:https://coral.googlesource.com/linux-imx/+/refs/heads/master/Documentation/devicetree/bindings/pinctrl/fsl%2Cimx8mq-pinctrl。 .txt _

2.5V 来自 PUE(上拉使能)设置,而所有 GPIO 都具有弱下拉。如果将其删除(并且您应该删除 LVTTL 和 ODE 以获得最大驱动强度),IO 将驱动 3.3V。这是一个可以做到这一点的叠加层。要启用,请将 pwm.dtbo 复制到 /boot,然后编辑 overlays.txt 以将 pwm 添加到列表中(即 overlays=pwm)

PWM 覆盖

于 2020-07-21T17:08:18.067 回答
1

什么是通道和引脚以及它是如何使用的?

通道映射到Linux sysfs 中的驱动芯片(例如)pwmchip0引脚映射到每个通道上的单独输出。每个通道都有npwm引脚。

您可以在您的设备上运行该pinout命令,以获取有关 40 针连接器上的外围端口及其连接到的 PWM 通道的更多详细信息:

$ 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返回 1),因此外围的引脚号始终为零。

为什么我无法让 PWM(1,1) PWM(2,2) 工作?

根据上面的解释,以下是初始化开发板上每个 PWM 的有效外围命令:

  • PWM1(引脚 32)-->pwm = PWM(0,0)
  • PWM2(引脚 33)-->pwm = PWM(1,0)
  • PWM3(引脚 15)-->pwm = PWM(2,0)
于 2019-04-02T17:39:48.650 回答
0

好吧,经过几天的研究,最终再次回答了我自己的问题。这是我发现的:

什么是通道和引脚以及它是如何使用的?

答: Channel好像lanePIN一条高速公路,有的芯片/管脚支持多个channel有的不支持,你可以用下面的命令算出来(以EdgeTPU为例,其他Linux SOC应该类似): cd /sys/class/pwm 然后做als应该显示多个芯片/引脚,例如 pwmchip0 pwmchip1 pwmchip2,假设您想知道支持多少,然后channel/lane它应该给您一个数字,对于 EdgeTPU,它显示这意味着支持 1 个通道/通道。您也可以这样做 (仅供参考,EdgeTPU 的所有引脚仅支持 1 个通道)pwmchip0cd pwmchip0cat npwm1pin PWM1pwmchip1 pwmchip2 ... pwmchip#

为什么我无法让 PWM(1,1) PWM(2,2) 工作?

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

简短回答: THEIR DOCUMENT IS WRONG. it should be PWM(Pin,Channel)

Long Anser:在这里它说你应该初始化PWMPWM(Channel, Pin)但是通过查看它的实现,它应该PWM(Pin, Channel)根据代码以及此处PWM 独立模块的另一个很好的例子(强烈建议任何 EdgeTPU 用户使用这个而不是python-periphery)。我有PR来更新他们的文档,但我想说,他们的 PWM 绝对没有经过任何测试。否则,误导性信息现在应该已经注意到了。(TBH,这个项目好像死了,一年多没有更新,甚至不确定我的 PR 是否会被合并。未来的工作:如果我的文档更正 PR 获得批准,我将努力将独立的 PWM 模块 PR 到python-外围库)

那么,在让 PWM 在代码中工作之后,一切都按预期工作了吗?

回答:不幸是,请查看我更新的问题。

于 2019-04-01T16:11:57.847 回答