1.なぜ高精度な時間計測が必要なのか?
以下の項目に対応したい場合、高精度な時間計測が必要です。
●外部イベントのタイムスタンプ
PWMの周期に対してパルス幅を変化させることで、LEDの明るさを調整することができます。
●イベント間の間隔測定
複数のイベントが連続して発生した際の、それぞれのイベント間の時間差を測定したい場合(例:パルスカウント、周期測定)
●処理時間のプロファイリング
ある関数やコードブロックの実行にどれくらいの時間がかかっているかを正確に測定し、最適化の指針を得たい場合
●通信プロトコルのタイミング調整
UARTのボーレート調整、SPI/I2Cのクロックタイミング、あるいは独自のビットバン通信など厳密な時間管理が求められる場合
●ソフトウェアデバウンス(※)
スイッチのチャタリングなど、瞬間的なノイズによる誤動作を防ぐため、一定時間信号が安定していることを確認する際に、正確な時間が必要です。
※)ソフトウェアデバウンスとは連続して発生するイベントを一定時間遅延させて、最後のイベント発生から一定時間経過後に一度だけ処理を実行する技術
2.タイマーを使った高精度な時間計測の仕組み
多くのマイコンのタイマーモジュールは、時間計測を効率的に行うための機能を備えています。主な手法としては、以下の2つが挙げられます。
1) 入力キャプチャ(Input Capture)機能
入力キャプチャは、特定のGPIOピンに入力される信号のエッジ(立ち上がりまたは立ち下がり)を検出した瞬間のタイマーカウンタの値を自動的に記録する機能です。
【仕組み】
・タイマーカウンタは、設定されたプリスケーラに従ってカウントアップし続けます。
・入力キャプチャが有効になっているGPIOピンに、設定されたエッジ(例: 立ち上がりエッジ)が入力されるとその瞬間のカウンタの値が専用の「キャプチャレジスタ」にコピーされます。
・同時に、入力キャプチャ割り込みが発生し、マイコンにイベントの発生を通知します。
・割り込みハンドラ内でキャプチャレジスタの値を読み取ることで、イベントが発生した正確な時刻(タイマーのカウント値)を知ることができます。

【活用例】
・パルス周期の測定
最初の立ち上がりエッジでカウンタ値をキャプチャし、次の立ち上がりエッジで再度キャプチャします。この2つのキャプチャ値の差が1周期の時間となります。
・パルス幅の測定
立ち上がりエッジでキャプチャし、立ち下がりエッジでキャプチャします。その差がパルス幅です。
・外部イベントのタイムスタンプ
複数のセンサー入力の発生時刻を、共通のタイマーを基準にして高精度に記録します。
・エンコーダ信号の読み取り
回転量や回転速度の測定に利用されます。
【メリット】
・高精度
ハードウェアレベルでカウンタ値が記録されるため、マイコンが割り込み処理を開始するまでの遅延の影響を最小限に抑えられます。
・マイコンの負荷が低い
マイコンは割り込みが発生するまで、キャプチャ処理に直接関与する必要がありません。
2) ワンショットタイマーとタイムアウト検出
特定の処理が一定時間内に完了するか、あるいは外部からの応答が一定時間内にない場合にタイムアウトを検出する用途で利用されます。
【仕組み】
・タイマーを特定の時間だけカウントするように設定し、カウントが完了したら割り込みを発生させる、あるいは特定のフラグをセットします。
・イベントが発生した際にタイマーをスタートさせ、期待される時間内に次のイベントが発生しない場合、タイマー割り込みによってタイムアウトを検出します。
【活用例】
・通信のタイムアウト監視:シリアル通信などでデータ送信後、一定時間内に受信応答がない場合にエラーを検出します。
・ソフトウェアデバウンス: ボタンが押されたことを検出後、タイマーをスタートさせ、例えば50ms間チャタリングが発生せず。信号が安定していれば、ボタン押下を確定します。
【メリット】
・確実な時間監視:期待される応答や処理が一定時間内に完了しない場合に、確実に検出できます。
・リソースの有効活用:タイムアウト待ちの間、マイコンは他の処理を実行できます。


