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
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.
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.
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
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 | }
|
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
>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
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.
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...
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.
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.
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.
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.
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.
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.
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!
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?
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 ?
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.
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.
> 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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.