ADS1115 richtig konfigurieren und auslesen

  • Hallo allerseits!

    Das ist mein erster Beitrag in diesem Forum - bin verzweifelt!

    Ich bin mir sicher, dass ihr mir weiterhelfen könnt.

    Mein Anliegen: Analoge Spannungswerte (0 bis ca. 2Vdc, Änderungsrate im Sekundenbereich) mit dem Raspberry messen und verarbeiten.

    Nach ein wenig Recherche im Netz habe ich das Joy-it Modul KY-053 mit dem ADS1115 entdeckt; hat mir recht gut gefallen...

    Meine Software am Raspberry schreibe ich mit Lazarus und dem Free Pascal Compiler (aus historischen Gründen - habe früher mit Turbo Pascal gearbeitet)

    Zum Testen des ADS1115 wollte ich diesen zunächst über die Shell des Raspberry mittels i2c-Tools (i2cset, i2cget) ansprechen.

    Den ADS1115 über i2C ansprechen funktioniert tadellos (Adresse 0x48) aber das Config-Register nach meinen Vorstellungen setzen, um dann aus dem Conversion-Register

    die Messwerte auszulesen.

    Und da fängt mein Problemchen an: Das Config-Register setzen scheint noch zu funktionieren, aber die anschließend aus dem Convesion-Register ausgelesenen Werte

    erscheinen eher wie Zufallszahlen.

    Die Eingangsspannung am A0 des KY-053 ist konstant 2Vdc.

    Konfiguration:

    * Raspberry Pi 4

    * Raspbian Buster

    * ADU: Joy-it KY-53 (ADS1115)

    Alle weiteren Infos entnehmt bite den beigefügten Dateien.

    Was mache ich falsch?

    Bitte um eure Hilfe!


    Schöne Grüße,

    Bergmensch

  • Moin Bergmensch,


    erstmal: Herzlich Willkommen im Forum!


    Kannst du mal schreiben, welche Register du mit welchen Daten beschrieben hast?

    Wenn du Terminalausgaben posten willst, dann setzte sie, bitte, in Code. Dieses Zeichen </> oben rechts im Editorfeld.

    Man kann es besser lesen als so ein Bild.


    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"

    Vielleicht trifft man sich in der RPi-Plauderecke.

    Edited once, last by Bernd666: Typo ().

  • Hallo Bernd666,


    danke für deinen Hinweis!


    Habe in der Shell des Raspberry Pi folgendes eingegeben:

    Code
    i2cset -y 1 0x48 0x01 0x8342 w

    Wobei man darauf achten muss, dass bei i2cset das Datenwort so angegeben werden muss (hab ich aus dem Netz): 0xLSBMSB

    Das bedeutet, dass ich das Config-Register (0x01) des ADS1115 so setzen will: (continuous mode, 4.096V, AINP = AIN0 and AINN = GND)


    01000010 10000011

    42h 83h


    Anschließend lese ich das Conversion-Register aus mit:

    Code
    i2cget -y 1 0x48 0x00 w

    Wobei auch für den Rückgabewert gilt: LSBMSB


    Gruß,


    Bergmensch

  • fred0815: Du meinst vermutlich wegen des Bildes RasPi_mit_ADS1115? Da ist noch eine Spannungsquelle mit 2V eingezeichnet, das würde schon passen.

    Mich würde aber interessieren, ob die Spannung mit einem Messgerät tatsächlich mal an GND/A0 gemessen wurde.

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • fred0815: Du meinst vermutlich wegen des Bildes RasPi_mit_ADS1115? Da ist noch eine Spannungsquelle mit 2V eingezeichnet, das würde schon passen.

    Mich würde aber interessieren, ob die Spannung mit einem Messgerät tatsächlich mal an GND/A0 gemessen wurde.

    Hallo VeryPrivat!

    Ja, habe die Spannung zwischen A0 und GND gemessen: 1,997Vdc

  • Ich fürchte, dass es am Setzen des Config-Registers liegt....

    Habe den Eindruck, dass der ADS1115 die Einstellungen, die ich in das Config-Register schreibe, nicht übernimmt.

  • Ich habe etwas recherchiert und denke es müsste passen (Code und Schaltung). Ich kenne Deine KTY Beschaltung nicht und würde daher vorerst gerne diese als "Fehlerquelle" ausschließen.

    Kannst Du ein paar Werte einlesen mit GND und mit 3,3V an A0 und die Werte hier posten?

    Kannst Du mal A1-A3 auf GND legen, damit deren Pegel definiert ist?

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • Falls es hilft, hier hat jemand einen Treiber für Python geschrieben. Den von Adafruit würde ich nicht unbedingt verwenden, da man dann weitere Abhängigkeiten hat (Blinka und noch was).


    Wenn du den A1 - A3 auf GND ziehst, sollte der gelesene Wert == 0 oder ein wenig drüber sein.

  • Falls es hilft, hier hat jemand einen Treiber für Python geschrieben. Den von Adafruit würde ich nicht unbedingt verwenden, da man dann weitere Abhängigkeiten hat (Blinka und noch was).


    Wenn du den A1 - A3 auf GND ziehst, sollte der gelesene Wert == 0 oder ein wenig drüber sein.

    Hallo DeaD_EyE!

    Danke für den Hinweis!

    Ich möchte allerdings keine fertigen Treiber verwenden, sondern alles von Null weg "zu Fuß" machen, damit ich das Thema auch richtig verstehe.

    Allerdings bin ich momentan mit meinem Latein am Ende!

    Habe nun A1-A3 auf GND gehängt aber wenn ich das Config-Register beschreibe mit

    Code
    i2cset -y 1 0x48 0x01 0x8342 w

    bekomme ich trotzdem Zufallswerte am A0 (siehe angehängte Dateien).

    Zumindest der Continuous-Modus scheint vom ADS1115 übernommen worden zu sein.

    Die Werte vom A0 gelesen (Conversion-Register 0x00) sehen so aus, als würde das Potential floaten...

    Gruß,

    Bergmensch

  • Ich habe etwas recherchiert und denke es müsste passen (Code und Schaltung). Ich kenne Deine KTY Beschaltung nicht und würde daher vorerst gerne diese als "Fehlerquelle" ausschließen.

    Kannst Du ein paar Werte einlesen mit GND und mit 3,3V an A0 und die Werte hier posten?

    Kannst Du mal A1-A3 auf GND legen, damit deren Pegel definiert ist?

    Hallo VeryPrivat!

    Habe nun alles so gemacht, wie von dir vorgeschlagen: A1-A3 auf GND und A0 nacheinander auf GND und +3,3V.

    Config-Register des ADS1115 beschrieben mit:

    Code
    i2cset -y 1 0x48 0x01 0x8342 w

    Dann jeweils 10 Werte vom Conversion-Register in eine Datei schreiben lassen (Anhänge).

    Immer noch Zufallswerte!

    Zumindest den Continuous-Modus scheint der ADS1115 übernommen zu haben.


    Gruß,

    Bergmensch

  • Danke, dann würde ich vorschlagen wir versuchen zuerst mal einen vernünftigen GND Wert einzulesen.

    Selbst bei falschen/fehlenden Einstellungen sollte die Chance ca. 0 zurück zu bekommen am höchsten sein...

    Im Datenblatt des ADS115 steht beim Lesen des Wertes nur was von der Adresse und dem Lesebit (Seite 35, Punkt 3)

    Im Internet finde ich verschiedene Versionen des Lesebefehls... Könntest Du bitte statt i2cget -y 1 0x48 0x00 w mal i2cget -y 1 0x48 w probieren?


    Edit: Erklärung: Byte 1 ist Adresse samt Lesebit (wird durch i2cget/i2cset gesetzt bzw. rückgesetzt) , Byte 2 und 3 sind bereits Response des ADS1115

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

    Edited once, last by VeryPrivat ().

  • Hallo VeryPrivat!

    Danke für den Tipp!

    Habe über das Lesebit auch schon gegrübelt....

    Leider verlangt i2cget nach dem Parameter für die Slave-Adresse (0x48) noch einen Wert und wenn man den weglässt, gibt es eine Fehlermeldung!

    Kennst du zufällig eine weitere Möglichkeit, um über die Shell mit dem i²C-Bus zu kommunizieren?

    Gruß,

    Bergmensch

  • Tut mir leid, I2C am Raspberry habe ich selbst noch nicht verwendet, daher kann ich auch nur versuchen Dir mit Recherche zu helfen. Daher muss ich Dich auch bitten diverse Versuche zu machen, da ich es nicht selbst probieren kann.

    Der dritte Beitrag von John La Rooy auf raspberrypi.stackexchange.com sieht interessant aus. Könntest Du bitte mal danach vorgehen?

    Damit wir die gleiche Adresse 0x49 haben, müsstest Du ADDR auf VDD verbinden - oder jeweils durch 0x48 ersetzen.

    Statt der 0 nach dem -y brauchst Du vermutlich 1, da es am Raspberry scheinbar der I²C 1 Bus ist und nicht wie in dem Beispiel der 0er.

    Danach müsste folgender Ablauf sein:

    • ADS1115 rücksetzen, indem Du ihn von der Versorgung trennst.
    • i2cget -y 1 0x49 0 w  => 0x0000, da noch keine Messung gestartet wurde
    • i2cget -y 1 0x49 1 w => 0x8385 müsste die Standardeinstellung des Konfigurationsregisters sein
    • i2cset -y 1 0x49 1 0xC385 w => Single Ended AIN0 (also gegen GND) müsste eingestellt sein
    • i2cget -y 1 0x49 0 w => "Kleiner ADC Wert" müsste auch bei mehreren Leseversuchen kommen.

    Übrigens, eine Idee hätte ich noch: Ist vielleicht der SDA Verbindungsdraht defekt? Das könnte erklären, warum Daten willkürlich daher kommen.

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • Moin Bergmensch,


    Wobei man darauf achten muss, dass bei i2cset das Datenwort so angegeben werden muss (hab ich aus dem Netz): 0xLSBMSB

    Mhm, laut Datenblatt Texas Instruments, ist es anders.

    Zu finden im Datenblatt, Punkt 10.1.7


    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"

    Vielleicht trifft man sich in der RPi-Plauderecke.

  • Der ADS1115 ist hat eine Auflösung von 16 Bit . Schon bei 8 Bit misst man auf 0,5% genau. Bei einem Spannungsbereich von etwa 3 V Spannung sind das 15 mV pro Bit (Stufe). Bei guten Layouts ließ sich das Rauschen auf der Leiterplatte kaum unter 10 mV bringen. Mit einem solchen Aufbau mit gesteckten Baugruppen kann man schon eine 8 Bit Auflösung nicht mehr sicherstellen. Von den Messwerten deshalb auf die obersten 8 Bit runden. Eventuell kommen dann keine Zufallszahlen mehr. Mit 16 Bit misst man mit den unteren Bits nur das Rauschen. Wenn man einen Zufallszahlengenerator braucht, ist eine Rauschquelle der beste Weg.