Переключение каналов ацп mcp3008, Python

Тема в разделе "Raspberry Pi", создана пользователем sovngard_49, 9 апр 2018.

  1. sovngard_49

    sovngard_49 Нуб

    Помогите новичку пожалуйста)
    3 датчика подключены к малинке через mcp3008.Обмен данными по Spi. Как переключать каналы ацп? Можно ли сделать это посредством библиотеки spidev? если да то как? Если нет то какие варианты еще есть?
     
  2. Igor68

    Igor68 Гуру

    Байт запроса, который Вы посылаете, после которого получаете значение АЦП в себе содержит режим измерения(обычный/дифференциальный - бит D3) и номер нанала (биты D0,D1,D2). Вам следует только изменять посылку и всё. А по работе с SPI посмотрите тут:
    http://amperka.ru/product/mcp3008-adc
     
    arkadyf нравится это.
  3. sovngard_49

    sovngard_49 Нуб

    наверное глупый вопрос ,но как изменять посылку?)
     
  4. Igor68

    Igor68 Гуру

    Простите за задержку, но как в примере... Вы его нашли для простого примера? Сейчас попробую сам отыскать (простите - вы же для Питона, а не Си)
     
  5. Igor68

    Igor68 Гуру

    Вот по этому адресу:
    https://learn.adafruit.com/reading-...ing-audio-volume-with-the-raspberry-pi/script
    Вот смотрите (выжимка из datasheet... те самые таблицы):
    snapshot50.png snapshot51.png
    Посмотрите из указанной ссылки:
    Код (Python):
        #!/usr/bin/env python
       
        # Written by Limor "Ladyada" Fried for Adafruit Industries, (c) 2015
        # This code is released into the public domain
       
        import time
        import os
        import RPi.GPIO as GPIO
       
        GPIO.setmode(GPIO.BCM)
        DEBUG = 1
       
        # read SPI data from MCP3008 chip, 8 possible adc's (0 thru 7)
        def readadc(adcnum, clockpin, mosipin, misopin, cspin):
                if ((adcnum > 7) or (adcnum < 0)):
                        return -1
                GPIO.output(cspin, True)
       
                GPIO.output(clockpin, False)  # start clock low
                GPIO.output(cspin, False)     # bring CS low
       
                commandout = adcnum
                commandout |= 0x18  # start bit + single-ended bit
                commandout <<= 3    # we only need to send 5 bits here
                for i in range(5):
                        if (commandout & 0x80):
                                GPIO.output(mosipin, True)
                        else:
                                GPIO.output(mosipin, False)
                        commandout <<= 1
                        GPIO.output(clockpin, True)
                        GPIO.output(clockpin, False)
       
                adcout = 0
                # read in one empty bit, one null bit and 10 ADC bits
                for i in range(12):
                        GPIO.output(clockpin, True)
                        GPIO.output(clockpin, False)
                        adcout <<= 1
                        if (GPIO.input(misopin)):
                                adcout |= 0x1
       
                GPIO.output(cspin, True)
               
                adcout >>= 1       # first bit is 'null' so drop it
                return adcout
       
        # change these as desired - they're the pins connected from the
        # SPI port on the ADC to the Cobbler
        SPICLK = 18
        SPIMISO = 23
        SPIMOSI = 24
        SPICS = 25
       
        # set up the SPI interface pins
        GPIO.setup(SPIMOSI, GPIO.OUT)
        GPIO.setup(SPIMISO, GPIO.IN)
        GPIO.setup(SPICLK, GPIO.OUT)
        GPIO.setup(SPICS, GPIO.OUT)
       
        # 10k trim pot connected to adc #0
        potentiometer_adc = 0;
       
        last_read = 0       # this keeps track of the last potentiometer value
        tolerance = 5       # to keep from being jittery we'll only change
                            # volume when the pot has moved more than 5 'counts'
       
        while True:
                # we'll assume that the pot didn't move
                trim_pot_changed = False
       
                # read the analog pin
                trim_pot = readadc(potentiometer_adc, SPICLK, SPIMOSI, SPIMISO, SPICS)
                # how much has it changed since the last read?
                pot_adjust = abs(trim_pot - last_read)
       
                if DEBUG:
                        print "trim_pot:", trim_pot
                        print "pot_adjust:", pot_adjust
                        print "last_read", last_read
       
                if ( pot_adjust > tolerance ):
                       trim_pot_changed = True
       
                if DEBUG:
                        print "trim_pot_changed", trim_pot_changed
       
                if ( trim_pot_changed ):
                        set_volume = trim_pot / 10.24           # convert 10bit adc0 (0-1024) trim pot read into 0-100 volume level
                        set_volume = round(set_volume)          # round out decimal value
                        set_volume = int(set_volume)            # cast volume as integer
       
                        print 'Volume = {volume}%' .format(volume = set_volume)
                        set_vol_cmd = 'sudo amixer cset numid=1 -- {volume}% > /dev/null' .format(volume = set_volume)
                        os.system(set_vol_cmd)  # set volume
       
                        if DEBUG:
                                print "set_volume", set_volume
                                print "tri_pot_changed", set_volume
       
                        # save the potentiometer reading for the next loop
                        last_read = trim_pot
       
                # hang out and do nothing for a half second
                time.sleep(0.5)
    Видите:
    potentiometer_adc =0;
    как раз выбор канала 0. А номера каналов как раз от 0 до 7.
    А вот это:
    Код (Python):
    commandout = adcnum
    commandout |=0x18  # start bit + single-ended bit
     
    как раз и задаёт режим измерения к номеру канала и ещё стартовый бит.
    Как я понял приведённый скрипт... "симуляция" для работы через GPIO, а не SPI в прямом смысле.
    Простите за задержку! Работы много.
     
  6. sovngard_49

    sovngard_49 Нуб

    спасибо большое))