"Erweitern der spi.xfer() Funktion" zur Erfassung von 2 Werten "parallel"

  • Hallo zusammen,


    ich habe eine Frage, auf die ich auch nach längerer Suche keine Antwort gefunden habe.


    Ausgangslage:

    Ich habe einen Prozess den ich mit 10 kHz erfassen möchte. Dazu habe ich einen analogen Wegsensor der einen Spannungsausgang von 0 - 10 Volt hat.

    Mein Plan ist es mit einem Spannungsteiler die Spannung auf 0 - 5 Volt zu reduzieren und mit einem MCP3208 zu erfassen.


    Die Spannung erfasse ich durch ein differentielles Lesen zweier Kanäle (Ch0 und Ch1). Das ganze funktioniert auch mit einem Python Befehl direkt im MCP.


    Code
    def ReadADC():
        adc = spi.xfer([0b00000100,0b00000000,0b00000000])    # Differentielles Lesen der Kanäle 0 un 1
        chan = ((adc[1] & 15) << 8) + adc[2]
        return chan

    Jetzt möchte ich zur Prozesserfassung noch einen zweiten Sensor parallel benutzen. Die Messwerte sollen möglichst zeitgleich mit dem ersten Sensor erfasst werden. (Einen Fehler habe ich immer durch die Erfassung der Kanäle nacheinander, aber diesen Fehler will ich möglichst klein halten).


    Ich habe einige Sachen ausprobiert, was funktioniert ist folgendes:


    Code
    def ReadADC():
        adc1 = spi.xfer([0b00000100,0b00000000,0b00000000])
        adc2 = spi.xfer([0b00000100,0b10000000,0b00000000])
        chan1 = ((adc1[1] & 15) << 8) + adc1[2]
        chan2 = ((adc2[1] & 15) << 8) + adc2[2]
        return chan1, chan2

    Dadurch, dass ich aber zwei Funktionen nacheinander aufrufe kommt mir das nicht sehr "schnell" vor und die Differenz zwischen den Messwerten ist auch nicht "stabil".


    Meine Idee war daher in einem spi.xfer() Befehl die Bytes direkt nacheinander zu schicken und die Antwort dann dementsprechend in 2 Werte aufzuteilen. Das habe ich aber nicht zum funktionieren bekommen. Die Werte für den ersten Sensor stimmen, nur für den zweiten nicht.


    Vom Prinzip hatte ich mir das so gedacht und mehrere verschiedene Varianten getestet (xfer2, mir die verschiedenen Bytes einzeln angeguckt, ich konnte aber nicht die gewünschte Verknüpfung entdecken,...):

    Code
    def ReadADC():
        adc = spi.xfer([0b00000100,0b00000000,0b00000000,0b00000100,0b10000000,0b00000000])
        chan1 = ((adc[1] & 15) << 8) + adc[2]
        chan2 = ((adc[4] & 15) << 8) + adc[5]
        return chan1, chan2


    Ist meine Idee überhaupt umsetzbar oder muss ich einen anderen Weg gehen? Wenn ja wäre ich für Hinweise oder auch gerne etwas mehr Hilfe dankbar.


    (Wenn jemand eine viel bessere Idee (auch Hardwaremäßig) für die Umsetzung meines Unterfangens hat gerne her damit. Ich fange erst an mit Python und der ganzen Messgeschichte und mir fehlt selber noch etwas der Überblick. Optimal wäre die Erfassung von 4 Kanälen mit 10kHz und das gleichzeitig (ist ziemlich utopisch, wäre aber die optimale Lösung). Alleine Ideen die mich näher bringen helfen mir weiter.


    Danke schonmal,


    Grüße


    eX


    (Tippfehler in den Codes können vorhanden sein, ich habe die Funktion bei mir direkt im Code und aus Performancegründen nicht als eine Funktion definiert)

  • Servus,
    also ich habe mit dem Pi auch schon mehrere analog-Werte parallel erfasst und umgewandelt, ich hatte absolut keine Probleme mit einem delay!

    ich habe dafür diesen ADC genutzt. Er hat 4 Kanäle und ne hohe Auflösung (16 Bit).
    Das Teil gibt es auch auf anderen Seiten günstiger.

    Für die Teile von Adafruit gibts auch extra Python libs.

    import Adafruit_ADS1x15


    Vielleicht hilft dir das weiter!

    Liebe Grüße

    Natürlich mache ich Fehler :stumm:

  • Servus eXitus537 ,

    Ist meine Idee überhaupt umsetzbar oder muss ich einen anderen Weg gehen? Wenn ja wäre ich für Hinweise oder auch gerne etwas mehr Hilfe dankbar.

    lies' Dir mal due Funktionsweise des SPI durch ( z.B. hier -> http://www.netzmafia.de/skript…ontrol/schnittstellen.pdf ).

    Dann wird Dir vieleicht von selbst klar werden, warum Dein Vorhaben wohl nicht so umsetzbar ist, wie Du Dir das imho vorstellst.


    cu,

    -ds-

  • Hallo und Danke euch beiden. Ich hatte noch ein paar andere Baustellen und da ist das hier etwas liegen geblieben.


    Wurtzelbert . Ich hab mit dem ADS1015 (war es glaube ich) zuerst rumgetestet und das hat mit der Adafruit Library auch wunderbar funktioniert. Nur sind diese für mein Vorhaben leider viel zu langsam.


    dreamshader Auch dir danke. Also wenn ich das richtig verstanden habe liegt es an der CS Leitung? Weil die nur zu Beginn des xfer-Befehls auf LOW gezogen um die Kommunikation zu starten und am Ende wieder hoch? Daher sieht der ADC das alles als ein "Block", also die Anforderung eines Wertes? Ist das richtig oder bin ich auf nem Holzweg?


    Danke und Grüße


    eX


    Nachtrag:


    Also würde es wenn überhaupt nur per manueller GPIO Ansteuerung funktionieren, was dann aber wieder nicht die konstante Zeit zwischen den Messwerten garantiert?

  • Hi eXitus537 ,

    Daher sieht der ADC das alles als ein "Block", also die Anforderung eines Wertes? Ist das richtig oder bin ich auf nem Holzweg?

    ja ... kann man so sagen ... Voraussetzung ist, dass der ADC multibyte unterstützt.

    Aber auch dann kann es nötig sein, CS selbst zu handeln. So einen Fall habe ich gerade hier und mir deshalb das hier -> Quick hack: GPIO-Steuerung in C ohne root Rechte und ohne Library ...

    gebastelt.

    Einfach ausprobieren bzw. mal ins Datenblatt schauen, ob mutlibyte unterstützt wird.


    cu,

    -ds-