本発明に係るエンジンの燃料噴射制御装置について、好適な実施の形態を掲げ、添付の図面を参照しながら以下、詳細に説明する。
図1は、実施の形態のエンジン10の燃料噴射制御装置12の構成を示すブロック図である。自動二輪車等の車両に搭載されるエンジン10のシリンダボア14には、ピストン16が摺動可能に嵌合されている。エンジン10のシリンダヘッド18には、燃焼室20に混合気を供給する吸気管22と、燃焼室20からの排気ガスを排出する排気管24とが接続されている。排気管24には、触媒コンバータ26が取り付けられている。シリンダヘッド18には、その先端が燃焼室20に突出する点火プラグ28、吸気バルブ30、及び排気バルブ32が取り付けられている。
吸気管22には、吸気量を制御するスロットルバルブ34が開閉可能に配設されるとともに、スロットルバルブ34の上流側と下流側とを接続するバイパス通路36が設けられている。このバイパス通路36には、バイパス通路36を開閉することで、バイパス通路36を通る空気量を調整するエアスクリュー38が設けられている。このエアスクリュー38を運転者が調整することで、アイドリング(アイドル)回転数の調整が行われる。スロットルバルブ34の下流側と、吸気バルブ30との間には、燃料を噴射する燃料噴射弁40が設けられている。
制御部42は、点火プラグ28の点火タイミング、及び燃料噴射弁40から噴射される燃料噴射量等を制御する。エンジン10の燃料噴射制御装置12は、更に、スロットルバルブ34の開度(以下、スロットル開度)THを検出するスロットル開度センサ44と、ピストン16に連接されたエンジン10のクランク軸10aの回転数(以下、エンジン回転数)NEを検出するエンジン回転数センサ46と、エンジン10の冷却水の水温TWを検出する水温センサ48と、触媒コンバータ26より上流側に設けられ排気ガスに残存する酸素濃度を検出する酸素センサ50と、燃焼室20に吸気される吸気温TAを検出する吸気温センサ52とを備える。このスロットル開度センサ44、エンジン回転数センサ46、水温センサ48、酸素センサ50、及び吸気温センサ52のそれぞれの出力信号は制御部42に入力される。
図2は、エンジン10の運転領域を検索するためのマップである。制御部42は、エンジン回転数NEとスロットル開度THとに基づいて運転領域がどの領域にあるかを検索する。このマップでは、下限スロットル開度THO2L及び上限スロットル開度THO2Hと、この両スロットル開度間の複数のスロットル開度THFB0、THFB1、THFB2、THFB3とが、エンジン回転数NEの増大に応じて大きくなる。これらのスロットル開度は、THO2L<THFB0<THFB1<THFB2<THFB3<THO2H、の関係が成り立つように予め設定されている。
設定された各スロットル開度THO2L、THFB0、THFB1、THFB2、THFB3、THO2Hは、ヒステリシスを設けて設定されている。つまり、図2に示す実線は、それぞれスロットル開度THを増大させる際に適用される境界値であり、この実線に隣接する破線は、それぞれスロットル開度を減少させる際に適用される境界値である。
図3は、空燃比のフィードバック領域を示すマップである。斜線で示す空燃比のフィードバック(O2フィードバック、O2F/B)領域は、エンジン回転数NE及びスロットル開度THで表される。O2フィードバック領域は、下限回転数NLOP、アイドル領域上限回転数NTHO2L、及び上限回転数NHOPと、下限スロットル開度THO2L及び上限スロットル開度THO2Hとで定まる領域である。下限回転数NLOP、アイドル領域上限回転数NTHO2L、及び上限回転数NHOPは、エンジン回転数NEの増大側での値が実線で示され、エンジン回転数NEの減少側での値が破線で示されることでヒステリシスが設定されている。下限スロットル開度THO2L及び上限スロットル開度THO2Hは、スロットル開度THの増大側での値が実線で示され、スロットル開度THの減少側での値が破線で示されることでヒステリシスが設定されている。
図4は、図2及び図3で定められる領域を重ねることで6つに区分けされたO2フィードバック領域の各第1学習領域Aを示す第1学習値マップ54を示す。図5は、図4に示す第1学習値マップ54の模式図である。第1学習値マップ54は、O2フィードバック制御に用いられる。
この複数の第1学習領域(フィードバック領域)Aは、O2フィードバック領域を図2の運転領域に応じて6つに区分したものであり、エンジン回転数NE及びスロットル開度THで表される。複数の第1学習領域Aは、スロットル開度THに応じて6つに区分けされており、エンジン回転数NE及びスロットル開度THに基づいて、複数の第1学習領域Aを含む複数の運転領域が設定される。本実施の形態では、6つのO2フィードバック制御用の第1学習領域Aの運転領域が「1」〜「6」の番号を付されて示され、O2フィードバック領域以外の運転領域が「0」、「7」〜「11」の番号を付して示される。
「1」の第1学習領域A(以下、第1学習領域A1)は、エンジン10のアイドリング領域である。「2」の第1学習領域A(以下、第1学習領域A2)は、第1学習領域A1にエンジン回転数NEが高回転側で隣接する第1学習領域Aである。「3」の第1学習領域A(以下、第1学習領域A3)は、第1学習領域A1及び第1学習領域A2にスロットル開度THの高開度側で隣接する第1学習領域Aである。「4」の第1学習領域A(以下、第1学習領域A4)は、第1学習領域A3にスロットル開度THの高開度側で隣接する第1学習領域Aである。「5」の第1学習領域A(以下、第1学習領域A5)は、第1学習領域A4にスロットル開度THの高開度側で隣接する第1学習領域Aである。「6」の第1学習領域A(以下、第1学習領域A6)は、第1学習領域A5にスロットル開度THの高開度側で隣接する第1学習領域Aである。
図6は、オープンループ領域の各第2学習領域Bを示す学習値マップである第2学習値マップ56の模式図である。第2学習値マップ56は、O2フィードバック制御を行うことができないオープンループ制御を行う所定の運転(本実施の形態では、リーン化運転)時に用いられる。リーン化運転は、燃費を抑えるべく空燃比を理想空燃比(14.7)よりも高くした(例えば、空燃比は16〜18)運転(低燃費の運転)のことをいう。図6においては、分かり易くするために、第2学習値マップ56を2点鎖線の第1学習値マップ54に重ねて表示している。スロットル開度TH及びエンジン回転数NEがオープンループ領域(以下、リーン化領域)内に入ると、原則としてオープンループ制御(以下、リーン化制御)を実行することでリーン化運転を行う。
この複数の第2学習領域Bは、リーン化領域を4つに区分したものであり、エンジン回転数NE及びスロットル開度THで表される。リーン化領域は、第1学習値マップ54の領域内、つまり、O2フィードバック領域内に設定されている。リーン化領域を4つに区分けした複数の第2学習領域Bは、エンジン回転数NEの幅が、第1学習値マップ54よりも狭く設定されている。
複数の第2学習領域Bは、第1学習領域A2内に設定される第2学習領域B(以下、第2学習領域B2)と、第1学習領域A3内に設定される第2学習領域B(以下、第2学習領域B3)と、第1学習領域A4内に設定される第2学習領域B(以下、第2学習領域B4)と、第1学習領域A5内に設定される第2学習領域B(以下、第2学習領域B5)とを有する。
第2学習領域B2においては、エンジン回転数NEの幅は、対応する第1学習領域A2よりも狭く、且つ、スロットル開度THは、エンジン回転数NEが低回転側では第1学習領域A2の幅と同じだが、高回転側になるにつれ第1学習領域A2の幅に対して狭くなる。詳しくは、第2学習領域B2においては、スロットル開度THが大きくなる程、エンジン回転数NEの幅が広がるものであり、エンジン回転数NEが高くなる程、スロットル開度THの下限が大きくなる。第2学習領域B3においては、エンジン回転数NEの幅は、対応する第1学習領域A3よりも狭く、且つ、スロットル開度THは、第1学習領域A3と同じ幅である。第2学習領域B4においては、エンジン回転数NEの幅は、対応する第1学習領域A4よりも狭く、且つ、スロットル開度THは、第1学習領域A4と同じ幅である。第2学習領域B5においては、エンジン回転数NEの幅は、対応する第1学習領域A5よりも狭く、且つ、スロットル開度THも、第1学習領域A5よりも狭い。詳しくは、第2学習領域B5においては、スロットル開度THの上限が第1学習領域A5よりも低く設定されている。第2学習領域B2は、スロットル開度THが低開度側の第2学習領域Bであり、第2学習領域B5は、スロットル開度THが高開度側の第2学習領域Bである。
図7は、制御部42の構成を示すブロック図である。制御部42は、基本噴射量算出部60と、O2フィードバック部62と、図4〜図6に示す第1学習値マップ54及び第2学習値マップ56を有する学習値マップ64と、揮発性メモリ66と、不揮発性メモリ68と、燃料噴射量算出部70とを備える。
基本噴射量算出部60は、噴射量マップ80を有する。噴射量マップ80には、スロットル開度THとエンジン回転数NEに応じた基本噴射量TIMBが記憶されている3次元マップである。この基本噴射量TIMBは、理想空燃比が得られるように、シミュレーション又は実験等によって予め設定されている。
図8は、噴射量マップ80の一例を示す図である。図8においては、エンジン回転数NEが所定回数の時の基本噴射量TIMBを示している。図8に示すように、スロットル開度THが大きくなるほど、基本噴射量TIMBも増加する。
基本噴射量算出部60は、スロットル開度センサ44が検出したスロットル開度TH及びエンジン回転数センサ46が検出したエンジン回転数NEに応じた基本噴射量TIMBを噴射量マップ80から取得することで、基本噴射量TIMBを算出する。この基本噴射量TIMBは燃料噴射弁40が開いている時間で表すことができる。
O2フィードバック部62は、現在のスロットル開度TH及びエンジン回転数NEがO2フィードバック領域内の場合に、空燃比を理想空燃比(ストイキオメトリー)に近づけるような補正係数を算出する。O2フィードバック部62は、リッチリーン判定部82と係数算出部84とを有する。リッチリーン判定部82は、酸素センサ50の出力信号に基づいて排気ガスのリッチ又はリーンを判定する。
係数算出部84は、フィードバック補正量算出部84aと、学習値算出部84bとを有する。フィードバック補正量算出部84aは、現在のスロットル開度TH及びエンジン回転数NEがO2フィードバック領域内の場合に、リッチリーン判定部82の判定結果に基づいてフィードバック補正量としてのKO2及びその平均値であるKO2aveを算出する。この算出されたKO2及びKO2aveは、揮発性メモリ66に記憶される。
学習値算出部84bは、現在のスロットル開度TH及びエンジン回転数NEがO2フィードバック領域内の場合に、KO2に応じてKBUを算出するとともに、KBUave(第1学習値)を算出する。学習値算出部84bは、現在のスロットル開度TH及びエンジン回転数NEがO2フィードバック領域内で、且つ、リーン化領域内の場合は、KBULEAN(第2学習値)を算出する。このKBUaveは、O2フィードバック制御用のKBUの平均値であり、KBULEANは、リーン化制御用のKBUの平均値である。
この算出されたKBU、KBUave、及び、KBULEANは、揮発性メモリ66に記憶される。不揮発性メモリ68には、KBULEANが記憶される。このKO2及びKBUaveは、O2フィードバック制御中の燃料噴射量TOUTの算出の際に使用される補正係数であり、空燃比を理想空燃比(ストイキ)に近づけるためのものである。
揮発性メモリ66は、図9に示すように、KO2が記憶されるKO2記憶部90と、KO2aveが記憶されるKO2ave記憶部92とを有する。また、揮発性メモリ66は、第1学習領域A1〜第1学習領域A6のKBU(以下、KBU1〜KBU6)を記憶するKBU1記憶部94、KBU2記憶部96、KBU3記憶部98、KBU4記憶部100、KBU5記憶部102、及びKBU6記憶部104を有する。
また、揮発性メモリ66は、第1学習領域A1〜第1学習領域A6のKBUave(以下、KBUave1〜KBUave6)を記憶するKBUave1記憶部106、KBUave2記憶部108、KBUave3記憶部110、KBUave4記憶部112、KBUave5記憶部114、及びKBUave6記憶部116を有する。
また、揮発性メモリ66は、第2学習領域B2〜第2学習領域B5のKBULEAN(以下、KBULEAN2〜KBULEAN5)を記憶するKBULEAN2記憶部118、KBULEAN3記憶部120、KBULEAN4記憶部122、及びKBULEAN5記憶部124を有する。この上記各記憶部(90〜124)には、最新の値のみが記憶されている。
フィードバック補正量算出部84aは、リッチリーン判定部82の判定結果が切り換わった場合(リッチからリーンになった時、リーンからリッチになった時)に、KO2を算出する。フィードバック補正量算出部84aは、算出したKO2を揮発性メモリ66のKO2記憶部90に上書きして記憶することで、KO2を更新する。なお、外部環境(温度、気圧、及び湿度等)と運転状態とが一定で、空燃比が理想空燃比近傍にある状態のときには、リッチリーン判定部82の判定結果は略周期的に切り換わる。
また、フィードバック補正量算出部84aは、KO2の算出タイミングにて所定回数前までに算出したKO2(例えば、今回と前回と前々回の計過去3回分のKO2)のKO2aveを算出する。フィードバック補正量算出部84aは、算出したKO2aveを揮発性メモリ66のKO2ave記憶部92に上書きして記憶することで、KO2の算出の度にKO2aveを更新する。
学習値算出部84bは、リッチリーン判定部82の判定結果が切り換わったときに、第1学習値マップ54を用いて、スロットル開度センサ44及びエンジン回転数センサ46が検出したスロットル開度TH及びエンジン回転数NEで特定される第1学習領域Aを参照し、参照した第1学習領域AのKBU(KBU1〜KBU6のいずれか1つ)を算出して更新する。
このKBUの算出は、KO2ave記憶部92に記憶されているKO2aveの基準値に対する変動分(KO2ave/基準値)と、現在のスロットル開度TH及びエンジン回転数NEで特定される第1学習領域Aの現在のKBUとを乗算することで新たなKBUを算出する。学習値算出部84bは、この算出されたKBUを揮発性メモリ66に記憶することで、KO2の算出の度にその時点におけるスロットル開度TH及びエンジン回転数NEで特定される第1学習領域AのKBUを更新する。
例えば、現在のスロットル開度TH及びエンジン回転数NEで特定される第1学習領域Aが第1学習領域A2の場合は、学習値算出部84bは、KO2ave記憶部92に記憶されているKO2aveの基準値に対する変動分(KO2ave/基準値)と、KBU2記憶部96に記憶されているKBU2とを乗算して新たなKBU2を算出する。この新たに算出されたKBU2は、KBU2記憶部96に上書きして記憶する。
学習値算出部84bは、現在のスロットル開度TH及びエンジン回転数NEで特定される第1学習領域AのKBUを算出すると、当該第1学習領域AのKBUの平均値であるKBUaveを新たに算出する。このKBUaveは、所定回数前までに算出した同じ第1学習領域AのKBUの平均値(例えば、今回と4回前までの計過去5回分のKBUの平均値)を算出することで求めることができる。学習値算出部84bは、算出したKBUaveを揮発性メモリ66に記憶する。これにより、KBUの算出の度にその時点におけるスロットル開度TH及びエンジン回転数NEで特定される第1学習領域AのKBUaveを更新する。
例えば、現在の運転領域に応じた第1学習領域Aが第1学習領域A2の場合は、学習値算出部84bは、第1学習領域A2の過去所定回数分のKBU2の平均値であるKBUave2を算出し、KBUave2記憶部108に該算出したKBUave2を上書きして記憶する。
学習値算出部84bは、現在のスロットル開度TH及びエンジン回転数NEが第1学習領域A内に設定された第2学習領域B内にある場合は、第2学習領域BのKBUの平均値であるKBULEANを算出する。つまり、スロットル開度TH及びエンジン回転数NEが第2学習領域B内にあるときに算出されたKBUの平均値であるKBULEANを算出する。このKBULEANは、スロットル開度TH及びエンジン回転数NEが第2学習領域B内にあるときに算出されたKBUであって、所定回数前までに算出した同じ第2学習領域B内のKBU(例えば、今回と前回と前々回の計過去3回分のKBU)の平均値を算出することで求めることができる。学習値算出部84bは、算出したKBULEANを揮発性メモリ66に記憶する。これにより、スロットル開度TH及びエンジン回転数NEが第2学習領域B内のときにKBUが算出される度に、その時点における該第2学習領域BのKBULEANを更新する。
例えば、現在のスロットル開度TH及びエンジン回転数NEが第1学習領域A2内で、且つ、第2学習領域B2内にある場合は、学習値算出部84bは、スロットル開度TH及びエンジン回転数NEが第2学習領域B2内にあるときに算出された、過去所定回数分のKBU2の平均値であるKBULEAN2を算出する。この算出されたKBULEAN2記憶部118に記憶される。
KBULEANが更新される場合は、スロットル開度TH及びエンジン回転数NEは、当然にO2フィードバック領域内にあるので、KBUaveも更新される。つまり、スロットル開度TH及びエンジン回転数NEが第1学習領域A内にあり、且つ、第2学習領域B内にある場合は、当該第1学習領域Aの、KBU、KBUaveが更新されるとともに、当該第2学習領域BのKBULEANも更新される。なお、スロットル開度TH及びエンジン回転数NEが第1学習領域A内にあり、第2学習領域B内に無い場合は、第1学習領域AのKBU、KBUaveのみが更新される。
燃料噴射量算出部70は、燃料噴射弁40から噴射される燃料噴射量TOUTを算出する。詳しくは、燃料噴射量算出部70は、スロットル開度TH及びエンジン回転数NEがO2フィードバック領域内にある場合であって、リーン化運転が行われていない場合は、(1)式によって、燃料噴射量TOUTを算出する。
TOUT=TIMB×KO2×KBUave×KTA・・・(1)
ここで、(1)式のTIMBは、基本噴射量算出部60が現在のスロットル開度TH及びエンジン回転数NEに応じて算出した基本噴射量TIMBであり、KO2は、KO2記憶部90に記憶されているKO2である。また、(1)式のKBUaveは、現在のスロットル開度TH及びエンジン回転数NEで特定される第1学習領域AのKBUaveであり、揮発性メモリ66に記憶されているものである。例えば、現在のスロットル開度TH及びエンジン回転数NEが第1学習領域A3内にある場合は、KBUave3記憶部110に記憶されているKBUave3である。(1)式のKTAは、吸気温センサ52が検出した吸気温TAに応じた吸気温補正係数KTAである。この吸気温補正係数KTAは、図示しないテーブル又はマップから取得する。なお、(1)のKO2に換えて、KO2aveをフィードバック補正量として用いて燃料噴射量TOUTを算出してもよい。
燃料噴射量算出部70は、後述するリーン化運転が可能なリーン化モード中に、スロットル開度TH及びエンジン回転数NEがリーン化領域内にある場合は、(2)式によって、リーン化制御用の燃料噴射量TOUTを算出する。これにより、リーン化運転を行うことができる。
TOUT=TIMB×KO2s×KBULEAN×KTA×KLEAN・・・(2)
(2)式のTIMB及びKTAは、(1)式と同様である。(2)式のKO2sは、リーン化運転中のようにKO2が算出できない場合に代わりに用いられるKO2の標準値であり、予め決められた係数である。このKO2sは、図示しないメモリに記憶されている。(2)式のKBULEANは、現在のスロットル開度TH及びエンジン回転数NEで特定される第2学習領域BのKBULEANであり、揮発性メモリ66に記憶されているものである。例えば、現在のスロットル開度TH及びエンジン回転数NEが第2学習領域B3内にある場合は、KBULEAN3記憶部120に記憶されているKBULEAN3である。(2)式の、KLEANは、スロットル開度TH及びエンジン回転数NEに応じて変動するリーン化制御用の係数であり、燃料を薄くするための係数(例えば、0.8等)である。
O2フィードバック制御を行うことができないリーン化制御の場合は、KO2及びそのKO2aveと、KBU、KBUave、KBULEANとが逐次更新されないので、リーン化制御中は、リーン化制御に入る前のKBULEANがそのまま使用されることになる。
燃料噴射量TOUTは燃料噴射弁40が開いている時間で表すことができ、算出された燃料噴射量TOUTで表される時間の間燃料噴射弁40が開くことで、燃料噴射弁40から燃料が噴射される。
なお、O2フィードバック制御とは、スロットル開度TH及びエンジン回転数NEがO2フィードバック領域内であって、且つ、リーン化運転が行われていない状況下で、KO2、KO2ave、KBU、及びKBUaveを更新していき、更新したKO2及びKO2aveを用いて、燃料噴射量TOUTを算出する処理を行う一連の制御のことをいう。後述するリーン化モード中を除き、このO2フィードバック制御中に、KBULEANも更新されていく。
このように、本実施の形態では、第1学習値マップ54と別に、第1学習値マップ54内に設定され、且つ、エンジン回転数NEの幅が第1学習値マップ54よりも低く設定されている第2学習値マップ56を設けている。この第2学習値マップ56の第2学習値マップ56の各第2学習領域Bのエンジン回転数NEの幅は、対応する第1学習値マップ54の第1学習領域Aよりも狭く設定されている。
ここで、同じ第1学習領域A内のKBUaveであっても、エンジン回転数NEが高回転側と低回転側とで算出されるKBUaveの値には、大きな差が生じてしまう可能性がある。例えば、第1学習領域A3であって、図5のP31で示される点(エンジン回転数NEが低回転側)で学習されるKBUによるKBUaveと、P32で示される点(エンジン回転数NEが高回転側)で学習されるKBUによるKBUaveとには差がある場合が多い。
しかしながら、第2学習領域Bのエンジン回転数NEの幅は第1学習領域Aに比べ狭いので、同じ第2学習領域B内のエンジン回転数NEが高回転側と低回転側とで算出されるKBULEANの差を、KBUaveの場合に対して小さくすることができ、KBULEANの精度を高くすることができる。
O2フィードバック制御を行っている最中は、以前にKBUを学習した運転領域(例えばP31)が、今回の燃料噴射量算出タイミングでの運転領域(例えばP32)と異なっていても、KO2の算出の度に、KBUave等も逐次更新されていくので、上記(1)式によって算出される燃料噴射量TOUTに与える影響は少ない。これに対して、リーン化制御の場合は、KBUave及びKBULEAN等は更新されない。そのため、揮発性メモリ66に記憶されている第1学習値マップ54のKBUaveが低回転側で算出されたものである場合に、現在のエンジン回転数NEが高回転側になると、揮発性メモリ66に記憶されているKBUaveとのズレが大きくなってしまう可能性がある。
従って、リーン化制御中には、第1学習値マップ54のKBUaveに換えて、第2学習値マップ56のKBULEANを用いる。これにより、揮発性メモリ66に記憶されている第2学習値マップ56のKBULEANが低回転側で算出されたものである場合に、現在のエンジン回転数NEが高回転側になったとしても、揮発性メモリ66に記憶されているKBUaveとのズレを小さくすることができる。その結果、適切な燃料噴射量TOUTを算出することができる。
なお、第1学習領域A5に関しては、アクセル開度の低開度側と高開度側とで算出されるKBUaveの値にも比較的大きな差が生じる可能性がある。例えば、図5のP51で示される点(スロットル開度THが低開度側)で学習されるKBUによるKBUaveと、P52で示される点(スロットル開度THが高開度側)で学習されるKBUによるKBUaveには差がある場合が多い。従って、第2学習領域B5では、スロットル開度THの上限が第1学習領域A5よりも低く設定している。これにより、同じ第2学習領域B5内のスロットル開度THが高開度側と低開度側とで算出されるKBULEAN5の差を、KBUave5の場合に対して小さくすることができ、KBULEAN5の精度を高くすることができる。
図10は、リーン化運転が可能なリーン化モードの設定動作を示すフローチャートである。まず、制御部42は、水温センサ48が検出した水温TWが所定温度以上であるか否かを判断する(ステップS1)。
ステップS1で、水温TWが所定温度以上であると判断すると、制御部42は、燃料噴射制御装置12が搭載される車両がニュートラル状態であるか否かを判断する(ステップS2)。
ステップS2で、ニュートラル状態であると判断すると、KBUave1と、KBULEAN3、4とが学習済み、つまり、揮発性メモリ66に記憶されているか否かを判断する(ステップS3)。
ステップS3で、KBUave1と、KBULEAN3、4とが学習済みと判断すると、制御部42は、リーン化モードに設定する(ステップS4)。なお、ステップS1で、水温TWが所定温度未満と判断した場合、ステップS2で、ニュートラル状態と判断した場合、ステップS3で、KBUave1及びKBULEAN3、4のうち、少なくとも1つが未学習であると判断した場合は、リーン化モードに設定しない。
図11は、スロットル開度TH及びエンジン回転数NEがO2フィードバック領域内にある場合の、燃料噴射制御装置12の動作を示すフローチャートである。まず、制御部42は、現在リーン化モード中であるか否かを判断する(ステップS11)。
ステップS11で、リーン化モード中であると判断すると、制御部42は、スロットル開度センサ44及びエンジン回転数センサ46が検出した現在のスロットル開度TH及びエンジン回転数NEが、リーン化領域内であるか否かを判断する(ステップS12)。
ステップS12で、現在のスロットル開度TH及びエンジン回転数NEがリーン化領域内にあると判断すると、制御部42は、該スロットル開度TH及びエンジン回転数NEで特定される第2学習領域BのKBULEANが揮発性メモリ66に記憶されているか否か(学習済みであるか否か)を判断する(ステップS13)。例えば、スロットル開度TH及びエンジン回転数NEで特定される第2学習領域Bが第2学習領域B5の場合は、KBULEAN5が学習済みであるか否かを判断する。
ステップS11で、リーン化モード中でないと判断された場合、ステップS12で、現在のスロットル開度TH及びエンジン回転数NEがリーン化領域内でないと判断された場合、ステップS13で、現在のスロットル開度TH及びエンジン回転数NEで特定される第2学習領域BのKBULEANが学習済みでないと判断された場合は、ステップS14に進み、制御部42は、O2フィードバック制御を行う。
具体的には、燃料噴射量算出部70は、現在のスロットル開度TH及びエンジン回転数NEで特定される第1学習領域AのKBUaveと、KO2とを揮発性メモリ66から取得する。そして、基本噴射量算出部60が現在のスロットル開度TH及びエンジン回転数NEに応じて算出した基本噴射量TIMBに、取得したKO2及びKBUaveと、KO2現在の吸気温TAに応じて吸気温補正係数KTAとを乗算することで、燃料噴射量TOUTを算出する。つまり、上述した(1)式を用いて燃料噴射量TOUTを算出する。燃料噴射弁40は、この算出された燃料噴射量TOUTで燃料を噴射する。
一方、ステップS13で、現在のスロットル開度TH及びエンジン回転数NEで特定される第2学習領域BのKBULEANが学習済みであると判断すると、制御部42は、リーン化制御を行ってリーン化運転を行う(ステップS15)。
具体的には、燃料噴射量算出部70は、現在のスロットル開度TH及びエンジン回転数NEに応じた第2学習領域BのKBULEANを揮発性メモリ66から取得する。そして、基本噴射量算出部60が現在のスロットル開度TH及びエンジン回転数NEに応じて算出した基本噴射量TIMBに、KO2sと、取得したKBULEANと、現在の吸気温TAに応じた吸気温補正係数KTAと、リーン化制御用の係数であるKLEANとを乗算することで、燃料噴射量TOUTを算出する。つまり、上述した(2)式を用いて燃料噴射量TOUTを算出する。燃料噴射弁40は、この算出された燃料噴射量TOUTで燃料を噴射する。この(2)式で算出される燃料噴射量TOUTは、(1)式で算出される燃料噴射量TOUTに対して燃料が少ないものになり、燃料噴射弁40から噴射される燃料を少なくしたリーン化運転を行うことができる。
係数算出部84は、このO2フィードバック制御中に、少なくともKO2、KO2ave、KBU、及びKBUaveを逐次算出し、揮発性メモリ66に最新の値が記憶される。このKBUave等の更新を図12のフローチャートに従って説明する。
まず、係数算出部84は、KO2の算出タイミングが到来したか否かを判断する(ステップS21)。係数算出部84は、リッチリーン判定部82の判定結果が切り換わると(リッチからリーンになる、又は、リーンからリッチになると)KO2の算出タイミングが到来したと判断する。
ステップS21で、KO2の算出タイミングが到来していないと判断すると、到来するまでステップS21に留まり、算出タイミングが到来したと判断すると、ステップS22に進む。ステップS22に進むと、係数算出部84のフィードバック補正量算出部84aは、KO2とKO2aveとを算出して更新する。つまり、算出されたKO2が揮発性メモリ66のKO2記憶部90に上書きされ、算出されたKO2aveが揮発性メモリ66のKO2ave記憶部92に上書きされる。
次いで、学習値算出部84bは、スロットル開度センサ44及びエンジン回転数センサ46が検出した現在のスロットル開度TH及びエンジン回転数NEに基づいて第1学習領域Aを特定する(ステップS23)。言い換えるならば、現在のスロットル開度TH及びエンジン回転数NEで特定される第1学習領域Aを判定する。
次いで、学習値算出部84bは、特定された第1学習領域AのKBU、KBUaveを算出して更新する(ステップS24)。つまり、算出された第1学習領域AのKBU、KBUaveが揮発性メモリ66に上書きされる。例えば、特定された第1学習領域Aが第1学習領域A5の場合は、KBU5及びKBUave5が算出され、算出されたKBU5及びKBUave5が揮発性メモリ66のKBU5記憶部102及びKBUave5記憶部114に上書きされる。
次いで、学習値算出部84bは、現在のスロットル開度TH及びエンジン回転数NEが、ステップS23で特定された第1学習領域A内に設定された第2学習領域B内にあるか否かを判断する(ステップS25)。例えば、特定された第1学習領域Aが第1学習領域A5の場合は、現在のスロットル開度TH及びエンジン回転数NEが、第2学習領域B5内にあるか否かを判断する。
ステップS25で、スロットル開度TH及びエンジン回転数NEが、ステップS23で特定された第1学習領域A内に設定された第2学習領域B内にあると判断すると、学習値算出部84bは、第2学習領域BのKBULEANを算出して更新する(ステップS26)。つまり、算出された第2学習領域BのKBULEANが揮発性メモリ66に上書きされる。例えば、現在のスロットル開度TH及びエンジン回転数NEが第2学習領域B5内にあると判断されると、KBULEAN5が算出され、算出されたKBULEAN5が揮発性メモリ66のKBULEAN5記憶部124に上書きされる。
一方、ステップS25で、スロットル開度TH及びエンジン回転数NEが、ステップS23で判定された第1学習領域A内に設定された第2学習領域B内にないと判断されると、KBULEANは更新されずに処理が終了する。
このように、リーン化モード中でない場合で、スロットル開度TH及びエンジン回転数NEがO2フィードバック領域内に入ると、O2フィードバック制御が実行される。これにより、KO2及びKO2aveが更新されていくとともに、各第1学習領域AのKBU、及びKBUaveが更新されていく。また、O2フィードバック制御中に、スロットル開度TH及びエンジン回転数NEがリーン化領域内に入ると、更に、該スロットル開度TH及びエンジン回転数NEで特定される第2学習領域BのKBULEANが更新される。
また、リーン化モード中であっても、スロットル開度TH及びエンジン回転数NEがリーン化領域内に入っていない場合は、O2フィードバック制御が実行される。これにより、KO2及びKO2aveが更新されていくとともに、各第1学習領域AのKBU、及びKBUaveが更新されていく。
また、リーン化モード中で、スロットル開度TH及びエンジン回転数NEがリーン化領域内に入っている場合でも、該スロットル開度TH及びエンジン回転数NEで特定される第2学習領域BのKBULEANが学習されていない場合は、O2フィードバック制御が実行される。これにより、KO2及びKO2aveに加え、第1学習領域AのKBU、及びKBUaveが更新されるとともに、学習されていない第2学習領域BのKBULEANも学習される。
以上のことから、リーン化モードに入ると、原則として第2学習領域BのKBULEANは更新されず、例外として学習されていない第2学習領域BのKBULEANのみが学習されることになる。
なお、スロットル開度THの変化率ΔTHが閾値を超えた場合、水温TWが所定値を下回った場合、センサ故障等の不具合によりフェール制御に入った場合は、リーン化モードが解除される。
以上のように、本実施の形態においては、O2フィードバック制御中は、第1学習値マップ54内の各第1学習領域AのKBUaveを更新して、燃料噴射量TOUTを算出するので、従来と同等のKBUaveの学習スピードとO2フィードバック制御の精度を確保することができる。また、第1学習値マップ54の領域内でリーン化運転に用いられる第2学習値マップ56を設定し、O2フィードバック制御中に、第2学習値マップ56内で学習する際は、第1学習値マップ54内の第1学習領域AのKBUaveと、第2学習値マップ56内の第2学習領域BのKBULEANとの両方を学習させることで、同じスロットル開度TH及びエンジン回転数NEであっても、異なる学習値を学習することができる。従って、所定の運転に用いられるKBULEANの精度が向上し、第2学習値マップ56の領域内で所定の運転を行う際は、第2学習値マップ56のKBULEANを用いることで高精度な燃料噴射を行うことができる。
リーン化モードに入った場合は、リーン化モードに入る前の第2学習値マップ56の各第2学習領域BのKBULEANの更新(学習)を停止するので、リーン化運転中に想定している空燃比とのズレを抑えることができる。
リーン化モード中に、リーン化運転が実行されていない場合は、KBUaveの更新(学習)を行うので、リーン化モード中もKBUaveの精度を確保することができる。
第2学習値マップ56のスロットル開度THが低開度側の第2学習領域B2は、スロットル開度THが大きくなる程、エンジン回転数NEの幅が広がるように設定されているので、リーン化運転が可能な領域を極力広げ、低燃費化を図ることができる。
第2学習値マップ56のスロットル開度THが高開度側の第2学習領域B5は、第2学習領域B5に対応する第1学習値マップ54の第1学習領域A5よりも、スロットル開度THの上限が低く設定されているので、リーン化運転が可能な領域を適切に制限でき、リーン化運転中のエンジン10の運転変動を抑えることができる。
なお、不揮発性メモリ68には、最初に算出されたKBUave1〜5の値、リーン化モードに設定される直前に揮発性メモリ66に記憶されているKBUave1〜6の値、又は、リーン化モードが解除後に最初に算出されたKBUave1〜KBUave6の値が記憶される。この不揮発性メモリ68に記憶されているKBUave1〜6は、エンジン始動直後のO2フィードバック制御時の燃料噴射量TOUTの算出に用いられる。