BeagleBone Green Wireless上的PWM设置时间非常长

2024-04-29 08:09:25 发布

您现在位置:Python中文网/ 问答频道 /正文

注意:我能找到的唯一的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)

这会发出1000 Hz的蜂鸣音,持续80毫秒,但只有在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, 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只会使all变慢,在长242毫秒的高脉冲之前是一个非常短的blippy同步脉冲:这是图像左上角的插图,显示了92微秒的脉冲。这似乎完全合理,所以我没有解释疯狂缓慢的PWM设置

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

我非常熟悉Linux/C,非常熟悉BeagleBone,但是python对我来说是相当新的

我被难住了

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

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

Tags: 代码importadafruitgpiotimeas脉冲beaglebone