« 並列接続した抵抗 | トップページ | 電池イジメ、その後 »

2017年6月20日 (火)

ARMマイコン、タイマーのインプット・キャプチャ機能で

初めて使う「機能」、使ってみて「なるほどなぁ~」
「こうするんや」というパターンにしばしば出会います。
その原因、
   「マニュアルに書いてあるやろ」
   「ちゃんと、隅から隅まで読みや」っという
場合が多いようです。
先日はこんなことに遭遇しています。

チップはARMマイコンSTM32F407。

11

タイマーのインプット・キャプチャ機能で、パルス周期を
測定しようとしたところ、タイマーカウンタのプリスケーラが
いうことをきかないという現象に出会いました。

クロック源は84MHz。
これが、16ビットのプリスケーラを通って32ビットのカウンタ
(アップカウント)に入ります。
測定値が32ビットで出てくるので、プリスケーラを使わなくて
もかまわないんですが、できればクロックを1MHz(1μS)にして
おきたいので、プリスケーラを「1/84」に初期化しました。
ところが、これがダメ。
出てくるパルス間隔値は1MHzで計測したものじゃなく、元クロック
の84MHzで計った値になるのです。 (想定の84倍大きな値)
う~む・・・。

しかし、何かのひょうしに1MHzでの値になって、ちゃんと思惑通り
の数値が出だします。
一度ちゃんと動き出すと以後は大丈夫。
うまくいかないのは起動直後の最初だけ。
「なんやこれ~?」でっす。

このうまくいくタイミングを調べてみると、カウンタのオーバー
フローが絡んでいました。
32ビットカウンタが一周すると、プリスケーラが設定した値で働く
ようになるのです。
クロック周波数が高くても32ビットあるんで、オーバーフロー
するまでの経過時間はざっと50秒。
起動後50秒ほどすると、考え通りの値が出てくるという現象が
読み取れました。

こうなると、「どこかにかいてあるやろ」っと、マニュアルを
探索。
この現象に関係する解説、こんなのでした。

・プリスケーラの説明
  新しいプリスケーラ比は、次の更新イベントで有効になります。

・TIMxEGRレジスタの説明
  UGフラグ:更新生成フラグ
  1にするとカウンタを再初期化。アップカウントではゼロクリア。
  プリスケーラは設定値で再スタート。

つまり、カウンタがフリーラン(オーバーフロー前に比較してリセット
するような機能を使わない場合)している時、プリスケーラが正しく
働くのは最初の更新イベント。
放置状態では、オーバーフローがこのタイミングだったのです。
だもんで、タイマーの初期処理では、ソフトで「UGフラグをオン」
しとかなくちゃいけないよ、ということでした。
とりあえず、この問題はこの方法で解決しました。

※現在は、インプット・キャプチャのタイミングでカウンタを
 ゼロクリアしたいんだが(ハード的に)の設定に悩んでます。

このハードウェア、インプット・キャプチャはタイマー2のch3を入力に
使ってます。 
ch1だとキャプチャのタイミングでカウンタをクリアできるんですが、
ch3だとうまいこといきません。   (私の回路設計じゃな~い)
だもんで、クリアはせずに、キャプチャの前回タイミング読んだ
カウント値と今回値の差から周期を求めることにしました。

|

« 並列接続した抵抗 | トップページ | 電池イジメ、その後 »

電子回路工作」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: ARMマイコン、タイマーのインプット・キャプチャ機能で:

« 並列接続した抵抗 | トップページ | 電池イジメ、その後 »