ADC-Modul ADS1115

ADC-Modul ADS1115

Mikrocontroller wie Arduino haben meist einen eingebauten A/D-Wandler (ADC = analog-to-digital converter) mit einer Auflösung von 10 Bit, d.h. es können maximal 1024 Werte unterschieden werden. Das im Folgenden besprochene ADC-Modul basiert auf dem ADC-IC ADS1115, einem A/D-Wandler mit einer Auflösung von 16 Bit und 4 Kanälen, den man leicht mit Mikrocontrollern verwenden kann, so dass man durch seine Auflösung bis zu 65536 Werte unterscheiden kann.
Desweiteren besitzt er einen internen Verstärker (PGA = Programmable Gain Amplifier), sodass er auch recht kleine Spannungen messen kann. Außerdem gibt es eine Alarmfunktion, die zur Überwachung von Spannungen einsetzbar ist, d.h. der Mikrocontroller kann in Inaktivitätsphasen in einen Stromsparmodus gehen, während der ADS1115 arbeitet.

Verwendete Bauteile

Anschlüsse

Pin Beschreibung/Funktion Arduino Uno
VDD Spannungsversorgung von 2V bis 5,5V 5V
GND Masse/0V GND
SCL "Serial clock" (I²C-Anschluss) A5
SDA "Serial data" (I²C-Anschluss) A4
ADDR Selektor für I²C-Addresse je nach Beschaltung:
ADDR-Pin I²C-Adresse
GND 1001000 (0x48)
VDD 1001001 (0x49)
SDA 1001010 (0x4A)
SCL 1001011 (0x4B)
Zum Überprüfen der Adressen kann der I²C-Scanner benutzt werden.
In der Regel ist der ADDR-Pin des ADS1115-Moduls mit einem Pulldown-Widerstand zu GND beschaltet, so dass eine I²C-Address von 0x48 eingestellt ist.
-
ALRT Digitaler Komparatorausgang oder Bereitschafts-Anzeige der A/D-Wandlung. -
A0, A1, A2, A3 Analogeingänge für Messung von Spannungen gegen GND (single-ended-inputs) oder als Erfassung von Differenz-Spannungen (differential-inputs) mit folgenden Varianten:
Single-ended Differential
A0 → GND A0 → A1
A1 → GND A0 → A3
A2 → GND A1 → A3
A3 → GND A2 → A3
-
Typische Beschaltung des ADS1115 mit einem Mikrocontroller
Abb.: Typische Beschaltung des ADS1115 mit einem Mikrocontroller (Quelle: Datenblatt von Texas Instruments)

Betriebsmodi

Der ADS1115 kann sich in 3 verschiedenen Betriebsmodi 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 der single-shot mode ausgewählt und es findet gerade keine A/D-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.

Stromsparmodus

Wird eine hohe Stromeinsparung benötigt, dann kann der ADS1115 mit folgenden Einstellungen betrieben werden:

Bei der Datenrage von 860 SPS beträgt die Zeit der A/D-Wandlung ~1,2ms. 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 ~1,5µA beträgt.

PGA (Programmable Gain Amplifier)

Den Gain (=Verstärkung) des programmierbaren Verstärkers (PGA) kann man auf die Werte 2/3, 1, 2, 4, 8 oder 16 einstellen. Der daraus resultierende Messbereich FS (Full-Scale Range) und die Spannungs-Auflösung (Resolution) ist in folgender Tabelle ersichtlich:

Verstärkung Messbereich Auflösung
2/3 ±6,144 V 0,1875 mV/Bit
1 ±4,096 V 0,1250 mV/Bit
2 ±2,048 V 0,0625 mV/Bit
4 ±1,024 V 31,2500 µV/Bit
8 ±0,512 V 15,5250 µV/Bit
16 ±0,256 V 7,8125 µV/Bit

Die zu messenden Spannungen müssen immer positiv sein, negative Ergebnisse kann es nur bei Differenz-Spannungsmessungen geben. Die an einem Analogeingang anliegende Spannung muss immer zwischen 0V und VDD (±0,3V) sein, sonst kann der ADC beschädigt werden.

Tests mit Library "MyADS1115"

Für die folgenden beiden Experimente wird die Library MyADS1115 von Retian verwendet.

Potentiometer kontinuierlich auslesen

Schaltplan
Abb.: Schaltplan für den Aufbau mit Arduino Uno, ADS1115-Modul und Potentiometer
#include "MyADS1115.h"

MyADS1115 ADS;

void setup()
{
   Serial.begin(9600);
   if (!ADS.isReady()) {
      Serial.println("ADS1115 not ready!");
      while (true);
   }

   ADS.init();

   // Voltage A0 -> GND
   ADS.setMux(ADS1115_MUX_AIN0_GND);

   // Gain to 6,144 V (Full Scale)
   ADS.setGain(ADS1115_PGA_6P144);

   // Sample rate: 8 SPS
   ADS.setRate(ADS1115_RATE_8);

   // Continuous reading
  ADS.setMode(ADS1115_MODE_CONTINUOUS);
}

void loop()
{
   static int value = 0;
   static float voltage = 0.0;

   value = ADS.readConversion();
   voltage = ADS.readVoltage();

   Serial.println("Value=" + String(value) + " (" + String(voltage) + " mV)");
   delay(200);
}
Abb.: Ausgabe auf der seriellen Konsole der Arduino-IDE

Stromsparmodus des ADS1115

Der Aufbau ist wie im vorherigen Experiment, nur dass im Sketch alle 2 Sekunde eine einzelne A/D-Wandlung auslesen wird, so dass im Zeitraum, in dem keine Messung stattfindet, sich der ADC im power-down-mode befindet.

#include "MyADS1115.h"

MyADS1115 ADS;

void setup()
{
   Serial.begin(9600);
   if (!ADS.isReady()) {
      Serial.println("ADS1115 not ready!");
      while (true);
   }

   ADS.init();

   // Voltage A0 -> GND
   ADS.setMux(ADS1115_MUX_AIN0_GND);

   // Gain to 6.144 V (Full Scale)
   ADS.setGain(ADS1115_PGA_6P144);

   // Sample rate: 860 SPS
   ADS.setRate(ADS1115_RATE_860);
}

void loop()
{
   static int value = 0;
   static float voltage = 0.0;

   ADS.startSingleMeas();
   while (!ADS.conversionReady());

   value = ADS.readConversion();
   voltage = ADS.readVoltage();

   Serial.println("Value=" + String(value) + " (" + String(voltage) + " mV)");
   delay(2000);
}
Abb.: Ausgabe auf der seriellen Konsole der Arduino-IDE

Tests mit Library "ADS1115_WE"

Für die folgenden beiden Experimente wird die Library ADS1115_WE von Wolfgang Ewald verwendet.

Potentiometer kontinuierlich auslesen

-Schaltplan siehe oben-

#include <Wire.h>
#include "ADS1115_WE.h"

ADS1115_WE ADS = ADS1115_WE();

void setup()
{
   Serial.begin(9600);
   Wire.begin();
   if (!ADS.init()) {
      Serial.println("ADS1115 not connected!");
      while (true);
   }

   // Voltage A0 -> GND
   ADS.setCompareChannels(ADS1115_COMP_0_GND);

   // Gain to 6,144 V (Full Scale)
   ADS.setVoltageRange_mV(ADS1115_RANGE_6144);

   // Sample rate: 8 SPS
   ADS.setConvRate(ADS1115_8_SPS);

   // Continuous reading
   ADS.setMeasureMode(ADS1115_CONTINUOUS);
}

void loop()
{
   ADS.setCompareChannels(ADS1115_COMP_0_GND);
   float voltage = ADS.getResult_mV();

   Serial.println("Voltage = " + String(voltage) + " mV)");
   delay(200);
}
Abb.: Ausgabe auf der seriellen Konsole der Arduino-IDE

LDR kontinuierlich auslesen

Statt dem obigen Potentiometer verwenden wir hier einen Fotowiderstand (LDR) der Serie GL55xx und benutzen den seriellen Plotter der Arduino-IDE, um die Helligkeitsänderungen visuell darszustellen.

Abb.: Schaltplan für den Aufbau mit Arduino Uno, ADS1115-Modul und LDR

Der Sketch entspricht dem vorherigen, nur dass die Ausgabe und die Verzögerungszeit angepasst wird:

Serial.println(voltage);
delay(10);
Abb.: Ausgabe auf der seriellen Konsole der Arduino-IDE
zurück