16 Bit Analog-Digital-Converter ADS1115

Wenn für Spannungsmessungen eine Auflösung von 10 Bit (= 1024 Stufen), wie z.B. die der Analogeingänge von Arduino Uno oder Mega nicht ausreichend ist, muss auf einen externen Analog-Digital-Converter (ADC) ausweichen.

Dazu bietet sich z.B. der ADC ADS1115 an, der bis zu vier Analogsignale, mit einer Auflösung von 15 Bit (= 32.768 Stufung) digitalisiert und als vorzeichenbehaftete 16 Bit Zahl im Zweierkomplement-Format ausgibt. Negative Werte können sich bei gewünschter Ausgabe von Differenzspannungen zwischen zwei Analogeingängen ergeben.

Der ADC wird über die I2C-Schnittstelle angesprochen.

        

       Bild 1: ADS1115 auf Breakout Board


   Anschlussbelegung:

  • VDD, GND: Stromversorgung 2,0 - 5,5 V
  • SCL, SDA: Serial Clock und Serial Data Bus
  • ADDR: I2C-Adresseingang (siehe nachfolgende Beschreibung)
  • ALRT: Alarm/Ready-Ausgang (in meiner Library nicht verwendet)
  • A0-A3: Analogeingänge

Analogeingänge:

Der ADS1115 besitzt 4 Analogeingänge A0 bis A3, die einerseits zur Messung von Spannungen gegen Masse (single-ended-inputs), als auch zur Erfassung von Differenz-Spannungen (differential-inputs) verwendet werden können. Die Auswahl der zu messenden Spannung erfolgt dabei über einen internen Multiplexer. Die nachfolgende Tabelle 1 zeigt die möglichen Varianten:

Tabelle 1: Auswahlmöglichkeiten der Spannungsmessung mit dem Multiplexer


Programmierbarer Verstärker PGA (Programmable Gain Amplifier):

Die Verstärkung (Gain) des PGA ist auf die Werte 2/3, 1, 2, 4, 8 oder 16 einstellbar. Der daraus resultierende Messbereich FS (Full-Scale Range) und die Spannungs-Auflösung (Resolution) ist in nachfolgender Tabelle 2 ersichtlich:

Tabelle 2: Messbereich (FS) und Spannungs-Auflösung (Resolution) in Abhängigkeit der vorgegebenen Verstärkung (Gain)

Achtung: Die zu messenden Spannungen müssen immer positiv sein, negative Messergebnisse können sich nur im Zuge von Differenz-Spannungsmessungen ergeben! Die an einem Analogeingang anliegende Spannung darf nicht kleiner als 0 V (minimal -0,3 V) und nicht größer als die Versorgungsspannung VDD (maximal VDD + 0,3 V) sein, sonst droht die Beschädigung des ADC. Die Versorgungsspannung VDD darf maximal 5,5 V betragen!


Datenrate:

Die Datenrate (Sample Rate) ist in 8 Stufen zwischen 8 SPS und 860 SPS einstellbar (SPS = Samples Per Second).


I2C-Adresse:

Der ADS1115-Chip besitzt einen Adresseingang ADDR. Durch Beschaltung des Adresseinganges mit GND, VCC, SDA oder SCL kann der ADS1115 auf 4 mögliche Adressen (0x48 bis 0x4B) eingestellt werden.

Auf dem ADS1115-Breakout Board (siehe Bild 1) ist der Adresseingang bereits mit einem Pulldown-Widerstand versehen, so dass standardmäßig, ohne weitere Beschaltung, bereits die Adresse 0x48 eingestellt ist.


Betriebsmoden:

Prinzipiell kann sich der ADS1115 in 3 verschiedenen Betriebsmoden befinden, wobei aber nur die folgenden 2 Moden direkt ausgewählt werden können:

  • Einzelmessung (single-shot mode) oder
  • Kontinuierliche Messung (continuous conversion mode)

Ist allerdings der single-shot mode ausgewählt und findet gerade keine Wandlung statt, dann befindet sich der ADS115 im dritten möglichen Modus, dem Stromsparmodus (power-down mode), solange bis wieder eine neue Einzelmessung gestartet wird.


Maximaler Stromspar-Betrieb:

Ist, z.B. wegen Batteriebetrieb, eine maximale Stromeinsparung gefordert, dann sollte der ADS1115 mit folgenden Einstellungen betrieben werden (siehe nachfolgendes Programmbeispiel 2):

  • Betriebsmodus: single-shot mode
  • Datenrate: 860 SPS
  • Anzahl von Messungen: gering, z.B. 5 mal pro Sekunde

Bei der Datenrage von 860 SPS (Samples Per Seconds) beträgt die Wandlungszeit nur ca. 1,2 ms pro Wandlung. Wenn also z.B. 5 Messungen pro Sekunde ausreichend sind, befindet sich der Chip davon 994 ms im power-down mode, wo die Stromaufnahme lt. Datenblatt nur ca. 1 - 1,5 µA beträgt. Das ist um den Faktor 150 - 200 geringer, als während der Wandlung.

Testaufbau:

Verwendete Bauteile:

  • 1 Arduino Nano
  • 1 ADS1115 Breakout Board
  • 1 Kondensator 100 nF
  • 2 Trimmpotis 10 kOhm
  • 1 Batteriepack 4,5 V


Library MyADS1115 für Arduino und Attiny45/85:

Folgende Funktionen stehen derzeit zur Verfügung:


  • Abfrage, ob der Baustein über I2C ansprechbar ist
  • Setzen und Abfragen des Betriebsmodus (Einzelmessung oder kontinuierliche Messung)
  • Setzen und Abfragen von Parametern (Multiplexer, Verstärkung, Datenrate)
  • Start einer Einzelmessung
  • Lesen des Messwertes (16 Bit-Integer-Zahl des Conversion-Register)
  • Lesen des Messwertes als Spannungswert (= skalierter Wert des Conversion-Register)
  • Ausgabe des Configuration-Register am Seriellen Monitor (nur für Kontrollzwecke, nicht für Attiny), siehe Bedeutung der einzelnen Bits des Registers -> Register


Die Library kann hier heruntergeladen werden:

Sollte die Library jemand verwenden oder testen, würde ich mich über eine Rückmeldung sehr freuen!

Version 1.0

MyADS1115.cpp.txt

MyADS1115.h.txt

keywords.txt

Leider kann ich hier keine "cpp"- oder "h"-Files hochladen, daher zum Verwenden der Library das Suffix ".txt" aus diesen Dateinamen entfernen und in einem neuen Verzeichnis mit dem Namen "MyADS1115" im Sketchbook-Ordner im Ordner "libraries" speichern.


Zur Auflistung der Funktionen der Library geht es hier: Funktionen

Programmbeispiele MyADS1115:

Bei den nachfolgenden Programmbeispielen wird der oben dargestellte Testaufbau verwendet.

Ein Beispiel für Attiny45/85 mit Ausgabe des Wandlungsergebnisses auf einer 7-Segmentanzeige ist hier zu finden: Attiny


Beispiel 1 für Arduino: Betrieb des ADC im kontinuierlichen Modus

Mit einer Messrate von 8 SPS (Samples Per Seconds) wird die über einen Trimmer (oder ein Poti) geteilte und am Analogeingang A0 gegen Masse anliegende Spannung in eine vorzeichenbehaftete 16 Bit Binärzahl (0 bis +32.767) gewandelt. Alle 200 ms wird das Wandlungsergebnis aus dem ADS1115 ausgelesen und als Binärzahl und dem berechneten Spannungswert (in mV) am Seriellen Monitor angezeigt:

//Programmbeispiel 1 fuer ADS1115
//Code fuer Arduino
//Author Retian
//Version 1.0


#include <MyADS1115.h>
MyADS1115 ADS;


int rawVal;
float voltage;


void setup() {
  Serial.begin(115200);
  if (ADS.isReady()) Serial.println("ADS1115 Ok");
  else Serial.println("ADS1115 Fehler");
  ADS.init();
 
  //Parameter muessen nur eingegeben werden, wenn sie von
  //den nachfolgenden Default-Werten abweichen sollen:
  //Mux:  ADS1115_MUX_AIN0_AIN1 ...... Diff.Spannungsmessung A0->A1
  //Gain: ADS1115_PGA_2P048 ...... Verstaerkung 2,048 V (Full Scale)
  //Rate: ADS1115_RATE_128 ...... Abtastrate 128 SPS (Samples Per Second)

  //Mode: ADS1115_MODE_SINGLESHOT ...... Einzelmessung
   
  ADS.setMux(ADS1115_MUX_AIN0_GND); //Spannung gegen Masse A0->GND
  ADS.setGain(ADS1115_PGA_6P144); //Verstaerkung auf 6,144 V (Full Scale)
  //Achtung: Auch wenn der Endausschlag (Full Scale) auf 6,144 V gestellt ist, darf
  //die an einem Analogeingang anliegende Spannung (Messspannung) nicht groesser als
  //die Versorgungsspannung VDD (maximal VDD + 0,3 V) sein, sonst droht die
  //Beschaedigung des ADC. Die Versorgungsspannung VDD darf maximal 5,5 V betragen.
  ADS.setRate(ADS1115_RATE_8); //Abtastrate 8 SPS
  ADS.setMode(ADS1115_MODE_CONTINUOUS); //Kontinuierliche Messung
  delay(150); //Warte, bis die erste Wandlung sicher fertig ist
}


void loop() {
  rawVal = ADS.readConversion();
  Serial.print("Wandlungsergebnis: ");
  Serial.print(rawVal);
  Serial.print(" -> Spannung: ");
  voltage = ADS.readVoltage();
  Serial.print(voltage);
  Serial.println(" mV");
  delay(200);
}

Beispiel 2 für Arduino: Betrieb des ADC im Stromsparmodus (power-down mode)

Hier wird der ADC in der Betriebsart Einzelmessung mit 1 Messungen alle 2 Sekunden betrieben. Im Zeitraum, wo keine Messung stattfindet, befindet sich der ADC im power-down-mode. Der Stromverbrauch wird dabei, wie bereits oben unter Punkt "Maximaler Stromspar-Betrieb" beschrieben, auf ein Minimum gesenkt. Die über zwei Trimmer (oder Potis) geteilten und an den Analogeingängen A0 und A3 anliegenden Spannungen werden als Differenzspannung zwischen den beiden Eingängen in eine vorzeichenbehaftete 16 Bit Binärzahl (-32768 bis +32767) gewandelt. Alle 2 Sekunden wird das Wandlungsergebnis aus dem ADS1115 ausgelesen und als Binärzahl und dem berechneten Spannungswert (in mV) am Seriellen Monitor angezeigt. Mittels Vielfachmessgerät kann der Stromverbrauch des ADC im power-down-mode gemessen werden. Laut Datenblatt sollte dieser 1 - 1,5 µA betragen, mein Messgerät zeigte ca. 3 µA.

//Programmbeispiel 2 fuer ADS1115
//Code fuer Arduino
//Author Retian
//Version 1.0


#include <MyADS1115.h>
MyADS1115 ADS;


int rawVal;
float voltage;


void setup() {
  Serial.begin(115200);
  if (ADS.isReady()) Serial.println("ADS1115 Ok");
  else Serial.println("ADS1115 Fehler");

  //Parameter muessen nur eingegeben werden, wenn sie von
  //den nachfolgenden Default-Werten abweichen sollen:
  //Mux:  ADS1115_MUX_AIN0_AIN1 ...... Diff.Spannungsmessung A0->A1
  //Gain: ADS1115_PGA_2P048 ...... Verstaerkung 2,048 V (Full Scale)
  //Rate: ADS1115_RATE_128 ...... Abtastrate 128 SPS (Samples Per Second)
  //Mode: ADS1115_MODE_SINGLESHOT ...... Einzelmessung
   
  ADS.setMux(ADS1115_MUX_AIN0_AIN3); //Differenzspannung A0->A3
  ADS.setGain(ADS1115_PGA_6P144); //Verstaerkung auf 6,144 V (Full Scale)
  //Achtung: Auch wenn der Endausschlag (Full Scale) auf 6,144 V gestellt ist, darf
  //die an einem Analogeingang anliegende Spannung (Messspannung) nicht groesser als
  //die Versorgungsspannung VDD (maximal VDD + 0,3 V) sein, sonst droht die
  //Beschaedigung des ADC. Die Versorgungsspannung VDD darf maximal 5,5 V betragen.
  ADS.setRate(ADS1115_RATE_860); //Abtastrate 860 SPS
}


void loop() {
  ADS.startSingleMeas();
  while (!ADS.conversionReady()); //Warte bis Umwandlung fertig ist
  rawVal = ADS.readConversion();
  Serial.print("Wandlungsergebnis: ");
  Serial.print(rawVal);
  Serial.print(" -> Spannung: ");
  voltage = ADS.readVoltage();
  Serial.print(voltage);
  Serial.println(" mV");
  delay(2000);
}