Python und AD-Wanlder

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Hallo Forumsbewohner,

ich habe eine Frage zu meinem aktuellen Projekt. Ich habe ein fertiges Python Programm, welches mir eine GUI erzeugt. Mithilfe dieser kann ich das analoge Signal eines Messgerätes in ein digitales Umwandeln und in einer Textdatei speichern (AD-Wandler MCP3008). Hierzu verwende ich folgenden Code:

Code: Alles auswählen

def getKraftwert(self, AdCh, CLKpin, DINpin, DOUTpin, CSpin):
        GPIO.output(CSpin, HIGH)
        GPIO.output(CSpin, LOW)
        GPIO.output(CLKpin, LOW)
        cmd = AdCh
        cmd |= 0b00011000
        for i in range(5):
            if (cmd & 0x10):
                GPIO.output(DINpin, HIGH)
            else:
                GPIO.output(DINpin, LOW)
            GPIO.output(CLKpin, HIGH)
            GPIO.output(CLKpin, LOW)
            cmd <<= 1
        AdChValue = 0
        for i in range(11):
            GPIO.output(CLKpin, HIGH)
            GPIO.output(CLKpin, LOW)
            AdChValue <<= 1
            if(GPIO.input(DOUTpin)):
                AdChValue |= 0x01
        return AdChValue

Ich muss gestehen, dass ich diesen Code nicht zu 100% verstehe, da ich diesen einfach im Internet gefunden habe. Ich habe dazu folgende Probleme. Dieser ist für einen 8-Bit Wandler wie meinen ausgelegt. Meine Werte die ich digital auswerte, haben Schwankungen wenn eine Konstante Spannung anliegt. Der digitale Wert schwankt dann um ca +-3. Ich denke das ist aber relative normal, oder ?

Aber nun zum Hauptproblem. Wenn das Messgerät auf 0 steht und nichts misst, dann ist der Wert vom AD-Wanlder bei ca 511. Aber zwischendurch habe ich Werte vom 200 oder 700 in meiner Textdatei aufgenommen. Ich verwende Abtastungen von 0,01-0,05 Sekunden. Ist dieses zu schnell? Meine GUI zeigt auch ein LIVE-Wert an. Dieser Tastet mit 0,2 Sekunden ab. Dort habe ich dieses augenscheinlich nicht.

Eine weitere Frage habe ich noch. Ich habe einen 16-Bit AD-Wandler bestellt um noch genauer aufzulösen. Muss ich den Code deswegen verändern? Ich habe dann ja statt 1023 auch ca. 65000 mögliche Digitalwerte?


Vielen Dank im voraus :)

LG Donald
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist halt das Problem, wenn man irgendwo was findet, dann liegt es meist daran, dass jemand es weggeworfen hat, weil es kaputt ist.
Laut Code hast Du einen 11bit-Wandler, wenn es soetwas gibt. Da Du nicht verraten hast, welches Modell, kann man halt auch nicht sagen, ob das vielleicht funktioniert oder nicht. Jedenfalls bin ich immer sehr skeptisch, wenn jemand ein Protokoll auf Hardwareebene versucht mit GPIOs nachzubilden. Da kann man nur hoffen, dass das mit dem Timing funktioniert. Wenn Du dann noch das Gerätchen mit zu vielen Abfragen überlastest, kann alles mögliche passieren.

Zum Code: er hält sich nicht an die Namenskonvention. Es ist scheinbar eine Klassenmethode, obwohl `self` gar nicht benutzt wird. Die Argumente haben kryptische Namen. if ist keine Funktion, sollte also nicht wie eine solche geschrieben werden. Die sind zudem noch überflüssig.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@Sirius3: er sagt doch, das es ein MCP3008 ist. Und der hat 10Bit Auflösung. Die 11 Schiebevorgänge benutzt der Held der das verbrochen hat weil er erstmal ein 0-Bit rausschiebt...

@PythonDonald: den Code solltest du wegwerfen. Der ist wirklich ganz ganz übel. Besseren unter Verwendung der PI eigenen SPI Schnittstelle (Achtung: muss dann richtig verkabelt werden) findet sich zb hier: https://codingworld.io/project/mcp3008- ... -pi-messen

Rauschen in den unteren 2 Bit ist je nach Quelle normal, musst du ggf. glätten. Ich habe den gleichen wandler bereits mit 10KHz oder so betrieben. Laut Datenblatt schafft er sogar 200KHz bei 5V. Zu schnelle abtastung ist also nicht das Problem. Wenn du einen mangelhaften elektrischen Aufbau ausgeschlossen hast, bleibt dir nur filtern übrig. Da du das für das Rauschen eh tun musst, würde ich einen moving average von 10-100 oder so verwenden.

Last but not least: natürlich musst du für einen anderen wandler anderen Code verwenden.
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Danke erst mal für euer Kommentare. das der Code so bescheiden ist, war mir halt nicht bewusst, da er ja funktionierte habe ich ihn erstmal genommen.
Gibt es vielleicht welche, die ich mir anschauen kann. Ich weis leider nicht, wie ich selber einen Code für den 16 Bit Wandler schreibe. Ich habe nun den AD7705BNZ - Wandler zur Verfügung.
@Deets: Dein eingefügter Link funktioniert leider nicht.

Das Glätten werde ich mir noch einmal anschauen. Danke.
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Dieses war zum Beispiel eine der Quelle:

https://www.raspiprojekt.de/machen/basi ... ?showall=1
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Für mich funktioniert der link tadellos. Gerade nochmal geprüft. Hast du aggressive Browser Einstellungen?

Und für den neuen findet sich

https://github.com/belese/python-AD770X ... /ad7705.py
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Ja der PC auf der Arbeit ist da sehr begrenzt ;)

Kannst du mir zu dem Code etwas sagen? Diesen habe ich bereits gefunden. Ist dieser so einsatzbereit? oder muss ich umfangreiche Änderungen vornehmen?
Ich stecke leider noch in der Anfangsphase meiner Programmierkarriere :D


Aber vielen Dank schon mal für deine Hilfe. Das ist echt super nett :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich verstehe nicht zu welchem Code ich was sagen soll. Dem vom AD770? Der ist ok, sonst haette ich den nicht rausgesucht. Und wenn dein PC begrenzt ist, kannst du ja ggf dein Smartphone benutzen. Oder deinem Admin sagen, dass seine uebertriebenen Massnahmen dich in der Wahrnehmung deines Jobs behindern.
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Ja genau ... Dann ist gut danke. Also ich habe die SPI aktiviert und nun bekomme ich schon mal Nullen ausgegeben. Jedoch weiß ich noch nicht genau, welche Anschlüsse ich wie belegen muss? :/ Ist das die selbe wie beim MCP3008 von deinem LINK?

Danke
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das kann man wirklich ALLES nachschauen. Wenn es einen Computer gibt, bei dem wirklich jedes Bit und Beinchen mit Vornamen bekannt ist - dann sind das der C64 und der PI. Und mir war so, als ob du sogar ein Oszi hast. Damit kannst du pruefen, ob CS, CLK, MOSI und MISO tun, was sie sollen.
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Ok, tut mir leid. Wie gesagt bin noch recht neu und lerne noch. :)

Ich weis schon was CS usw ist. Mir ging es nur um den Code. Da muss doch definiert sein, welcher Pin auf CS, Clock usw. gesteckt ist ? Oder ist genau dieses durch die SPI einheitlich? Bei meinem alten Programm musste ich diese noch definieren und auswählen?

Bitte nicht böse sein. ich bin nicht zu faul zum selber suchen, aber in machen punkten fehlt mir leider noch das Hintergrundwissen :)


LG
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Scheint nach meinen Recherchen einheitlich zu sein, wo CS, CLK und co. angeschlossen werden ;) Danke
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Kann es sein, das ich folgende Anpassung machen muss:

MODE=0b11 -> 0b17
BITS= 8 -> 16

?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Mode bezieht sich auf den SPI-Modus. Bits auf die Wortbreite von SPI. Versuch den Code nachzuvollziehen, und abzugleichen damit, was das Datenblatt deines Chips sagt. Schau dir im Oszilloskop an, ob die Register die du erwartest gesetzte werden. Dank CS ist SPI mit einem 4-Kanal Oszi gut debugbar. Oder einem Logikanalyser.
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Könnte mir vielleicht trotzdem jemand erst mal bei der Verkabelung helfen? Bei dem MCP3008 habe ich dieses auch hinbekommen. Dort hatte ich ja auch 8 verschiedene Channel. Nun habe ich folgende Leitungen verbunden:

SCLK, CS0, (MOSI, MISO = Diese gehen auf DIGIN und DIGOUT)
Das ist die Pinbelegung am Raspi, die ich Verwende (SPIO0): https://docs.microsoft.com/en-us/window ... appingsrpi

Ich weiß nun nicht genau wo und wie ich die Referenzspannung anlegen muss und wo genau der neue "Channel" / Eingang ist. Wenn ich 1 Volt auf Ref In und 0,5 Volt auf AIN1(+) lege, dann würde ich ja einen Wert ungleich 0 erwarten. ?

Habt Ihr oder hast du noch eine Idee was falsch ist?




LG
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also wenn ich mir das Datenblatt anschaue, dann sehe ich das die Vref mindestens mal 1.25V sein muss. Dann gibt's da noch /RESET, dass muss natuerlich HIGH.

Und das Problem mit SPI ist, dass die Daten die kommen auch 0 sind, wenn das Kabel nicht (korrekt) verbunden ist. Um das auszuschliessen kannst du zB mal MISO auf 3.3V legen, dann muessen ja nur Einsen zurueck kommen.

Dann hat das Teil ja diverse Register, und die kannst du versuchen zu lesen. Vor allem das CLOCK ist interessant, denn das hat nicht-0-Bits nach RESET.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zu dem /RESET: es kann auch sein, dass das einen Pullup hat. Musst du mal ebenfalls das Datenblatt durcharbeiten.
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Also wenn ich MISO einfach auf HIGH stecke, dann kommen nicht mal mehr Nullen ? :/ Das Programm harkt dann einfach kurz :(

Ich habe jetzt ca 1,3 Volt auf Ref+ und GND bei Ref-. Außerdem habe ich bei AIN1+ ca. 0,7 Volt anliegen und bei AIN1- ebenfalls GND. Ist das denn richtig ?


LG
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was heißt “das Programm harkt”? Ich harke meinen Garten. Wenn du Fehlermeldungen hast, zeig die.

Und wie man das Ding verdrahtet steht im Datenblatt. Was anderes zu machen als das zu lesen tue ich auch nicht.
PythonDonald
User
Beiträge: 27
Registriert: Donnerstag 20. Juni 2019, 07:35

Ich habe MISO vom Raspberry GPIO9 auf HIGH geteckt. Dann gibt es keine Ausgabe(keine Nullen). Wenn ich das Kabel wieder rausziehe, dann läuft es weiter und es werden wieder Nullen ausgegeben.

Einen Fehler bekomme ich nicht.
Antworten