Den ADS1115 16-Bit AD Wandler am Arduino mit Autorange betreiben

Ich habe den ADS1115 16-bit AD Wandler mit dem Arduino Uno eingestellt und ausgelesen. Wenn der Messwert kleiner wird, passt sich der Eingangsverstärker an und wird hochgefahren. Dadurch werden die 6 Messbereiche +-6.144V bis hinunter zu +-0.256V optimal ausgenutzt.

Zusätzlich wird beim Einschalten einmalig die USB Versorgungsspannung gemessen. Die AD-Wandler Eingangsspannung darf die Versorgungsspannung (VDD oder VCC) nicht um mehr als 0,3V Übersteigen, ansonsten kann der AD Wandler zerstört werden. Im Alltagsbetrieb ist hier noch eine Schutzschaltung vorzusehen, auf die ich aber hier verzichtet habe.

Praktisch am ADS1115 ist dass er eine Referenzspannung bereits eingebaut hat.

Die Anschlüsse und Brücken sind:
Vom Arduino bekommt der ADS1115 die 5V Versorgungsspannung und GND.
Zwei Datenleitungen vom Arduino werden angeschlossen: A5 zu SCL und A4 zu SDA.
Für die Spannungsmessung habe ich einen Drehpoti mit 25kOhm von 3,3V zu GND geschaltet und der Mittelabgriff geht an den Messeingang 0 (A0)
Die Versorgungsspannung wird über eine Brücke VDD zu A1 gemessen.
Die Adresse wird mit einer Brücke von ADDR zu GND auf 0x48 fest gelegt.

Es wird die Wire Library und die passende Adafruit Library eingebunden. Der Link dazu ist im Programm.

Hier das Programm.

// ADS1115 16Bit AD Wandler
// Eingangsspannung nicht über VDD + 0.3V !!
// VDD wird gemessen, die USB Spannung.
// Der Vorverstärker wird automatisch auf den besten Messbereich eingestellt
//
// Matthias Busse 7.4.2018 Version 2.0

// Anschlüsse
// Uno  ADS1115
// A5   SCL
// A4   SDA
// 5V   VDD
// GND  GND
// und
// ADS1115 ADDR auf GND
// Poti+ an Uno 3,3V --- Poti-Mitte an A0 ADS1115 --- Poti- an GND
// VCC Brücke an A1 zur Messung der USB Spannung

#include <Wire.h>
#include <Adafruit_ADS1015.h> // https://github.com/adafruit/Adafruit_ADS1X15

Adafruit_ADS1115 ads;
int16_t adc;
int gain=0;
double maxvolt=6.144, volt, vdd;

void setup(void) {
  Serial.begin(38400);  
  ads.begin();
  ads1115_vdd();                      // Die USB Spannung messen
  Serial.print("\nADS1115 mit VDD="); // und ausgeben
  Serial.println(vdd); 
  ads1115_gain(gain);
}

void loop(void) {
  adc = ads.readADC_SingleEnded(0);   // Kanal 0 messen gegen GND
  if(adc >= 32768) adc -= 65536l;
  volt = maxvolt / 32768.0 * adc;
  Serial.print(adc);
  Serial.print(" Gain: ");
  Serial.print(gain);
  Serial.print(" range: +-");
  Serial.print(maxvolt,3);
  Serial.print("  Volt: ");
  Serial.println(volt,6);
  ads1115_autorange();
  delay(1000);
}

void ads1115_autorange() {
// Der Verstärker wird angepasst um den maximalen Messbereich zu erreichen
//
// Matthias Busse 7.4.2018 Version 1.0

  if(adc>32500) {
    if(gain>0) gain--;
  }
  if(adc<16000 && adc>0) {
    if(gain<5) gain++;
  }
  if(adc>-16000 && adc<0) {
    if(gain<5) gain++;
  }
  if(adc<-32500) {
    if(gain>0) gain--;
  }
  ads1115_gain(gain);
}

void ads1115_gain(int g) {
// Den Vorverstärker einstellen
// 0: +/- 6.144V  1 bit = 0.1875mV
// 1: +/- 4.096V  1 bit = 0.125mV
// 2: +/- 2.048V  1 bit = 0.0625mV
// 3: +/- 1.024V  1 bit = 0.03125mV
// 4: +/- 0.512V  1 bit = 0.015625mV
// 5: +/- 0.256V  1 bit = 0.0078125mV
//
// Matthias Busse 7.4.2018 Version 1.0

  if(g==0) { ads.setGain(GAIN_TWOTHIRDS); maxvolt=6.144; }
  if(g==1) { ads.setGain(GAIN_ONE); maxvolt=4.096; }
  if(g==2) { ads.setGain(GAIN_TWO); maxvolt=2.048; }
  if(g==3) { ads.setGain(GAIN_FOUR); maxvolt=1.024; }
  if(g==4) { ads.setGain(GAIN_EIGHT); maxvolt=0.512; }
  if(g==5) { ads.setGain(GAIN_SIXTEEN); maxvolt=0.256; }  
}

void ads1115_vdd(void) {
// Die USB Versorgungsspannung messen.
// gain sollte hierzu auf 0 stehen
//
// Matthias Busse 7.4.2018 Version 1.0

  adc = ads.readADC_SingleEnded(1); // VDD Brücke zu A1, misst die USB Versorgungsspannung
  vdd = maxvolt / 32768.0 * adc;
}

Nun sind Spannungsmessungen von knapp 5V bis runter zu 8uV möglich.
Im größten Bereich +- 6,144 (gain=0) beträgt die Auflösung 187,5 uV und im kleinsten Messbereich +-0,256V (gain=5) ist die Auflösung 8uV.

Hier die Ausgabe in der Konsole

Verwendet wurden:
Arduino Uno
Arduino Software 1.8.0
ADS1115 AD Wandler (Datenblatt)
Drehpoti 25kOhm

von Matthias Busse

2 Gedanken zu „Den ADS1115 16-Bit AD Wandler am Arduino mit Autorange betreiben

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.