車速パルスを取得する方法を得てからスピードメーターはどうやって計算してるんだろ??とHPでいろいろ調べてみたら、実際に計測してる方を発見!
要は、「車速パルス発生から次のパルス発生の時間を0.4μ秒刻みで計測」、0.4μ秒が何回発生したか?を求め、基準値35400を計測結果で割るとスピードが出る!(@@)ほうほう!なるほど!これなら200km/hでも計測できるワケですね☆
ついでにリミッターについて考えると、140km/hでリミッターがかかる車は、実際車速パルスが140km/hで発生してても139km/hしか出てませんよ〜と計測結果を偽ってECUに出力してやれば140オーバーでも燃料カットされないということですね?なるほどなるほど!!
ということで、プログラムしてみました。回路を作っていないので実際に動くか解りません。プログラムはこんな感じ?という考察だけです。
実際には135km/hでリミッターがかかるという話なのでこのままのプログラムではリミッターカットできないハズです。
<PIC16F84A>
#include
__CONFIG( FOSC_HS & CP_OFF & PWRTE_ON & WDTE_OFF );
//オシレータ種類_コードプロテクト_パワーアップタイマ_ウォッチドックタイマ
#define _XTAL_FREQ 10000000
//CPU10MHz設定
static unsigned char speed=0;
//スピード表示用
static unsigned char seg1 = 0;
//1桁目
static unsigned char seg2 = 0;
//2桁目
static unsigned char seg3 = 0;
//3桁目
static unsigned char i=0;
//RA桁表示割り振り
static unsigned char limitcount=0;
//リミッター用カウンタ
static unsigned int count = 0;
//カウンタ用
static bit flag=0;
//カウンターセットフラグ
static bit limit = 0;
//リミッターフラグ
unsigned char p[10] =
{0b00000000,0b00000001,0b00000010,0b00000011,0b00000100,
0b00000101,0b00000110,0b00000111,0b00001000,0b00001001};
//7seg0~9←7セグLED配線による
/*動作概要
車速パルス発生→次の車速パルス発生の時間を40usカウントを何回繰り返すか計測、基準値35400をカウントで割ることで車速が求められる。
140km/hまではRA0に入力された車速パルスをRA3へそのまま出力、139km/h以上の場合はRA3へ127カウントごとに反転出力。35400/(127*2)=139.37km/h
*/
static void interrupt warikomi(void)
//割り込み発生時イベント
{
T0IE = 0;
//TIMER0割り込み禁止
T0IF = 0;
//TIMER0フラグクリア
TMR0 = 155;
//カウンタ値再セット
//////////////////////////////LIMITER CUT//////////////////////////////////////
if(limit==1&&limitcount>127){
//127カウントごとにRA3出力反転(パルス~パルス間253=139.9km/h)/2
RA3 = ~RA3;
limitcount=0;
}
limitcount++;
//////////////////////////////////////////////////////////////////////////////
T0IE = 1;
//TIMER0割り込み許可
count++;
//speed+
if(count>35400){
count=35400;
}
}
main()
{
TRISA = 0b00001000;
//RA4を車速パルス入力、RA07seg1桁目、RA17seg2桁目、RA27seg3桁目、RA3パルス出力
TRISB = 0b00000000;
//RB0~7 7seg動作
PORTA = 0b00000000;
//AB全ポート0初期化
PORTB = 0b00000000;
while(1){
//無限ループ処理
while(RA4==0){
//RA4パルスinならRA3へパルス出力(リミッタフラグ無し)
if(limit==0){
RA3=1;
}
if(flag==0){
//初回カウンター設定、次のパルスinまでカウントに++
flag = 1;
GIE = 1;
//すべての割り込み許可
T0IE = 0;
//タイマー割り込みを禁止
speed=35400/count;
//35400(基準値を回数で割ると速度が出る)
/////////////////////////////LIMITER CUT///////////////////////////////////////////
if(speed>139){
//speed 139以上でlimitフラグ1、以下なら0
limit=1;
}else{
limit=0;
}
////////////////////////////////////////////////////////////////////////////////////
seg3=speed/100;
//速度を7セグに割り振り
speed%=100;
seg2=speed/10;
speed%=10;
seg1=speed;
count=0;
//count初期化
OPTION_REG |= 0b10010000;
//OPTIONレジスタ設定に値を代入
TMR0 = 155;
//カウンタ値をリセット1ms=0.4us*100=40us
T0IE = 1;
//タイマー割り込みを許可
}
if(i==4 || (seg3==0 && seg2==0)){
i=1;
}
switch(i){
//7seg表示割り振り処理
case 1:
RA0=1;
PORTB=p[seg1];
break;
case 2:
if(seg3!=0 || seg2>1){
RA1=1;
PORTB=p[seg2];
}
break;
case 3:
if(seg3!=0){
RA2=1;
PORTB=p[seg3];
}
break;
}
}
RA0=0;
RA1=0;
RA2=0;
i++;
while(RA4==1){
if(limit==0){
RA3=0;
}
flag=0;
if(i==4 || (seg3==0 && seg2==0)){
i=1;
}
switch(i){
case 1:
RA0=1;
PORTB=p[seg1];
break;
case 2:
if(seg3!=0 || seg2>1){
RA1=1;
PORTB=p[seg2];
}
break;
case 3:
if(seg3!=0){
RA2=1;
PORTB=p[seg3];
}
break;
}
}
RA0=0;
RA1=0;
RA2=0;
i++;
}
}
<修正箇所>
修正1
if(count>35400){
count=35400;
}
追加。0km/hでも35400以上カウントしないよう修正。
修正2
i++の位置をwhile文の外へ(間違い修正)
Posted at 2012/11/30 09:52:13 | |
トラックバック(0) | 日記