пи не будет читать значения из MCP3424 - PullRequest
0 голосов
/ 21 октября 2019

при попытке прочитать данные с АЦП MCP3424 я получаю неожиданные, неправильные результаты. Я знаю, что устройство подключено, но результаты, которые я читаю, неверны

Я пишу на каналы 3 и 4 АЦП. Когда я читаю результат обратно, данные в регистре конфигурации не соответствуют тому, что я запрограммировал

import smbus
import time
# Get I2C bus
bus = smbus.SMBus(1)
# I2C address of the device
MCP3425_DEFAULT_ADDRESS = 0x68
# MCP3425 Configuration Command Set
MCP3425_CMD_NEW_CNVRSN = 0x80 # Initiate a new conversion(One-Shot Conversion mode only)
MCP3425_CMD_MODE_CONT = 0x10 # Continuous Conversion Mode
MCP3425_CMD_MODE_ONESHOT = 0x00 # One-Shot Conversion Mode
MCP3425_CMD_SPS_240 = 0x00 # 240 SPS (12-bit)
MCP3425_CMD_SPS_60 = 0x04 # 60 SPS (14-bit)
MCP3425_CMD_SPS_15 = 0x08 # 15 SPS (16-bit)
MCP3425_CMD_GAIN_1 = 0x00 # PGA Gain = 1V/V
MCP3425_CMD_GAIN_2 = 0x01 # PGA Gain = 2V/V
MCP3425_CMD_GAIN_4 = 0x02 # PGA Gain = 4V/V
MCP3425_CMD_GAIN_8 = 0x03 # PGA Gain = 8V/V
MCP3425_CMD_READ_CNVRSN = 0x00 # Read Conversion Result Data
MCP3425_CMD_CH4 =0x60
MCP3425_CMD_CH3 =0x40

class MCP3425():
    def __init__(self):
        self.config_command()

    def config_command(self):
        """Select the Configuration Command from the given provided values"""
        CONFIG_CMD4 = (MCP3425_CMD_CH4| MCP3425_CMD_MODE_CONT | MCP3425_CMD_SPS_60 | MCP3425_CMD_GAIN_2)
        bus.write_byte(MCP3425_DEFAULT_ADDRESS, CONFIG_CMD4)
        CONFIG_CMD3 = (MCP3425_CMD_CH3| MCP3425_CMD_MODE_CONT | MCP3425_CMD_SPS_240 | MCP3425_CMD_GAIN_1)
        bus.write_byte(MCP3425_DEFAULT_ADDRESS, CONFIG_CMD3)
        print ('-C-', CONFIG_CMD4, CONFIG_CMD3)

    def read_adc(self, channel):
        """Read data back from MCP3425_CMD_READ_CNVRSN(0x00), 2 bytes
        raw_adc MSB, raw_adc LSB"""
        data = bus.read_i2c_block_data(MCP3425_DEFAULT_ADDRESS, (MCP3425_CMD_READ_CNVRSN | channel), 3)
        print (channel, data)
        # Convert the data to 12-bits
        raw_adc = ((data[0] & 0x0F) * 256) + data[1]
        if raw_adc > 2047 :
            raw_adc -= 4095
        return {'r' : raw_adc}

#from MCP3425 import MCP3425
mcp3425 = MCP3425()
while True :
    adc = mcp3425.read_adc(MCP3425_CMD_CH4)
    print ("Digital Value of Analog Input 4: %d "%(adc['r']))
    adc = mcp3425.read_adc(MCP3425_CMD_CH3)
    print ("Digital Value of Analog Input 3: %d "%(adc['r']))
    print (" ********************************* ")
    time.sleep(0.8)

Я записываю 117 (01110101) в канал 4 и 80 (01010000) в регистры конфигурации канала 3. Это означает, что для обоих каналов я должен получить обратно 3 байта: 2 байта данных и один байт регистра конфигурации

это распечатка, которую я получаю, значения не считываются (Ch4 + подключен к делителю напряжения (2,5 В),Ch4- и Ch3- соединены с землей, Ch3 + является плавающим), а байт 3 является просто адресом, а не регистром конфигурации

-C- 117 80
96 [0, 0, 96]
Digital Value of Analog Input 4: 0 
64 [0, 0, 64]
Digital Value of Analog Input 3: 0 
 *********************************

1 Ответ

0 голосов
/ 25 октября 2019

сейчас это заняло некоторое время, но я нашел проблему. Хитрость заключалась в том, что MCP3434 - это не 4-канальный АЦП, а один АЦП с мультиплексором с 4 входами. Как только я понял это, схема из таблицы была очевидна. Это просто не очень хорошо объяснено в описании того, как обрабатывать поток данных на шине I2C.

Таким образом, вы не можете настроить два АЦП для параллельного измерения, но когда вам нужно прочитать больше каналов, вам нужно

1) настройка / запуск канала 1

2) чтение данных

3) настройка / запуск канала 2

4) чтение данных

шаг считывания данных, таким образом, не зависит от канала.

...