Donnerstag, 22. August 2013

Dynamische Messung der Stromaufnahme

Um die Belastung der Batterie unter realen Bedingungen zu messen, wurde der Stromverbrauch des Gesamtsystems in einer dem Zustand bei der tatsächlichen Messung ähnlichen Konfiguration bestimmt. Die Messungen wurden ohne Sensor durchgeführt, da verschiedene Sensoren einen unterschiedlichen Stromverbrauch haben. Falls der Sensor keine erhebliche Stromaufnahme oder (insbesondere) eine erhebliche Anlaufzeit benötigt, ist dieser für die folgende Betrachtung zu vernachlässigen.

Die Stromaufnahme des Arduino im sleep-mode (powerDown, ADC_OFF, BOD_OFF) beträgt statisch gemessen ca. 40 µA (direkte Strommessung, Philips PM 2503).

Konfiguration: Arduino Fio, XBee Series 2, LiPo Akku 850 mAh, LowPower V. 1.30 https://github.com/rocketscream/Low-Power)

Die dynamischen Messungen wurden als Spannungsmessungen über einem 1 Ω 1% Widerstand mit einem HP 54200A Digitaloszilloskop ausgeführt.

Um zu prüfen, ob die Stromaufnahme, insb. des XBee-Moduls beim Einschalten einen höheren Peak als während des Betriebs hat, wurde eine Kontrollmessungen mit einem analogen Speicheroszilloskop (HP1741A) durchgeführt, die keine Anzeichen dafür lieferten.


Zunächst wurde der Stromverbrauch des Arduino-Boards ohne XBee-Modul gemessen:

Dazu wurde der Controller 15msec in den sleep Modus versetzt, dann über die Standard-delay-Funktion 100msec gewartet. Die Stromaufnahme des Controllers beträgt etwa 5mA.
Die sleep-Dauer scheint nicht ganz der Angabe von 15msec zu entsprechen, sondern eher etwa 20msec zu betragen. Bei Bedarf sollte dies durch eine genauere Messung geklärt werden. Die Messung wurde bei längeren sleep-Dauern wiederholt, um eine erhöhte Stromaufnahme bei längerer Dauer auszuschließen. Dafür ergab sich kein Anhaltspunkt.

Daraufhin wurde die Stromaufnahme mit XBee-Modul gemessen.

Da das XBee-Modul mindestens etwa 3 Sekunden „wach“ blieb[1], wurde im Versuch eine sleep-Dauer von 8 Sekunden (der Maximalwert) verwendet. Die Abbildung zeigt, dass die Stromaufnahme jetzt etwa 40 mA beträgt. Dies deckt sich mit statischen Messungen (Digital- und Analog-Voltmeter) und ist auch plausibel. Man erkennt eine leicht erhöhte Stromaufnahme zu Beginn (etwa 3 mA mehr Stromverbrauch für etwa 300 msec). Auch dies ist plausibel. In einer Messung (von etwa 50, kein Bild) erschienen einzelne Datenpunkte, die einen höheren Stromverbrauch zu Beginn andeuten könnten, diese konnten aber durch Messungen mit einem analogen Speicheroszilloskop nicht verifiziert werden und werden deshalb als Artefakte (etwa Einstreuung des benachbarten PCs oder Lötstation) interpretiert. Bei Bedarf sollte eine präzise Messung – etwa per analoger Integration und Mittelung – durchgeführt werden. Der hierfür nötige Aufwand scheint aber nur gerechtfertigt, falls Probleme mit überlasteten Batterien auftreten.

NB: Die Messungen wurden insbesondere durchgeführt, da ein Testaufbau mit einem Arduino-Leonardo und XBee-Shield bei weitem nicht die erwartete Betriebsdauer erzielte, sondern nur gut eine Woche aus 4 Standard-Mignon-Zellen. Dies rührte aber, wie zu Beginn der Messungen klar wurde, vom Ruhestrom des Spannungsreglers des XBee-Shields, der bei etwa 10 mA lag. Dies würde dann zu einer Batteriekapazität von etwa 10 Tagen x 24 Stunden x 10 mA = 2400 mAh (plus die eigentlich nötige Stromaufnahme von Board und XBee-Modul, die bei etwa 1 mA im Mittel liegt und damit vernachlässigbar ist), also einem plausiblen Wert.
Dies führt zu folgenden Betriebsdauern:


Quellcode des Programms zur Messung mit XBee-Modul. Für die Messung ohne XBee-Modul wurde der entsprechende Code auskommentiert und die Zeit im Aufruf von powerDown auf 15Ms gesetzt.

/**
* Short sleep cycles to measure power consumption
* essentially a fast blink with sleep during off time
**/

#include "LowPower.h"

char c = 'A';

const int XBEE_WAKE = 7;

void setup() {
  Serial.begin(9600);
  // Send XBee to sleep, never wake it up
  digitalWrite(XBEE_WAKE,HIGH); // just in case
  // XBee pins are clamped internally
  pinMode(XBEE_WAKE,INPUT);
}

void loop () {
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
    digitalWrite(13, HIGH);
  // Send to XBee Module
  // first wake it up
  pinMode(XBEE_WAKE,OUTPUT);
  digitalWrite(XBEE_WAKE,LOW);
  // wait a little bit
  delay(100);
  Serial.print(c);
  Serial.flush();
  // wait a little bit and send XBee to sleep again
  delay(100);
  digitalWrite(XBEE_WAKE,HIGH); // just in case
  // XBee pins are clamped internally
  pinMode(XBEE_WAKE,INPUT);


    delay(100);
    digitalWrite(13, LOW);
}



[1] Vermutlich wurde das so konfiguriert, prüfen ! Ist aber nicht so kritisch. Letztlich sollte per Versuch – aufwendig – geklärt werden, wie lange das Modul mindestens wach bleiben muß, um eine verlässliche Übertragung zu gewährleisten. 3 Sekunden sind meiner Erinnerung nach der default und realistisch.