Arduino-Analogeingang


von Prof. Jürgen Plate

Der Arduino-Analogeingang

Das Lesen von analogen Spannungen mit dem Arduino-C umfasst auch die Auswahl der Referenzspannung über den Funktionsaufruf analogReference() und das anschließende Lesen mit analogRead(). Bei analogRead() wird als Parameter die Pin-Nummer auf der Steckerleiste angegeben, die abgetastet werden soll. Obwohl die AVR-Prozessoren Abtastraten von bis zu 15.000 Samples pro Sekunde unterstützen, wird diese Rate beim Arduino nicht erreicht. Er kommt auf etwa 10.000 Abtastungen pro Sekunde. Der Analog-Digital-Wandler (ADC) des Arduino hat 10 Bit Auflösung, er kann also zwischen 1024 Spannungsstufen unterscheiden. Die analogen Pins auf dem Arduino sind mit einem "A" gekennzeichnet.

Die Verwendung der Analogeingänge erfordert jedoch einige Aufmerksamkeit bei der Auswahl der richtigen Referenzspannungsquelle für den AVR-ADC. Zur Festlegung der Obergrenze des Eingangsspannungsbereichs gibt es diverse Modi, die mittels analogReference() ausgewählt werden können.

Das Einstellen der Referenzquelle erfolgt mit der Funktion analogReference() am Anfang des Sketches. Dieser wird als Argument eine der oben aufgeführten Konstanten übergeben, z. B. analogReference(INTERNAL). INTERNAL ist übrigens die Voreinstellung.
// Programmbeispiel: Poti am Analogeingang steuer Analogausgang

// Pins fuer Ausgabe und Eingabe benennen
#define PWM 2
#define ADC 0

void setup()
  {
  pinMode(PWM,OUTPUT);
  }
  
void loop()
  {
  int ADC = analogRead(0);
  // ADC liefert Werte 0..1023, PWM kann aber nur
  // 0..255 --> Mapping
  ADC = map(ADC, 0, 1023, 0, 255);  
  analogWrite(PWM, ADC); 
  }

Will man wissen, wie hoch die Eingangsspannung ist, muss die Referenz berücksichtigt werden. Die Spannung am Eingang ergibt sich dann zu

U = (analogread(pin) * Vref) / 1024

Im folgenden gehe ich von der internen Referenz von 5 V aus. Die Auflösung beträgt, wie erwähnt, 10 Bit, d. h. die Eingangspannung von 5 V wird in 1024 Stufen digitalisiert, was bedeutet, dass die kleinste messbare Spannungsdifferenz ca. 0,005 V beträgt. Der maximale Wert von 5 V darf auf keinen Fall überschritten werden, da sonst der Arduino beschädigt werden könnte. Zum Schutz der Eingänge sollte daher die folgende Beschaltung verwendet werden:

Die Schottky-Dioden D1 und D2 (es können auch einfache Silizium-Dieoden verwendet werden) begrenzen die Eingangsspannung auf den Bereich zwischen ca. -0,3 V und +5,3 V, wobei der Widerstand R1 als Strombegrenzung wirkt. Liegt die zu erfassende Spannung im Bereich von 0 bis 5 V, wird R2 einfach weggelassen. Ist die Eingangsspannung größer als 5 V, dienen R1 und R2 als Spannungsteiler, der die Eingangsspannung auf den Bereich von 0 bis 5 V reduziert. Der Wert von R1 kann zwischen 10kΩ und 100 kΩ liegen. Zur Berechnung der Teilspannung U2 über R2 nach dem Ohmschen Gesetz gilt: U2 = Ue * R2/(R1 + R2). Dazu ein Beispiel: Ue soll maximal 14 V betragen (Messen eines Bleiakkus). Man wählt R1 = 100 kΩ. Damit der Eingang nicht überlastet wird, sollte die Eingangsspannung durch 3 dividiert werden. Das Verhältnis von R2:(R1 + R2) ist also 1:3 → R2 = 50 kΩ. Man kann hier getrost auf einen Wert aus der Normreihe zurückgreifen und für R2 51 kΩ ansetzen. Der Unterschied läßt sich leicht per Software herausrechnen.

Der Kondensator C1 filtert das Eingangssignal und kann je nach Anwendung entfallen. Der Wert von 1 nF dient als Richtwert, kleinere und größere Werte sind möglich.

Spannungen zwischen 0 V und 5 V können also direkt an den analogen Eingangspins eingelesen werden. Für höhere Spannungen wird ein Spannungsteiler vor den Eingang geschaltet. Dessen Widerstände werden so gewählt, dass die maximal zu erwartende Spannung am Analogpin 5 V ergibt.

Ue ist die maximal zu messende Spannung. Der Spannungsteiler sorgt dafür, dass die Spannung U2 entsprechen heragesetzt ist. Die Widerstandswerte berechnen sich dann folgendermaßen, wobei eine Rechnung für R2 vorgeschaltet ist, in der die ungefähre Dimension der Werte so bestimmt wird, das sich Widerstände mit 1/8 W Maximalleistung verwenden lassen:

[1] R2 = (Ue * U2)/0,1;
[2] R1 = ((Ue / U2) - 1) * R2;

In der Praxis wird man zuerst R2 ausrechnen und dann den nächstgelegenen Wert aus der Normreihe dafür einsetzen. Mit diesem Wert wird dann R1 bestimmt. Dazu ein Beispiel: Ue sei 15 V, U2 ist die Max. Eingangsspannung von 5 V:

R2 = (15 * 5)/0,1 = 750 Ω
R1 = ((15 / 5) - 1) * 750 = 1500 Ω

Dies sind Minimalwerte. Darf die Spannungsquelle nicht so stark belastet werden, ist es sinnvoll höhere Werte zu verwenden, indem man die Werte von R1 und R2 mit dem gleichen Faktor multipliziert. Wegen der hochohmigen Eingänge können die Werte auch problemlos auf R1 = 5 kΩ und R2 = 10 kΩ erhöht werden.

Durch den Spannungsteiler sinkt auch die Auflösung des Eingangs im gleichen Verhältnis wie Ue / U2. Bei maximal 10 V Eingangsspannung muss diese beispielsweise halbiert werden. Das kleinste Messintervall ist dann 0,01 V. Deshalb sollte man den Spannungsteiler so dimensionieren, dass der maximale Messbereich gut ausgenützt wird.

Prinzipiell kann der Arduino nur Gleichspannungen messen, sind Wechselspannungen zu messen, sind weitere Maßnahmen notwendig. Da eine Wechselspannung positive und negative Anteile enthält, der Arduino aber nur positive Spannungen messen kann, wird ein Trick verwendet:

  1. Die zu messenden Wechselspannung darf nun nur noch maximal ±2,5 V betragen - damit bewegt sie sich im Bereich von -2,5 V bis +2,5 V.
  2. Der Eingangswechselspannung wird eine Gleichspannung von 2,5 V überlagert. Damit wird die Wechselspannung auf den Bereich von -2,5 V + 2,5 V = 0 V bis +2,5 V + 2,5 V = 5 V angehoben.
Die so entstandene rein postive Spannung kann der Arduino messen. Die Hilfsschaltung für die Wechselspannungsmessung ist recht einfach:

Die beiden 4,7-kΩ-Widerstände und die Elektrolytkondensatoren sorgen für stabile 2,5 V als Fusspunkt der Wechselspannungsquelle. Der 220-nF-Kondensator hält Gleichspannungsanteile fern und die beiden 470-kΩ-Widerstände heben den Arduino-Analogeingang auf 2,5 V.


Copyright © Hochschule München, FK 04, Prof. Jürgen Plate
Letzte Aktualisierung: