#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)
Комментарии:
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. Пожалуйста, избегайте задавать дополнительные вопросы в ответе, поскольку на них невозможно ответить. Если проблемы здесь связаны с исходным вопросом, вы можете отредактировать сам вопрос. В противном случае рассмотрите возможность задать второй вопрос для решения новой проблемы.