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.
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:
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:
|
- |
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.
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.
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.
Für die folgenden beiden Experimente wird die Library MyADS1115 von Retian verwendet.
#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);
}
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);
}
Für die folgenden beiden Experimente wird die Library ADS1115_WE von Wolfgang Ewald verwendet.
-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);
}
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.
Der Sketch entspricht dem vorherigen, nur dass die Ausgabe und die Verzögerungszeit angepasst wird:
Serial.println(voltage);
delay(10);
zurück