als aller erstes ich bin ein totaler Neuling, was Python angeht. Ich möchte im Zuge eines Projektes einen AD-Wandler mit einem RP auslesen. Dafür habe ich mich für den AD7357 entschieden.
Hier das Datenblatt: http://www.analog.com/en/produ…g-ad-con ... /ad7357.ht
Ich habe dazu eine Platine entworfen, die wunderbar funktioniert, wenn ich eine Spannung anlege.
Der AD-Wandler kommuniziert über SPI mit dem RP. Verbunden sind diese beiden über ein 40 poligen Stecker. Den Code den ich nun in Python geschrieben habe sieht wie folgt aus :[/code]
Code: Alles auswählen
[Codebox=python file=Unbenannt.py]#Verbunden sind MISO und SDATAa( Datentransfer vom AD-Wandler zum RP).....SCLK und SCLK für die Clock...... CS und CEON...MOSI meiner Meinung nach hier nicht notwendig, da nur Daten vom AD-Wandler kommen und SCLK und CS seperat angesteuert werden.
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
HIGH = True
LOW = False
try:
def readAnalogData (SCLKPin, MISOPin, CSPin):
GPIO.output(CSPin, LOW)
# print (CSPin)
GPIO.output(CSPin, HIGH) # Nun ist Chip bereit zum auslesen
# print (CSPin)
GPIO.output(SCLKPin,HIGH) # da der negative flankenwechsel entscheidenden ist, muss die SCLK vorher auf HIGH gesetzt werden
# print (SCLKPin)
time.sleep (0.0000000055) # Delay nach NChipSelect auf negativ
list=[]
# print list
for i in range(32): # ich lese beide Kanäle über SDATAa aus
GPIO.output(SCLKPin, LOW) # Auf Low damit das SDATA ausgelesen werden kann
# print (SCLKPin) # Wenn der ausgeschaltet ist, funktioniert es nicht --> nur 0.
x = (GPIO.input(MISOPin)) # Der wert der jetzt auf der Sdata ist wird ausgelesen und in x gespeichert
#print x,i
list.append(x) #a.append(adcvalue), in eine liestegespeichert, die am Ende 32 bits bestitzen soll
time.sleep (0.00000001) # Dauer des SCLK LOW pulse width
GPIO.output(SCLKPin, HIGH) # Setzte wieder auf HIGh damit der nächste flankenwechsel vorbeeitet wird.
#print (SCLKPin)
time.sleep (0.00000001) # Dauer des SCLK HIGH pulse width
return list # 32 Bit Liste returnen
GPIO.output (CSPin, HIGH) # packe CS wieder auf HIGh um lesevorgang zu beenden
time.sleep (0.000000005) # Minimum time betweeen end of serial read ad next falling edge of NCS
SCLK = 11 # hier werden die GPIOS benannt
MISO = 9
CS = 8
GPIO.setup(SCLK, GPIO.OUT) #Eingang und Ausgang festlegen
GPIO.setup(MISO, GPIO.IN)
GPIO.setup(CS, GPIO.OUT)
while True:
print readAnalogData(SCLK,MISO,CS) # Übergeben der Daten an die Funktion und dan ausgeben des Ergebnisses ( hier list)
except KeyboardInterrupt:
GPIO.cleanup()[/Codebox]
Dabei habe ich mich an das Datenblatt gehalten, welches die wesentlichen Informationen für das auslesen des AD-Wandlers hergibt(Zeitverzögerungen, Taktflanken etc). Ich möchte die 32 Bits (14 Bits pro Kanal die mit 2 Nullen am Anfang angekündigt werden(siehe Datenblatt Seite 21)) über SDATAa auslesen. Dies funktioniert nach Datenblatt auch. Diese will ich in eine Liste speichern und ausgeben. Allerdings funktioniert mein Programm auf der semantischen Ebene überhaupt nicht. Er gibt mir sogar andere Werte aus wenn ich print befehle dazu schalten( Hier mit der Raute versehen). Vielleicht kann mir jemand helfen, dass ich das Programm doch noch zum laufen bringe.
Grüße