2011年7月6日作成 2012年1月25日更新
エンジンの制御には使用していないのですが、車速を計測して表示したりログを取ったりできるようにしています。現在の車速が判ればスピードリミッターを実装できますけど、不要ですよね?
NA6CE の MT 車の場合車速パルスが出ませんので、スピードメーターにリードスイッチを追加して車速パルスが出るように改造する必要があります。
スピードメータドライブシャフトの回転数は 60 km/h の時に 637 RPM になるようになっていて(JIS規格で定められているようです)、NA6CE の車速パルスはシャフト一回転で4パルス出ています。
この車速パルスの間隔を測定すれば現在の速度がわかりますね。
60 km/h = 637 RPM * 4 パルス
1 km/h = ( 637 RPM * 4 パルス ) / 60
1 km/h 時の周期 = 60 / ( 637 RPM * 4 パルス ) [分] = 60 * ( 60 / ( 637 RPM * 4 パルス )) [秒]
なので
速度 = ( 60 * ( 60 / ( 637 RPM * 4 パルス ))) / 車速パルスの間隔 [秒]
で求めることが出来ますね。
speed.c
タイマー 1 カウントの時間 = 1024 / IOCLK [秒]
temp=MTU22.TGRA;
if(temp!=0) speed[idx]=(unsigned char)((((float)60.0*60*IOCLK)/(637*1024*4))/temp);
// (60*60*IOCLKで32ビットを溢れるので、floatにキャスト)
idx++;
if(idx>3) idx=0;
SPEED=((unsigned int)speed[0]+speed[1]+speed[2]+speed[3])/4; // 過去4パルスの平均
実際にパルスの間隔を測定してみると、一定速度で走行してもパルスの間隔が1割程度変動しました。メーター内にある磁石の並びが均等じゃないのかもしれません。
過去4回分の計測結果を平均して、値を安定させました。
車速パルスの数を積算することで走行距離を求めることが出来ます。
60 km/h = 637 [RPM] * 4 パルス
60 km/h = 637*4 [パルス/分]
60 km/h = 60*637*4 [パルス/時]
1 km/h = 637*4 [パルス/時]
1 km = 637*4 [パルス]
なので
走行距離 = パルスの数 / (637 * 4)[km]
で求めることができます。
speed.c
DISTANCE = 車速パルスの数
unsigned int getdistance(void)
{
//return DISTANCE/(637*4); // km
return ((float)DISTANCE*1000)/(637*4); // m
}
('A`)