Google EdgeTPU не может заставить PWM работать с Python

Вот мой тестовый код:

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-периферии https://github.com/vsergeev/python-periphery/blob/master/periphery/pwm.py

он должен получить путь следующим образом:

PWM(1,1) ===> /sys/class/pwm/pwmchip1/pwm1 если pwm1 не существует, то он должен вызвать export генерировать это.

Итак, мой главный вопрос:

  • Что такое channel а также pin и как это было использовано?
  • Почему я не могу заставить ШИМ (1,1) ШИМ (2,2) работать?

Заранее спасибо.

--------------- 2019.4.2 Обновление --------------------

Я сам разобрался с предыдущим ответом (и спасибо всем, кто оказал помощь).

Но, как вы можете видеть из моего собственного ответа, я все еще не могу заставить ШИМ работать, так как он не выдает стабильное напряжение. (Вы можете проверить более подробно ниже).

Я в настоящее время сталкиваюсь с другой проблемой, в которой выходное напряжение не является стабильным вообще. Итак, вот что я сделал, чтобы проверить:

Я настроил оба Raspberry Pi 3+ Model B и EdgeTPU Coral Board с 50hz ШИМ с 5% рабочий цикл. Поскольку оба устройства имеют выход GPIO 3,3 В, моя теория такова, что их выход должен быть одинаковым, но это не так.

Вот напряжение, измеренное с помощью платы Arduino UNO: Pi против EdgeTPU. (Примечание: все напряжение должно делиться на 10). Вы можете видеть четкую схему (PWM) на выходе Pi, колеблющуюся около 1.8v. но если вы посмотрите на выход EdgeTPU, вы увидите, что напряжение повсюду и оно намного ниже (1,1 В против 1,8 В).

для меня очевидно, что что-то не так с выходом EdgeTPU PWM, поэтому я провел дальнейшие исследования. выяснилось из (ограниченного) документа, он говорит

Все выводы GPIO имеют понижающий резистор 90 кОм внутри SOC iMX8M, который используется по умолчанию во время загрузки, за исключением выводов I2C, которые вместо этого имеют напряжение до 3.3 В на SOM. Однако все это можно изменить с помощью наложения дерева устройств, которое загружается после загрузки.

Что заставляет меня подозревать 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-периферию в качестве библиотеки по умолчанию для реализации GPIO и PWM?
  • Зачем выбирать Mendel Linux в качестве операционной системы по умолчанию, если нет сайта / документа или какого-либо другого вида, который можно найти?

2 ответа

По-видимому, все еще остается нерешенным вопрос о работе ШИМ 3,3 В (в отличие от 2,5, что правильно указано как делитель напряжения между выводом, имеющим включенное подтягивание, и каждым выводом, имеющим слабое понижение).

Конфигурацию контактов для наложения дерева устройств можно найти здесь: https://coral.googlesource.com/linux-imx/+/refs/heads/master/arch/arm64/boot/dts/freescale/fsl-imx8mq-phanbell.dts

Число там (0x7f) можно декодировать с помощью этой битовой маски: https://coral.googlesource.com/linux-imx/+/refs/heads/master/Documentation/devicetree/bindings/pinctrl/fsl%2Cimx8mq-pinctrl.txt.

2,5 В поступает от установленного значения PUE (включения подтягивания), в то время как все GPIO имеют слабое напряжение. Если это удалить (и вы должны удалить LVTTL и ODE для максимальной мощности привода), IO будет управлять 3,3 В. Вот накладка, которая это делает. Для включения скопируйте pwm.dtbo в / boot, а затем отредактируйте overlays.txt, чтобы добавить pwm в список (т.е. overlays=pwm)

ШИМ-оверлей

Что такое канал и пин-код и как он используется?

Канал отображается на микросхему драйвера в Linux sysfs (например, pwmchip0), и вывод отображается на отдельные выходы каждого канала. Каждый канал будет иметь npwm штырьки.

Вы можете запустить pinout введите на своем устройстве дополнительную информацию о периферийных портах 40-контактного разъема и каналах ШИМ, к которым они подключены:

$ 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), поэтому номер контакта на периферии всегда будет равен нулю.

Почему я не могу заставить ШИМ (1,1) ШИМ (2,2) работать?

Согласно приведенному выше объяснению, здесь приведены допустимые команды периферии для инициализации каждого ШИМ на плате разработчика:

  • ШИМ1 (контакт 32) -> pwm = PWM(0,0)
  • ШИМ2 (Контакт 33) -> pwm = PWM(1,0)
  • ШИМ3 (Контакт 15) -> pwm = PWM(2,0)

Ну, в конце концов, ответив на мой вопрос снова после нескольких дней исследований. Вот что я нашел:

Что такое канал и пин-код и как он используется?

Ответ: Channel как lane как будто PIN является высокоскоростным, некоторые чип / пин поддерживают несколько channel некоторые этого не делают, вы можете понять это с помощью следующей команды (например, используя EdgeTPU, другие Linux SOC должны быть похожими): cd /sys/class/pwm тогда сделай ls должен показывать несколько чип / пин как pwmchip0 pwmchip1 pwmchip2Позвольте сказать, вы хотите знать, сколько channel/lane является pwmchip0 поддержка, то вы cd pwmchip0 а потом cat npwm он должен дать вам номер, для EdgeTPU он показывает 1 это означает, что 1 канал / полоса поддерживается для pin PWM1, Вы можете сделать то же самое для pwmchip1 pwmchip2 ... pwmchip# (К вашему сведению, все контакты EdgeTPU поддерживают только 1 канал)

Почему я не могу заставить ШИМ (1,1) ШИМ (2,2) работать?

Это забавная часть, я слишком много могу сказать об этом.

Краткий ответ: THEIR DOCUMENT IS WRONG.it should be PWM(Pin,Channel)

Длинный Anser: Здесь говорится, что вы должны инициализировать ШИМ как PWM(Channel, Pin) но, глядя на его реализацию, он должен быть PWM(Pin, Channel) согласно коду. и еще один замечательный пример автономного модуля PWM здесь(настоятельно рекомендую любому пользователю EdgeTPU использовать этот вместо python-periphery). У меня есть PR, чтобы обновить их документ, но я хочу сказать, что их ШИМ определенно не были проверены никакими средствами. В противном случае вводящая в заблуждение информация уже должна была быть замечена. (TBH, проект кажется мертвым, без обновления в течение года, даже не уверен, будет ли мой PR объединен или нет. Будущая работа: если мой PR по корректировке документа будет утвержден, я буду работать над тем, чтобы получить отдельный PR-модуль ШИМ в библиотека периферии питона)

Итак, все ли работало так, как должно быть после того, как ШИМ заработал в коде?

Ответ: К сожалению, нет Пожалуйста, проверьте мой обновленный вопрос.

Другие вопросы по тегам