使用I2C和python中的raspberry的软件pwm

问题描述 投票:1回答:1

我正在寻找一种使用mcp23017 gpio-expander并将树莓派作为led调光器的解决方案,但是每4-5秒就会出现短暂的闪烁。如果直接使用gpio(我在代码中注释/取消注释代码中的相关部分)的话,也会出现闪烁现象我不能使用rpi.gpio软件-pwm或pi-blaster,因为它不能通过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)
python raspberry-pi i2c pwm
1个回答
-1
投票

根据评论,我将您的问题的答案重写了。

我删除了I2C部分和注释,并简化了睡眠功能,从而简化了您的应用程序。我这样做是为了向您展示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。

© www.soinside.com 2019 - 2024. All rights reserved.