Arduinoのloopの呼び出し周期を計測する

Arduino

Arduinoのloopはどのくらいの周期で呼び出されるのでしょうか?
気になってみたので手元にあった2つのArduinoで計測してみました。

  • Arduino Uno R3
  • Arduino Nano Every

動かすスケッチ

スケッチ

#include <Arduino.h>

#define NUM_LOOPS 100  // 100周分を計測する

int numLoops = NUM_LOOPS;
unsigned long loopTime[NUM_LOOPS];

void setup()
{
  // 初期化処理
  Serial.begin(9600);
}

void loop()
{
  loopTime[numLoops] = micros();

  if(numLoops > 0)
  {
    numLoops--;
  }
  else
  {
    // 100周期終了後に合計実行時間を出力
    for(int i = NUM_LOOPS; --i >= 0;)
    {
      Serial.println(loopTime[i]);
    }

    while(true)
    {
      // 無限ループでプログラムを停止
    }
  }
}

やっていること

loop()が呼び出されるたびにloopTimeにその時の時刻を記録します。そして、
100個のデータがたまったらシリアルモニタに出力します。

シリアル出力は非常に時間がかかるのでこのような処理にしています。

時刻の取得時間やデクリメントの時間は考慮していませんが、大体のloopの呼び出し周期はわかると思います。

Arduino Uno R3

呼び出し周期は以下のようになりました。

呼び出し周期が4,8,4,4,8,4,…と規則的な結果になっています。

Arduino Nano Every

呼び出し周期は以下のようになりました。

呼び出し周期が8μsと一定の結果になっています。

結果

micros() – Arduinoリファレンス

Arduino Uno Rev3のように動作周波数が16Hzのボードでは、microsの分解能は4μsです。
平均すると1周期は5.3μsくらいでしょうか。

コメント

タイトルとURLをコピーしました