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
27.01.2018, 17:09
Beitrag #1
Messen der eigenen Betriebsspannung mit dem Arduino
Für viele Anwendungen ist es sinnvoll zu wissen, wie hoch die Betriebsspannung genau ist, da sie oft als Referenzspannung in die Analogmessung eingeht.

Das kann man ohne zusätzliche Bauteile ermitteln, indem man die interne Referenzspannung von 1,1 V misst.

Leider ist diese aber auch durch Fertigungstoleranzen nicht genau 1,1V.
Also gehen wir erst mal den umgekehrten Weg und bestimmen wie groß die interne Referenzspannung des jeweiligen Arduino ist.
Dazu müssen wir die aktuelle Betriebsspannung mit einem Messgerät messen und können dann mit diesem gemessenen Wert unsere interne Referenz bestimmen.

Code:
const float VCC = 4.94; // Gemessen in Volt!

void readInternalRef11() {
  // 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 = 1.10 * 1023L / result;
  float internal1_1Ref = 1.1 * VCC / rvcc;
  Serial.print("Interne Referenz (1.1V): ");Serial.println(internal1_1Ref);
}

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

void loop() {
  readInternalRef11();
  delay(2000);
}

Für meinen UNO erhalte ich stabil 1,08V.

Mit diesem Wert kann ich jetzt zum Programmstart für diesen konkreten IC die Betriebsspannung ermitteln und in den analogen Messungen benutzen auch wenn der jetzt an einer anderen Spannungsquelle hängt.

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

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);
  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);
}
Wenn man eine schwankende Betriebsspannung hat, muss man diese Messung von Zeit zu Zeit wiederholen.

Die Grundlage für diesen Code bildet diese Veröffentlichung.

Die Defines resultieren aus der Ansteuerung der ADC-Register, die ich im Angang aus den Datenblättern zusammengefasst habe.

Gruß Tommy
Gruß Tommy


Angehängte Datei(en)
.pdf  ADC.pdf (Größe: 244,03 KB / Downloads: 151)

"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
28.01.2018, 00:57
Beitrag #2
RE: Messen der eigenen Betriebsspannung mit dem Arduino
Sehr interessant. Ich wusste das gar nicht (1,1 V).

Rainer
Diese Nachricht in einer Antwort zitieren
13.02.2018, 19:39
Beitrag #3
RE: Messen der eigenen Betriebsspannung mit dem Arduino
Hallo Tommy,

ich hab mich inzwischen ein bischen mit dem Spannungsmessen beschäftigt.

Als erstes habe ich diesen Code versucht:

http://bienonline.magix.net/public/avr-vcc-messen.html

Dank deiner Hilfe habe ich ihn auch zum Laufen gebracht.
Die Messungen ergaben einen Genauigkeit von ca. +-0,15V.

Als nächste habe ich mir dein code angeschaut.
Der Code läuft so weit, mir ist aber noch nicht ganz klar wie ich ihn anwenden muss.

Der erste Code ist dafür da um die genaue Referenzspannung fest zu legen?

(27.01.2018 17:09)Tommy56 schrieb:  
Code:
const float VCC = 4.94; // Gemessen in Volt!

Falls ich ihn über den USB-Port versorge, muss ich dann am USB Kabel die Spannung messen oder kann ich sie auch am 5V/GND Port des Nano/Uno messen?

Das Ergebnis am Monitor war bei mir 1,06.

Ich vermute mal, dass ich diese 1,06 dann hier im zweiten Code eintragen muss:

(27.01.2018 17:09)Tommy56 schrieb:  
Code:
const float INTERN = 1.08; // bestimmt pro IC

Was für einen Wert muss hier rein?
Die Eingansspannung kann es ja nicht sein, diese möchte ich ja bestimmen.

(27.01.2018 17:09)Tommy56 schrieb:  
Code:
float vcc = 5.0; // wird dann gemessen

Der zweite Code bringt mir nur ein Ergebniss am Bildschirm und nicht fortlaufend den aktuellen Wert wie beim ersten Code. Ist das richtig?

Viele Grüße
Harry
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.02.2018, 19:54
Beitrag #4
RE: Messen der eigenen Betriebsspannung mit dem Arduino
(13.02.2018 19:39)Harry schrieb:  Der erste Code ist dafür da um die genaue Referenzspannung fest zu legen?
Falls ich ihn über den USB-Port versorge, muss ich dann am USB Kabel die Spannung messen oder kann ich sie auch am 5V/GND Port des Nano/Uno messen?
Da kannst Du auch direkt am 5V-Pin messen.
(13.02.2018 19:39)Harry schrieb:  Das Ergebnis am Monitor war bei mir 1,06.

Ich vermute mal, dass ich diese 1,06 dann hier im zweiten Code eintragen muss:
Code:
const float INTERN = 1.08; // bestimmt pro IC
Was für einen Wert muss hier rein?
Deine 1.06
(13.02.2018 19:39)Harry schrieb:  
Code:
float vcc = 5.0; // wird dann gemessen
Das habe ich nur vorbelegt. Hier wird der richtige Wert eingetragen.
Code:
vcc  = messenBetrieb();
(13.02.2018 19:39)Harry schrieb:  Der zweite Code bringt mir nur ein Ergebniss am Bildschirm und nicht fortlaufend den aktuellen Wert wie beim ersten Code. Ist das richtig?
Ach ja, da habe ich die Ausgabe im Loop vergessen. Die schaffst Du aber allein Wink

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
13.02.2018, 21:20
Beitrag #5
RE: Messen der eigenen Betriebsspannung mit dem Arduino
(13.02.2018 19:54)Tommy56 schrieb:  Ach ja, da habe ich die Ausgabe im Loop vergessen. Die schaffst Du aber allein Wink

ich denke jaShy
Bevor ich mit dem Strommessen aber weiter mache möchte ich mein Problem mit dem zerflashten 328P lösen um nicht zu viele Baustellen auf einmal zu habe. Ich wollte das Strommessen nach dem Nano auch mit einem "reinem 328P" machen, was (wie du bestimmt schon mitbekommen hast) schief liefConfused

Viele Grüße
Harry
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.02.2018, 21:31 (Dieser Beitrag wurde zuletzt bearbeitet: 13.02.2018 21:34 von Tommy56.)
Beitrag #6
RE: Messen der eigenen Betriebsspannung mit dem Arduino
Du musst die interne 1,1V-Referenz für jeden einzelnen Schaltkreis bestimmen, um die Fertigungstoleranzen zu erfassen. Klebe/Schreibe den Wert drauf.

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
13.02.2018, 21:40
Beitrag #7
RE: Messen der eigenen Betriebsspannung mit dem Arduino
(13.02.2018 21:31)Tommy56 schrieb:  Du musst die interne 1,1V-Referenz für jeden einzelnen Schaltkreis bestimmen, um die Fertigungstoleranzen zu erfassen. Klebe/Schreibe den Wert drauf.

Mit Schaltkreis meinst du den UNO / NANO / 328 oder die Ganze Schaltung in der er verbaut ist?

Grüße
Harry
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.02.2018, 22:46
Beitrag #8
RE: Messen der eigenen Betriebsspannung mit dem Arduino
(13.02.2018 21:40)Harry schrieb:  
(13.02.2018 21:31)Tommy56 schrieb:  Du musst die interne 1,1V-Referenz für jeden einzelnen Schaltkreis bestimmen, um die Fertigungstoleranzen zu erfassen. Klebe/Schreibe den Wert drauf.

Mit Schaltkreis meinst du den UNO / NANO / 328 oder die Ganze Schaltung in der er verbaut ist?

Grüße
Harry
Ich meine damit jeden einzelnen UNO/NAMO/328/2560

Wegen der Fertigungstoleranzen hat da jerder einzelne IC einen eigenen Wert der 1,1V Referenz und die muss man für jeden IC einzeln ermitteln, wenn man sie braucht.

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 60.153 26.03.2015 13:43
Letzter Beitrag: doctorwhy

Gehe zu:


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