2016-06-18 Oder: wie man typische Fallen vermeidet.

Einleitung

Eigentlich klingt es ja so einfach, mit dem Arduino eine Spannung zu messen: ADC auslesen, durch 1023 teilen und mal 5 V nehmen. Fertig. Noch netter geht es mit der Map-Funktion:

spannung = map(messwert,0,1023,0,5000);

und man hat ein hübsches Ergebnis in Millivolt. Temperaturmessungen mit dem LM35 werden dann zu

temperatur = spannung/10.0;

(nicht das das jemand wollte, seit es den ds18b20 gibt…).

Aber stimmt das? Könnten die ermittelten Werte vielleicht von der Versorgungsspannung abhängig sei? Wenn ja, welchen Einfluß hat der USB-Anschluss? Wenn man einen anderen USB-Hub verwendet, ein USB-Ladegerät oder eine Powerbank?

Lieber mal ausprobieren. Dazu nehme ich ein Spannungsreferenz (1), die zum einen 2,4994 V liefert, dazu ein Spannungsteiler (2), der 4,58 V liefert. Und einen Arduino Nano (3) zum Messen. Beim Messen wird einfach der DAC-Wert 100 mal gelesen und auf den Display ausgegeben. Nix spektakuläres.

Und probiere exemplarisch an drei rumliegenden USB-Quellen.

Raus kommt folgende kleine Tabelle:

In der Spalte DAC steht der DAC-Wert.

In der Spalte TH1 steht die Spannung unter der Annahme, dass die Referenzspannung 5 Volt beträgt. Wie man leicht sehen kann, stimmt das Ergebnis nicht, minimale Abweichung ist bei gut 2.4%.

Vusb enthält die tatsächlich gemessene USB-Spannung der drei Quellen. Damit nachgerechnet ergibt sich Spalte TH2. Der erste Messwert ist komisch… Ursache? Messfehler? Wer weiß.

Die beiden anderen Ergebnisse zeigen eine wesentlich bessere Übereinstimmung mit dem tatsächlichen Daten.

Erkenntnis

Die Ergebnisse des DACs sind abhängig von der USB-Versorgungsspannung, die Annahme von 5 V als Referenzspannung ist nicht zulässig.

Die Spannungsbestimmung funktioniert nur bei bekannter Referenzspannung.

Konsequenzen

Es nützt nix, die Spannung auszumessen. Ein Wechsel der Spannungsquelle und es müsste neu gemessen werden. Oder anders: Jeder PC, jedes USB-Ladegerät, jede Powerbank liefert möglicherweise andere Ergebnisse.

Nicht zu vergessen die USB-Kabel, die bei steigender Länge zum Verlust beitragen.

Lösung

Externe Referenz! Mit analogReferenz(EXTERNAL); die Referenzspannung extern beziehen, mit der Referenzspannung (2) aus dem Spannungsteiler produziert liefert der DAC bei allen USB-Spannungen einen fast konstanten Wert. Und umgerechnet auch die erwarteten 2,5 V, nämlich 626/1023*4,58 V sind 2,80… ups! Da stimmt was nicht.

Mal nachgeguckt. Oh je. Die Versorgungsspannung der Spannungsreferenz (1) war blöd gewählt, der Spannungsteiler vom Widerstand zu gering gewählt, will sagen: die Referenzspannung war jenseits von 5 Volt. Also noch mal.

Nun passt es. Referenzspannung ist 3.62 Volt, DAC liefert 705, umgerechnet ergibt das ziemlich gut 2,495 Volt. Ein Fehler von übern Daumen 0,3%.

Ergebnis

Bei USB-Versorung ist nicht sichergestellt, dass tatsächlich 5 V als Spannungsreferenz vorliegen. Daher wird eine andere Referenzquelle benötigt.

Das kann eine externe Quelle sein, wenn eine Referenz nahe an 5 V benötigt wird. Oder die ATmega-internen Referenzen von 1.1 Volt.

und wenn extern versorgt wird?

Dann erzeugt der Spannungsregler auf dem Board eine Referenzspannung. Die ist oft ziemlich stabil aber nicht immer exakt 5 V. Andererseits bei Wechsel der Speisequelle konstant, will sagen: egal was rein geht, es kommt immer der gleiche Wert raus. Einmal messen, gut ist.

Aber dran denken: Die Eingangsspannung muss hoch genug sein, sie darf nicht unter die Regelschwelle zu fallen. Sicherheitshalber: 7 V.

Noch was?

Ja. Man könnte auf die Idee kommen, die Versorgungsspannung zu messen. Das können manche der ATmegas, indem Sie gegen die (unbekannte Referenzspannung) die Spannung der (bekannten) Referenzquelle 1.1 Volt messen. Damit könnte man via Rückrechnung die ungefähre Versorgungsspannung und damit die Referenzspannung ermitteln.

Leider ist es in der Arduino-Welt nie standardisiert worden und prozessorabhängig.

siehe dazu: http://jeelabs.org/2012/05/04/measuring-vcc-via-the-bandgap/