前回の記事に引き続き,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でした.
測定データを見れば分かりますが,かなりバラついている印象です.
エネルギー測定も目標にしているので,サンプル館の時間を都度測定し,グラフを長方形に区切って面積の和を導く,ような形で区間積分だろうと予想しています.
次回以降,いよいよ回路の設計の予備実験に入っていこうと思います.
コード作りに必要な最低限のデータは出揃いました.