覆盆子pi零和ad7793

时间:2018-12-03 07:09:16

标签: python stm32 spi adc

我尝试通过Python代码从ad7793adt7320到RPi Zero获得数据。我成功地从adt7320获得了温度,成功地从ADC获得了ID和STAT ...但是如果我尝试将任何电压源连接到ADC,我都会从ADC数据获得0xFF(或0x00)。 (-)和in(+)。

此ADC通过SPI与STM32F4一起工作。

你有什么想法吗?

我附上我的.py代码。以及ADC和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)。

我还有ADC的第二个问题。当我将ADC连接到STM32时,我成功地从ADC获取数据。但是有时候我有一个“跳跃”的数据。我附上图片2。这个问题。此图片未显示原始ADC数据,但没有关系。

Pic.1. Circuit

Pic.2. Strange ADC data from 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()

0 个答案:

没有答案
相关问题