【问题标题】:software pwm using I2C with raspberry in python在 python 中使用 I2C 和树莓派的软件 pwm
【发布时间】:2014-10-13 14:51:40
【问题描述】:

我正在寻找使用 mcp23017 gpio-expander 和树莓派作为 LED 调光器的解决方案,但每 4-5 秒就会出现短暂的闪烁。如果我直接使用 gpio,我执行了闪烁也存在(如果您尝试,请注释/取消注释代码中的相关部分) 我不能使用 rpi.gpio software-pwm 或 pi-blaster 因为它不能通过 i2c 使用,如果你有一个解决方案可以为 i2c 准备好这个包,那也很棒 我认为问题出在寻址 GPIO 的某个地方,但我不明白

--update-- 在树莓派上使用软件无法获得稳定的时序

#!/usr/bin/python
# -*- coding: utf-8 -*-

# uncomment line 14-20 for using I2C and comment line 24-35, switch for using GPIO directly

import smbus
import time
import RPi.GPIO as GPIO

liste = [4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# print liste #debugging ...
periodendauer = 0.001 # means 1000Hz

# # to send data to mcp23017
# b = smbus.SMBus(1) # 0 indicates /dev/i2c-0, muss auf 1 stehen (für rev2)
# while True:
    # for values in liste:
        # b.write_byte_data(0x20,0x14,values) #send data via smbus(I2C) to mcp23017
        # # print values #debugging only
        # time.sleep(periodendauer)


# to send data direct to gpio-pin
GPIO.cleanup()
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)
while True:
    for values in liste:
        if values > 0:
            values = True
        else:
            values = False
        GPIO.output(7,values)
        # print values #debugging only
        time.sleep(periodendauer)

【问题讨论】:

标签: python raspberry-pi i2c pwm


【解决方案1】:

根据 cmets,我重写了我对您问题的回答。

我通过删除 I2C 部分和 cmets 简化了您的应用程序并删除了睡眠功能。我这样做是为了向您展示 Raspbery Pi 以您想要使用的方式进行这种精确计时是多么不可靠。我在您的代码中添加的是在 for 循环的开始和结束时测量的时间,因此它现在测量的是“liste”数组的整个循环处理,而不是单个“值”的长度。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import time
import RPi.GPIO as GPIO
import sys

liste = [4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0]

GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)
while True:
    ms = time.time() * 1000.0
    for values in liste:
        if values > 0:
            values = True
        else:
            values = False
        GPIO.output(7,values)
    me = time.time() * 1000.0 - ms
    sys.stdout.write("\r{0:4.4f}".format(me)),
    sys.stdout.flush()

我家里有一个香蕉派,它具有相同的 GPIO 输出,但请在 Raspberry 上运行它,您将得到相同的结果(可能循环时间更长)。对我来说,结果在 4-5ms 之间,有几个 6ms 长度的脉冲,有时超过 10ms。这就是为什么你有闪烁的领导。

对于基于 I2C 的解决方案,我建议使用专用的 I2C PWM 驱动板来产生平滑的 PWM 信号,例如 NXP 的 PCA9685。

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
  • 感谢@fredtantini,我编辑了帖子以使其与原始问题更相关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多