Präzise Spannungsmessung mit dem Arduino

Vorsicht! Niemals weniger als 0V oder mehr als 5V für die externe Referenzspannung am Pin AREF verwenden! Wenn eine externe Spannungsreferenz am AREF-Pin verwendet wird, immer zuerst analogReference(EXTERNAL) aufrufen, bevor analogRead() benutzt wird, ansonsten könnte das Board bzw. der Mikrocontroller beschädigt werden!

AREF-Pin auf dem Arduino
Abb.: AREF-Pin auf dem Arduino

AREF auf dem Arduino Uno ist der Pin, der den Referenzwert der Spannung für die analogen Eingänge darstellt. Durch die Veränderung dieses Referenzwertes, also das Anlegen einer anderen Spannung am AREF-Pin, kann man den Messbereich eingrenzen, um dadurch eine höhere Genauigkeit zu erzielen.

Der ADC (=Analog-Digital-Wandler) des Arduino Uno kann zwischen 1024 Spannungen unterschieden. Dazu teilt er die jeweilige Referenzspannung in 1024 Bereiche und überprüft dann, in welchem Bereich die aktuelle Spannung liegt. Durch den AREF-Pin kann man die Referenzspannung der analogen Eingänge verändern. Wenn man also an AREF 2,5V anschließt, werden dann diese in 1024 Teile zerlegt.

Zunächst muss man dem Arduino mitteilen, welche Art von Referenzspannung er verwenden soll. Dies erfolgt über den Befehl analogReference() zu Beginn des Sketches. Normalerweise wird als Argument DEFAULT verwendet, welches die Spannung des Arduino (5V bzw. 3,3V je nach Board) verwendet. Um eine externe Spannungsquelle zu verwenden, wird als Argument EXTERNAL eingesetzt.
Folgende Argumente können verwendet werden (gilt für Arduino AVR Boards, also Uno, Mega, etc.):

DEFAULT Standardmäßige Referenzspannung von 5V bzw. 3,3V, je nach Board-Typ
INTERNAL Eingebaute Referenzspannung von 1,1V bei ATmega168 und ATmega328P bzw. 2,56V beim ATmega8 (nicht verfügbar beim Arduino Mega)
INTERNAL1V1 Eingebaute Referenzspannung von 1,1V (nur Arduino Mega)
INTERNAL2V56 Eingebaute Referenzspannung von 2,56V (nur Arduino Mega)
EXTERNAL Referenzspannung wird durch den AREF-Pin gespeist (0V bis 5V)

Zu beachten ist, dass nach dem Ändern der Referenzspannung die ersten Lesevorgänge von analogRead() noch nicht präzise sein können!

Experiment

void setup()
{
    analogReference(EXTERNAL); // switch to external reference voltage
    Serial.begin(9600);
}

void loop
{
    Serial.println(analogRead(A0));
    delay(1000);
}
zurück