5.     ソフトウェア

5.1.     割り込みの種類

11種類の割り込みが同時に動いています。大まかな概要を  別添5 に示します。

ITU

  GRA1 #2-#4インジェクター駆動タイミング発生 クランク2回転に1回

  GRB1 0.1秒おきに割り込みを発生 水温・O2センサー・各種モニター値の表示・空燃比学習制御等

  GRA2イグナイター駆動タイミング発生 クランク2回転に4回

  GRB2 クランク角センサークランク2回転に5回

  GRA3 #1-#3インジェクター駆動タイミング発生 クランク2回転に1回

  GRA4 シミュレート用クランク信号発生 クランク2回転に5回

IRQ0 車速信号

txi1 rs232c送信時 送信データ1バイトごと(sci.mar)

rxi1 rs232c受信時 受信データ1バイトごと(sci.mar)

rfsh キーボード・リミッターカット制御1/488.28125秒に1回(cmi_i :t.mar)

adi 吸気圧、水温、o2センサーの取り込み クランク2回転に1回と0.1秒に2回

   

5.2.     エンジン回転数・位置の検出(クランク各信号の処理  ITU2GRB2)

クランク角センサーの信号は、入力回路を経て、TIOCB2に接続されている。

ITU2はITU0で発生した64kHzをTCLKDからの入力で立下りをカウントしている。クランク角信号の立上がり時のTCNT2がgrb2に保存される。立上りパルスが発生するたびに割込が発生する。割り込みのたびに前回のgrb2との差を算出してエンジン回転数を割り出す。

クランク角信号は、2回転する間に5パルス発生する。#1が圧縮上死点の場合、パルス幅が短くなるので直前のエンジン回転数をもとにクランクが#1が圧縮上死点か他の位置にあるか判定する。 表2 がその判定値である。#1が圧縮上死点のパルスは通常の1/6幅でありエンジン回転数の範囲は15rpm(VIVIOの純正ECUが燃料ポンプを停止させる回転数)~10000rpmの範囲で667倍のスケールがあるためエンジン回転数を667^(1/6)=3余裕をみて6ステップに分割する。エンジン回転数は64000Hz*60/2/grb2=1920000/⊿grb2で計算できます。ITU2の規準クロックはITU0の64kHzです。

表 1 各回転におけるクランク信号パルス幅

16

80

179

400

900

2000

10000 rpm

120000

24000

10727

4800

2133

960

192

通常時の⊿grb2

20000

4000

1788

800

356

160

32

短いパルス時 #1圧縮上死点時の⊿grb2

表 2 パルス判定値

回転範囲

⊿grb2がこの値以下なら#1圧縮上死点時と判断する

16~80

(20000+24000)/2=22000

80~179

(4000+10727)/2=7364

179~400

(1788+4800)/2=3294

400~900

(800+2133)/2=1467

900~2000

(356+960)/2=658

2000~10000

(160+192)/2=176

始動時はパルスの幅を決定するためのエンジン回転数が得られていないので、最初の1パルスは無視してエンジンが1回転したら(5パルス)その平均よりエンジン回転数を算出しそれをもとに短いパルスが検出されたらそのときを #1圧縮上死点とします。エンジン回転数はrpmに保存されます。始動時からのパルス数はrpm_i2に保存されています。エンジンが停止するとパルスが立ち下がらないためエンジン回転数が停止したことを検出できなくなります。ITU1のgrb1の割込処理ルーチンで0.1秒置きにカウントされているrpm_iがITU2のgrb2の割込処理ルーチンでクリアされず2になった場合エンジンが停止したとみなします。停止とみなす回転数は0.1秒*2*60*2=12rpmとなります。rpm_i2はエンジンが停止した時点でクリアされます。クランクの位置はcank_posに保存されます。crank_posが1,2,3,4の場合は、点火時期を計算して点火信号を作成します。t.mar:ig_timeing_set

 また、#1圧縮上始点時に立ち上がりパルスを作成するために、P5のビット2をcrank_posが3の時、lowにします。クランク信号の整形後とP5のビット2のワイヤードORをとると#1圧縮上始点時の立ち上がりパルスが得られます。

表 3 変数crank_posの値とクランク位置

crank_pos クランク位置 
      0 #1圧縮上死点が終了して30度経過すると0にクリアされる。30~180度 
      1 180~360度#3圧縮上死点~
      2 360~540度#4圧縮上死点~
      3 540~720度#2圧縮上死点~
      4 720~30度#1圧縮上死点~

 

5.3.     車速の検出

ケーブル1回転に付、4パルス出力されます。解説書によると車速 60kmの場合は637rpmとなっている。リードスイッチによるスピード検出なのでデジタル的な波形が得られる。637*4/60=42.2666パルス/sec

  60km/42.2666=1.4195

 すなわち1秒間に1パルスが発生した場合の車速は1.4195km/hとなる。ITUが余っていなかったのでIRQ0を使用する。

走行距離はIRQ0の割り込みがかかることに0.341mを足すことにより算出できます。走行距離は、タコメータ起動後の走行距離l_mと発進からの走行距離od_mの2種類計測しています。od_mについては発進により前回の計測値をクリアし自動的に計測をするため、0-400加速等の計測に便利です。

なお、VIVIOの場合135km/h付近でリミッタがかかりますので130km/h以上の車速を検出したら115km/hの擬似車速信号を発生させます。通常はrfshタイマーの割り込みによりirq0端子の値をそのまま、P5-3に出力します。130km/h以上の場合は、rfshタイマーが7回読み出されたらhi(CPUからはlowに見える)を出力するようにした。

ちなみに車速センサからの信号は、 hi:low比は50km/h8:5、100km/h 4:3です。

5.4.     AD変換処理

 吸気圧はクランクの位置によって大幅に変動する。気筒判別信号の後に吸気圧をサンプルとする。他の水温・O2センサーのAD変換中と干渉しないようにするために、他のチャンネルがAD変換中の場合は、AD変換要求が出ないように、変換終了割り込みを使用する。変換要求はFIFOで管理します。FIFOにはADのチャンネル番号をセットします。AD変換終了割り込みが発生したら、次のチャネル番号を取り出して変換開始をセットします。

AD変換の手順

jsr @ad_init 初期化ルーチン

jsr @ad_request r0l=変換チャンネル

ad_bufに変換値がセットされる。なお最上位ビットが1の場合は、変化途中である。

5.4.1.    吸気圧

 正常時の出力電圧は整備解説書よりアイドリング時  P2-161 1.5~2.1V(実測は1.91V) エンジン停止時(約3.6V)別のページを見ると

P2-175 -240mmHg~-340mmHg エンジン停止時を0mmHgとする。おのおの平均を取って1.8V(-290mmHg)

3.6V(0mmHg)となり、P(mmHg)=161E(V)-580であらわせる。H8にはADコンバータの入力として取り込む。

変換値に対しては 161*5/1024*N-580=7867/10000N-580mmHg

なお、吸気圧は、真空に対する760mmHgとの差である。

 itu2_grb2の処理ルーチンの中で#1圧縮上死点時(短いパルスを検出したとき)にAD変換を要求し、次の#1圧縮上死点時に変換値を取り出します。

5.4.2.    水温

 電源+側に抵抗、 GND側にサーミスタを接続した分圧回路と思われる。サーミスタの抵抗値は整備解説書P2-159より20℃2~2.9kΩ 80℃

280~360Ω 平均を取ると 20℃ 2.45kΩ80℃ 320Ωとなる。サーミスタの式

image037.svg

に当てはめるとB定数が3509となる。。後は、サーミスタ単体の抵抗値とECUに接続した場合の電圧を比較すればメーターの抵抗値が推測できる。分圧回路の出力値は、下式となる。

image039.svg

抵抗値と電圧を測定すると 330Ωの時、0.76V266Ωの時 0.665V この結果よりメーターの抵抗は4875Ωとなる。

水温を直読するための実際の処理は指数や対数計算を行う必要があり煩雑な計算になることから、ADの変換値と温度のテーブルを作成して、変換することにする。水温センサの信号を直接AD変換するとラジエータファンがON、OFFの時のAD変換値は107(92度)、120(87度)です。温度は新車解説書を参照。ラジエターキャップの蓋を開けて温度を測ったときと直接AD変換した場合は235(58度)であることから、実験式を作成した。水温は2次元マップ(temp_table:map.mar)で変換する。

変換はitu1_grb1の処理ルーチンで行います。(0.1秒置き)

図 11 AD変換値(n)と温度(T)

5.4.3.    O2V

直接AD変換器に入力する。

変換はitu1_grb1の処理ルーチンで行います。(0.1秒置き)

5.5.     マップアクセス

点火時期・燃料噴射量・各種補正係数は2次元・3次元マップ化されています。

たとえばエンジン回転数を扱っているものについては500rpm置きに作成されており、その間の回転数が必要な場合は、直線補間で算定されます。マップについては、任意の数、ステップに変更可能です。

図 12 マップ概念図

image043.gif

マップのヘッダの構成

 2次元マップ

    .data.wマップの最小値,マップのステップ,マップの数

 3次元マップ

    .data.wマップの列値の最小値,マップの列のステップ,マップの列数

   .data.w マップの行値の最小値,マップの行のステップ,マップの行数

x1,x2,y1,y2がマップの値で、x,yが任意です。

2次元マップ読み出し two_point_access:igmap.mar

  z=map[x1]+(map[x2]-map[x1])*(x-x1)/(x2-x1)

3次元マップ読み出し four_point_access:igmap.mar

  z1=map[x1,y1]+(map[x2,y1]-map[x1,y1])*(x-x1)/(x2-x1)

  z2=map[x1,y2]+(map[x2,y2]-map[x1,y2])*(x-x1)/(x2-x1)

  z=z1+(z2-z1)*(y-y1)/(y2-y1)

 

5.6.     点火制御 (ElectronicSpark Advance and Dwell Control)

itu2_grbの各圧縮上死点時に、点火時期設定ルーチン(ig_timeing_set:t.mar)が呼び出されこの中で点火時期とドエルアングルが計算されFIFOに信号発生時期と信号のhi/lowがセットされる。最初、gra2に信号発生時期、ndra0に信号のhi/lowを設定しておき、コンペアマッチが発生したらその割り込みルーチンの中で次の値をtpc_next_data2:igmap.marルーチンによって設定します。点火時期の設定は、圧縮上死点の180度前に行われる。

 点火時期は下記の式で計算します。

g=ig_map[エンジン回転数,吸気圧]+補正(a_ig_k_const)+ig_k(ジョイスティックによる手動補正)+アイドル補正

5.6.1.    基本点火時期

エンジン回転数と吸気圧による3次元マップより算出。 図 13 (ig_map:map.mar)

5.6.2.    加速補正(a_k_ig

判断される場合は、a_k_rpm_pres_ig_v_map[エンジン回転,吸気圧]:map.marによって遅角補正を行う。 図14

初期値がマップの値で1回点火するごとにa_k_ig_step_valで減じて補正量を減らしていきます。

5.6.3.    アイドル補正(idle_ig_k

エンジン回転数がidle_rpm_max(1000rpm)以下、吸気圧がidle_rpm_max(-400mmHg)以下の場合にアイドル補正が行われる。

1秒間のエンジン回転数の変動に合わせて点火時期を修正する。 図15 dle_k_ig_map:map.mar

5.6.4.    ドエル角

ドエル角についてはエンジン回転数による2次元マップより算出(ig_tw_map:map.mar)

n=64000/(rpm/60)/2=64000*60/rpm/2=1920000/rpmクランク1/2回転時(カム1/4回転)

ただし、始動時( 500rpm以下)では、点火時期-15度、ドエル120度に固定されます。

点火時期 ng=grb2+ntop-g*n/180+grb2 g:点火時期(度)

駆動開始 ngon=ng-d*n/180+grb2 d:ドエルアングル(度)

図 13  基本点火時期

image045.svg

図 14 加速補正

image047.svg

図 15 アイドル補正

image049.svg

図 16 ドエル角

image051.svg

5.7.     燃料噴射制御( FuelInjection

itu2_grb2の処理ルーチンの中から#2が圧縮上死点の時は、#1-#3噴射タイミング設定ルーチン(inj13_timeing_set:t.mar)、#4が圧縮上死点の時は、(inj24_timeing_set:t.mar)がコールされます。さらにこれらのルーチンからinj_calcが呼び出され、噴射量と噴射開始時期が計算され、レジスタに値を設定してリターンします。リターン後、噴射グループごとのFIFOに信号発生時期と信号のhi/lowが格納されます。最初、gra1、a3に信号発生時期、ndra1、ndrb1に信号のhi/lowを設定しておき、コンペアマッチが発生したらその割り込みルーチンの中で次の値をtpc_next_data1:igmap.mar、tpc_next_data3:igmap.marルーチンによって設定します。ちなみ、インジェクターの特性を調べるために3回、満タン時の燃料補給量と、噴射回数と噴射時間を調べたところ、

     表 4 燃料消費量と噴射時間、噴射回数の関係

a(1/64ms)

n(回数)

L

t(秒)

208652111

302138

11.30

1630.094617

224020590

325302

10.60

1750.160859

220421249

331643

11.15

1722.041008

 

これから、1秒あたりの噴射時間と無効噴射時間を解析すると、1.73cc/秒/本無効噴射時間は0が一番近い答えになりました。無効噴射時間が0というのは疑問が残りましたが、インジェクターが開く時間と閉じる時間はほぼ同じと考えられます。燃料タンクほぼ空になるまで(カタログ上は約32リットル33リットル入ったことがある)数度測定しないと正確な答えは出ないでしょうが目安になります。104cc/分このことからインジェクターの容量は、余裕が少ないと考えられます。燃料ポンプは、45リットル/時間なので余裕があります。

      表 5 各エンジンのインジェクター・燃料ポンプ容量

車種

PS

インジェクター 燃料ポンプ

備考

    cc/分 リットル/時  
VIVIO NA

52ps

104

45

直4
VIVIO SC DOHC

64ps

 

80

直4
ALTEZZA RS200 6MT

210ps

340

343

直4
ALTEZZA AS200

160ps

185

115

直6

各種補正後の噴射量は、

image053.svg

image055.svg

なお、噴射量は90%以上の開度にならないように制限をかけています。

5.7.1.    基本燃料噴射量(std_inj)

エンジン回転数と吸気圧による3次元マップより算出。

マップの 1は1/64ms

図 17> inj_map:map.mar

実走行データより補間して作成した基本燃料マップ

図 17 基本噴射量(std_inj)

image057.svg

5.7.2.    水温補正(water_k)

temp_k[水温]:map.mar

図 18 水温補正量

image059.svg

5.7.3.    始動後増量(cold_start_k)(500rpm以上になってから)

水温により増量マップと増量時間を決める。

 エンジン始動後

増量値の初期値はcold_start_temp:map.marとし、cold_start_time_map:map.mar経過後に増量無しとなるように、徐々に増量値を減少させていきます。

 始動後増量(%)=water_k=(cold_start_temp[水温]-100)/cold_start_time_map[水温]*始動後の経過時間(0.1秒単位)+100

図 19 始動後増量概念図

image061.svg

図 20 始動後の増量補正量

image063.svg

図 21 始動後の増量時間

image065.svg

5.7.4.    加減速時(a_k)

吸気圧の変化量と水温により増量と増量時間を決める。

 ⊿吸気圧がa_k_plus_min:t.mar以上の場合、増量値の初期値はa_k_rpm_pres_map:map.mar*a_k_temp_v_map:map.mar/100とし、燃料噴射のたびにa_k_step:t.mar分徐々に補正無しに近付けていきます。( 図23)いままで、クランク2回転に1回吸気圧をサンプルし、直近の2個を平均して、この値を制御に使っていました。ためしにアイドルからアクセルを踏み込んで空ぶかしした場合のクランク2回転置きのサンプル値を見てみると50mmHg以上変化しているので、吸気圧どおりに燃料を噴射した場合で仮にエンジン回転数が変わらない場合と比べても1.5倍ほど燃調が合わなくなります。回転数も上がっているので2倍は合わなくなるでしょう。このことからすばやく吸気圧の変化を検出する必要があるのと、定常時は思ったより吸気圧の変動はないので移動平均を取らないようにします。吸気圧の変化が10mmHg以上で加速と判定します。思ったんですけど微分回路を経由してAD変換器に入力したらすばやく加速ができないですかねぇ。または微分回路の出力にレベル判定回路を設けて割り込みを掛けて非同期噴射を行うとか。補正しない場合より引きつきはしなくなりました。

当初はあまり気にしていなかったが、燃調が合ってくると、シフトダウンしてエンジンブレーキを掛けたときやひどいときはシフトアップをするためにアクセルを抜いたときに、バックファイヤーが生じるときがある。これは、吸気圧が低くなることにより、ガソリンの気化速度が増えるためにリッチになり、燃えきらなかったガソリンがマフラーにたまり着火し爆発するからです。パーンと結構大きな爆発音がします。後ろについている車が急に減速します。これも減速補正を掛けるパラメータは吸気圧の変化量を使用します。(H15.11.9)

 加減速による補正(%)=a_k:t.mar=(a_k_rpm_pres__k_map[エンジン回転数,吸気圧]:map.mar*a_k__temp_v_map[水温]:map.mar)/100-a_k_step:t.mar*加速補正の噴射回数

 但しa_k_step:t.marは加速時に+、減速時は-となる。補正量は、加速時は100をきった場合、減速時は100を越えると100になり、補正を終了する。

図 22 アイドルからアクセル全開にした場合の吸気圧

image067.svg

図 23 加速補正概念図

image069.svg

図 24 吸気圧に関する加減速補正

image071.svg

図 25 水温に関する加減速補正

image073.svg

5.7.5.    空燃比(af_feedback)フィードバック

O2センサの値が0.5V以上(AD変換値1024/5/2)の場合はリッチ、未満の場合はリンと判定し、リッチの場合は補正係数を1%増量、リンの場合は1%減量します。(af_step:t.mar)なお、リン→リッチあるいはリッチ→リンになった場合はストイキになったと判断して補正係数は修正しません。水温・加速・出力空燃比等の補正が掛かっている場合は補正係数を修正しません。フィードバック値は、全域に影響を与えます。

af_feedback:t.marに保存される 100で補正なし

5.7.6.    基本燃料噴射量(af_k_map)マップ自動修正機能

空燃比フィードバックの値を元に、燃調マップを修正自動的に修正していきます。

O2センサーの時定数を0.2秒とし、0.2秒前のエンジン回転数、吸気圧と現在のフィードバック値を使用します。

マップ4点の0.2秒前のエンジン回転数・吸気圧に対する比重を算定し(map_wait_calc:igmap.mar)、フィードバック係数を4点に割り振ります。燃調マップの修正量は2バイト単位のRAM上のマップ(af_k_map:igmap.mar)に保存します。マップの隣同士の値が、片方がリッチでもう片方がリンの場合など極端にマップが未完成の場合で、同じ個所の修正が続く場合は、マップの修正が進まなく、フィードバックによって空燃比が収束しません。(修正マップは1000で補正なしです。)

     kx1=(x2-x)/(x2-x1)

     kx2=1-kx1

     ky1=(y2-y)/(y2-y1)

     ky2=1-ky1

     k[x1,y1]=kx1*ky1

     k[x2,y1]=kx2*ky1

     k[x1,y2]=kx1*ky2

     k[x2,y2]=kx2*ky2

      マップの修正

map[x1,y1]=map[x1,y1]*((f-1)*0.0014k[x1,y1]+1)

map[x2,y1]=map[x2,y1]*((f-1)*0.0014k[x2,y1]+1)

map[x1,y2]=map[x1,y2]*((f-1)*0.0014k[x1,y2]+1)

map[x2,y2]=map[x2,y2]*((f-1)*0.0014k[x2,y2]+1)

 

図 26 マップ概念図

image075.svg


 

1/a f_stduy_k:t.mar(714)=0.0014

マップの修正値については、その都度RS232Cで出力されますので、別に作成したwindows上でのモニターソフトによって、修正値を保存できます。その結果を元に基本噴射量のマップを修正してください。修正ファイル名:af_k_map.csv(H15.11.9)

5.7.7.    減速時の燃料カット(a_k)

吸気管圧力が-400mmHg以下で、水温によって決められる回転数以上の場合(fuel_cut_rpm_map:map.mar)が5秒(fuel_cut_min_time:t.mar)以上継続した場合、燃料カットを行います。回転数を下回った場合は直ちに燃料噴射を開始します。

図 27 燃料カット復帰回転数

image077.svg

5.7.8.    アイドル安定化係数(idle_k)

エンジンが、空気を吸い込むとサージタンクの中の空気が少なくなり、回転が落ちる、するとサージタンクの空気が増えてきて回転が上がる。吸気圧で制御をしているDジェトロの場合、これによりハンチングを起こす。よって、1秒後との回転数の変動を検出して燃料噴射量を調整している。idle_k_map[⊿rpm]:map.mar

図 28 アイドル安定化係数

image079.svg

5.7.9.    始動時の燃料噴射(start_temp_k)

始動時( 600rpm以下)では、噴射量はengin_start_inj_val * 始動時水温補正

inj_start_temp_map[水温]:map.mar/100となります。

 

図 29 始動時燃料増量

image081.svg

5.7.10. 空燃比補正マップ( af_con出力空燃比)

高回転時および高出力時に空燃比を補正するマップです。147でストイキジオメトリです。af_map[エンジン回転数,吸気圧 ]:map.mar

 

噴射開始時期(inj_on_d)は、二次元マップinj_start_map[エンジン回転数]:map.marによって角度が決められます。

5.7.11. 噴射開始時期

噴射開始時期のタイマー設定値は、inj_on=grb2+クランク1回転の時間(1/64ms単位)*inj_on_d/360

噴射終了時期はinj_off=inj_on+噴射量

図 30 噴射開始時期

image083.svg

5.8.     LCD表示

ハードウェアは、秋月マザーボードの液晶のR/WがGNDに接続されているためこれをカットし、P3-6に接続しました。これにより液晶のR/Wが制御でき、コマンド終了を検出できるのでプログラムが高速に動作します。

R/Wを制御しない場合、ウェイトを何箇所かかける必要があり、それを合計すると5.122ms+0.109ms*33=8.719msのウェイトが掛かっています。このウェイト処理中に割り込み禁止の状態にしておくと1/8.719ms=115Hzまでの割り込みしか受け付けなくなります。したがってitu1では割り込み禁止状態を最小限にするため表示ルーチンは割り込み許可状態で実行します。

Wait方式       10+6+(6+4)*8192+10+10=81956 1/16MHz*28036=5.122ms

R/Wチェック方式 10+6+(6+4)*170+10+10=17361/16MHz*1736   =109μs

R/Wを制御しない秋月に付属のプログラムは、LCDが処理中であるかどうかをチェックする変わりに規格上の最大のwaitをかけて動作をさせています。液晶表示を間欠いれず更新することはないので液晶表示の間にほかの処理をしていますのでwaitが必要ない場合がほとんどです。またe信号を発生させる微妙なタイミングのためにwaitが入っていますが、命令フェッチの時間を入れれば規格上余裕がありますのでできるだけ削除しました。これはCPUクロックが16MHz動作の場合なのでオーバークロックで動作させる場合は調整が必要かもしれません。

コマンド処理中は busyフラグをみればわかりますので、新たに液晶に書き込むときはこのフラグをチェックしてから書き込むことにします。表示のときはlcd_out4を呼び出しますのでこの先頭でこのフラグをチェックします。(1の場合は書き込めない)チェック中はr/wをhiにし、ポート3の0~3bitを入力にする必要があるのでそのときは入力に切り替えます。キットではr/wはGNDに接続されているのでこれを空いている

P3-6(CN3-13)に接続します。(ランドを2箇所カッターで切り電線でDB0(7)~DB3(10)をGNDに接続します。R/wとDB0~DB3はランドを共有している。) 配線を変えても初期化時はr/w=0なので従来のプログラムもそのまま使えます。なお、初期化ルーチンの一部は液晶のマニュアルより4msのwaitを入れています。waitを入れなくてもたまたま動くこともありますがたまに起動時に液晶表示がおかしくなります。

 これらの改良により初期化+表示を10,000回した場合で比較した場合130倍のスピードアップが図れました。32文字表示するのに1.5msほどです。

プログラムは lcd.marです。 lcd_initが初期化lcd_dispがer1で示される文字列を表示

lcd_cg_ramがユーザ定義文字を登録するサブルーチンです。

液晶に表示される内容はS1~S4のスイッチで切り替えができ、スイッチを操作するたびに下記の順番で切り替わります。

図 31 LCD表示項目

image085.svg

5.9.     馬力とトルク表示

5.9.1.    基本公式

加速力

image087.svg

a:加速度(m/s2)

空気抵抗(無風時)

転がり抵抗

image089.svg

W:車重(人も含む)μ: 転がり抵抗係数

平坦な舗装路 0.01

空気抵抗

image091.svg

Cd:空気抵抗係数D:自動車の横断面積 V:車速

P:気圧(mb)

image093.svg

ρ:空気密度

登坂抵抗

image095.svg

θ :勾配 0の時が水平θを検出するのは難しい V:車速

エンジン出力

image097.svg

 

エンジン馬力

image099.svg

T:エンジントルクrpm:エンジン回転数

駆動力

image101.svg

T:エンジントルクi:総合減速比 R:回転有効半径 e:伝達効率

5.9.2.    走行性能曲線より

 走行性能曲線(別添 4)があればF4=0とするとF3は車速に関係なく一定であり、曲線では0km時点での走行抵抗を読めばわかります。

読値が F2=13.10065kgなのでW=890とするとμ=0.01472舗装路と考えた場合少し悪いような気がする。

 F3は速度の2乗に比例します。F3を読み取りDはCADで面積を算定すればCdも算出されます。

25℃の時のρ=1.13459519168137

140km/h(38.88889m/s)   D=1.524089Cd=0.053832

 車速 V1と t 秒後のV2より a=(V2-V1)/t となりFkが算出できればTがでます。TよりPSが算出できます。

たとえば20kmより35.5kmに1秒で加速した場合、a=(35.5-20)/3.6/1=4.305556

image103.svg

image105.svg

image107.svg

image109.svg

image111.svg

e=1と仮定 エンジントルクと駆動力を曲線より読めば算出できます。ギアごとに異なります。

image113.svg

走行性能曲線での読み取り値との比がeとなります。

風や舗装の状況、路面の勾配等、車重量等 正確に決まらない項目が多いので絶対的な馬力を算出するには目安程度と考えていただきたい。

ただし、同じ道路で馬力の変化を比較すればチューニングには有効な手段となりうる。たとえば添加剤を入れた場合等。

車の重量は装備品と人の重さとガソリン量により絶えず変わるのでタコメータに重量を入力できる機能が必要である。

5.9.3.    空気抵抗、転がり抵抗の数を実測するには(走行性能曲線)がない場合

ある程度のスピードで走行しているときギアをニュートラルにした場合、車は減速していく。そのときの減速させる力は空気抵抗と転がり抵抗と駆動系の摩擦です。よってこれらのデータがたくさん得られればCd*D,W*μは近似できる。

 

5.10.  パソコンにログを出力

RS232Cによって、各種計測値・制御値を出力します。

パソコン上で計測データが確認または保存できるようにRS232C経由で0.2秒おきに計測値を送信します。出力データを少なくするためにバイナリー形式で出力します。よってデータはハイパーターミナルでは確認できません。C++で作成されたWINDOWS上で動く専用ソフトを使えば、確認およびCSV形式でのファイル保存が可能です。下図が専用ソフトの起動後の画面です。

シリアル出力は、scr.mar内のsci_init1で38400bpsに初期化し、sci_out_str1で送信文字列をFIFOにセットします。sci_out_str1はFIFOにデータをセットし終わると直ちにリターンします。実際の送信は割り込みによって自動的に行われます。

送信フォーマットは、 t.mar内のitu_i1_bin_sci_outを見ればわかると思います。wordおよびlong

wordの出力は86形式にあわせるためlowバイトから出力しています。(swap16,swap32:t.mar)

H8からの送信データを受信するプログラムは、C++Builder5.5

コマンドラインツール(フリー)を使用して作成しています。送信データをテキスト形式に変換して、カレントフォルダーに保存しますファイルはrs232c.csvでありCSV形式なのでExcelで見ることが可能です。

起動時の画面

図 32 WINDOWS版エンジンモニター

  燃料噴射量の学習機能による補正量の表示画面 このマップは終了時にaf_k_map.csvファイルに保存されます。画面を見れば学習されている場所が一目瞭然です。

図 33 燃料修正マップの表示

プログラムの説明

  ウインドウプロシージャー:WndProcとrs232cの処理を別スレッドで処理するrs232cからなっています。

  rs232cはWndProcの初期化時に起動され、rs232cの受信をスケジュールして待機しています。受信データがそろったらWndProcを呼び出します。0.2秒おきのエンジン回転数や吸気圧などの定時受信データと、空燃比修正マップの値を受信する場合の2パターンあり、データのフォーマットは下記のとおりです。プログラムはWIN32APIで作成されています。

  ★0.2秒おきのエンジン回転数や吸気圧などの定時受信データ

  0xffffffff,I,I,b_hour,b_min,b_sec,b_ss,rpm,km,MT,water,pres,o2v,ig_btdc,ig_len,inj_start,inj_len,

  af_feedback,water_k,cold_start_k,start_temp_k,a_k,af_con,a_ig_k,std_inj,af_k,idle_k,idle_k_ig,ig_k,a_k,af_con,af_ig_k,std_inj,af_k,idle_k,idle_k_ig

  ★空燃比修正マップの値を受信

  0xffffffff,K,K,エンジン回転数,吸気圧,マップ左上,マップ右上,マップ左下,マップ右下

  パターンにあわせてメッセージを変えています。

  メーター表示は、METERクラスにて行っています。

機能の切り替え

H8マザーボードのディップスイッチで各種の設定ができます。

      S2機能

      OFFマップの修正をしない

      ONフィードバックを使用して燃調マップを修正する。

      S3機能

      OFFクランクテスト信号を出力しない。

      ONクランクテスト信号を出力する。

 

     S4機能

      OFF燃調の学習制御をoffにする。

      ON燃調を理論空燃比になるように学習制御する。

 

     S5機能

      OFFセンサ入力で制御する。

      ON吸気圧、O2センサの値は、任意に設定された値を使用する。

      S6機能

      OFF燃調・点火時期をH8/3048で制御する。

      ON燃調・点火時期は純正ECUの信号をそのまま出力する。

 

     S7機能

      OFF減速時燃料カットを行なわない

      ON減速時燃料カットを行う

 

イグニッション・インジェクター信号簡易モニター

各信号が入力されるたびに割り込み処理によってledを点滅させます。

     S8機能

      OFFLED1:クランク角センサーLED2:空燃比がリッチ/ストイキ・リン

      ONLED1:インジェクションLED2:車速センサー

 

5.11.  配線図

明示のない個所については秋月マザーボードの配線どおりである。

図 34 配線図

image119.svg

 

5.12.  IOマップ

図 35 IOマップ

image121.svg

5.13.  プログラムリスト

エンジン制御プログラム H15.11.23版t.lzh

エンジン状態表示プログラム H15.11.23版  c.lzh Borland C++ 5.5コマンドラインフリー版 makefileはd:\borland\bcc55にBorland

  C++がインストールされていると仮定しています。

  Microsoft Visual C++ 5.0  プロジェクトにCOMCTL32.LIBを加えるとコンパイルできます。

配線図 Dxfデータ cir.lzh PDF版 cir.pdf