瞬間燃費計算
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