Darkside(https対応しました)

2014年12月09日の記事

2014年12月9日(火) 22:03

外部割り込み

 ようやくセンサー値の取得が片付きそうなので、残る課題はSDカードのタイムアウト問題とインプットキャプチャーである。
 SDカードは最悪使わないという手があるので、必須となるインプットキャプチャーを先に試す。と言っても実際に使うのは外部割込みだ。入力ピンに接続された信号が変化したときに、割り込みを発生させる機能がある。これで適切なタイマーのカウント値を読めば、パルス幅を知ることができるはず。

 EXTIは、入力キャプチャーと異なりどの入力ピンでも使用可能。ただし、ピン0からピン15までそれぞれが一まとめになっている。つまり、ポートAのピン0とポートAのピン1は区別できるが、ポートAのピン0とポートBのピン0は区別できない。後者は「どこかのポートのピン0」で割り込みが発生したことしか分からない。「どのポートで発生したか」は分からないので、そこに注意して使用ピンを考えねばならない。
 それさえ注意すれば、ピン選択は自由度が高い。使い方をマスターすれば、制約のキツいインプットキャプチャーを使う必要は無くなる。ひょっとしたら、EXTIで代用可能だからインプットキャプチャーが手抜き仕様なのかもしれない。

 どこかのポートのピン0で入力信号が変化すると、EXTI0割り込みが発生する。ピン1ならEXTI1であり、ピン2ならEXTI2である。こうしてEXTI15まで存在する。だが、割り込みハンドラーは16種類のEXTIに対して7つしか存在しない。EXTI0〜EXTI4までは独立した割り込みハンドラーだが、5〜9までは一まとめになっており、10〜15もまた一まとめだ。
 よって、ピン0からピン4までを使用した方が、割り込み判定を高速に実行できる。速度的に有利である。だが、若いピン番号は案外空いていない。物理的に実装されていないことも多い。ラジコンパルス幅の取得ぐらいで、そこまで神経質になる必要もなかろう。

 ラジコン受信器からのパルス入力は、こんなタイミングになっている。
 CH1〜CH3までは、パルスの立ち上がりで割り込みが入るようにしておく。
 CH4だけは、立ち上がりと立ち下がりの両方で割り込みが入るようにしておく。

 CH1で割り込みが発生すれば、タイマーのカウンターを0にする。
 CH2で割り込みが発生すれば、CH1のパルス幅としてタイマーのカウンター値を採用。直後にタイマーのカウンターを0にする。
 CH3で割り込みが発生すれば、CH2のパルス幅としてタイマーのカウンター値を採用。直後にタイマーのカウンターを0にする。
 CH4で割り込みが発生すれば、1回目なら同様にCH3のパルス幅を取得。2回目ならタイマーのカウンター値をCH4のパルス幅として取得。

 パルスの前後関係は決まっている。フラグをうまく変化させ、割り込みが順番通りに発生していることを確認しつつパルス幅を取り込んで行けば良い。
 全体のタイミングは、CH1の割り込みが発生した時点に合わせる。タイムアウト含め各種エラー対策も必要だが、まずは皮算用通りに動作するかどうかが問題だ。

written by higashino [マルチローター] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL
Darkside(https対応しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4