Anzahl FOR durchgänge für eine Sec

Hallo,

ich würde gerne wissen wie lange ein Zyklus des Arduino Mega2560 dauert und wie viele meine FOR Schleife hat.

Ich mess über den AnalogIn A0 eine übermittelte Spannung, die ich gerne im Sec Takt über Mittelwertbildung aufnehmen möchte.

Welchen Wert müsste also mein “numReadings” haben, um so genaust wie möglich eine Sec lang alle gemessenen Wert in mittelWert zu speichern.

Programmcode:

...

unsigned long int mittelWert;

unsigned int numReadings = ???;
unsigned int numSec = 20;
unsigned int rechenWert;

...

void prog1(){ 
 
 Serial.println("Es wird gemessen ... Bitte warten!");
 mittelWert = 0;
 rechenWert = numSec * numReadings;
 
 for(i = 0; i < numSec; i++){                        //Anzahl wiederholungen der Sec-Durchgänge
   for(i2 = 0; i2 < numReadings; i2++)            //Anzahl der Durchgänge um eine Sec zu erreichen
   {
      sensorValue = analogRead(analogInPin);   //Auslesen des A0 Pins
      mittelWert = mittelWert + sensorValue;    //Alle Werte in mittelWert speichern
   }
   
  } 
 
   ausgabe = mittelWert / rechenWert;    //Umrechung um Mittelwert zu generieren

...
}
...

Gruß TeChI

Das ist der falsche Ansatz und wird so nichts. Verwende millis() um jede Sekunde eine Messung zu machen. Und bilde dann nach x Messungen den Mittelwert.

Vll hab ich mich auch etwas falsch ausgedrückt.
Ich will schon so viel Messungen wie möglich in der Sec! nur halt genau eine Sec lang

Gruß

Hmm, einfach so lange Messen bis sich millis um 1000 erhöht hat?

Also nicht in einer for Schleife sndern millis "merken" und dann in einer While Schleife laufen lassen bis millis um 1000 größer ist als der Merker. Man muß sich nur noch was überlegen wie man die Messwerte elegant zwischenspeichert :wink: Ein Schleifenzähler beinhaltet dann die Anzahl der Messungen in dieser Sekunde.

Christian

Im Prinzip fast das gleiche. Verwende millis() um die vergangene Zeit zu zählen. Du setzt vor der ersten Messung eine Variable (Typ unsigned long) auf den aktuellen millis() Wert. Dann misst du solange bis millis() - dieser Wert größer als 1000 ist. Dann ist 1 Sekunde vergangen.

for-Schleifen zum Timing zu verwenden geht nicht richtig. Da stecken zu viele Dinge drin die sich ändern können und du kannst auch nicht sagen was das Compiler aus der Schleife macht. Sowas kann man in Assembler machen wo man genau weiß wie viele Takte ein Befehl braucht. Und selbst dann ist ein Drecks-Aufwand den Overhead der Schleife korrekt zu zählen

Hey super Danke!
Von dem millis() wusste ich noch nichts, das macht es ja ziemlich einfach!

Ich kannte zuvor nur die Assambler Programmierung und dachte, versteift wie ich war, nur an den einen Weg.

Ihr habt mir sehr geholfen! :wink:

Hallo,

... selbst mit Assembler mache ich so was nicht mit Schleifendurchgängen - spätestens wenn ein Interrupt zuschlägt ist das Timing kaputt. Diese "millis" kann man sinngemäß und sehr elegant mit einem Timer Interrupt lösen.

Christian