программный pwm с использованием I2C с малиной на питоне

Я ищу решение, используя mcp23017 gpio-expander с raspberry pi в качестве диммера, но каждые 4-5 секунд происходит короткое мерцание. я понял, что мерцание также присутствует, если я использую gpio напрямую (комментируйте/раскомментируйте соответствующие части кода, если вы попробуете это), я не могу использовать rpi.gpio software-pwm или pi-blaster, потому что его нельзя использовать через i2c, если у вас есть решение для подготовки этих пакетов для i2c, это также было бы здорово, я думаю, что проблема где-то в адресации GPIO, но я этого не понимаю

--update-- невозможно получить стабильные тайминги с программным обеспечением на raspberry pi

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

person herr_xyz    schedule 20.08.2014    source источник
comment
редактировать: этот код также доступен через github github.com /herrxyz/software-pwm-raspberry-python/blob/мастер/   -  person herr_xyz    schedule 20.08.2014


Ответы (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()

У меня дома есть Banana Pi с такими же выходами GPIO, но, пожалуйста, запустите его на Raspberry, у вас будет тот же результат (возможно, с более длительным временем цикла). Для меня результаты были между 4-5 мс с несколькими импульсами длиной 6 мс, а иногда они превышали 10 мс. Вот почему у вас мигает светодиод.

Для решения на основе I2C я бы предложил специальную плату драйвера ШИМ I2C для получения плавного ШИМ-сигнала, такую ​​​​как PCA9685 от NXP.

person KZD76    schedule 28.01.2015
comment
Это не дает ответа на вопрос. Чтобы подвергнуть критике или запросить разъяснения у автора, оставьте комментарий под его сообщением — вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно репутация, вы сможете комментировать любой пост. - person fredtantini; 28.01.2015
comment
Спасибо @fredtantini, я отредактировал пост, чтобы он больше соответствовал исходному вопросу. - person KZD76; 01.02.2015