12Bit 8 Kanal ADC auslesen Python

OP #5072921
Lesenswert?

Hallo,

ich möchte über einen 12 Bit ADC eine analoge Spannung von meinem 
Lichtmesskopf erfassen. Die schwierigkeit die ich habe ist das dieser 
verwendete ADC 8 Kanäle hat un dich nicht direkt aus dem datenblat sehen 
kann wie ich genau auf den ersten Eingang zugreife. Im Anhang habe ich 
schon was programmiert und würdee euch bitte mir eure Meinung darüber zu 
sagen und was die Ursache sein könnte.


import RPi.GPIO as GPIO

import spidev

import time



GPIO.setmode(GPIO.BOARD)

GPIO.setup(13, GPIO.OUT)    #LED

GPIO.setup(29, GPIO.OUT)    #GPIO1

GPIO.setup(31, GPIO.OUT)    #GPIO2

GPIO.setup(33, GPIO.OUT)    #GPIO3

GPIO.output(29, False)

GPIO.output(31, False)

GPIO.output(33, False)

GPIO.output(13, False)

GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_UP) # pin 11 (GPIO17) als 
input - Pullup

GPIO.setwarnings(False)




#Settings SPI

spi = spidev.SpiDev()

spi.open(0, 0)

#spi.max_speed = 5000

spi.mode = 2

#spi.cshigh




#DMUX - ADC1

GPIO.output(29, False)

GPIO.output(31, False)

GPIO.output(33, False)


Vref = 3.3



#Kanal3 des ADC ansteuern

spi.writebytes([0x10 ,0x00 ])


#ADC auslesen

adc = spi.xfer2([0x00,0x00])

print('adc Wert',adc)

adc_out = ((adc[0] & 0x1F) << 7) + ((adc[1] >> 1 ))

voltage = adc_out * (Vref/4096)

#Berechnet die Ausgangsspannung

voltage = round(voltage,2)


print('Spannung ',voltage)


Vielen Dank für eure Hilfe
Moderator (Firma: Titel) Persönliche Seite #5072940
Lesenswert?

Andreas V. schrieb:
> was die Ursache sein könnte.
Die Ursache wofür?

Hast du mal gemessen, was mit deinem Programm auf dem Bus passiert?
Sieht das Timing auf dem Bus so aus wie im Datenblatt?

> ich nicht direkt aus dem datenblat sehen kann wie ich genau auf den
> ersten Eingang zugreife.
Du meinst den "nullten" Eingang Vin0?
Falls ja, dann sendest du per SPI 0x0000 und bekommst gleichzeitig das 
Wandlungsergebnis zurück.
Angehängte Dateien:
OP #5072951
Lesenswert?

Ich würde gerne IN 2 ansteuern das wäre ja dan 0x10 0x00,

ich mess kurz mal was auf meinem Bus wirklich passiert.
Aber vom Umwandeln von den 2 byte in die Spannung stimmt so für einen 12 
Bit Wandler oder?


dc = spi.xfer2([0x00,0x00])

print('adc Wert',adc)

adc_out = ((adc[0] & 0x1F) << 7) + ((adc[1] >> 1 ))

voltage = adc_out * (Vref/4096)

#Berechnet die Ausgangsspannung

voltage = round(voltage,2)
Moderator (Firma: Titel) Persönliche Seite #5072967
Lesenswert?

Andreas V. schrieb:
> Aber vom Umwandeln von den 2 byte in die Spannung stimmt so für einen 12
> Bit Wandler oder?
> adc_out = ((adc[0] & 0x1F) << 7) + ((adc[1] >> 1 ))
Das Ding ist doch schon richtig ausgerichtet, da ist doch keine 
Schieberei mehr nötig...

> Aber vom Umwandeln von den 2 byte in die Spannung stimmt so für einen 12
> Bit Wandler oder?
Keine Ahnung, was spi.xfer2() macht. Aber wenn das zwei Bytes in ein 
Array "adc" einliest, dann würde ich das so probieren und das Ganze in 
Millivolt rechnen:
adc_out = (adc[0]<<8) | adc[1];
voltage = (adc_out*Vref_mV)/4096;

> ich mess kurz mal was auf meinem Bus wirklich passiert.
Gute Idee, denn nur das, was dort passiert, interessiert den Baustein. 
Und wie das letzte Mal im 
Beitrag "Re: Python Programmierung 8 Kanal 12 Bit DAC" gilt: 
den richtigen SPI Modus verwenden.
OP #5073183
Lesenswert?

Lothar M. schrieb:
> Andreas V. schrieb:
>> es ist nämlich so das auf meinem SPI Bus insgesamt 4 ADC und 4 DAC
>> integreirt sind, jedoch muss man sagen das diese immer hintereinander
>> und nie gleich angesprochen werden.
> Sicher? Kontrollier das mal.


Habe nochmal mir die Platine angeschaut, es ist so das die Daten für Din 
und Dout zwar ständig an den Bauteilen anliegt wenn ich etwas sende aber 
erst wenn ich durch den DMUX das CS für einen Bestimmten Baustein 
freigeben schaltet dieser durch das habe ich getestet. und komischer 
weise tut mein DAC ja auch auf dem BUS //:
Moderator (Firma: Titel) Persönliche Seite #5073270
Lesenswert?

Andreas V. schrieb:
> komischer weise tut mein DAC ja auch auf dem BUS //:
Ja, dann mach mal dessen DOUT Pin frei (Leiterbahn auftrennen oder 
Beinchen von der Leiterplatte abheben) und miss am Pin, ob der Pegel 
dann besser wird. Wenn ja, dann musst du nur den zweiten "Aktivisten" am 
Bus finden. Im schlimmsten Fall ist es tatsächlich der uC, dessen 
MISO-Pin auf "Ausgang" geschaltet ist.
OP #5073298
Lesenswert?

Lothar M. schrieb:
> Andreas V. schrieb:
>> komischer weise tut mein DAC ja auch auf dem BUS //:
> Ja, dann mach mal dessen DOUT Pin frei (Leiterbahn auftrennen oder
> Beinchen von der Leiterplatte abheben) und miss am Pin, ob der Pegel
> dann besser wird. Wenn ja, dann musst du nur den zweiten "Aktivisten" am
> Bus finden. Im schlimmsten Fall ist es tatsächlich der uC, dessen
> MISO-Pin auf "Ausgang" geschaltet ist.

Oke alles klar das werd eich gleich morgen versuchen. Aber ich finde das 
sofern komisch wenn ich einen 1 Kanal 12Bit ADC betreibe an dem spi 
funktioniert das ohne Porbleme. Habe gerade die CS durchgemessen aber da 
passt auch alles. Werde morgen mal deinen Vorschlag ausprobieren.

Danke ich schreibe dann morgen was rausgekommen ist.
Moderator (Firma: Titel) Persönliche Seite #5075352
Lesenswert?

Andreas V. schrieb:
> ja genau aber der hängt auch auf dem Bus wo meine anderen 4 ADC mit
> angeschlossen sind.
Nun, dann musst du jetzt einfach mal einen Teilnehmer nach dem anderen 
vom Bus nehmen und schauen, wer diesen Konflikt verursacht. Das nennt 
sich Fehlersuche, und das kannst nur du machen, weil nur du die Hardware 
hast...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren