Forum: Mikrocontroller und Digitale Elektronik Auflösung des ADS1115


von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich verwende den ADS1115 zusammen mit einem Arduino UNO. Die 
Kommunikation funktioniert, auch das Setzen der verschiednenen 
Konfigurationen. Eine Sache ist mir allerdings nicht klar: Die letzten 4 
bit des Ergebnisses sind immer 0. Anbei ein Screenshot der 
Kommunikation. Das Ergebnis ist, dass die Auflösung nur 3mV beträgt und 
nicht 0,1875mV. Das Verhalten ist in allen Betriebsarten gleich, also 
unabhängig von PGA setting und Single ended/Diff. Hat jemand eine 
Erklärung? Vielen Dank!
Sebastian

von Pandur S. (jetztnicht)


Lesenswert?

Zeig mal Schema & code

von Sebastian (Gast)


Lesenswert?

Hi,

hier der Code Auszug der Kommunikation:

      i2c_start();
      i2c_write(0b10010000);      //Adress byte, write
      i2c_write(0b00000001);     //Pointer to config
      i2c_write(0b11000001);  //Messung start, AIN0/GND, 
6.144V,Single-shot
      i2c_write(0b11100011);      //860 SPS, Comp off
      i2c_stop();

      i2c_start();
      i2c_write(0b10010000);     //Adress byte, write
      i2c_write(0b00000000);     //Pointer auf Conv. register
      i2c_stop();


      i2c_start();
      i2c_write(0b10010001);     //Adress byte, read
      hi=i2c_read(1);            //Read with ACK
      lo=i2c_read(1);           //Read with ACK
      i2c_stop();

      temp=hi<<8 | lo;

Hardware ist dieses Board:
https://www.az-delivery.de/products/analog-digitalwandler-ads1115-mit-i2c-interface

Anschluss "ganz normal", also nur SDA, SCL und Versorgung. Mehr ist 
nicht dran.

von Johannes S. (Gast)


Lesenswert?

wird da irgendwo auf das Ende der Wandlung gewartet oder ein fixes delay 
für die Wandlungszeit gemacht? Wenn man das Ergebnis zu schnell vom ADS 
holt dann liefert der Fahrkarten.
Und beim Shiften aufpassen das auch 16 Bit Vars benutzt werden und auch 
eine 16 Bit Operation daraus wird.

von Sebastian (Gast)


Lesenswert?

Danke für den Hinweis mit dem Delay. Das werde ich tatsächlich mal 
einbauen. Wann startet die Wandlung? Erst nachdem das LSB ins config 
register geschrieben wurde oder schon nachdem das MSB (mit Bit 15 als 
Startbit) geschrieben wurde? Danke.
Sebastian

von Johannes S. (Gast)


Lesenswert?

habe ich jetzt nicht mehr im Kopf, da hilft dir das Datenblatt weiter. 
Mit dem delay bin ich mir sicher, das ist dringend nötig.

ein Code snippet, ohne Gewähr:
1
/*=========================================================================
2
    POINTER REGISTER
3
    -----------------------------------------------------------------------*/
4
    #define ADS1015_REG_POINTER_MASK        (0x03)
5
    #define ADS1015_REG_POINTER_CONVERT     (0x00)
6
    #define ADS1015_REG_POINTER_CONFIG      (0x01)
7
    #define ADS1015_REG_POINTER_LOWTHRESH   (0x02)
8
    #define ADS1015_REG_POINTER_HITHRESH    (0x03)
9
/*=========================================================================*/
10
11
/*=========================================================================
12
    CONFIG REGISTER
13
    -----------------------------------------------------------------------*/
14
    #define ADS1015_REG_CONFIG_OS_MASK      (0x8000)
15
    #define ADS1015_REG_CONFIG_OS_SINGLE    (0x8000)  // Write: Set to start a single-conversion
16
    #define ADS1015_REG_CONFIG_OS_BUSY      (0x0000)  // Read: Bit = 0 when conversion is in progress
17
    #define ADS1015_REG_CONFIG_OS_NOTBUSY   (0x8000)  // Read: Bit = 1 when device is not performing a conversion
18
19
//...
20
21
    // Set 'start single-conversion' bit
22
    config |= ADS1015_REG_CONFIG_OS_SINGLE;
23
24
    // Write config register to the ADC
25
    writeRegister(m_i2cAddress, ADS1015_REG_POINTER_CONFIG, config);
26
27
    // Wait for the conversion to complete
28
    {
29
30
        for (int i=0; i<100; i++) {
31
            if ( (ADS1015_REG_CONFIG_OS_BUSY == (readRegister(m_i2cAddress, ADS1015_REG_POINTER_CONFIG) & ADS1015_REG_CONFIG_OS_MASK))) {
32
                wait_us(1*1000);
33
            }
34
            else
35
            {
36
                break;
37
            }
38
            
39
        }
40
41
    }

von Forist (Gast)


Lesenswert?

Sebastian schrieb:
> Inked20200531_111142_LI.jpg
Ist es eigentlich so schwierig, die Screen Shot Funktion des PCs zu 
benutzen?

Wenn das dann doch zu viel verlangt ist, könntest du wenigstens dafür 
sorgen, dass sich nicht die halbe Welt im Monitor spiegelt und das Ding 
von vorne knipsen. Es muss doch irgendwie möglich sein, das Schmartfone 
gerade davor zu halten.
-1

von Christoph M. (mchris)


Lesenswert?

>Ist es eigentlich so schwierig, die Screen Shot Funktion des PCs zu
>benutzen?

Ganz unten links im Bild steht "Teledyne Lecroy".

Sebastian:
>Eine Sache ist mir allerdings nicht klar: Die letzten 4
>bit des Ergebnisses sind immer 0.

Wie sehen die Signale aus, wenn du diese Library benutzt?:
https://github.com/addicore/ADS1115

von Guest (Gast)


Lesenswert?

Sebastian schrieb:
> Danke für den Hinweis mit dem Delay. Das werde ich tatsächlich mal
> einbauen. Wann startet die Wandlung? Erst nachdem das LSB ins config
> register geschrieben wurde oder schon nachdem das MSB (mit Bit 15 als
> Startbit) geschrieben wurde? Danke.
> Sebastian

Der sollte einen Ausgang (meistens open drain) haben der signalisiert, 
wenn die Wandlung beendet ist. Heißt idr. RDY oder Alert.

von Sebastian (Gast)


Lesenswert?

Danke für den inhaltlosen Kommentar. Das nächste mal werde ich doch 
einen USB Stick suchen und einen richtigen Screenshot speichern. Ich 
dachte halt es geht auch so, bitte vielmals um Verzeihung...

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

Christoph M. schrieb:
>>Ist es eigentlich so schwierig, die Screen Shot Funktion des PCs
> zu
>>benutzen?
>
> Ganz unten links im Bild steht "Teledyne Lecroy".
>
> Sebastian:
>>Eine Sache ist mir allerdings nicht klar: Die letzten 4
>>bit des Ergebnisses sind immer 0.
>
> Wie sehen die Signale aus, wenn du diese Library benutzt?:
> https://github.com/addicore/ADS1115

Danke für den Tip! Habe ich gemacht. Die Auflösung im single ended Modus 
mit +/-6.144V beträgt immer noch 3mV (s. screenshot). Der Pin A1 liegt 
auf GND, alle anderen floating. Ich werde mal ein Poti anschliessen 
damit ich die Spannung fein Einstellen kann. Aber es sieht tatsächlich 
so aus als ob nur 12bit Auflösung vorhanden sind. Seltsam.

von Wolfgang (Gast)


Lesenswert?

Sebastian schrieb:
> Hat jemand eine Erklärung?
Wie genau lautet der Marking Code des ADC, mit dem dein Breakout Board 
bestückt ist?
Die ausgelesenen Daten passen verdammt gut zu einem ADS1015.

von Forist (Gast)


Lesenswert?

Christoph M. schrieb:
>>Ist es eigentlich so schwierig, die Screen Shot Funktion des PCs zu
>>benutzen?
>
> Ganz unten links im Bild steht "Teledyne Lecroy".
Dann ersetze das "P" durch "embedded".
Sorry, das Ding kostet ein Mehrfaches von einem heutigen PC und da 
sollte ein halbwegs vernünftiger Screen Shot doch nun wirklich möglich 
sein.
Selbst mit einem 8€ China-Clone als LA geht das anständiger.

von Mike J. (linuxmint_user)


Lesenswert?

Sebastian schrieb:
> Das nächste mal werde ich doch
> einen USB Stick suchen und einen richtigen Screenshot speichern. Ich
> dachte halt es geht auch so,

Darum geht es nicht.
Du hinderst Leute dabei dir zu helfen.
Wenn man die Informationen in Bild/Video/Wort gut aufbereitet, dann 
erhöht man die Wahrscheinlichkeit dass die anderen das eigene Problem 
schneller lösen.

Ich sehe diese zusätzliche Arbeit die ich da rein stecke als 
Wertschätzung der µC.NET Nutzer und habe dadurch natürlich auch einen 
Vorteil.

1. Wenn du von qualifizierten Leuten die Meinung hören möchtest, dann 
ist es nicht unwahrscheinlich dass sie älter sind und vielleicht nicht 
mehr ganz so gut sehen können. Diese Gruppe von Menschen denken sich 
dann: "Das ist zu klein, da sehe ich nicht genug."
(speziell wenn es dann noch etwas unscharf ist oder Reflexionen 
vorhanden sind)

2. Dann gibt es noch die Leute (stetig wachsende Anzahl) die ein Handy 
nutzen und welche dir nicht helfen können weil das Bild lange zum laden 
braucht. (sei es wegen eines oft recht schlechten Funknetzes oder weil 
sie nur die 64kbit/s nutzen die nur noch verfügbar sind wenn das 
Datenvolumen aufgebraucht ist)

Ich kauf bei meinem Handys generell kein zusätzliches Datenvolumen und 
nutze nur das was es frei dazu gibt.

von Sebastian (Gast)


Lesenswert?

Wolfgang schrieb:
> Sebastian schrieb:
>> Hat jemand eine Erklärung?
> Wie genau lautet der Marking Code des ADC, mit dem dein Breakout Board
> bestückt ist?
> Die ausgelesenen Daten passen verdammt gut zu einem ADS1015.

Danke, daran habe ich auch schon gedacht. Es ist ein "BOGI" also 16bit 
Variante. Ich habe nun eigenen code und alle verfügbaren Beispiele für 
den Arduino probiert. Stets das gleiche Verhalten, die letzten 4 bit 
sind immer 0. Seltsam.

von Wolfgang (Gast)


Lesenswert?

Sebastian schrieb:
> Ich habe nun eigenen code und alle verfügbaren Beispiele für
> den Arduino probiert.

Der einfachste Test sollte doch sein, wenn man eine Einzelwandlung 
auslöst und dem ADC dann "alle Zeit der Welt" gibt, um die Wandlung 
sicher zu Ende zu führen. Dann wäre man erstmal unabhängig vom Busy-Flag 
und käme mit dem Lesen der Daten sicher nicht zu früh.

p.s. Etwas böse wäre natürlich, wenn der Chips falsch gelabelt wäre.

von Sebastian (Gast)


Lesenswert?

Wolfgang schrieb:
> Sebastian schrieb:
>> Ich habe nun eigenen code und alle verfügbaren Beispiele für
>> den Arduino probiert.
>
> Der einfachste Test sollte doch sein, wenn man eine Einzelwandlung
> auslöst und dem ADC dann "alle Zeit der Welt" gibt, um die Wandlung
> sicher zu Ende zu führen. Dann wäre man erstmal unabhängig vom Busy-Flag
> und käme mit dem Lesen der Daten sicher nicht zu früh.
>
> p.s. Etwas böse wäre natürlich, wenn der Chips falsch gelabelt wäre.

Die Einzelwandlung und die Reduzierung auf den einfachst möglichen code 
habe ich gemacht: Clock Rate auf 10kHz reduziert, Delays zwischen jedem 
Schreib/Lesevorgang, Data ready verwenden. Immer gleiches Ergebnis. Ich 
habe auch mal die 10k Pullups durch 3,3k ersetzt. Ich bin mir jetzt 
ziemlich sicher, dass es nicht an gestörter Kommunikation liegt. Die 
Anstiegszeiten der Signalflanken liegen innerhalb der Spezifikation.
Ich denke auch, dass die Arduinobeispiele soweit fehlerfrei sind. Also 
liegt es wohl am Chip (habe 3 breakout boards probiert).
Kurz zur Applikation: Es geht darum, einen Kraftsensor auszulesen. Ein 
INA126 verstärkt die Brückenspannung und verschiebt das Signal um 2,5V. 
Daurch muss keine negative Spannung gemessen werden. Ich habe einen 
Messbereich von -500 bis +500N, entspricht 0-5V Spannung. Danke für die 
Hilfen erstmal!

von Mike J. (linuxmint_user)


Lesenswert?

Sebastian schrieb:
> Stets das gleiche Verhalten, die letzten 4 bit
> sind immer 0. Seltsam.

Könntest du einfach mal die maximale Spannung oder ein wenig mehr 
anlegen, so dass du 0xFFFF ausgegeben bekommst?

von Mike J. (linuxmint_user)


Lesenswert?

Sebastian schrieb:
> Ich habe einen Messbereich von -500 bis +500N, entspricht 0-5V Spannung.

Du nutzt wohl eher: FSR= ±6.144V
Damit bekommst du bei Nutzung von nur der positiven Spannung auch nur 
einen 15bit-Wert.

Wie sehen denn deine Registereinstellungen aus?

Sebastian schrieb:
> i2c_write(0b11100011);      //860 SPS, Comp off

Mit 860SPS hast du eh nur eine effektive Auflösung von 14,8 bit und wenn 
du dann auch noch nur den positiven Bereich nutzt, sind es eigentlich 
nur 13,8 bit.

Könntest du mal auf nur 8 SPS stellen, die Spannung am Eingang auf über 
6,144V stellen oder wenn das nicht geht einen niedrigeren Messbereich 
einzustellen (FSR= ±0.512V) um den Vollausschlag sehen zu können ?

von Manfred (Gast)


Lesenswert?

Mike J. schrieb:
> Du nutzt wohl eher: FSR= ±6.144V
> Damit bekommst du bei Nutzung von nur der positiven Spannung
> auch nur einen 15bit-Wert.

Was genau seine 0,1875mV Auflösung gäbe.

Mike J. schrieb:
> Mit 860SPS hast du eh nur eine effektive Auflösung von 14,8 bit
> und wenn du dann auch noch nur den positiven Bereich nutzt,
> sind es eigentlich nur 13,8 bit.

Kannst Du bitte erklären, wie Du auf diese verringerte Auflösung kommst?

Ich bin zwar nicht der TO, aber habe eine Idee im Kopf, wo ich ebenfalls 
mit dem 1115 oder 1015 nur einseitig messen will. Die Hardware wird 
demnächst erst aufgebaut, ich kann also noch keine Messungen machen.

von Wolfgang (Gast)


Lesenswert?

Mike J. schrieb:
> Mit 860SPS hast du eh nur eine effektive Auflösung von 14,8 bit und wenn
> du dann auch noch nur den positiven Bereich nutzt, sind es eigentlich
> nur 13,8 bit.

In wie weit der Messbereich des Wandlers genutzt wird, ist hier nun 
wirklich nicht das Thema. Das würde sich in den oberen Bits bemerkbar 
machen.
Hier geht es einzig um die Frage, woran es liegen kann, dass das untere 
Nibble vom Wandlungsergebnis immer als 0000 übertragen wird.

von Sebastian (Gast)


Lesenswert?

> Könntest du mal auf nur 8 SPS stellen, die Spannung am Eingang auf über
> 6,144V stellen oder wenn das nicht geht einen niedrigeren Messbereich
> einzustellen (FSR= ±0.512V) um den Vollausschlag sehen zu können ?

Also, bei einer Spannung von 4,97V am Eingang (=VDD) und 860 SPS 
schwankt das Ergebnis zwischen 26480 und 26464. Das ist soweit korrekt, 
6,144V entspricht dann 32767. Bei 8 SPS lautet das Ergebnis stabil 
26464. Lo nibble aber auch hier immer 0000.

von Andreas V. (Firma: IGL) (andreas_va)


Lesenswert?

Ist das Problem inzwischwn gelöst? Das sieht aus als wenn Dein ADS1115 
ein ADS1015 wäre und als ADS1115 konfiguriert ist. Schon mal einen 
anderen ADA1115 probiert?

von K. S. (the_yrr)


Lesenswert?

Sebastian schrieb:
> Also
> liegt es wohl am Chip (habe 3 breakout boards probiert).
In dem Zusammenhang muss man die chinesischen 50% abziehen. Das passiert 
wenn das Board mit 1.5€ weniger als die Hälfte von dem IC in großen 
Stückzahlen kostet.

von Sebastian (Gast)


Lesenswert?

Andreas V. schrieb:
> Ist das Problem inzwischwn gelöst? Das sieht aus als wenn Dein
> ADS1115
> ein ADS1015 wäre und als ADS1115 konfiguriert ist. Schon mal einen
> anderen ADA1115 probiert?

Gelöst ist das Problem nicht, aber es gibt mittlerweile mehrere Nutzer 
die die mit dem Amazon-board die gleiche Erfahrung gemacht haben. Ich 
habe mir übrigens bei RS ein anderes board mit dem IC gekauft und siehe 
da: 16bit Auflösung so wie gewünscht. Man kann also Zusammenfassen: Chip 
korrekt gelabelt, aber es ist tasächlich nur die 12bit Variante. Das 
habe ich auch noch nicht erlebt!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.