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
Funktioniert prima, vielen Dank
Serial.begin(38600);
sollte
Serial.begin(38400);
sein.
Danke für den Hinweis, das ist geändert.