INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Messen der eigenen Betriebsspannung mit dem Arduino
26.02.2018, 02:06 (Dieser Beitrag wurde zuletzt bearbeitet: 26.02.2018 02:14 von Harry.)
Beitrag #9
RE: Messen der eigenen Betriebsspannung mit dem Arduino
Hallo Tommy,

ich habe dein Code getestet.
Im gegensatz zu dem Code wo ich benutzt habe funktioniert deiner auch wenn man den IC mit 8MHz internen Takt betreibt.

Allerdings habe ich eine Schwäche festgestellt. Ändert sich die eingesetzte Spannung zu der Spannung mit der geeicht wurde, weicht das Ergebnis (bei mir um dan Faktor 0,15) vom tatsächlichen Wert ab. Ich habe dein Code etwas geändert, man könnte die Rechenoperation vermutlich auch noch optimieren. Was hälst du davon?

Meine Änderungen habe ich mit "//-----------" markiert.

Code:
const float INTERN = 1.29; // bestimmt pro IC
float vcc = 5.0; // wird dann gemessen

//---------------------------------------
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 9, 10, 11, 12, 13);
float a = 4.5;        // Spannung mit welcher die Eichung durchgeführt wurde
float c;              // Differenz Eichwert - Messwert
float d;              // Wert um den der gemessene Wet korrigiert werden muss
float e;              // Endwert
const int8_t led = 3;
//---------------------------------------

float messenBetrieb() {
  // Lesen 1,1V-Referenz als Input mit Referenz Betriebsspannung vcc
  // Referenz Vcc und analog Input = interne Referenz 1,1V
  #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
    ADMUX = _BV(MUX5) | _BV(MUX0);
  #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
    ADMUX = _BV(MUX3) | _BV(MUX2);
  #else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #endif  

  delay(10); // Warten bis Referenz eingeschwungen
  ADCSRA |= _BV(ADSC); // Start Umwandlung
  while (bit_is_set(ADCSRA,ADSC)); // Messen

  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
  uint8_t high = ADCH; // unlocks both

  long result = (high<<8) | low;
  float rvcc = INTERN * 1023L / result;
  Serial.print("Betriebsspannung: ");Serial.println(rvcc);

//---------------------------------------
  lcd.begin(16, 2);
  lcd.setCursor(0, 1);
  lcd.print(rvcc);
  c = a - rvcc;                     // Eichwert - Messwert
  lcd.setCursor(0, 0);
  lcd.print("C");lcd.print(c);
  d = c * 0.15;                     // Korrigierender Wert
  lcd.setCursor(8,0);
  lcd.print("d");lcd.print(d);
  e = rvcc + d;                     // Tatsächliche Spannung
  lcd.setCursor(8,1);
  lcd.print("e");lcd.print(e);
  digitalWrite(led, HIGH);delay(100);digitalWrite(led, LOW);delay(200);
  delay(5000);         // Zeit um das Display bei 3V-Test hell zu drehen
//---------------------------------------

  analogReference(DEFAULT);  // zurückstellen auf Vcc als Referenz
  delay(10); // Warten bis Referenz eingeschwungen
  return rvcc;
}

void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  vcc  = messenBetrieb();
}

void loop() {
  float mess = vcc / 1023 * analogRead(A0);
  messenBetrieb();
  delay(2000);
}

Geeicht habe ich mit 4.50 Volt.
Volt=Tatsächliche Spannung, RVCC= Dein Wert, E=Mein Wert

Code:
Volt   RVCC   E
3.00   2.70   2.97
4.50   4.50   4.50
5.00   5.08   4.99

Viele Grüße
Harry
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.02.2018, 13:11
Beitrag #10
RE: Messen der eigenen Betriebsspannung mit dem Arduino
(26.02.2018 02:06)Harry schrieb:  ich habe dein Code getestet.
Im gegensatz zu dem Code wo ich benutzt habe funktioniert deiner auch wenn man den IC mit 8MHz internen Takt betreibt.

Mit 1MHz funktioniert es auch.

(26.02.2018 02:06)Harry schrieb:  Allerdings habe ich eine Schwäche festgestellt. Ändert sich die eingesetzte Spannung zu der Spannung mit der geeicht wurde, weicht das Ergebnis (bei mir um dan Faktor 0,15) vom tatsächlichen Wert ab.

Ich muss mich korrigieren. Den Messfehler gibt es nur wenn man den 328P alleine betreibt und dabei ist es egal mit wieviel MHz und ob interner oder externer Takt eingestellt ist. Mit einem Nano ist alles ok.

Die Abweichung beim 328P war bei mir immer Faktor 0,15. Getestet mit 3 ICs und verschiedene Takte. Die Formel habe ich inzwischen verkürzt.

rvcc = rvcc + (eichung - rvcc) * 0.15; // Eichung = eingestellte Volt bei Eichung

Der Faktor "INTERN" scheint bei den Nanos in der Größenordnung von ca. 1,08 zu liegen, meine 328P lagen alle bei ca. 1,29.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.09.2019, 18:43 (Dieser Beitrag wurde zuletzt bearbeitet: 27.09.2019 18:59 von Tommy56.)
Beitrag #11
RE: Messen der eigenen Betriebsspannung mit dem Arduino
Noch eine Ergänzung zu den Berechnungen (Diskussion hier):

Nach dem Messverfahren müsste man eigentlich durch 1024 teilen.
Damit würde sich bei Messspannung 5V und Referenz 5V ein Messergebnis von 4,995 ergeben (ist >= 4,995...). Das wäre formal richtig.
Die Divission /1024 geht auch schneller.

Anders herum ergibt eine Division durch 1023 vei 5V und 1023 Messwert wieder 5V.

Also egal, wie man rechnet. Es ist immer in irgend einer Hinsicht falsch. Man muss sich für einen Fehler entscheiden.

Was wieder den alten Spruch bestätigt: Wer misst, misst Mist.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Information [Tutorial] Temperatur / Luftfeuchte messen und auf LCD ausgeben Lazzard 5 70.462 26.03.2015 13:43
Letzter Beitrag: doctorwhy

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste