Я пытаюсь получить данные из 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()