チャンネルが分離されていたFLEXPWMとは違って、GPT関連のIRQはフラグが統合されているようだ。

InputCapture1/2のフラグはランダムなタイミングで発生するため、チャンネル毎に制御信号を分離した方が安全そうなのだが、条件分岐によって判定を行うポイントを設定する場所が問題になりそうだ。
例えば、ひとまず統合されたIRQをそのままサブルーチンに投げる方法と、、、

フラグの条件でIRQが発動した際の分岐先を決定する方法とでは、キャプチャの挙動が変わってくる可能性がある。

GPT系ではイニシャライズからタイマの起動、オーバーフロー、タイマの停止を統一して行うことになるが、

タイマ停止時にはGPIOの属性をALT1からALT5に変更し、InputCaptureに設定した端子を開放している。

キャプチャ・イベントが発生したタイミングでカウンタの値をレジスタに記録し、

値を読み込んだ後に、キャプチャ・フラグのクリアを行う。サブルーチン内でインターラプトの介入をを禁止することで、処理の混乱を回避している。
カウンタの読み出しは、InputCapture1/2 個別のタイミングで行っている。

本来はプライオリティーが設定されたIRQが分離されているGPT1/2を並列に運用するのが筋なのだが、ボードから端子が取り出せないためにGPT2のみの運用で妥協せざるを得ない。
無理をすれば、ボード裏にあるPSRAMのCSからGPT1のInputCaptureを取り出せるが、

これは最後の手段と考えている。
32bitフルスケールをカウントする時間は7秒程度で、この間にOverFloorによるエラーが1回発生する。

テルミン用のFVCは、パルスのアッパーエッジのタイミングで取得したカウント値の差分を検出するために、実際に取得した値の実効値を調整する必要がある。Teensy3.6で構成した16bit精度のFVCから得られるデータの実効値は14bit程で、ピッチの制御に用いるには微妙な数値だ。
32bit精度のカウンタからはより柔軟に実効域を切り取ることが出来るので、データエラーによって発生するバウンシング現象を防止できるかもしれない。
posted by Yasuski at 01:44|
Teensy