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
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.
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)
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.
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.
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.
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.
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.
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.
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 //:
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.
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.
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?
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.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.


