[H8-ML(4007)] フリーランタイマ + キャプチャでのパルス周期計測
From: わたなべ <YIU03275@xxxxxxxxxxx>
Date: 2003年10月10日(金)01時08分40秒
わたなべです。
16bitフリーランタイマ + 16bitインプットキャプチャの場合です。

>他のタイマなどの割込み処理中に
>オーバーフローとインプットキャプチャが立て続けに起こった場合、
>同IPRの中ではGRAインプットキャプチャが強いので他のタイマの割込み処理終了
>後にインプットキャプチャ割込みが先に発生します

 これは通常、起こりえます。入力パルス周期をタイマのオーバーフロー周期の
1/n付近で微妙に動かしてやると再現させやすいと思います。

要はインプットキャプチャが先なのか、オバーフローが先なのかわかれば
よいわけで、キャプチャのタイミングがオーバーフローの山の前なのか
後ろなのかを判断することで対応します。
(10年以上前にやった話なので記憶があいまいですが。)

キャプチャ割り込みの中で、
   キャプチャ値 <= (unsigned short)0x7FFF ならオーバーフローが先なので
+ 2^16(山ひとつ数えたことにしてここでオーバーフロー割り込み要求フラグを
クリアするんっだたかな?でも複数入力の場合は複数の桁上がりをこの
割り込みの中でカウントするとオーバーヘッドが増えるので、対象の桁
上がりだけを-1してオバーフロー割り込み要求はクリアせず、割り込みを
起こさせて、そこで+1することでつじつま合わせるだったかな-忘れました。
手法はいくつかあると思います。)
   キャプチャ値 >= (unsigned short)0x8000 ならキャプチャが先でそのまま
 といった感じでしょうか。もっとも割り込み待ちが
 (タイマーオーバーフロー周期)/2を越える場合は成り立ちませんけど。

  また2^16を越える桁上がり分はオーバーフロー割り込みを使用し、桁上がり分を
 カウントすることで対応します。
  桁上がりをどこで数えて、下位16bitとなる(今回キャプチャ値 - 前回キャプチャ
値)と
 桁上がり分の上位16bit(8bit)を組み合わせる処理と桁上がり分のクリアをどの
 レベルで、どう行うかというややこしい面はあります。
  
  起こり得る全ての状態を考慮し、絶対誤りの起こらない処理を作るのは
 けっこう面倒ですが、基本的に1個のフリーランタイマとそれにぶらさがる
 複数のインプットキャプチャで、複数のパルス周期を測ることは可能だと
 思います。
 (測定可能上限周波数がソフトに依存し、腕の見せ所?)

 (ベテランの方にはいうまでもないのですが、)ついでに書いておくと、たまに忘れ
る
 人がいるのが1発目の割り込みの処理です。CPU起動後ポート処理、タイマー
 スタートさせ、割り込み禁止で他のイニシャル処理してから割り込み解除を行う
と、
 イニシャル中に発生した割り込み起動要因が順次起こります。場合によっては
 期待していたタイミングと異なる場合がありますので、それなり処理が必要です。
  またパルス停止判断後の最初の一発目の割り込みも無視します。パルス周期は
 同方向のエッジが2回来てパルス周期ですから。

  ワンチップマイコンの中には、フリーランタイマ1個にインプトキャプチャや
 コンペアマッチのレジスタをぶら下げただけというタイマ構成だけのものも
けっこう あるのではないでしょうか?それで成立しているということは、みなさん
 それなり手法を確立しているのだと思います。

スレッド概略
[3936(R)](起点)
 └[4003(U)]
   └[表示中]
     └[4008(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]