Raspberry Pi PWM精度,Python

时间:2016-03-24 21:44:18

标签: python raspberry-pi pwm

我有一个在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()

2 个答案:

答案 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使用,因为电路在两者之间共享。如果您使用插孔,这应该只是一个问题。