メーターを作っているのですが、車速パルスから速度を求めたりイグニッションコイルのパルスからエンジンの回転数を求めなければなりません。速度は車速パルスの周波数を求めて換算式に当てはめ、エンジンの回転数は1秒あたりの回転数を求めて60倍すれば求まります。そんな感じで「パルスの周波数」を求めればいいのですが、少し考えさせられたのでここに覚え書きとして残しておこうと思います。周波数の求め方には「直接計数方式」と「レシプロカル方式」の2種類があります。パルス数を数えて周波数を求める方法です。1秒間のパルス数を数えるとその数が周波数になりますね。(周波数は1秒あたりの振動数)0.1秒間だけ数えると10倍すれば求まります。低周波の場合に有効桁数を多くしようとするとカウントする時間を長くして測定しなければならないデメリットがあります。1[mHz]の分解能を得るには1000秒のカウント時間が必要になってしまいます。レシプロカル方式パルスの周期を測定して、その逆数を計算し周波数を求める方法です。有効桁数は測定パルスの周波数に関係なく、測定の際の時間分解能で決まります。そのため低い周波数でも短時間で高い分解能で測定できます。高周波の場合は有効桁数を取りにくくなってしまいます。メーターのパルスの周波数は低い方なのでレシプロカル方式で求めます。車速を求めるスピードメータの規格がJISで決まっているようで、計算式も載っています。上記の式を変形して、V(車速)を求める形にすればいいだけです。スポンサーリンク下記はArduino風のサンプルコードです。60[km/h]の時の回転数は637[rpm]で1回転あたりの車速パルス数は4パルスの場合になります。1000倍を2回しているのはmicros関数でマイクロ秒が返ってきて、計算時に分母に来るので*10^6となります。変わらないかもしれないですが、計算回数を少なくしたいので定数などはあらかじめ計算しておきます。(float)SpdSub;}外部割り込みに車速パルスを入れ、上記の関数を呼び出せば車速が求まります。計算はできるだけ簡単に高速にできるようにしたつもりです。この場合だと車速パルスがない時、つまり0[km/h]の時は割り込みが来ないので測定できなくなってしまいます。して0[km/h]を検出する必要がありますね。何秒間か割り込みがなければ0[km/h]と判断できますね。1.5パルスで1回転の場合の割り込みプログラムは以下のようになると思います。(float)RotSub;}本当に動くかは保証できませんので、参考程度にしてください。エンジンの回転数はイグニッションコイルのノイズがひどくて波形整形をしないと正確な数値が得られないのでハードウェア側の工夫が必要でした。あと、まだ計算式があっているのか不安なのでもうちょっと考えてみようと思います。ArticleTwitterFacebookLineHatenaPocket8人の方がこの記事を「いいね」と言っています。]2019/06/12修正しました。ご指摘ありがとうございます。Reply通りすがり2019/06/13脱字がありますね。Site電子工作とか「つくる」のが好きな人が日々を綴っているブログです。→ABOUTプロダクトブランドNeulseもよろしくお願いします。14:29あなたが正しいからといって、私が間違ってるわけではない。