Funktionsaufruf mit fester Frequenz

Hallo,

ich habe ein Problem, für das es eindeutig zu viele Lösungen gibt-

ich möchte eine Funktion in einer festen Frequenz (ca.100Hz) aufrufen.

Ich habe bereits den MsTimer2 (http://www.arduino.cc/playground/Main/MsTimer2) genutzt, es gibt allerdings auch andere Lösungen, wie den SimpleTimer (http://arduino.cc/playground/Code/SimpleTimer).

Anscheinend gibt es Unterschiede, ob der Timer Hard- oder Software ist und wie sich das Programm verhält, falls die aufgerufene Funktion länger läuft als eine Periodendauer.
Ich habe keine richtige Übersicht über die Timer, über die das Arduino Uno Board verfügt, und inwieweit sich solche “zusätzlichen” Timer auf die PWM-Funktionalität auswirken.

Vielleicht hat hier jemand einen Hinweis für mich.

Vielen Dank und

viele Grüße

Martin

Jeweils 2 PWM Ausgänge benutzen je einen Timer. Wenn Du den Timer für andere Zwecke verwendest dann funktionieren die entsprechenden PWM Ausgänge nicht.

Deine Funktion muß auf alle Fälle innerhalb 10mS abgearbeitet sein ansonsten bringt ein erneuter Aufruf der Funktion das Programm durcheinander oder der Controller geht in tilt (Überlauf des Stacks). Die Funktion s zu schreiben daß ein erneuter Aufruf die alte Instanz der Funktion fertig abarbeiten läßt und de erneuten Aufruf nicht beachtet ist schwierig bis unmöglich.

Beschreib uns mal was Du genau machen willst und gist uns Deinen Sketch. Grüße Uwe

Hallo,

das Board besitzt 6 PWM Ausgänge, also verfügt es über 3 Timer dafür?

Mein Ziel ist es, einen parametrisierten Sinus zu erzeugen und über einen PWM Port auszugeben, während ich gleichzeitig die Werte von 3 analogen Inputs über den COM-Port aufzeichne.

Momentan arbeite ich mit diesem Code, um den Timer zu testen:

void setup() {
  ...  
  MsTimer2::set(10, test); //bzw 500 zum testen
  MsTimer2::start();
  ...
}

void test() {
  durchgelaufen=false        //um das Prinzip zu zeigen

  digitalWrite(led, HIGH); 
  delay(2); 
  digitalWrite(led, LOW);

  durchgelaufen=true          //wenn der Code beim nächsten mal mit true beginnt wüsste ich doch zumindest, dass er durchgelaufen ist, oder?
}

Könnte ich den kompletten Durchlauf nicht kontrollieren, indem ich zum Ende der test() Funktion eine Variable auf 1 setze?

Viele Grüße!

Mein Ziel ist es, einen parametrisierten Sinus zu erzeugen und über einen PWM Port auszugeben, während ich gleichzeitig die Werte von 3 analogen Inputs über den COM-Port aufzeichne.

Wenn Du die jeweiligen Werte nicht in 1/100s berechnen kannst, dann machst Du was fundamental falsch. Die übliche Lösung für so ein Problem ist die Werte vorzuberechen und dann einfach aus einem Array auszulesen.

Wenn Du in einer Timerinterruptroutine länger brauchst als der Timer zum Ablaufen, dann ist direkt nach dem Abarbeiten der Routine bereits der nächste Timerinterrupt aufgelaufen --> die Zeit zwischen den Aufrufen wird dann nur noch durch die Abarbeitungszeit bestimmt, der Timer ist dann egal. Das Hauptprogramm kommt dann so gut wie gar nicht mehr zum Zug.

Sowas vermeidet man normalerweise besser.

Die übliche Lösung für so ein Problem ist die Werte vorzuberechen und dann einfach aus einem Array auszulesen.

Genau das ist mein Plan, allerdings benötige ich dann genau diese 100Hz, um mit den entsprechend vorher berechneten Amplituden auf die richtige Periodendauer zu kommen.

Soweit ich mir das bis jetzt erschließen konnte, ist der Timer, den "MsTimer2" nutzt, für die PWM-Kanäle 3 und 11 zuständig. Ein Softwaretimer (ich glaube die arbeiten mit dem millis()-Aufruf) stellt sicher eine höhere Belastung für die Rechenleistung da, oder?

millis() hängt letztendlich an Timer0. Die dafür notwendige Rechenleistung ist eher vernachlässigbar / vergleichbar mit dem was die MsTimer2 Library auch verursacht.