python中使用带树莓的I2C软件pwm

2024-03-29 01:39:32 发布

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

我正在寻找一个解决方案,使用MCP23017GPIO扩展器和覆盆子pi作为led调光器,但每隔4-5秒就会有短暂的闪烁。我发现如果我直接使用gpio,也会出现闪烁(如果你尝试的话,在代码中注释/取消注释相关部分) 我不能用零售物价指数软件pwm或pi爆炸机,因为它不能通过i2c使用,如果你有一个解决方案,让这个软件包为i2c做好准备,它也将是伟大的 我想问题出在处理GPIO上,但我不明白

#!/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)

Tags: toimportsendtruefordatagpiotime
1条回答
网友
1楼 · 发布于 2024-03-29 01:39:32

根据这些评论,我改写了对你问题的回答。在

我通过删除I2C部分和注释简化了您的应用程序,并删除了sleep函数。我这样做是为了向你展示Raspbery圆周率对于这种精确的计时方式是多么的不可靠。我在代码中添加的是for循环开始和结束时的时间度量,因此它现在测量的是“liste”数组的整个周期处理,而不是单个“values”的长度。在

#!/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输出,但请运行它在覆盆子,你会有相同的结果(可能有更长的周期时间)。对我来说,结果是4-5毫秒,有几个6毫秒长的脉冲,有时超过10毫秒,这就是为什么你有闪烁的led。在

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

相关问题 更多 >