Arduino UNO R4はADCの分解能が14ビットまで設定できる(analogReadResolution()を使う)。デフォルトはUNO R3に合せて10ビットになっている。
では、分解能によって実行時間に変化があるか?簡単なコードを書いて測定してみる。
#define LOOP_NUM 100000
volatile int x;
void setup() {
Serial.begin(115200);
}
void loop() {
unsigned long time_start, time_end, time_loop;
int i, n;
time_start = micros();
for (i = 0; i < LOOP_NUM; i++) {
x = i;
}
time_end = micros();
Serial.print("空ループ start: ");
Serial.print(time_start);
Serial.print(" end: ");
Serial.print(time_end);
Serial.print(" diff: ");
Serial.print(time_end - time_start);
Serial.println("");
time_loop = time_end - time_start;
for (n = 8; n <= 14; n += 2) {
analogReadResolution(n);
time_start = micros();
for (i = 0; i < LOOP_NUM; i++) {
x = analogRead(A0);
}
time_end = micros();
Serial.print(n);
Serial.print("ビット start: ");
Serial.print(time_start);
Serial.print(" end: ");
Serial.print(time_end);
Serial.print(" diff: ");
Serial.print(time_end - time_start);
Serial.print(" ");
Serial.print((float)(time_end - time_start - time_loop) / (float)(LOOP_NUM));
Serial.print(" μs/analogRead()");
Serial.println("");
}
Serial.println("");
}
実行結果。
結果は分解能によらず、一回あたり約22μs。本当かなぁ、という気がしないでもないけど、実行結果は上のとおり。
ちなみに、同様なことをArduino UNO R3(互換機)で実行してみたら、analogRead()一回あたり約111μsだった。なお、ループ回数(LOOP_NUM)は10000で行った(シリアルの通信速度は9600bps ― Arduiino IDEでボードをArduino UNOに指定したときのデフォルト値)。
こうやって比べると、R4は速いことがよく分かる。クロックだけを比較してもしょうがないけど、一応、R3は16MHz、R4は48MHz。
コメント
Arduino UNO R4の情報を探して、訪問させて頂きました。
遅ればせながら最近UNO R4を入手していろいろ試していますが、知りたいことが見つからずに困っていたところ、具体的に検証された方法を公開していただき大変参考になりました。
ありがとうございます。
R3と比較してR4は通常の入力でも高速であることが理解できました。
(R3は110uS程度、R4は20uS程度)
ところで、R3でもADCSRAで分周比を変えると10uS程度まで高速化出来るようですが、R4でのレジスタを使っての高速化方法などをご検証されたことはありますか?
公開して頂いたコードを参考に試してみたのですが、結果が約0.2uSと早すぎです。
結果が私の実験とは違うとのことですが、すみません、理由はわかりません。
UNO R4のレジスタを直接いじるようなこともやったことはありません。
UNO R4のアナログ入力は、入力インピーダンスが低い、測定値がふらつく、という問題がありあまり実用的ではないと感じています。そのあたりはこちらの記事に書いています。
https://www.jh4vaj.com/archives/40909