Luft Temperaturregelstrecke

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Murphy.
User
Beiträge: 12
Registriert: Dienstag 13. September 2016, 18:45

Hallo

ich finde den Fehler beim Auslesen des A/D-Wandlers einfach nicht, ich habe das Skript von Sirius etwas angepasst und noch ein anderes Skript ausprobiert. Bei beiden Skripten habe ich das Problem das ich keine Werte angezeigt bekomme sondern nur eine leere Printzeile...

Zu erst die Version von Sirius:

Code: Alles auswählen

import spidev
     
def read_sensor(spi, channels):
      result = []
      spi.open(0,0)
      for channel in channels:
            rcv = spi.xfer2(((24 + channel) << 14).to_bytes(3, 'big'))
            result.append(int.from_bytes(rcv[1:2], 'big') & 0xfff)
      spi.close()
      return result
     
def main():
      spi = spidev.SpiDev()
     
        # t = temperatur, d = drossel, p = druck, m = massenstrom
        # Kanal 0 = d
        # Kanal 1 = t1
        # Kanal 2 = t2
        # Kanal 3 = p
        # Kanal 4 = m
      d, t1, t2, p, m = read_sensor(spi, [0, 1, 2, 3, 4])
      print(d, t1, t2, p, m)
       
if __name__ == '__main__':
      main()
und hier die andere Version:

Code: Alles auswählen

from spidev import SpiDev

class MCP3208:
    def __init__(self, bus = 0, device = 0):
        self.bus, self.device = bus, device
        self.spi = SpiDev()
        self.open()

    def open(self):
        self.spi.open(self.bus, self.device)
    
    def read(self, channel = 0):
        adc = self.spi.xfer2(((24 + channel) << 14).to_bytes(3, 'big'))
        data = int.from_bytes(adc[0:2],'big') & 0xfff
        return data
        self.close()
            
    def close(self):
        self.spi.close()

adc = MCP3208()

while True:
    p = adc.read(channel = 0)
    print (p)
Kann mir jemand erklären was ich falsch mache?
Zuletzt geändert von Anonymous am Freitag 14. Oktober 2016, 00:17, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Murphy.
User
Beiträge: 12
Registriert: Dienstag 13. September 2016, 18:45

Moin,

weiter geht's...

channel = 0

Der Ausdruck

Code: Alles auswählen

a = ((24 + channel) << 14).to_bytes(3, 'big')
ergibt

Code: Alles auswählen

b'\x06\x00\x00'
Ich benötige für die Funktion spi.xfer2() allerdings folgenden Ausdruck [6, 0, 0]

Die Problematik die ich sehe ist, dass die Bits für die Auswahl des Kanals auf die ersten beiden Bytes aufgeteilt wird.

Gibt es noch andere Möglichkeiten das Problem zu lösen?
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@Murphy: b'\x06\x00\x00' ist eine Folge der 3 Bytes 6, 0 und 0. Das ist für die Funktion xfer2 das selbe wie [6,0,0]. Falls Du das nicht glaubst, kannst Du ja das eine statt dem anderen Schreiben und wirst keinen Unterschied feststellen.
Murphy.
User
Beiträge: 12
Registriert: Dienstag 13. September 2016, 18:45

Sirius3 hat geschrieben:@Murphy: b'\x06\x00\x00' ist eine Folge der 3 Bytes 6, 0 und 0. Das ist für die Funktion xfer2 das selbe wie [6,0,0]. Falls Du das nicht glaubst, kannst Du ja das eine statt dem anderen Schreiben und wirst keinen Unterschied feststellen.

Hey Sirius, vielen Dank für die Antwort und das Skript. Ich würde es gerne glauben, da ich diese Lösung schöner finde, aber leider klappts bei mir nicht. Wenn ich b'\x06\x00\x00' schreibe bekomme ich eine leer Printzeile und wenn ich [6,0,0] wird der entsprechende Kanal ausgelesen.

Hab mich jetzt mit nem Zwischenschritt zur Lösung gemogelt, ist zwar nicht schön aber funktioniert erstmal.

Code: Alles auswählen

import spidev

def read_sensor(spi, channels):
      result = []
      spi.open(0,0)
      for channel in channels:
            a = ((24 + channel) << 14)
            rcv = spi.xfer2([a >> 16, (a & 65280) >> 8, a & 255])
            result.append(((rcv[1] & 15) << 8) + rcv[2])
      spi.close()
      return result
     
def main():
      spi = spidev.SpiDev() 
      d, t1, t2, p, m = read_sensor(spi, [0, 1, 2, 3, 4])
      print(d, t1, t2, p, m)
     

       
if __name__ == '__main__':
      main()
Wie kann ich den Code in einer Codebox anzeigen? Das scrollen nervt ziemlich
Zuletzt geändert von Anonymous am Freitag 14. Oktober 2016, 14:23, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Antworten