無保証!

とりあえず、ROMの中身を見てみましょう。
左の画像は、RA-STi.Ver1のECU(マーキングSB)に載せられたROM(27C1028)からデータを採取したものです。 またROMのデータの配置は型式やグレードで違うことも多いので参考程度にして下さい。

※普通のECUには27C1028は載っていないので捜さないで下さい...。
※著作権の観点からJPEGにしてあります。(笑)


M37791のメモリ空間8000h〜FFFFhのデータを、 1byteづつ 256段階のグレースケールで表現していて 横方向に16byte分、縦に256段積んだものを左から8列に並べた 視覚化ダンプリスト(笑)です。

ここでは8000h〜8FFFhに連続的な濃度パターンが見てとれると思います。
このことから大まかにですが、
8000h〜8FFFhは、ほぼデータ領域
9000h〜FFFFhは、プログラム領域 と推測できます。







データ領域を拡大してみます。
マップがわかりやすいようにγ補正もしてあります。 理論空燃比定数 エアフロテーブル 燃料補正マップ用回転数テーブル 燃料補正マップ用負荷テーブル 燃料補正マップ エンジン回転数リミッタ 点火時期MAP用回転数テーブル 点火時期MAP用負荷テーブル 点火時期MAP 空燃費フィードバックフラグ 速度リミッタ 点火時期補正MAP 基本噴射量リミッタ ブースト圧リミッタ 目標ブースト圧MAP用回転数テーブル 目標ブースト圧MAP用スロットルテーブル 目標ブースト圧MAP 最大デューティMAP用回転数テーブル 最大デューティMAP用スロットルテーブル 圧力センサ故障判定値 理論空燃比定数 (2byte,x1)
インジェクタ無効噴射時間 (2byte,x1)
エアフロー - 空気量変換テーブル (2byte,x64)
燃料補正マップ用回転数テーブル (1byte,x16)
燃料補正マップ用負荷テーブル (1byte,x16)
燃料補正MAP (1byte,16x16)
エンジン回転数リミッタ (2byte x5?)
点火時期マップ用回転数テーブル (1byte,x16)
点火時期マップ用負荷テーブル (1byte,x16)
点火時期MAP (1byte,16x16)
空燃費フィードバックフラグ (1byte,x1)
車速リミッタ (1byte,x3)
点火時期補正MAP (1byte,16x16)
基本噴射量によるリミッタ (1byte,x16)
ブースト圧リミッタ (1byte,x8)
目標ブーストMAP用回転数テーブル (1byte,x8)
目標ブーストMAP用スロットル開度テーブル (1byte,x8)
目標ブーストMAP (1byte,8x8)
最大デューティMAP用回転数テーブル (1byte,x8)
最大デューティMAP用スロットル開度テーブル(1byte,x8)
最大デューティMAP (1byte,8x8)
圧力センサ故障判定値 (2byte,x2)



理論空燃比定数(800ah ,2byte)

エアフローメーターで得られた空気質量から理論空燃比を計算する為の定数です。 燃料インジェクターや燃圧、エアフローテーブル等を変えた時に変更する必要があります。
以下のデータも同様ですが、2byteのデータはビッグエンディアンですので 下位/上位バイトを入れ換えて読む必要があります。


インジェクタ無効噴射時間(801ch, 2byte)

燃料インジェクターを変更した場合には理論空燃比定数の他にも、インジェクターのソレノイドの作動遅れの無効噴射時間を変更する必要がある。(1us/bit位か?) また作動原理としてはソレノイドなので作動電圧にかなり依存する部分があり、1Vあたりの補正係数が(801ah, 2byte)も用意されている。
計算式としては(801ch)のデータは14V時のデータとなっているようなので、 無効噴射時間 = (801ch) - (801ah) x (Vb - 14) / 256
となるようだが、実際にデータをいじったわけではないので未検証! (Vb: バッテリ電圧)


エアフロー - 空気量変換テーブル(8080h, 2byte x64)

このテーブルは2byteデータ、64個で構成されています。 エアフローメーターから出力される電圧値をマイコンでA-D変換して、 その値から空気質量に変換する為のテーブルです。
エアフローメーターの出力が非線形なので(下記参照)、このテーブルで補正しているわけですね。 データ精度、テーブルの大きさから、電子制御エンジンの"キモ"なのがわかります。


燃料補正MAP用回転数テーブル(8100h,1byte x16)

このテーブルは1byteデータ、16個で構成されており、燃料補正マップの縦軸を構成しています。 値は 50rpm/bitです。
しかし純正のデータでは、7000rpm迄しか用意されていないようで... (もちろん7000rpmを越えても端のデータが使い続けるだけで 特に支障はないですが) STiのエンジンで7000rpm迄しか用意されていないのは非常に勿体無い! せめて7500rpm位まで準備したら、上の廻りが変わって来るはず。 もっとも自分の車では重たいHLAのせいか、バルブが飛び始めるので 7400rpmにレブリミットを設定しています。(泣)

燃料補正MAP用負荷テーブル(8110h,1byte x16)

このテーブルは1byteデータ、16個で構成されており、燃料補正マップの横軸を構成しています。
ちょっとしたブーストアップ程度では問題無いですが、 タービンやカム等を変更したり、ヘッド廻りをいじった場合には テーブル、及びMAPの拡張が必要になります。
拡張と言っても、本当にマップサイズを変更してしまうとプログラム領域の 変更やデータ領域の確保など大変なので、今までのデータを負荷方向に圧縮してやり、 空いた領域に高負荷用の燃料補正MAPを書けば良いです。 (ここでは負荷とかいてますが、実際には燃料噴射時間(128us/bit位?)です)

燃料補正マップ(8120h,1byte 16x16)

燃料補正マップは基本空燃費に対して、エンジン回転数や負荷によって 補正を加える為の 16x16の大きさをもつ2次元マップです。 マップは16x16と荒いですが、これは基本の噴射量はきっちり計算してあり、 それに対して補正をかけるからであっていい加減な訳ではありません。 また線形補間されているので、マップが荒いことによる問題は体感することは 不可能と思われます。

かなり凸凹してますが、負荷、回転数が上昇すると燃料を増量させている事が見てとれます。
横軸が負荷、縦軸がエンジン回転数(50rpm単位)で実際の設定空燃比は、 14.7 x (MAP値 - 80H) / 80hとなります。つまりOffset 80hで理論空燃比、 それ以下だと薄くて、以上だと濃くなります。
しかしノーマルのマップでは、7000rpm位までしか用意されていなかったりして...


このマップを変更する上での注意点は、
  • 低回転/低負荷域では触媒の機能を保つため理論空燃比に近い値をとるようにする。 実際にはO2センサーを用いた理論空燃比付近へのフィードバックを行っている ので、少々はいじっても問題は無いが変な補正値を憶え込んでしまいます。
  • 理論空燃比でいつも調子が良ければ常時フィードバックすればいいのですが、 実際には[より]出力が出る空燃比は別にあって、12〜13あたり(出力空燃比)になるようです。 さらにターボ車でエンジン保護の為にガソリンの気化熱を利用するガソリン冷却を 行うと、10あたりもあり得るわけで...。
    (ここらへんはA/F、排気温度計とにらめっこして決めましょう)



エンジン回転数リミッタ(8466h,8468h,846ah,846ch,8470h、各2byte)

回転数リミッタは2byteのデータ4つ(8466h,8468h,846ah,846ch)で構成されていて、 段階的に燃料カットを行うようになっています。また8470hには8466hと同様にリミッタをかけるための初期条件が設定されています。設定値はたとえば3c18hだと10進で18384となりますが、120,000,000をこの2byteデータで除算すると約7800rpmの回転数が設定されます。
この変更は車両の仕様や状態を見極めて設定しましょう。自車の場合は引き下げてます。(泣)


点火時期MAP用回転数テーブル(84d0h, 1byte x16)

このテーブルは1byteデータ、16個で構成されており、点火時期マップの縦軸を構成しています。 値は 50rpm/bitです。
燃料補正用MAPと同じく純正のデータでは、7000rpm迄しか用意されていないので 拡張してやった方が良さそうです。

点火時期MAP用負荷テーブル(84e0h, 1byte x16)

このテーブルは1byteデータ、16個で構成されており、点火時期マップの横軸を構成されています。
これも燃料補正マップの負荷テーブルと同じです。

点火時期マップ(8500h, 1byte 16x16)

点火時期マップは、その名のとおり回転数や負荷によって基本点火時期を決定する為の 16x16の大きさをもつ2次元マップです。

値がそのまま進角(1°CA/bit)になっていて回転数が上がると点火時期を進め、 負荷が上がる程点火時期は遅らせているのが見て取れます。 基本的にこのマップではレギュラーガソリンに対応しているようです。

このマップを変更する上での注意点、
  • 負荷が上がると異常燃焼が発生しやすくなるので点火時期は遅らせる。
  • 適正な点火時期に対し速めすぎると、異常燃焼が発生。
  • 遅くしすぎると、排気温度の上昇(実質の膨張率が下がるので)を招く。




空燃比フィードバックフラグ(8640h,1byte)

このフラグは、O2センサーによる燃料噴射量のフィードバック制御を行うかどうかを決めます。 プログラムを解析してみると、プログラム領域中にフィードバック用係数の回転数/負荷 テーブルがあったりします。ここでフィードバック領域を変更することも可能です。
自分の場合はセッティング出し用のROM以外は、基本的にO2フィードバックをONにしています。 環境にも優しいですからね。


車速リミッタ(86c7h,86c8h,86c9h,各1byte)

このデータは1バイトx3からなり、段階的に作動/復帰するようになっています。 2km/h/bitですので、180km/hリミッターだと、5bh(182km/h),5ah(180km/h),59h(178km/h)とデータが並んでいます。適当に変更しましょう。


点火時期補正マップ(87c0h, 1byte 16x16)


他に16x16のマップとしては点火時期の補正マップが存在します。 基本の点火時期に対してノックセンサーによる学習で更に点火時期を進角させる為のマップで、 これでハイオクガソリン分の進角を加えて対応しているようです。

点火時期/燃調用にレギュラ/ハイオク別々のマップをもつECUもあることを考えると 手抜きに見えなくもないが...
しかしノックセンサーのフィードバック係数を確認できるなら、 このマップだけで進角が行え、なおかつノッキングが発生した場合には 基本点火時期まで遅角されるので比較的安全に変更が出来ます。


基本噴射量によるリミッタ(88f0h, 1byte x16)

基本の燃料噴射量(=負荷)で設定値以上になると燃料カットを行うリミッタです。
自分は気にしたことが無いけど、それは最初からリミッタが外れた状態"ffh" になっていたからでした。 RA-STiは、ノーマルでこれだから全部"ffh"にしても問題は無い?
#恐るべし、RA-STi!


ブースト圧リミッタ(8918h,1byte x8)

ブースト圧で設定値以上になると燃料カットを行うリミッタです。
他のリミッタ類もそうだけど、無闇にリミッタ値を上げるのではなく 想定する使用方法によって再設定しましょう。
検証の結果、8mmHg/bit位のようです。たとえばedh=1896mmHgが設定されていると 絶対圧なのでブースト圧では1.5kg/cm^2となります。


目標ブースト圧MAP用回転数テーブル(8920h, 1byte x8)

このテーブルは1byteデータ、8個で構成されており、目標ブーストMAPの縦軸となる回転数を示しています。 値は 50rpm/bitです。

目標ブースト圧MAP用スロットルテーブル(8928h, 1byte x8)

このテーブルは1byteデータ、8個で構成されており、目標ブーストMAPの縦軸となるスロットル開度を示しています。

目標ブースト圧マップ(8940h, 1byte 8x8)

ImprezaWRXはタービンのウエストゲートで過給圧を調整しますが、 そのアクチュエーターへの配管にPWM制御のソレノイドバルブを配しており ECUでのコントロールが可能となっています。 この制御の為に、回転数とスロットルバルブ開度で決定する 8x8のマップです。

値を変化させても、実際にはそれほどの変化が無いので、 大きめの値にして下記の最大デューティマップでコントロールしたほうが レスポンスが良いようなきもするが、気のせい?... 単位は、8mmHg/bit位ですかねえ。


最大デューティMAP用回転数テーブル(8990h, 1byte x8)

このテーブルは1byteデータ8個で構成されており、最大デューティMAPの縦軸となる回転数を示しています。 値は 50rpm/bitです。

最大デューティMAP用スロットルテーブル(8998h, 1byte x8)

このテーブルは1byteデータ8個で構成されており、最大デューティMAPの縦軸となるスロットル開度を示しています。

最大デューティマップ(89a0h, 1byte 8x8)

ソレノイドバルブのPWM制御で最大のデューティー比を回転数と スロットルバルブ開度で決定する 8x8マップです。

値が大きい程、ブースト圧は上がるはず。

値を変えると結構劇的に最大ブースト圧が変化します。 余り大きく値を変えると危ないので、自制心をもって変更しましょう。(笑)

デューティ値は0.392%/bitで変化します。

アイドリング回転数テーブル1(8a60h/8a70h, 各1byte x16)

冷却水温度によるアイドリング回転数テーブルで、主に車速信号の有無での2つのテーブルを 使い分けている。おそらく停車状態と走行状態での暖気を考慮して2種類のテーブルを用意しているようだ。 また他にもクリッピングデータもあり、このテーブルの変更だけでアイドリング回転を完全にはコントロールできません。 恐らく冷却水温度は-40℃から110℃の10℃刻みで、値は12.5rpm/bitとなっている。

燃料カット回転数テーブル1(8e50h/8e60h, 各1byte x16)

電子制御エンジンではアクセルオフ時に燃料カットを行うようになっているが その燃料カットを開始する回転数は冷却水温度によるテーブルとして用意されている。 このテーブルには車速の大小で2つのテーブルを使い分けているが、 それに伴う制御はいろいろあるようなのでこのテーブル情報を元に解析してみると良い。 恐らく冷却水温度は-40℃から110℃の10℃刻みで、値は25rpm/bitとなっている。 また燃料カット後の復帰は後記の再噴射回転数で行うようになっている。

燃料カット回転数テーブル2(8e90h/8ea0h, 各1byte x16)

上記の燃料カットテーブル1と同様の機能を持っていて2段階で燃料カットお行うようになっている。 動作も同じようだ。

燃料再噴射回転数テーブル1(8e70h/8e80h, 各1byte x16)

燃料カットを行って回転数が下がってアイドリング回転に近くなるとエンジンストールを防ぐためにも燃料の再噴射を開始するためのテーブルである。
またこのほかにも8x8のマップが存在するのですが、これはA/Fセンサが故障と判断された際のフェールセーフの為のAir量推定マップのようです。(回転数とスロットル開度で推定) これをベースに16x16に拡張して、なおかつスピードデンシティとなるように制御を書き換えてやると面白いかもしれません。


Ads by TOK2