Loging System Programing for c

燃費 馬力 瞬間燃費 インジェクション開度 0-400 0-100 Total System

ここに記載のソースリストは、著作権を放棄していません。掲載、引用には一報願えれば幸いです。
 

瞬間燃費計算

CCS-Cのおまじない
FUSEのセットです。内部クロックはH4で4逓倍させます。(10MHZX4=40MHz)だからといって、20MHZ取り付けて80MHZでは動きません。内部最大は40MHZですので・・・

//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/__/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
//
// SPEED COUNTER
/
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/__/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
#include <18f8720.h>
#fuses H4,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP
#device ADC=10//A/D変換10ビットモード
#USE DELAY(CLOCK=40MHZ, CRYSTAL=10MHZ)
#use RS232(BAUD=230400, XMIT=PIN_C6,RCV=PIN_C7)
//割り込み優先設定//
#PRIORITY CCP4,CCP5,CCP3,CCP2,CCP1,TIMER1
 


float rpm[11];
float speed[64];
float inj[64];
float xdata[41];

float powerremain[64];
float time_domain;
float ydata[41];
long nenpi_counter;

»  詳細  2008年1月12日 20:43

プログラムソース(ccs-c用)

mainルーティン設定はこのようにします。



//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_main_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
main()
{
  setup_ccp1(CCP_CAPTURE_RE); //CCP1動作条件設定 立上りはRE 立下りはFE
  cp1edge=0;//fall=1 rise=0
  setup_ccp2(CCP_CAPTURE_RE);
  setup_ccp3(CCP_CAPTURE_FE);
  setup_ccp4(CCP_CAPTURE_FE); //CCP2動作条件設定 立下り
  setup_ccp5(CCP_CAPTURE_RE); //CCP2動作条件設定 立下り
  setup_timer_0(RTCC_INTERNAL | RTCC_DIV_8);
  setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
  setup_timer_3(T3_INTERNAL | T3_DIV_BY_8|T3_CCP1_TO_5);
  set_timer1(3035);
  enable_interrupts(INT_TIMER1); //タイマ1割込み許可
  enable_interrupts(INT_TIMER0); //タイマ0割込み許可
  enable_interrupts(INT_CCP1); //CCP2側のみ割込み許可
  enable_interrupts(INT_CCP2); //CCP2側のみ割込み許可
  enable_interrupts(INT_CCP3); //CCP2側のみ割込み許可
  rpm_rise=1;
  enable_interrupts(INT_CCP4); //CCP2側のみ割込み許可
  enable_interrupts(INT_CCP5); //CCP2側のみ割込み許可

  enable_interrupts(GLOBAL); //グローバル割込み許可
               ・
               ・
               ・
               ・
               ・
}



割込みにて計測しますのでソースはこのようになります。
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_割り込みtimer1_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
//0.05s毎に割込み
#int_timer1
void isr1()
{
   set_timer1(3035);
   counter ++;//回数カウンタ+1
//基準速度(低速におけるタイマーオーバーフロー対応):

   if(counter>19)//1s
   {
       speed0= number2*0.707714083510262*2*(4/(float)e_pulse) ;
   }

   if(counter==10)//0.5s
   {
       speed0= number2*0.707714083510262*2*2*(4/(float)e_pulse) ;
   }
//変数speedが表示する値となる
//22km以下ではパルスの周期がタイマーオーバーフローとなるため0.5s毎のパルスカウントを行い速度に変換
//22km以上ではパルスの立ち上がり〜立下りまでの時間より速度に変換する。
//パルス抜けは実験より70km以上から発生する場合があるため35km以上から判定処理を行う。判断には
//パルスの立ち上がりのみから算出した速度を使用する。
   if(speed0<22)
   {
       speed=speed0;
   }
   else if(speed0>=22)
   {
       speed=vew_speed;
   }






   if(counter==20)//1秒毎ごとに瞬間燃費を配列に保存
   {
       number1=0;
       if(inj_time!=0)
       {
          nenpi_s=nenpi_odo/(inj_time*gas*gas_hosei);//瞬間燃費
//gasは噴射係数 gas=給油量/(totalinjecton-積算した無効噴射時間);
          nenpi_l=odo_m/((totalinjecton-mukou_count)*gas*gas_hosei);//トータル燃費
       }
       if(nenpi_s>20)
       nenpi_s=20.0;
       nenpi_counter=nenpi_counter+1;
       if(nenpi_counter==1)
//単位時間あたりの瞬間燃費を時系列配列に保存
       {
              inj[0]=inj[1];//20秒前の瞬間燃費
              inj[1]=inj[2];
              inj[2]=inj[3];
              inj[3]=inj[4];
              inj[4]=inj[5];
              inj[5]=inj[6];
              inj[6]=inj[7];
              inj[7]=inj[8];
              inj[8]=inj[9];
              inj[9]=inj[10];
              inj[10]=inj[11];
              inj[11]=inj[12];
              inj[12]=inj[13];
              inj[13]=inj[14];
              inj[14]=inj[15];
              inj[15]=inj[16];
              inj[16]=inj[17];
              inj[17]=inj[18];
              inj[18]=inj[19];//2秒前の燃費
              inj[19]=inj[20];//1秒前の燃費
              inj[20]=nenpi_s;//ここが現在の瞬間燃費
              syunkan_nenpi=(inj[15]+inj[16]+inj[17]+inj[18]+inj[19]+inj[20])/6;//移動平均処理
              if(speed0>20&&nenpi_max<syunkan_nenpi&&inj_count<=5&&kaiben>10)
                    nenpi_max=syunkan_nenpi;
              nenpi_counter=0;
        }
        nenpi_odo=0;
        inj_time=0;
   }

   if (counter >19) //10回目か?
   {
      counter = 0; //回数カウンタクリア
      number2=0;
   }
}

  

»  2008年4月29日 14:43