BeagleBone Green Wireless 上 PWM 的大量设置时间

问题描述

注意:我能找到的唯一 BeagleBone 标签是黑色的,这是一个绿色 Wifi,但我没有理由相信绿色和黑色在这件事上表现不同。欢迎提供替代标记建议。

对于嵌入式应用程序,我正在使用 BeagleBone Green Wireless 和 Adafruit python3 库,我正在尝试生成一些 PWM(脉宽调制)以向机器操作员发出音频蜂鸣警报,并发现它需要 ~设置 PWM 命令需要 240 毫秒,这感觉就像是一段疯狂的时间。

将 PWM 引脚连接到扬声器(通过晶体管)的最小 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)

这会按预期发出 80 毫秒的 1000 Hz 蜂鸣声,但仅在 PWM 设置后大约 240 毫秒的延迟之后才会发出。

为了充分检测这一点,我使用了另一个 GPIO 引脚并将两个引脚连接到示波器,切换 I/O 引脚以帮助我将代码与我看到的内容同步。

odd PWM Setup times on BeagleBone

上面的轨迹是 PWM 输出,这是正确的,下面的轨迹显示来自代码的各种同步脉冲,让我知道我看到了什么。 242 毫秒长脉冲(仅在 PWM 设置语句期间有效)。

这是生成跟踪的实际代码

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,frequency = 1000)
toggleBit()  # trailing edge of 242 msec pulse

time.sleep(0.080)   # beep for 80 msec

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

为了排除python只是让all有点慢,就在242毫秒长高脉冲之前是一个非常短的blippy同步脉冲:这是显示图像左上角的插图那个脉冲92微秒。这似乎完全合理,所以我无法解释疯狂缓慢的 PWM 设置。

我查看了 Adafruit 库中的 C 代码,我感觉到在执行 PWM 时存在一次性设置成本,但是这个大约 240 毫秒的事情反复出现。更改 PWM 引脚没有任何区别,以 root 身份运行也没有任何区别(我的非 root 用户是正确的 pwmgpio 组的成员)。在执行所有这些操作之前,我运行了正确的 config-pin 命令。

我对 Linux/C 非常熟悉,使用 BeagleBone 也很舒服,但 Python 对我来说还很陌生。

我被难住了。

涉及的组件(据我所知都是最新的):

  • BeagleBone 绿色无线
  • Debian Buster IoT 映像 2020-04-06
  • 内核版本 4.19.94-ti-r42
  • Python 3.7.3
  • Adafruit-BBIO 1.2.0

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)