我尝试通过Python代码从ad7793
和adt7320
到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.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()