• 締切済み

AVRのインプットキャプチャについて

AVRのインプットキャプチャを利用してパルス立ち上がりエッジ間の時間を計測したいのですが、どうも計算が合いません。知恵を貸してください・・・ 1MHzの駆動でカウンタの分周が64分周なら単純に1カウント64μSecですよね? 実際に計測しますと130Hzのパルス立ち上がりエッジ間に60カウントしました。ですので・・・ 60パルス*64μSec=3840μSec となると思うのですが、 130Hzならパルス立ち上がりエッジ間は・・・ 1Sec/130Hz=0.007692Sec すなわち7692μSecですよね? もし計算間違ってたら教えてください。 計測対象のパルスですが、これはPCファンの回転信号を計測しました。 DSOnanoで計測したら130Hzでした。 AVRのタイマ/カウンタの値はUARTで確認しました。 AVRのタイマーの設定を間違ってたらいけないので記載していきます。以下の通りです。 TIMSK = (1<<ICF1); TCCR1B = (1<<ICES1)|(3<<CS10);//上りエッジの64分周

みんなの回答

  • tadys
  • ベストアンサー率40% (856/2135)
回答No.1

AVRは使った事はありませんが。 インプットキャプチャの使い方が間違っています。 インプットキャプチャは、入力のエッジが有った時にカウンターのカウント値をラッチしておいて、後からソフトでその値を読みだすように使います。 1回目のエッジでのカウント値と2回目のエッジのカウント値の差を取れば2つのエッジの間の時間間隔が分かります。 2つのエッジの間にカウンターがオーバーフローするとカウント値の大小が逆転する事に注意する必要があります。 これがうまく動く為には測ろうとするパルスの周期よりカウンタの周期が長い必要があります。 カウンタの割り込みを上手く使えばこの制限は外れますけどね。 7692μSec/64μSec=120.19なので、どうやらカウンタの周期は128usで動いていて、7692usの間にカウンタが60回オーバーフローするのを数えているようですね。 カウンターの周期は最大にしておいていいのですよ。 そして、2つのキャプチャの間のキャプチャ値の差を取るんです。 カウンタのオーバーフロー時の処理を忘れないように。

DELED
質問者

補足

タイマーが設定通りの速度で動いているか確認するたオーバーフロー割り込みを利用して時間を測ってみました。 約4秒間隔で割り込みが発生しています。設定から計算すると、 64μSec×65535カウント=4194240μsecすなわち4.19秒となり、カウンタ自体は問題無さそうです。