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

#python #linux #pwm #tpu #google-coral

#python #linux #pwm #tpu #google-coral

Вопрос:

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

 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("%dn" % 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

The

PWM(1,1)

PWM(2,2)

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

 "sysclasspwmpwmchip0"
"sysclasspwmpwmchip1"
"sysclasspwmpwmchip2"
  

В исходном коде 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) работать?

Thank you in advance.

—————2019.4.2 Update———————

I figured out the previous answer by myself (and thank you for anyone who provided help).

But as you can see from my own answer, I’m still not able to get the PWM to work as it is not output stable Voltage. (You can check out more detail below).

I’m currently running into another issue in which the output voltage are not stable at all. So, here is what I did to test:

Я настроил оба, Raspberry Pi 3 Model B и EdgeTPU Coral Board с 50hz помощью 5% , PWM с ,, рабочим циклом. Поскольку оба устройства имеют выход GPIO 3.3 В, моя теория заключается в том, что их выходные данные должны быть идентичными, но это НЕ так.

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

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

Все выводы GPIO имеют понижающий резистор 90 Ком внутри iMX8M SOC, который используется по умолчанию при загрузке, за исключением выводов 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-periphery в качестве библиотеки по умолчанию для реализации GPIO и PWM?
  • Зачем выбирать Mendel Linux в качестве ОС по умолчанию, когда нет сайта / документа или любого другого вида, который можно найти?

Комментарии:

1. Трудно определить что-либо о форме сигнала из предоставленных выборок, потому что частота дискретизации слишком низкая, а интервал считывания не согласован. Сигнал частотой 50 Гц подается каждые 20 мс, что означает, что вам нужно отбирать выборки каждые 10 мс или чаще, чтобы получить точные показания. Эти выборки варьируются в пределах 75-115 мс, что слишком медленно для точного измерения сигнала.

2. @Devunwired Ладно, ты сказал, что для меня это имеет смысл. Я попытаюсь увеличить частоту дискретизации, чтобы протестировать это снова. но просто сравните результаты с Pi и Coral board, вы можете сказать, что есть явные различия, верно? (с той же частотой и рабочим циклом)

3. Вы не можете сообщить ничего ценного, потому что неясно, в какой точке формы сигнала вы собираете выборку (а на АЦП передается остаточное напряжение во время переключения). Вам действительно нужно проверить это на осциллографе, чтобы увидеть, правильна ли синхронизация вывода

4. В качестве дополнительного примечания, я просто подключаю область видимости ко всем трем выходам PWM, и их параметры сигнала полностью совпадают с кодом периферии.

5. @Devunwired Сегодня я снова протестировал это, кажется, PWM работает с небольшим светодиодом (я могу подтвердить, что он работает, приглушив свет). но я все еще не могу заставить его работать с сервоприводом SG90 ( ee.ic.ac.uk/pcheung/teaching/DE1_EE/stores/sg90_datasheet.pdf ) Я смог легко управлять сервоприводом с помощью Raspberry Pi. Я все еще подозреваю, что понижающий резистор, возможно, слишком сильно потреблял напряжение. Не могли бы вы, пожалуйста, поделиться тем, как настроить наложение дерева устройств на Mendel Linux? Спасибо.

Ответ №1:

По-видимому, все еще остается нерешенным вопрос о работе PWM напряжением 3,3 В (в отличие от 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,imx8mq-pinctrl.txt .

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

Наложение PWM

Комментарии:

1. Спасибо за это объяснение @Micheal Brooks! Я попытался реализовать наложение для Google coral, чтобы изменить режим gpio на open drain. Для этого я скопировал ваш пример и изменил подузлы, а также соответствующие выводы. Вы можете найти файл .dts здесь . Консоль загрузки сообщает, что оверлей загрузился успешно, но проверка выводов не сработала. У вас есть какие-либо идеи, почему это может быть?

Ответ №2:

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

Канал привязан к чипу драйвера в 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)

Комментарии:

1. Спасибо за добавление, но я на самом деле уже разобрался со всем этим (вы также можете сослаться на мой собственный ответ). Я думаю, мне следовало бы обновить вопрос с другой проблемой, которую я также проиллюстрировал в более поздней части моего ответа.

Ответ №3:

Что ж, в конечном итоге я снова отвечаю на свой вопрос после пары дней исследований. Вот что я нашел:

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

Ответ: Channel это похоже на то, что lane как будто PIN это высокий уровень, некоторые чипы / контакты поддерживают несколько, channel некоторые нет, вы можете выяснить это с помощью следующей команды (используя EdgeTPU, например, другие SOC Linux должны быть похожими): 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 канал)

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

Это забавная часть, мне есть что сказать по этому поводу.

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

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

Итак, все ли работало так, как предполагалось, после включения PWM в код?

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

Комментарии:

1. Пожалуйста, избегайте задавать дополнительные вопросы в ответе, поскольку на них невозможно ответить. Если проблемы здесь связаны с исходным вопросом, вы можете отредактировать сам вопрос. В противном случае рассмотрите возможность задать второй вопрос для решения новой проблемы.