C-Styleで割り込み(その3)

次のような無条件ループでプログラムする場合、ループ内で時間のかかる処理があると、センサ値を読むタイミングによっては、センサ値の変化に気づかない場合がある。
f:id:ohguma:20190224095347p:plain

内部で50ミリ秒の時間がかかる処理があるとセンサ値を読むタイミングは50ミリ秒ごとになる。
センサ値を読んだ後の10~30ミリ秒でセンサ値が変化終了すると、次のセンサ値を見たときには変化が読み取れない。
f:id:ohguma:20190224101851p:plain


そこで、時間のかかる処理とは別に、割り込み内でセンサ値の変化をチェックすることで読み飛ばしを防ぐ。
f:id:ohguma:20190224095413p:plain

センサ値が大きくなる変化を読み取る場合は、次のような感じでセンサ値の最大値(グラフでは点線)を保存しておけば読み飛ばしを防げる。

  • メインプログラム側でセンサ保存値をリセット
  • 割り込み内でセンサ値をチェックし、センサ保存値より値が大きければ、センサ保存値を更新
  • メインプログラム側でセンサ保存値を使って処理
  • (以下繰り返し)

f:id:ohguma:20190224101903p:plain



自走するロボットが秒速1mで進む場合、50ミリ秒で5cm進む。

  • 秒速1mとは
    • 1秒で1m (1000ミリ秒で1000mm)
    • 0.1秒で10cm (100ミリ秒で100mm)
    • 0.01秒で1cm (10ミリ秒で10mm)

処理に時間のかかる超音波センサなどを使う場合、その処理中にセンサ値の変化が終わり、変化を読み飛ばすことは十分考えられる。