Raspberry pi Zero и ad7793 - PullRequest
       91

Raspberry pi Zero и ad7793

0 голосов
/ 03 декабря 2018

Я пытаюсь получить данные из ad7793 и adt7320 в RPi Zero по коду Python.я получаю температуру от adt7320, успешно получаю ID и STAT от АЦП ... Но я получаю 0xFF (или 0x00) из данных АЦП, если я пытаюсь подключить любой источник напряжения к входам (-) и в (+) АЦП.

Этот АЦП работает через SPI с STM32F4.

Может быть, у вас есть какие-либо идеи?

Я прилагаю свой код .py.И схема АЦП и платы ADT7320 (см. Рисунок 1).Эта плата подключается к RPI: Плата: RPI:

CH12 - GPIO26 (cs_0)

CH34 - GPIO13 (cs_1)

CH5 - GPIO16 (cs_2)

MOSI - GPIO20 (MOSI)

MISO - GPIO19 (MISO)

SCLK - GPIO21 (SCLK)

Я использую RPI spi1 (sp1.1, spi1.2, spi1.3).

У меня также есть вторая проблема с АЦП.Когда я подключаю АЦП к STM32, я успешно получаю данные от АЦП.Но иногда у меня есть «скачок» данных.Я прилагаю рис.2.с этой проблемой.На этих рисунках не показаны необработанные данные АЦП, но это не имеет значения.

Рис.1.Схема

Рис.2.Странные данные АЦП из STM32

import spidev
import time
from datetime import datetime

spi_CH12 = spidev.SpiDev()
spi_CH34 = spidev.SpiDev()
spi_CH5 =  spidev.SpiDev()

spi_CH12.close()
spi_CH34.close()
spi_CH5.close()

spi_CH12.open(1,0)
spi_CH12.max_speed_hz = 1000000
spi_CH12.mode = 0b10
spi_CH12.bits_per_word = 8
sleeptime = 1

spi_CH34.open(1,1)
spi_CH34.max_speed_hz = 1000000
spi_CH34.mode = 0b10
spi_CH34.bits_per_word = 8

spi_CH5.open(1,2)
spi_CH5.max_speed_hz = 1000000
spi_CH5.mode = 0b10
spi_CH5.bits_per_word = 8

#Functions:
def ADC_RST(CS):
    spi = SPI_SEL(CS)
    id = spi.xfer([0xFF])
    id = spi.xfer([0xFF])
    id = spi.xfer([0xFF])
    id = spi.xfer([0xFF])
    return id[0]

def ADC_ID(CS):
    spi = SPI_SEL(CS)
    id = spi.xfer([0x60])
    id = spi.xfer([0xFF])
    return id[0]

def SPI_SEL (CS):
   if CS == 0:
        spi = spi_CH12
   if CS == 1:
        spi = spi_CH34
   if CS == 2:
        spi = spi_CH5
   return spi


def ADC_STAT(CS):
    spi = SPI_SEL(CS)
    id = spi.xfer([0x40])
    id = spi.xfer([0xFF])
    return id[0]

def ADC_CH(CS, CH):
    spi = SPI_SEL(CS)
    if CH>2:
        CH=2
    CH |= 0x90
    id = spi.xfer([0x10]) #select configuration register 00010000 (0x10);
    #id = 
    id = spi.xfer([0x08]) #Write 16 bits to CONFIGURATION register:
            #bias voltage: disabled 0 0
            #burnout current: disabled 0 
            #bipolar operation: 0 or 1?
            #boost: disabled 1
            #gain: disabled 0 0 0
            #top 8b: 00011000 (0x18), disable boost yields 00010000 (0x10)
            #BIPOLAR: 0x00001000 (0x08)
    id = spi.xfer([CH])     
            #internal reference 1
            #0 0
            #buffer 1
            #0
            #000 (CH1) 001(CH2) 010(CH3) 
            #channel select = AIN1(+) - AIN1(-) 
            #bottom 8b: 10010000 (0x90)     10010001 (0x91) read CH2    10010010 (0x92) read CH3    
    return id[0]

def ADC_MODE(CS):
    spi = SPI_SEL(CS)
    id = spi.xfer([0x08]) #select MODE register (00001000)(0x08)
                        #Write 16 bits to MODE register on page 16 Table 15
    id = spi.xfer([0x20]) #0x00 for continuous 
                        #0x20 for single conversion preferred
                        #0x40 for idle
                        #0x60 for power down
                        #0x80 internal zero scale calibration
                        #0xA0 internal full scale calibration
                        #0xC0 system zero scale calibration
                        #0xE0 system full scale calibration
                        #update rate on page 16/17
    id = spi.xfer([0x0F])       
                        #0x00    X    X
                        #0x01  470Hz 4mS
                        #0x02  242Hz 8mS
                        #0x03  123Hz 16mS
                        #0x04   62Hz 32mS
                        #0x05   50Hz 40mS
                        #0x06   39Hz 48mS
                        #0x07 33.2Hz 60mS
                        #0x08 19.6Hz 101mS -90dB for 60Hz   
                        #0x09 16.7Hz 120mS -80dB for 50Hz
                        #0x0A 16.7Hz 120mS -65dB for 50/60Hz
                        #0x0B 12.5Hz 160mS -66dB for 50/60Hz
                        #0x0C   10Hz 200mS -69dB for 50/60Hz
                        #0x0D 8.33Hz 240mS -70dB for 50/60Hz  
                        #0x0E 6.25Hz 320mS -72dB for 50/60Hz 
                        #0x0F 4.17Hz 480mS -74dB for 50/60Hz 
    return id[0]

def ADC_READ(CS, CH):   
    spi = SPI_SEL(CS)
    value = 0
    ADC_CH(CS, CH)
    ADC_MODE(CS)
    while ADC_STAT(CS) > 127:   
        pass        
    id = spi.xfer([0x58])
    value = spi.readbytes(3) 
    return value

def ADC_IEXC(CS, value):
    spi = SPI_SEL(CS)
    if value > 3:
        value = 0
    id = spi.xfer([0x28]) 
                        #select IO register RS2=1, RS1= 0, RS0 = 1  0x28
                        #Write 8 bits to IO register (IEXC1 -> IOUT1, IEXC2 -> IOUT2, 10uA excitation current)  
    id = spi.xfer([value]) 
                        #0 -> 0uA
                        #1 -> 10uA
                        #2 -> 210uA
                        #3 -> 1000uA
    return id[0] 

def ADC_CALIB(CS):
    spi = SPI_SEL(CS)
    id = spi.xfer([0x08])
    id = spi.xfer([0x80])
    id = spi.xfer([0x0F])
    id = spi.xfer([0x08])
    id = spi.xfer([0xA0])
    id = spi.xfer([0x0F])
    return id[0]     

def ADT7320_INIT(CS):
    spi = SPI_SEL(CS)
    id = spi.xfer([(0 << 6) | (0x01 << 3)]) #Send the command byte
    id = spi.xfer([0x80]) #Send the data to write
    return id

def ADT7320_RST(CS):
    spi = SPI_SEL(CS)
    id = spi.xfer([0xFF])
    id = spi.xfer([0xFF])
    id = spi.xfer([0xFF])
    id = spi.xfer([0xFF])
    return id[0]

def ADT7320_ID(CS):
    spi = SPI_SEL(CS)
    id = spi.xfer([(0x78 & ((0x03 +8) <<3))])
    id = spi.xfer([0xFF])
    return id[0]

def ADT7320_READ(CS):
    spi = SPI_SEL(CS)
    temperature = 0
    low = 0
    high = 0
    id = spi.xfer([(0x1 << 6) | (0x02 << 3)])
    high = spi.xfer([0xFF])[0]
    low = spi.xfer([0xFF])[0]
    temperature = ((high << 8) | (low << 0))
    return temperature  

CH12 = 0
CH34 = 1
CH5 = 2

ADC_RST(CH12)
ADC_RST(CH34)
ADC_IEXC(CH12, 0)
ADC_IEXC(CH34, 0)
ADC_CALIB(CH12)
ADC_CALIB(CH34)  
ADT7320_RST(CH5)
ADT7320_INIT(CH5)

while True:
    value = ADC_READ(CH12,0)
    print hex(value [0]), hex(value [1]), hex(value [2])
    time.sleep(sleeptime)
spi.close()
...