Огромное время настройки ШИМ на беспроводной сети BeagleBone Green

#python #beagleboneblack #pwm

Вопрос:

Примечание: единственный тег BeagleBone, который я смог найти, был для Черного, это Зеленый Wi-Fi, но у меня нет оснований полагать, что Зеленый и черный ведут себя по-разному в этом вопросе. Рекомендации по альтернативным тегам приветствуются.

Для встроенного приложения я использую беспроводную связь BeagleBone Green и библиотеки Adafruit python3, я пытаюсь сгенерировать ШИМ (широтно-импульсную модуляцию) для звуковых сигналов, оповещающих оператора машины, и обнаружил, что для настройки команды PWM требуется ~240 миллисекунд, и это просто кажется сумасшедшим большим количеством времени.

Минимальный код python, который соединяет ШИМ-вывод с динамиком (через транзистор):

 import time
import Adafruit_BBIO.PWM as PWM

pwmPin = "P8_46"

PWM.start(pwmPin, duty_cycle = 50, frequency = 1000)
time.sleep(0.080)
PWM.stop(pwmPin)
 

Это делает звуковой сигнал 1000 Гц в течение 80 мс, как и ожидалось, но только после задержки ~240 мс, пока ШИМ настраивается.

Чтобы полностью измерить это, я использовал другой вывод GPIO и подключил оба вывода к области видимости, переключив вывод ввода-вывода, чтобы помочь мне синхронизировать код с тем, что я вижу.

нечетное время настройки ШИМ на BeagleBone

Верхняя трассировка-это ШИМ-выход, который является правильным, а нижняя трассировка показывает различные синхроимпульсы из кода, чтобы сообщить мне, что я вижу. Длинный импульс длительностью 242 мс (который активен только во время инструкции по настройке ШИМ).

Это фактический код, который сгенерировал трассировки:

 import time
import Adafruit_BBIO.GPIO as GPIOn
import Adafruit_BBIO.PWM  as PWM

bitPin = "P8_10"    
pwmPin = "P8_46"

GPIO.setup(bitPin, GPIO.OUT)
currentBit = GPIO.input(bitPin)

def toggleBit():
    global bitPin
    global currentBit

    currentBit = not currentBit

    GPIO.output(bitPin, currentBit)

# INITIAL SYNC PULSE -- 92 microseconds
toggleBit()             
toggleBit()             

# Now generate PWM beep

toggleBit()  # rising edge of 242 msec pulse
PWM.start(pwmPin, duty_cycle = 50, frequency = 1000)
toggleBit()  # trailing edge of 242 msec pulse

time.sleep(0.080)   # beep for 80 msec

toggleBit()
PWM.stop(pwmPin)
toggleBit()
 

Чтобы исключить, что python просто замедляет работу с битами, непосредственно перед длительным импульсом 242 мс-это очень короткий импульсный синхроимпульс: это вставка в левом верхнем углу изображения, показывающая, что импульс составляет 92 микросекунды. Это кажется вполне разумным, поэтому у меня нет объяснения сумасшедшей медленной настройке ШИМ.

Я посмотрел код C в библиотеке Adafruit, и у меня возникло ощущение, что при выполнении ШИМ была единовременная стоимость настройки, но эта штука ~240 мсек появляется неоднократно. Изменение PIN-кода PWM не имело никакого значения, равно как и запуск от имени root (мой пользователь, не являющийся пользователем root, является членом соответствующих pwm и gpio групп). Я выполнил правильные config-pin команды, прежде чем делать все это.

Мне очень удобно работать с Linux/C, довольно удобно с BeagleBone, но python для меня довольно новый.

Я в тупике.

Задействованные компоненты (все они являются последними, насколько я знаю):

  • Беспроводная связь BeagleBone Green
  • Образ IoT Debian Buster 2020-04-06
  • Версия ядра 4.19.94-ti-r42
  • Python 3.7.3
  • Адафрут-BBIO 1.2.0

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

1. Вы пробовали делать это два раза подряд? Если это одноразовая настройка, то второй вызов будет быстрее. В противном случае общая идея состоит в том, чтобы сделать то, что делает профилировщик — изолировать строку кода, в которой происходит большая часть задержки (например, вычислить разницу time.time() до и после), затем войти в функцию и повторить процесс.

2. Первоначально я столкнулся с этой проблемой, вызвав ее дважды — для генерации <звукового сигнала> <звукового сигнала><звукового сигнала> <звукового сигнала><звукового сигнала>, но эта короткая пауза превратилась в 250 мсек, что означает, что это не одноразовая настройка. Я знаю, как выполнять отладку на уровне C на этом уровне, но нет никаких шансов, что я первый, кто выполнит ШИМ на BeagleBone, и гораздо более вероятно, что я делаю что-то не так, чем то, что леди Ада в корне ошиблась в широко используемой библиотеке. Надеюсь, что кто — то еще догадался об этом.

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

4. После целого дня исследований мне стало ясно, что это явная ошибка. Я подал заявку на проект: github.com/adafruit/adafruit-beaglebone-io-python/issues/350