我有一个在Pi 2上运行的简单Python程序。我似乎无法弄清楚输出频率偏离的原因。我把它编程为2000hz。我用两种方式测量输出,两者都产生1530赫兹。
由于我使用引脚18,我相信我应该使用硬件PWM。任何建议,我错过了什么。
这是代码
import time
import sys
import datetime
import RPi.GPIO as GPIO
def tonet(hz,s):
pt = GPIO.PWM(tone,hz)
pt.start(50) # duty cycle
time.sleep(s)
pt.stop
GPIO.output(tone, GPIO.LOW) # good house keeping
return
# Pin Definitons:
tone = 18 #
# Pin Setup:
GPIO.setmode(GPIO.BCM) # Broadcom pin-numbering scheme
GPIO.setup(tone, GPIO.OUT) # pin set as output
GPIO.output(tone, GPIO.HIGH)
pause = raw_input('high press a key')
GPIO.output(tone, GPIO.LOW)
pause = raw_input('low press a key....')
print 'start pwm'
tonet(2000, 20)
GPIO.cleanup()
答案 0 :(得分:0)
我认为引脚12和24(BOARD编号方案)具有硬件PWM功能,因此更加准确。
答案 1 :(得分:0)
Broadcom引脚#18是Raspberry Pi 2和3上的PWM硬件引脚。但问题是您使用的接口库如何支持Pi 2上的PWM硬件。
阅读这个Raspberry Pi StackExchange帖子的答案,看来RPIO库可能有一些PWM不准确性,至少在2012年答案的时候。
Can I use the GPIO for pulse width modulation (PWM)?
正如Alex Chamberlain所建议的,WiringPi图书馆似乎是 支持一个GPIO引脚上的硬件PWM输出和软件PWM开启 任何其他GPIO引脚。同时RPIO.PWM库执行PWM 任何GPIO引脚上的DMA。实际上,这是一个中间的房子 硬件和软件PWM,提供1μs的时序分辨率 使用WiringPi的软件PWM [1]至100μs。
哪些适合您的应用程序取决于多少 您需要的PWM输出以及您想要的性能 输出。
如果您的应用程序能够容忍低时序分辨率和高分辨率 抖动然后您可以使用软件或DMA辅助定时循环。如果 您需要更高精度/更低抖动的PWM 硬件协助。
另见2013年Raspberrypi.org论坛讨论。 RPIO.PWM: Precise PWM via DMA for servos and more (1µs res)
此外,我似乎记得耳机插孔音频可能会干扰PWM使用,因为电路在两者之间共享。如果您使用插孔,这应该只是一个问题。