• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+

のぼるざえもんのブログ一覧

2012年11月30日 イイね!

スピードメーターのプログラムの考察〜忘れないため記録

車速パルスを取得する方法を得てからスピードメーターはどうやって計算してるんだろ??と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) | トラックバック(0) | 日記

プロフィール

「傘泥棒対策 http://cvw.jp/b/1504928/40266466/
何シテル?   08/18 21:50
のぼるです。中古ですが念願の赤コペンGETしました!これからオープンカーライフ楽しみます♪よろしくお願いします。
みんカラ新規会員登録

ユーザー内検索

<< 2012/11 >>

    123
45678910
11 121314151617
181920212223 24
2526 272829 30 

愛車一覧

ダイハツ コペン 通勤快速コペンとまと号(コペトマ) (ダイハツ コペン)
トマトみたいでかわいいです。 姉には「てんとう虫みたい」って言われました。 写真、、駐車 ...

過去のブログ

2016年
01月02月03月04月05月06月
07月08月09月10月11月12月
2015年
01月02月03月04月05月06月
07月08月09月10月11月12月
2014年
01月02月03月04月05月06月
07月08月09月10月11月12月
2013年
01月02月03月04月05月06月
07月08月09月10月11月12月
2012年
01月02月03月04月05月06月
07月08月09月10月11月12月
ヘルプ利用規約サイトマップ
© LY Corporation