Spannung messen (maximal 15V)

Das wichtigste ist, wie Du deinen Arduino mit Strom versorgt.

Das wichtigste ist, dass Du deinen Arduino mit Strom versorgt.

Das messen der Versorgungsspannung des Arduinos macht manchmal Sinn.
Hier allerdings nicht.

Im Gegenteil, es lenkt vom Problem ab.
Bringt eine zusätzliche Hürde rein.

Gemessen werden, soll die Spannung von 12V Batterien.(Messbereich bis 15V)
Und da interessiert die Versorgungsspannung des Arduinos im Geringsten nicht.
Von 1,8V bis 5,5V ist alles völlig egal.
Von mir aus darf sie auch wackeln, wie ein Lämmerschwanz.

Anleitung, wie so etwas zu tun ist:

  1. Datenblatt lesen.
    Erkenntnis daraus:
    A: die interne 1,1V Referenz ist recht stabil
    B: die interne Referenz unterliegt einer 10%igen Toleranz(Bauteilstreuung)
    C: Ein hoher Widerstand des Spannungsteilers verringert nicht die Genauigkeit, sondern verlängert den Messzyklus

  2. Spannungsteiler berechnen
    Die Referenz liefert uns im Extremfall 1,0 V oder 1,2 V.
    Nehmen wir hier den unteren Wert.
    Also 1,0 V.
    Unterer Widerstand, also zwischen GND und A Pin, willkürlich auf 10K festgelegt.
    Also maximal 1V Spannungsabfall am 10K
    Bleiben noch 14V, welche am oberen (zwischen Batterie und A Pin) abfallen müssen.
    Also sollte er 140k, oder geringfügig mehr haben.

Fix einen 100k und einen 47k Widerstand in Reihe geschaltet.

  1. Die EinPunktKalibrierung.

Interne Referenz aktivieren.
Testspannung an den Spannungsteiler anschließen.
Testspannung so groß wählen, dass der Endstand des ADC von 1023 gerade nicht erreicht wird.

Angenommene Testspannung: 14,89V
ADC Wert bei dieser Testspannung: 1008

const float Steigung = 14.89/1008; // bitte eigene ausgemessene Werte einsetzen

Nochmal als Ganzes:

/**
 * Datenblatt des ATMega328P :
 * http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf
 * 
*/




const float Steigung = 15.6/1014; // meine gemessenen Werte


void setup() 
{
  Serial.begin(9600);
  analogReference(INTERNAL);
}



void loop()
{ 
  float value = Steigung * analogRead(A0);
  Serial.println(value);
  delay(100);
}

Damit ist das Problem erschlagen!
Und wie man sieht gehen weder die Betriebsspannung, die exakte Referenzpannung, als auch die konkreten Widerstandswerte in die Berechnung ein.
Alles dieses braucht man im Programm nicht.

Mögliche Verbesserungen:
Ein kleiner Kerko zwischen A Pin und GND.
Den µC während der Messung schlafen legen
Einen gleitenden Mittelwert berechnen