Forum: Mikrocontroller und Digitale Elektronik 12Bit 8 Kanal ADC auslesen Python


von Andreas V. (keki9387)


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

von Andreas V. (keki9387)


Lesenswert?

Der benutzte ADC ist der ADC 128S022

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

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.

von Andreas V. (keki9387)


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)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Andreas V. (keki9387)


Angehängte Dateien:

Lesenswert?

Also ich habe mir den Verlauf der Kurven mit dem Oszi angeschaut und das 
passt soweit meiner Meinung nach, nur ist mirdie gelbe kurve 
aufgefallen, das ist das Signal Dout, das ich hier keine Daten 
zurückbekommen.

von Jim M. (turboj)


Lesenswert?

Wenn DOU das gelbe Signal ist, dann haste da den GPIO am RPi auf Ausgang 
gestellt - also 2 Ausgänge die sich "bekämpfen".

Ansonsten würde da kein Signal mit ~1V Spannung raus kommen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Andreas V. schrieb:
> das ist das Signal Dout, das ich hier keine Daten zurückbekommen.
Doch, da kommt schon was. Aber es ist wie erwähnt noch ein zweiter 
Teilnehmer (oder sonstiger IC-Ausgang) am Bus, der den auf low ziehen 
will. Klassische Buskollision.

von Andreas V. (keki9387)


Lesenswert?

Lothar M. schrieb:
> Klassische Buskollision.

Bekomme ich diese BUskollision irgendiwe in Griff??
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. Das realisier ich über ein DMUX der 
das CS immer schaltet.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von Andreas V. (keki9387)


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 //:

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Andreas V. (keki9387)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Andreas V. schrieb:
> wenn ich einen 1 Kanal 12Bit ADC betreibe an dem spi funktioniert das
> ohne Porbleme.
Neue Informationen...  :-/
Du meinst 1 einzigen 1-Kanal ADC?

von Andreas V. (keki9387)


Lesenswert?

Lothar M. schrieb:
> Andreas V. schrieb:
>> wenn ich einen 1 Kanal 12Bit ADC betreibe an dem spi funktioniert das
>> ohne Porbleme.
> Neue Informationen...  :-/
> Du meinst 1 einzigen 1-Kanal ADC?


ja genau aber der hängt auch auf dem Bus wo meine anderen 4 ADC mit 
angeschlossen sind.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von Andreas V. (keki9387)


Lesenswert?

oh man :/ das habe ich befürchtet. Das wollte ich nur wenns net anders 
geht aber so sieht es halt gerade aus. problem ist das es eine SMD 
gelötete Platine ist, das wird ne menge arbeit. Werde gleich anfangen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.