[Solved] Problem mit ESP32 in Verbindung mit ADC ADS1115

Hallo zusammen,

ich bastele zurzeit an einer Schaltung, die im Grunde einfach nur ein analoges Sensorsignal auf einen Controller geben soll, um dieses dann weiterzuverarbeiten. Allerdings bin ich bereits bei der AD-Wandlung auf ein Problem gestoßen, was ich nicht in der Lage bin zu lösen.

Kurz zur Schaltung:
Hauptdarsteller dieses Trauerspiels sind ein ESP32 und ein ADS1115, die über I²C miteinander verbunden sind, und ein 4-20mA Wegsensor. Der Sensor liegt an 12V an und seine Signalwerte werden über einen Präzisionswiderstand in eine entsprechende Spannung (5V max) für den ADC umgewandelt. Die 12V regele ich durch einen normalen L7805 runter um sie als Versorgungsspannung sowohl für den ESP als auch den ADC zu verwenden. Beide sind eigentlich für 3,3V ausgelegt, können aber, laut Datenblatt, auch mit 5V betrieben werden.

Jetzt zu meinem Problem:
Beim Auslesen des Conversion Registers dreht irgendetwas in der Schaltung am Rad und ich bekomme scheinbar zufällige Werte zwischen 0 und 240 ausgegeben. Diese Werte sind allerdings nicht kontinuierlich, sondern es handelt sich immer um die selben, etwa 20, Werte. Etwa 16, 32, 64, 112, 144, 176. Ich habe schon mit verschiedensten Konfigurationen des ADS1115 herumprobiert, kam aber nie zu sinnvolleren Ergebnissen.
Ich gehe davon aus, dass es sich um ein grundlegendes Verständnisproblems bezüglich der I²C-Kommunikation meinerseits handelt.

Hier mein verwendeter Code:

#include <Wire.h>

void setup() {
Wire.begin();
Serial.begin(115200);
Wire.beginTransmission(0x48); //GND-Adresse
Wire.write(0x01);             //Config Register
Wire.write(0xC1);             //Single-shot, A0 single-ended, PGA 6,144V
Wire.write(0x03);             //8SPS, Comparator disabled
Wire.endTransmission();
  }
  
void loop() {
Wire.beginTransmission(0x48);
Wire.write(0x00);             // Conversion Register
Wire.endTransmission();
Wire.requestFrom(0x48,2);
Wire.read();
Serial.println(Wire.read());
}

Falls sich also jemand mit den beiden Komponenten auskennt, wäre ich für jede Hilfe dankbar.

Moin,
wir hatten doch kürzlich mal was mit AD-Wandlern, die weniger Bits ausgeben als angenommen:
Das war hier.

Dein Problem sieht mir fast so aus als wäre es dasselbe.

Gruß Walter

Hi,

ich habe mir den Thread gerade einmal durchgelesen, allerdings scheint mir, dass er nicht genau mein Problem behandelt.
In meinem Aufbau springen die Werte selbst bei einer festen Eingangsspannung wie wild zwischen 0 und 240 umher und daher glaube ich eher, dass der Fehler bei mir liegt.

Trotzdem vielen Dank für deine Antwort.

Ich gehe davon aus, dass es sich um ein grundlegendes Verständnisproblems bezüglich der I²C-Kommunikation meinerseits handelt.

Wie du das überprüfen kannst:

Bisher machst du einen auf "gut glauben", oder "wirds schon tun", wunderst dich aber, dass lustige Werte kommen.

Wire.endTransmission();
Wire.requestFrom(0x48,2);

Beide liefern dir den Erfolg ihrerer Tätigkeit als Rückgabeparameter.
Diese solltest du auch auswerten.

Hallo,

Wire.requestFrom(0x48,2) holt 2 Byte von der Adresse in den Buffer.
Mit Wire.read() liest du jedoch nur ein Byte aus den Buffer aus.

Bin mir aber nicht sicher, ob das dein Springen erklärt.

Mit Wire.read() liest du jedoch nur ein Byte aus den Buffer aus.

Ich sehe da 2 read, von denen allerdings nur eins zur Anzeige kommt.

Bin mir aber nicht sicher, ob das dein Springen erklärt.

Das kann ich auch nicht sagen.
Liegt wohl an der Beschaltung.

Wenn die Eingänge offen sind, versucht der Wandler das Universum auf einen Wert zu reduzieren.
Der darf dann auch springen.

Ups, gatt übersehen. :astonished:
Dann geht der erste read() (MSB) ins Nirvana und der zweite (LSB) wird angezeigt.

Edit:
Der Wert wird in der Loop kontinuierlich abgefragt. Da solltest du eine kleine Wartezeit einfügen und warten bis ein neuer Wert ansteht. Hab jetzt nicht nachgesehen, ob du den "continuous conversion mode" eingestellt hast.
Nebenbei: Der ADS1115 hat auch ein Flag das angibt, ob eine Konvertierung abgeschlossen ist.

Danke an alle für eure Antworten.

Der Fehler war genau der, der beschrieben wurde:
Ich habe natürlich nur das erste byte abgefragt, nicht aber das zweite :confused: Jedenfalls funktioniert jetzt beinahe(!) alles perfekt. Ich habe nämlich tatsächlich, wie im von wno158 verlinkten Thread beschrieben, keinen 16-bit ADC geliefert bekommen, sondern einen 12-bit....

Dennoch noch einmal ein herzliches Danke an euch :slight_smile:

Danke für die Rückmeldung!

Jetzt vielleicht noch den Titel des ersten Beitrags um ein [gelöst] ergänzen, dann ist es perfekt.