Hobbuy Blog
趣味と購入のブログ

3.ArduinoのIO速度を測る② - 2025.10.30

前回の記事に引き続き,ArduinoのIO速度を測定していきます.
前回のときはArduino Uno R4 Minimaとコードの相性問題,そして速度の問題が発生したためDueでしか測定できませんでした.
今回は修正版コードで実行したため,前回とは少しデータの質が違うかもしれませんが,参考にする値で,大まかな速度を知りたいだけなので問題ありません.

まず,コードを掲載します.


  /*
  ==ArduinoのIO速度測定コード==
  A0ピンに電圧を入力し,閾値(トリガ電圧)を上回るとD9ピンから電圧を出力し,下回ると出力を切る
      
  ピンのステータスはSerialで出力
  デバッグ用のため,消しても可
  */
      
  void setup() {
    Serial.begin(115200); // 115200baudで通信を開始
    analogReadResolution(12); // 12bit ADCでないボードの際は行をコメントアウトする
  }
      
  void loop() {
    float value = analogRead(A0) * 5.0 / 4095.0; // アナログ入力値から電圧を算出 ※3.3V系マイコンの際は5.0を3.3に変更すること

    if (value >= 2) { // トリガ電圧の2は希望の電圧に設定してもOK
      analogWrite(9, 255); // PWMを出力(変調なし・IO電圧をそのまま出力)
      // Serial.println("HIGH"); // Serial経由で電圧出力「入」状態を記録(デバッグ用)

      while (value >= 2) { // 入力電圧がトリガ電圧を下回るまで繰り返す ※鳥が電圧は上と揃えること
        value = analogRead(A0) * 5.0 / 4095.0; // アナログ入力値から電圧を算出
      }

      analogWrite(9, 0); // PWM出力を切る
      // Serial.println("LOW"); // Serial経由で電圧出力「切」状態を記録(デバッグ用)
    }
  }
  

Dueの時はdigitalWrite()関数を使っていたのですが,Unoでは調子が悪くてうまく測定できませんでした.
あまり原因は分かりませんでしたが,とにかく測定をしたかったのでdigitalWrite(9, HIGH);と同じ振る舞いをするanalogWrite(9, 255)で代用しています.
このコードで測定をし,50個のデータを採りました.
前回同様,2C53Tで測定しました.
垂直軸(電圧)の精度はそこまで信頼していませんが,250 MSa/sもあると水平軸(時間)の遅延や差などを調べられて便利です.

余談はほどほどにして,計測結果の話に戻ります.
使用ピンは前回と同じで,A0ピンに入力した矩形波(3.0 V・1 Hz)をオシロのCh2に入力し,D9からの出力をCh1に入力します.
Ch2をトリガソースにするとCh2のトリガ位置よりも後の位置でArduinoからの入力のCh1の波形が立ち上がるので,その立ち上がり時間の差分をカーソル測定で測定しています.

計測データはこちらからダウンロードできます.
Excel形式でダウンロード

平均値は1067.92 μs,平均サンプリングレートは936.4 Sa/sでした.
最小値は56 μsで,最大値は2104 μsでした.
測定データを見れば分かりますが,かなりバラついている印象です.

エネルギー測定も目標にしているので,サンプル館の時間を都度測定し,グラフを長方形に区切って面積の和を導く,ような形で区間積分だろうと予想しています.
次回以降,いよいよ回路の設計の予備実験に入っていこうと思います.
コード作りに必要な最低限のデータは出揃いました.

← 前回:ArduinoのIO速度を測る①
次回:放射線測定器に使う部品を買い揃える →

←目次へ戻る ←メインページに戻る