Stromverbrauch Arduino

Aufgrund einer kleinen Diskussion in einem anderen Thread wo ich anderer Meinung war, es sich aber nicht wirklich nur aus der Theorie rausfinden lies, kam mir der Gedanke es doch einfach auszumessen.

Annahme
Stromverbrauch kann durch delay reduziert werden, während bei millis() mehr aktive Segmente den Stromverbrauch erhöhen. Für Hochleistungs-CPUs von Intel oder Nvidia mag das ja gelten. Auch beim ARM wird alles abgeschaltet was gerade nicht gebraucht wird.

Hier aber wohl nicht.

Testaufbau
Hochgenaue Spannungsquelle
Ein 10 Ohm ±1% Messwiderstand vor der Spannungsmessung
Ein Spannungsmessgerät nach dem Messwiderstand (um sicher die Spannung des Arduino zu messen und nicht durch 10Ohm Messwiderstand verfälscht)
Ein Digital-Oszi über dem Messwiderstand damit der Stromverlauf als Kurve sichtbar wird.
Arduino Nano Clon mit Atmel328p
LED am Pin12 mit Vorwiderstand ca 7mA Strom

Erster Durchgang

long Max = 16777216; //256*256*256=16777216
long Zahl = 0;
int LED = 12;
bool Zustand = false;
int Durchgang;
unsigned long Zeit;

void setup() {
  // put your setup code here, to run once:
pinMode(LED, OUTPUT);
Serial.begin(19200);
Serial.println("Start");
Durchgang = 0;
}

void loop() {
  // put your main code here, to run repeatedly:

do{
  Zahl = Zahl + 10 - 9;
  //Zahl = Zahl - 9;
  }
  while (Zahl < Max);
  Durchgang ++;
  Zahl = 0;
if (Zustand) {
  Zustand = false;
  }
  else {
  Zustand = true;
  }
  Serial.print(Durchgang);
  Serial.print(" : ");
  Serial.print(Zustand);
  Serial.print(" : ");
  Zeit = millis();
  Serial.println(Zeit);
digitalWrite(LED, Zustand);
}

Berechnung einer sehr großen Zahl indem ich in einer Schleife permanent 10 addieren, 9 abziehe bis Max erreicht. Zeit ungefähr 10,5sec

LED toggle

Zweiter Durchgang

bool Zustand = false;
int LED = 12;

void setup() {
  // put your setup code here, to run once:
pinMode(LED, OUTPUT);
Serial.begin(19200);
Serial.println("Start");
}

void loop() {
  // put your main code here, to run repeatedly:

delay (10000);
if (Zustand) {
  Zustand = false;
  }
  else {
  Zustand = true;
  }
digitalWrite(LED, Zustand);
Serial.println(Zustand);
}

Delay 10000 benutzt

LED toggle

Beide male identischer Stromverbrauch, keine Temperaturabweichung am Chip erkennbar. Hab die Temperatur gestern schon verfolgt über jeweils 2 Std ohne Abweichungen zu erkennen. Daher keine Thermofoto-Reihe, wären alles nahezu identische Bilder.

Interessanter Effekt im dritten Oszibild
Wenn ich zum Versuchsaufbau gelaufen bin oder im Raum rumgelaufen wackelt die Stromkurve. Man sieht den Rythmus mit dem ich mit meinem Fuss geklopft habe. Mal schneller mal langsamer. Einer der Klemmen oder der Kontaktierungen hat bösen Wackler und reagiert schon auf Erschütterungen im Raum. Ok, ich bin nicht der leichteste, aber solche Wirkung habe ich nicht erwartet. Mag für einige komische Dinge die in solchen Versuchsaufbauten vorkommen durchaus eine Erklärung sein.

Kalte CPU Morgens vor erstem Versuch. Das helle am USB-Stecker sind Lichtreflexionen die wohl als hohe Temperatur gewertet werden. Der USB-Stecker ist nicht eingesteckt

Warme CPU nach 20 Minuten, danach ändert sich die Temperatur nicht mehr. Auch bei 4 Std dauerlauf nicht

Für mein Verständins steht ja auch während delay nicht die komplette Welt still... PWM z.b. läuft ja auch weiter- was zeigt dass kein Timer angehalten wird oder ähnliches.
Lediglich der Sketch wird angehalten.

Aus meiner Sicht ist delay ein Stil den man sich erst gar nicht angewöhnen sollte.

Das ist wie mit dieser irren Idee die 30 Jahre lang die westdeutschen Schulen belastet hat, die Kinder sollen schreiben wie sie sprechen- kein Wunder dass es da ein 13. Jahr braucht bis das wieder halbwegs ausgebügelt ist...

Naja, in ARM und Intel-CPUs schaut das anders aus. Da sind Programmteile stromhungrig oder stromsparend. Da würde man wohl auch sehen wie stark sich einzelne Bereiche belasten. Allerdings schwer zu erfassen, da der Heatspreader die Sicht versperrt und andererseits ohne diesen die CPU keine Sekunde überlebt.

Jedenfalls die schalten Bereich komplett ab. Gerade ARM-Prozessoren sind da Meister in dieser Disziplin. Nichts davon steckt aber in unserem Atmel.

Dafür kann man doch die Arduinos schlafen schicken.

Ich bin mir auch nicht sicher ob man bei Leistungsfähigeren CPUs noch groß mit delay arbeiten sollte... lasse mich da aber gern eines besseren belehren. Einen Vorteil von delay habe ich bisher noch nicht finden können.

MaHa76:
Einen Vorteil von delay habe ich bisher noch nicht finden können.

Es ist programmiertechnisch sehr einfach zu benutzen und kann den Code lesbarer halten. Auch fürs Debuggen kann Delay zum zeitweiligen Einbau von Zwangspausen praktisch sein. Ich gebe zu, mein Code ist nicht Delay frei. Allerdings weiß ich genau, wo ich Delay einbaue und weshalb.

Delay ist gut für anfängerfreundliche Beispiele. Das sie dabei in eine üble Falle tappen, merken sie erst später.

Oder um absichtlich Code zu verlangsamen, zu Beochachtungszwecken oder debuggen, aber dann weiß man bereits was man tut, wenn man das anwendet.

Edit: 5 Sekunden Differenz, 2 Posts, ein Gedanke :slight_smile:

chefin:
Gerade ARM-Prozessoren sind da Meister in dieser Disziplin. Nichts davon steckt aber in unserem Atmel.

"Butter bei die Fische!" das gefällt mir :slight_smile:

Hier im Forum taucht ja immer mal wieder die Frage auf, wie ein Arduino stromsparend betrieben werden könnte. Dabei wurde meist auf den Schlafmodus abgezielt. Interessant fände ich die Fragestellung, ob man wie bei den ARM-Prozessoren Funktionalitäten des Atmel ausschalten kann, um im Betrieb Strom zu sparen.

Als Hobbyanwender umgibt mich leider nichts Hochgenaues, weshalb ich nur die Idee formulieren kann.

Hallo,
delay() kann man dazu nutzen, etwas "sicher" zu machen.

fahre Schlitten in bestimmte Position
delay(5000)

der Schlitten braucht 3sek um seine Position zu erreichen
nach dem Komando- fahre Schlitten in bestimmte Position

kann bei sauberer programmierung dieser Vorgang nicht gestört werden,
weil nichts mehr abgearbeitet wird.
Gruß und Spaß
Andreas

MaHa76:
Dafür kann man doch die Arduinos schlafen schicken.

Ich bin mir auch nicht sicher ob man bei Leistungsfähigeren CPUs noch groß mit delay arbeiten sollte... lasse mich da aber gern eines besseren belehren. Einen Vorteil von delay habe ich bisher noch nicht finden können.

Sorry da muss ich dir widersprechen

Intel CPUs arbeiten quasi dauerhaft im delay. Sie nutzen Interupts um zu arbeiten. Uns zwar AUSSCHLIESSLICH.

Da läuft ein kleines Script das nichts anderes macht als endlos zu warten. Die Schleife hat keine Abbruchbedingung. Diese CPUs laufen aber auch völlig anders als wir das vom Atmel kennen. Hunderte von Timern, 255 Softinterrupts, alles Eventgesteuert, Objektorientierte Programmierung schon im Kern von Windows. Völlig andere Welt.

Hm, OK... gut ich bin ja quasi noch Laie was programmieren angeht...

Aber was kann man nun letztendlich festhalten? Delays sind nicht so schlecht wie behauptet und man kann getrost damit arbeiten?

ja, wenn dir bewusst ist was und warum du das tust. Das grosse Problem kommt bei späteren Änderungen oder Erweiterungen.

Das bezieht sich jetzt auf "lange" delays.

Eigentlich heißt das Thema “Stromverbrauch”. Wenn das Ergebnis dieses Themas gewesen wäre, bei delay braucht der µC nur 10% Leistung, dann hätte man bei stromsparenden Anwendungen tatsächlich delay für einen zusätzlichen Schlafmodus nehmen können, der von Interrupts unterbrochen werden kann.

Über den praktischen Sinn nachzudenken macht aber keinen Sinn, da es sich ja nicht so verhält.

MaHa76:
Aber was kann man nun letztendlich festhalten? Delays sind nicht so schlecht wie behauptet und man kann getrost damit arbeiten?

Ein Befehl ist grundsätzlich weder gut noch schlecht. Er kann aber gut oder schlecht verwendet werden. Ein Freund macht das “belebte Haus” mit delay. LED an, Pause, LED aus. So versteht er es, so sieht es auf der Modellanlage gut aus. Hier erfüllt delay den gewünschten Effekt. Gute Funktion gleich guter Einsatz von delay.

Als er mich bat, noch eine Fernsehflackern einzubauen, habe ich einfach auf millis umgestellt. Die Zeiten stehen in einem Feld variabler Größe und können angepaßt werden.

Hier geht es eigentlich nicht um delay, sondern um das Thema blockadearmes Programmieren. Sowas wie while(1) oder for(j=0;0<10000;j++) gehören auch dazu. Oder wie kann ich Multitasking machen, wenn ich kein Multitasking-Betriebssystem habe.

Aussagen wie “vergiß delay” führen zu der Annahme, man möge delay nicht. Für mich gilt das definitiv nicht. Meine Variante für einen Anfänger wäre “Vergiß verübergehend delay, lerne millis. Wenn Du das beherrscht, erinnere Dich daran, daß in seltenen Fällen auch delay ein nützlicher Befehl sein kann.” Da ich faul bin, schreibe ich nicht gern Text und bevorzuge die kurze Variante, da der Fortgeschrittene irgendwann selbst drauf kommt.

Hi Cheffin,
cool, Deine Herangehnsweise gefällt mir... :slight_smile:
Hast Du auch gemessen wie viel Strom der Nano gezogen hat (oder sind das die 7mA)?

Zu der delay Geschichte (als Auslöser der Diskusion)...
Für mich ließ sich (mit eurer Hilfe) damit erst mal ein paar Zeilen Code schreiben der (wahrscheinlich) macht was ich möchte und den ich als Arduino und C Anfänger nachvollzieen kann.

Ich gehe (besser ging) auch etwas "Zielpragmatisch" an die Geschchte "MC und seine Programmierung" heran, den Ziel war für mich die paar Zeilen Code hinzubekommen mit welchen Tests auf eine bestimmte Art und weise durchgeführt werden können.
inzwischen ist mir aber klar geworden, dass ich meine Versuchsreihen noch wesentlich weiter optimieren kann, wenn ich mich mit der MC Programmierung mehr auseinandersetze. Diese Optimierungen erlauben dann aber kein (längeres) delay mehr...

Grüße

Herbert

Vorab mit einem alten Netzteil wars so um die 18mA. Das hatte aber Potifehler, es ist böse in der Spannung gesprungen. 4,7V…kleiner Ruck am Poti, 5,3V und natürlich dann Strom auch angesiuegen. Untauglich für diesen Zweck. Also das Digital-Netzteil geholt. Und dann die Messspannung auskalibriert. So das der Controller auch immer die selbe Spannung bekommt, nämlich genau 5V.

Im Oszi-Diagramm sind 5mV/Div und 1:10 Tastkopf. Der 10Ohm Widerstand hat also 200mV Spannungsabfall. Nach Ohmschen Gesetz also 20mA (0,2/10).

Mit LED on dann die 27mA.

mein Chef mag mich

Hab neues Netzteil bekommen, damit ich nicht das Labor belästigen muss, da ja meines überaltert ist :slight_smile:

jetzt muss ich nur noch das 300MHz Speicheroszi durchboxen.

http://www.meilhaus.de/rigol+mso2302a-s,i16.htm

Aber es steht ja auch noch Weihnachten vor der Türe....mal sehen.

Ich benutze das Delay() gar nicht mehr, sondern nehme nur noch eine eigene Delay-Funtkion, welche auf Narcoleptic basiert. Diese stellt vor dem Delay den A/D-Konverter ab und nach dem Aufwecken wieder an. Dadurch fällt der Stromverbrauch während des "Schlafdelay" in den Mikroamperebereich.
Habe das alles von dieser Seite, wo schon diverse Messungen mit diversen Einstellungen durchgeführt wurden. Absolut lesenswert :slight_smile:

http://s6z.de/cms/index.php/arduino/nuetzliches/9-winterschlaf-fuer-arduino

Ok, wenn mein Netzteil da ist setze ich die Messreihe mit deinem Delay mal fort bzw dem Sleepmodus den du da benutzt.