Betriebsspannung Arduino Uno R3 auslesen und auf LCD Shield anzeigen

Hallo an Alle, hier mal eine Frage.
Ist es möglich und vor allem wie wäre die Umsätzung, wenn ich die Betriebsspannung des Arduinos Uno R3 auslesen und über ein LCD Display anzeigen lassen möchte?
Vieleicht hat sich ja schon mal Jemand mit diesem Problem beschäfftigt eine Lösung gefunden, denn es ist schon nicht so toll, wenn der Akku für die Betriebsspannung plötzlich unter 5 V hat.
Ich wäre froh, wenn mir jemand bei der Lösung des Problems helfen könnte.
Vielen Dank schon einmal

Willst Du jetzt die Versorgungsspannung des Arduino messen oder die der Batterie?
Batteriespannung; Spannungsteiler und analoger Eingang.

Grüße Uwe

Hmm, also so wie du das nun vor hast, wird das nicht gehen.

Analoger Wert Uno 5V -> Uno Masse ist 100%
Analoger Wert Uno 4V -> Uno Masse ist 100%

Wie genau versorgst du deinen Uno mit einer Batteriespannung? 5V am Linearregler sind zu wenig! Gehe da auf ~7V hoch.

Direkt am 5V Pin solltest du die Batteriequelle nicht anschließen.

Was gehen könnte, wäre ein Spannungsteiler an der Batterie und diese Auslesen. Damit das funktioniert solltest du an der Batterie einen StepUpDown Regler einbauen.

Analoger Wert Uno 5V (Batterie 3V) -> Uno Masse ist 60%

Du mußt auch berücksichtigen, dass die Referenzspannung des AD-Wertes normalerweise die 5V des Arduino ist. Wenn die Batteriespannung aber zu sehr absinkt, so dass auch die 5V kleiner wird, dann wirst du da nicht messen können.
Du kannst mit analogReference() eine kleinere Referenzspannung setzen, dann verlierst du Aber die 5V Spannweite auch für andere Sensoren.
Alternativ kannst du auch die 3.3V als Vergleichswert nehmen und den VIN-Wert in Relation dazu berechnen:

/*************************************************************************************************
**  Read_Uin()		by GuntherB							**
**************************************************************************************************
** liest die Spannung Vin; vergleicht mit U3.3 um auch Spannung bei einbrechender VCC		**
** messen zu können.										**
** 												**
**************************************************************************************************/
double Read_Uin(){
  const byte Uin_Pin = A0;
  const byte U33_Pin = A1;
  static boolean _init = true;
  const double R_fakt = 3.020;       // Widerstandsverhältnis Uin Spannungsteiler
  const int Filterfaktor = 10;
  static double Uin;
  
  int _Uin_AD = analogRead(Uin_Pin);      
  int _U33_AD = analogRead(U33_Pin);
  double _Uin = 3.3 / _U33_AD * _Uin_AD * R_fakt;    // Berechnung Uin aus Verhältnis zu U3.3
  
  if (_init &&_Uin > 6){  // Uin initial mit Wert belegen, um Filterhochlauf zu verrringern
    Uin = _Uin;
    _init = false;
  }
  
  Uin = ((Uin * Filterfaktor) + _Uin) / (Filterfaktor +1);  // Filtern Uin 
  
  return Uin;
} // End Read_Uin()

Diese Funktion hatte ich mir mal geschrieben, das mit dem Filtern kannst du auch weglassen. Funktioniert zuverlässig bis zu einer Uin von ca. 4.6V.

sschultewolter:
Hmm, also so wie du das nun vor hast, wird das nicht gehen.

Analoger Wert Uno 5V -> Uno Masse ist 100%
Analoger Wert Uno 4V -> Uno Masse ist 100%

Wie genau versorgst du deinen Uno mit einer Batteriespannung? 5V am Linearregler sind zu wenig! Gehe da auf ~7V hoch.

Direkt am 5V Pin solltest du die Batteriequelle nicht anschließen.

Was gehen könnte, wäre ein Spannungsteiler an der Batterie und diese Auslesen. Damit das funktioniert solltest du an der Batterie einen StepUpDown Regler einbauen.

Analoger Wert Uno 5V (Batterie 3V) -> Uno Masse ist 60%

Ich verstehe Deine %- Angaben nicht.
Grüße Uwe

Der TS hat nach einer Möglichkeit gefragt, wie er die Betriebsspannung des UNO's auslesen kann. Sonst nix.
Es gibt da im 328 eine versteckte, bzw. mittlerweile sogar in den Atmel Unterlagen beschriebene Möglichkeit, die Betriebsspannung zu messen. Hier der Code dazu:

/**
 * reading the actual voltage of the board.
 **/
word readVcc() {
  long result;
  byte tmpSave = ADMUX;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result; // Back-calculate AVcc in mV
  ADMUX = tmpSave;
  delay(2); // Wait for Vref to settle
  return result;
}

Ich denke der Punkt ist, dass sich der AD auf die 5V des Arduino bezieht.
Wenn aber die Uin unter 6V sinkt, dann sinkt damit auch die Referenz des AD, dadurch wird die Berechnung falsch.

ich habe hier mal die beiden Messmethoden (direkt mit 5V als Referenz und die oben beschriebene Methode Vergleich mit der 3.3V) gegenüber gestellt:


Wie man sehen kann: sobald die 5V sinkt, weil Uin zu klein wird (<6V), erzeugt die Messung falsche Werte, wenn mit 5V als Referenz gearbeitet wird. Mit der Methode "Vergleich mit U3.3" funktioniert die Messung bis 4,6V Uin. Ich habe dieses System bei mir im Einsatz, weil ich den Arduino aus einem 7.2V Akku versorge.

Ich dachte die 1.1V Referenz ist unabhängig von der Betriebsspannung :confused:

EDIT:
Ok, ich kapiers glaube ich. Man misst die konstanten 1.1V mit den schwankenden "5V" als Referenz. Also im Prinzip genau anders herum als es normal ist. :slight_smile:

willie1968:
Der TS hat nach einer Möglichkeit gefragt, wie er die Betriebsspannung des UNO's auslesen kann. Sonst nix.
Es gibt da im 328 eine versteckte, bzw. mittlerweile sogar in den Atmel Unterlagen beschriebene Möglichkeit, die Betriebsspannung zu messen. Hier der Code dazu: ...

Wenn Du schaus, war das meine allererste Antwort. Allerdings nicht so ausführlich hineinkopiert sondern nur ein link.
Grüße Uwe

Serenifly:
Ich dachte die 1.1V Referenz ist unabhängig von der Betriebsspannung :confused:

EDIT:
Ok, ich kapiers glaube ich. Man misst die konstanten 1.1V mit den schwankenden "5V" als Referenz. Also im Prinzip genau anders herum als es normal ist. :slight_smile:

Richtig!

uwefed:
Wenn Du schaus, war das meine allererste Antwort. Allerdings nicht so ausführlich hineinkopiert sondern nur ein link.
Grüße Uwe

Ja, genau. Aber manchmal sind die Leute einfach blind.

Was mir an der Lösung mit den 1.1V secret Voltmeter nicht gefällt ist die Wartezeit von 2ms, und dass man wirklich nur die 5V des Arduino messen kann. Mit der Methode des Vergleiches mit der 3.3V kann ich auch andere absolute Spannungen messen, auch wenn die 5V schon eingebrochen ist.

guntherb:
Was mir an der Lösung mit den 1.1V secret Voltmeter nicht gefällt ist die Wartezeit von 2ms, und dass man wirklich nur die 5V des Arduino messen kann. Mit der Methode des Vergleiches mit der 3.3V kann ich auch andere absolute Spannungen messen, auch wenn die 5V schon eingebrochen ist.

Bis zu welcher Betriebsspannung sind die 3,3V den stabiel oder anders gefragt wieviel Drop Out hat der 3,3V Spannungsregler?

Die 2mS Wartezeit hast Du immer wenn Du die Referenszpannungsquelle wechselst bis Du sicher eine stabiele Messung bekommst.

Grüße Uwe

Hallo Uwe,

da ich beim direkten Vergleich mit der 3,3V nicht die Referenz wechseln muß, brauche ich keine Wartezeit. Der einzige Nachteil ist, dass ich einen weiteren AD für die Messung der U3.3 brauche.

Die DropVoltage vom 5V-Regler ist tyisch 1V, die vom 3.3V Regler leigt bei 280mV (@150mA, in der Praxis sicherlich weniger, z.B. 120mV bei 50mA). Die Genauigkeit bei 1,5%, sollte für die meisten Fälle ausreichen sein.

Du kannst auch ein einen Analogeingang eine externe Referenzspannungsquelle anschließen. Gibt es z.B. mit 1,23V oder 2,5V. Misst du nun die 5V so kannst du dann berechnen, wieviel Ub (5V) wirklich hat. Somit sparst du die 2 ms Umschaltzeit, brauchst aber eben einen weiteren Analogeingang.
Ich habe für derartige Zwecke noch etliche B589N (gute alte DDR Bestände), dem Äquivalent zum AD589 rumfliegen 8)