2011年7月3日作成 2011年7月9日更新
点火時期が一定でもクランクの回転数が変われば、イグナイタに通電開始する時間を変えなければならないですし、点火マップや噴射マップを読み出すのにも現在の回転数が必要なので、点火等の処理を行う前にクランクの回転数を計測します。
クランクアングルセンサーNeの立ち上がりから次の立ち上がりまでの時間を、マイコンのタイマーで計測しています。クランク180度ごと、毎回の点火ごとの計測になります。
rotetion_speed.c
// 回転数計測 Neの立ち上がりでインプットキャプチャ割り込みが発生して、ここが実行されます
temp=MTU21.TGRA;
if(temp!=0)
{
RPM=30*IOCLK/64/temp;
}
else RPM=0;
タイマーは IOCLK (I/Oクロック) を64分周したクロックで駆動しています。IOCLK が 24MHz なので 1/(24000000/64)[秒] (= 2.67[マイクロ秒]) ごとにカウントアップします。
Neの立ち上がりから次の立ち上がりまででクランク180度なので、回転数は
回転数[RPM] = (60/2)/クランク180度回る時間[秒] = (60/2)/(カウント値*(1/(24000000/64))[秒])
で求めることが出来ますね。
タイマーがオーバーフローしたとき、すなわち 65535*2.67[マイクロ秒] = 175[ミリ秒] 間以上 Ne の立ち上がりが来なかった時には、回転数ゼロとしています。60*1/0.175 = 約 350[RPM]まで計測できることになります。
とっても簡単ですね。C言語の入門レベル以下です。
('A`)