Ich möchte gerne einen MCP3001 (ADC) auslesen.
Ich gehe nach Figure 6-1 (Seite 16):
http://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf
Entsprechend CLK auf Low gesetzt, CS von High auf Low.
Jetzt lese ich 16 bits ein.
Allerdings kommt so nur Murks raus. Was mache ich grundsätzlich falsch?
1
importtime
2
importRPi.GPIOasGPIO
3
4
GPIO.setmode(GPIO.BCM)
5
6
HIGH=True#HIGH-Pegel
7
LOW=False#LOW-Pegel
8
9
# Funktionsdefinition
10
defreadAnalogData(SCLKPin,MOSIPin,MISOPin,CSPin):
11
# Pegel vorbereiten
12
GPIO.output(CSPin,HIGH)
13
GPIO.output(CSPin,LOW)
14
GPIO.output(SCLKPin,LOW)
15
16
# Empfangen der Daten des ADC
17
adcvalue=0#RuecksetzendesgelesenenWertes
18
foriinrange(15):#16bitslesen
19
GPIO.output(SCLKPin,HIGH)
20
GPIO.output(SCLKPin,LOW)
21
adcvalue<<=1#1Postitionnachlinksschieben
22
if(GPIO.input(MISOPin)):
23
adcvalue|=0x01
24
time.sleep(0.5)
25
26
returnadcvalue
27
28
# Variablendefinition
29
SCLK=11#Serial-Clock
30
MOSI=10#Master-Out-Slave-In
31
MISO=9#Master-In-Slave-Out
32
CS=17#Chip-Select
33
34
# Pin-Programmierung
35
GPIO.setup(SCLK,GPIO.OUT)
36
GPIO.setup(MOSI,GPIO.OUT)
37
GPIO.setup(MISO,GPIO.IN)
38
GPIO.setup(CS,GPIO.OUT)
39
40
whileTrue:
41
printreadAnalogData(SCLK,MOSI,MISO,CS)
Edit: Ich habe gesehen, dass die Informationen, die ich bekomme in
diesem Format sind:
1
XXX0123456789XXX
Wie kann ich nun genau diesen Teil aus meiner Variable auslesen?
Jay Myon schrieb:> Edit: Ich habe gesehen, dass die Informationen, die ich bekomme in> diesem Format sind:> XXX0123456789XXX> Wie kann ich nun genau diesen Teil aus meiner Variable auslesen?
1
all_data="XXX0123456789XXX"
2
3
needed_data=all_data[3:12]
Damit sollte needed_data "0123456789" enthalten. Ggf. die Indices
anpassen
Gruesse
Leider ergibt sich hieraus immer noch vollkommenes Chaos:
1
defreadAnalogData(SCLKPin,MOSIPin,MISOPin,CSPin):
2
# Pegel vorbereiten
3
GPIO.output(CSPin,HIGH)
4
GPIO.output(CSPin,LOW)
5
GPIO.output(SCLKPin,LOW)
6
7
# Empfangen der Daten des ADC
8
adcvalue=0#RuecksetzendesgelesenenWertes
9
foriinrange(15):#16bitslesen
10
GPIO.output(SCLKPin,HIGH)
11
GPIO.output(SCLKPin,LOW)
12
adcvalue<<=1#1Postitionnachlinksschieben
13
if(GPIO.input(MISOPin)):
14
adcvalue|=0x01
15
adcvalue=str(adcvalue)#instringwandeln
16
adcvalue=adcvalue[3:13]
17
adcvalue=int(adcvalue)#zurueckinintwandeln
18
time.sleep(0.5)
19
20
returnadcvalue
Stimmt was an dem Bitmuster nicht? Ich finde da keine Ungereimtheiten.
Es liegt eine Spannung von etwa 1,4V an. Also erwarte ich etwa Werte von
500... Außerdem einigermaßen stabil.
Ich erhalte so etwas: 0,2,50,88,3,70,4,86...
Ein paar Fehler sind mir noch aufgefallen:
1) Ich muss 16bits einlesen, also 2 bytes (nicht 15 bits)
2) Davon will ich nun 10bit daten extrahieren
Für mich ergibt sich dann dieses:
1
defreadAnalogData(SCLKPin,MOSIPin,MISOPin,CSPin):
2
GPIO.output(CSPin,HIGH)
3
GPIO.output(CSPin,LOW)
4
GPIO.output(SCLKPin,LOW)
5
6
adcvalue=0
7
foriinrange(16):
8
GPIO.output(SCLKPin,HIGH)
9
GPIO.output(SCLKPin,LOW)
10
adcvalue<<=1
11
if(GPIO.input(MISOPin)):
12
adcvalue|=0x01
13
adcvalue>>=3
14
adcvalue&=0x3ff
15
time.sleep(0.5)
16
17
returnadcvalue
Leider sind die resultierenden Werte außerhalb des erwarteten Bereichs
und zudem immer noch zu sehr schwankend.
Wo habe ich noch einen gedanklichen Fehler?