●Arduinoで時間を測定する

■パルス幅を測定するpulseIn関数

パルスがHIGHもしくはLOWの時間をマイクロ秒で返します

pulseIn(ピン番号,HIGH または LOW)

HIGHにするとパルスがHIGHになったら測定開始してLOWになると終了します。
デフォルトではパルスが発生するまでのタイムアウトは1秒ですが指定する場合には、第三引数にマイクロ秒で指定します。
タイムアウトすると0を返します。


■時間を返す関数

unsigned long = millis()
プログラムの実行を開始してからの経過時間をミリ秒で返す。
約50日間でオーバーフローし、ゼロに戻ります。

unsigned long = micros()
プログラムの実行を開始してからの経過時間をマイクロ秒で返す
約70分間でオーバーフローし、ゼロに戻ります
16MHz動作のArduinoでは分解能は4マイクロ秒です。


▼カウンタのオーバーフローは怖くない

ハードウエアのカウンタを使って前回値と今回値の差を取り時間を計るプログラムを作成すると、オーバーフロー時のプログラムの動作が気になってきます。
とは言え、カウンタはオーバーフローしてゼロに戻ってが延々と繰り返されるモノですし・・・・
オーバーフローするとゼロに戻るため前回値と今回値の差はおかしな事になるような気がしますが、じつは全然問題ありません。

簡単にするために4ビットのカウンタが延々に回っているとします。
4ビットのため0から15までの値を取ります、つまり、0から15までのカウンタです。
オーバーフロー前に取得した前回値とオーバーフロー後に取得した値の時間差を求めてみましょう。

0 :0000
1 :0001
2 : 0010←今回値
3 :0011
4 :0100
5 :0101
6 :0110
7 :0111
8 :1000
9 :1001
10:1010
11:1011
12:1100
13:1101
14: 1110←前回値
15:1111

今回値 - 前回値(関数電卓で計算しました)
0010 - 1110 = 1111110100
4ビットのカウンタのため下位4ビットのみ使用する
0100 は 10進数の 4
前回値と今回値の差は4ですので正しく差が取得できています。

オーバーフローしていても、してなくても正しく時間が取得できるでしょ!
プログラムって実に面白いですね。


▲トップページ > マイコンなど