(57)【特許請求の範囲】
【請求項１】
内燃機関に対して燃料を噴射する燃料噴射弁と、
前記機関の排気通路に配設された触媒よりも下流の位置に配設されるとともに同触媒から流出するガスの空燃比に応じた出力値を出力する下流側空燃比センサと、
所定の下流側フィードバック条件が成立している期間において、前記下流側空燃比センサの出力値と所定の下流側目標値との偏差である出力偏差量に所定の比例ゲインを乗じることにより比例項を算出し、前記出力偏差量に所定の調整ゲインを乗じた値を積算することにより時間積分値を算出するとともに同算出された時間積分値に比例した値を積分項として算出し、前記下流側空燃比センサの出力値を前記下流側目標値に一致させるための補正量であって前記燃料噴射弁から噴射される燃料の量をフィードバック補正する空燃比フィードバック量を少なくとも前記比例項及び前記積分項に基いて算出する補正量算出手段と、
前記算出された積分項に相関する値を学習値として取得する学習手段と、
前記下流側フィードバック条件が成立している場合には少なくも前記空燃比フィードバック量に基いて最終燃料噴射量を算出するとともに、前記下流側フィードバック条件が成立していない場合には少なくとも前記学習値に基いて最終燃料噴射量を算出し、前記算出された最終燃料噴射量の燃料を前記燃料噴射弁から噴射させる燃料噴射制御手段と、
を備えた内燃機関の燃料噴射量制御装置において、
前記学習手段は、
前記学習値が、所定の上限値と所定の下限値との間に所定時間に渡って存在している場合、又は、前記所定時間が経過する期間における前記学習値の変化量が判定用閾値幅よりも小さい場合、前記学習値が収束したと判定するように構成され、
前記補正量算出手段は、
前記比例ゲインを、前記学習値が収束したと判定された後は前記学習値が収束したと判定される前に比べて小さい値に設定するとともに、
前記調整ゲインを、前記学習値が収束したと判定された後は前記学習値が収束したと判定される前に比べて小さい値に設定するように構成され、
前記学習値が収束したと判定される前において、前記比例ゲインを、前記機関の吸入空気量が小さいほど大きくするように構成された燃料噴射量制御装置。
【請求項２】
請求項１に記載の燃料噴射量制御装置において、
前記補正量算出手段は、
前記学習値が収束したと判定された後において、前記比例ゲインを、前記機関の吸入空気量に依存しない値に設定するように構成された燃料噴射量制御装置。
【請求項３】
請求項１又は請求項２に記載の燃料噴射量制御装置において、
前記補正量算出手段は、
前記触媒の劣化の程度を示す触媒劣化指標値を取得するとともに、前記触媒の劣化の程度が進行しているほど前記比例ゲインが小さくなるように、前記比例ゲインを前記触媒劣化指標値に基いて決定するように構成された燃料噴射量制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、内燃機関の排気通路に配設された触媒の下流に配設される空燃比センサ（下流側空燃比センサ）の出力値に基づいて燃料噴射量を制御する内燃機関の燃料噴射量制御装置に関する。
【背景技術】
【０００２】
従来の内燃機関の燃料噴射量制御装置の一つ（以下、「従来装置」と称呼する。）は、図１に示したように、機関の排気通路に配設された触媒（三元触媒）４３と、上流側空燃比センサ５６と、下流側空燃比センサ５７と、を備える。上流側空燃比センサ５６及び下流側空燃比センサ５７は、触媒４３よりも上流及び下流にそれぞれ配設されている。
【０００３】
上流側空燃比センサ５６の出力値Vabyfsは、被検出ガスの空燃比（上流側空燃比abyfs）に対して図２に示したように変化する。
【０００４】
下流側空燃比センサ５７の出力値Voxsは、被検出ガスの空燃比（下流側空燃比afdown）に対して図３に示したように変化する。即ち、出力値Voxsは、被検出ガスの空燃比が理論空燃比よりもリッチのとき最大出力値maxとなり、被検出ガスの空燃比が理論空燃比よりもリーンのとき最小出力値minとなる。出力値Voxsは、被検出ガスの空燃比が理論空燃比よりもリーンな空燃比からリッチな空燃比へと変化する際に最小出力値minから最大出力値maxへと急変し、被検出ガスの空燃比が理論空燃比よりもリッチな空燃比からリーンな空燃比へと変化する際に最大出力値maxから最小出力値minへと急変する。
【０００５】
従来装置は、上流側空燃比センサの出力値により表される空燃比（上流側空燃比abyfs）を「理論空燃比に設定された目標空燃比」に一致させるための「燃料噴射量の補正量」を算出する。この補正量はメインフィードバック量とも称呼される。メインフィードバック量を用いた空燃比フィードバック制御はメインフィードバック制御とも称呼される。
【０００６】
更に、従来装置は、「下流側空燃比センサの出力値と、理論空燃比に実質的に相当する値に設定された下流側目標値と、の差（以下、「出力偏差量」とも称呼する。）」に基いて「メインフィードバック量とは別の燃料噴射量の補正量」を算出する。この補正量はサブフィードバック量とも称呼される。サブフィードバック量を用いた空燃比フィードバック制御はサブフィードバック制御とも称呼される。そして、従来装置は、メインフィードバック量及びサブフィードバック量を用いて燃料噴射量を補正することにより、機関に供給される混合気の空燃比を理論空燃比に制御している。なお、機関に供給される混合気の空燃比は、機関の空燃比とも称呼され、触媒４３に流入する排ガスの空燃比と実質的に等しい。
【０００７】
サブフィードバック量は、ＰＩ制御又はＰＩＤ制御に則って算出されるので、少なくとも比例項及び積分項を含む。より具体的に述べると、従来装置は、出力偏差量に比例ゲインを乗じることによりサブフィードバック量の比例項を算出する。従来装置は、出力偏差量に調整ゲインを乗じた値を積算することにより時間積分値を算出し、その時間積分値に基いてサブフィードバック量の積分項を算出する。
【０００８】
ところで、エアフローメータの吸入空気量検出誤差、燃料噴射弁の噴射特性の個体差又は経時変化、及び、上流側空燃比センサの空燃比検出誤差等（以下、「吸排気系の誤差」と総称する。）は、機関の空燃比の目標空燃比に対する定常的な誤差を発生させる。従って、吸排気系の誤差は、上記時間積分値に現れる。即ち、上記時間積分値は吸排気系の誤差の大きさを表す値と等しい値に収束する。従って、従来装置は、吸排気系の誤差が発生している場合においても、機関の空燃比を理論空燃比に略一致させることができる。
【０００９】
ところが、時間積分値が収束するまでには所定の時間を要する。更に、例えば、下流側空燃比センサが活性化していない場合等の「サブフィードバック制御条件（下流側フィードバック条件）が不成立である期間」において、時間積分値は更新されない。そこで、従来装置は、上記時間積分値（又は上記時間積分値に相関する値である「サブフィードバック量の積分項」）を、所定の学習間隔時間Ｔｔｈが経過する毎にサブフィードバック量の学習値（サブＦＢ学習値）として取得する。
【００１０】
学習間隔時間Ｔｔｈは、サブフィードバック量（従って、時間積分値）の更新間隔時間よりも長い。サブＦＢ学習値は、「機関の運転停止中においてもデータを保持することができるバックアップＲＡＭ等」に格納される。更に、従来装置は、サブフィードバック制御条件が不成立である期間、そのサブＦＢ学習値を用いて燃料噴射量を制御するとともに、サブフィードバック制御条件が成立するとそのサブＦＢ学習値に応じた値を時間積分値の初期値として使用する。これにより、サブフィードバック制御条件が不成立である期間、燃料噴射量をできるだけ適切な値に制御することができる。更に、サブフィードバック制御条件が成立した直後の時間積分値を適切な値に設定することができる。
【００１１】
このサブＦＢ学習値は、収束すべき値から大きく乖離する場合がある。サブＦＢ学習値が収束すべき値は、上記吸排気系の誤差の大きさを表す値であり、以下、「収束値」とも称呼する。例えば、バッテリ交換等によりバックアップＲＡＭに記憶されていたサブＦＢ学習値がクリアされると、サブＦＢ学習値は収束値から大きく乖離することがある。或いは、機関の失火率が変化した場合、及び、特定気筒の燃料噴射弁の燃料噴射特性が他の気筒の燃料噴射弁の燃料噴射特性から大きく変化した場合、等においても、サブＦＢ学習値は収束値から大きく乖離することがある。図４の（Ａ）は、サブＦＢ学習値が収束値から大きく乖離している状態から次第に収束する様子を概念的に示している。
【００１２】
従来装置は、サブＦＢ学習値を収束値に迅速に収束させるため、サブＦＢ学習値の収束の程度に応じて「時間積分値の変化速度」を変更している。より具体的に述べると、従来装置は、サブＦＢ学習値の所定期間における変化量（変動量）が所定の幅を超えると、サブＦＢ学習値は収束していないと判定して時間積分値の一回あたりの更新量を大きくし、サブＦＢ学習値の所定期間における変化量が所定の幅を超えないときサブＦＢ学習値は収束したと判定して時間積分値の一回あたりの更新量を小さくする。これにより、サブＦＢ学習値が収束していない場合においてサブＦＢ学習値を迅速に収束値に接近させることができ、且つ、サブＦＢ学習値が収束した場合においてサブＦＢ学習値が外乱により過度に変動することを回避することができる（例えば、特許文献１を参照。）。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】特開２００９−１６２１３９号公報
【発明の概要】
【００１４】
このように、時間積分値の一回あたりの更新量を変更することによりサブＦＢ学習値を迅速に収束させるように構成されている装置において、学習値が収束しているか否かの判定を精度良く行うことは「時間積分値の一回あたりの更新量」を適切な値に設定するために重要である。加えて、時間積分値の一回あたりの更新量を変更しない装置であっても、サブＦＢ学習値が収束しているか否かの判定を精度良く行うことは、気筒別空燃比の不均一性の程度を「サブＦＢ学習値に相関する値に基いて取得する装置（例えば、特開２００９−３０４５５号公報を参照。）」等において重要である。
【００１５】
ところで、図４の（Ｂ）に示したように、サブＦＢ学習値が実質的に収束した状況において、サブＦＢ学習値の変化量は「サブフィードバック量の比例項」の大きさに実質的に依存して変化する。
【００１６】
より具体的に述べると、図４の（Ｂ）において、時刻ｔ０−時刻ｔ４の期間の「サブフィードバック量の比例項を算出するための比例ゲイン」は、時刻ｔ４以降の比例ゲインの約２倍に設定されている。サブフィードバック量の比例項は「出力偏差量と比例ゲインとの積」である。下流側空燃比センサ５７の出力値Voxsは、下流側空燃比センサ５７の特性上、実質的に「最大出力値max及び最小出力値min」の何れかの値となり、且つ、下流側目標値は実質的に変化しないので、出力偏差量の大きさは略一定である。従って、時刻ｔ０−時刻ｔ４の期間のサブフィードバック量の比例項の大きさは、時刻ｔ４以降の比例項の大きさの約２倍となる。一方、サブフィードバック量の積分項は実質的に収束しているから、触媒４３に流入するガスの空燃比は実質的にサブフィードバック量の比例項に基いて変化する。
【００１７】
従って、時刻ｔ０−時刻ｔ１及び時刻ｔ２−時刻ｔ３における「触媒４３の酸素吸蔵量ＯＳＡの減少速度」は、時刻ｔ４−時刻ｔ５及び時刻ｔ６−時刻ｔ７における酸素吸蔵量ＯＳＡの減少速度の２倍となる。同様に、時刻ｔ１−時刻ｔ２及び時刻ｔ３−時刻ｔ４における「触媒４３の酸素吸蔵量ＯＳＡの増大速度」は、時刻ｔ５−時刻ｔ６及び時刻ｔ７−時刻ｔ８における酸素吸蔵量ＯＳＡの増大速度の２倍となる。
【００１８】
一方、下流側空燃比センサ５７の出力値Voxsは、触媒４３の酸素吸蔵量ＯＳＡが「０」に到達することにより触媒４３からリッチなガスが流出したときに最小出力値minから最大出力値maxへと変化し、触媒４３の酸素吸蔵量ＯＳＡが最大酸素吸蔵量Ｃmax（触媒４３が吸蔵し得る酸素の量の最大値）に到達することにより触媒４３からリーンなガスが流出したときに最大出力値maxから最小出力値minへと変化する。
【００１９】
この結果、下流側空燃比センサ５７の出力値Voxsの反転周期（最小出力値minから最大出力値maxへと変化してから最小出力値minへと変化し、その後、再び最大出力値maxへと変化するまでの時間）は、比例ゲインに実質的に反比例する。即ち、時刻ｔ０−時刻ｔ４の期間における反転周期は、時刻ｔ４−時刻ｔ８の期間における反転周期の１／２倍となる。
【００２０】
他方、上記時間積分値及びサブフィードバック量の積分項は反転周期の長さに実質的に比例するように変化するので、サブＦＢ学習値も反転周期の長さに実質的に比例するように変化する。従って、時刻ｔ４−時刻ｔ８の期間におけるサブＦＢ学習値の変化量（変化幅）Ｄ１は、時刻ｔ０−時刻ｔ４の期間におけるサブＦＢ学習値の変化量Ｄ２の２倍になる。
【００２１】
以上の説明から理解されるように、サブＦＢ学習値が実質的に収束した状況において比例ゲインを大きい値に設定すれば、サブＦＢ学習値の変化量を小さくすることができる。換言すると、比例ゲインを大きく設定することは、サブＦＢ学習値が収束したとの判定を早期に行うために有利である。
【００２２】
しかしながら、触媒４３の酸素吸蔵量ＯＳＡが「最大酸素吸蔵量Ｃmax」及び「０」に到達する毎に、触媒４３からＮＯｘ及び未燃物がそれぞれ排出される。従って、サブＦＢ学習値が収束したと判定された後においても比例ゲインが大きい値に設定され続けることは、ＮＯｘ及び未燃物が排出される頻度が増大するので、エミッションを改善する上で好ましくない。
【００２３】
本発明は上述した課題に対処するためになされたものであって、その目的は、学習値（サブＦＢ学習値）が収束しているか否かを迅速且つ精度良く判定することができ、且つ、学習値が収束したと判定した後におけるエミッションを改善することができる「内燃機関の燃料噴射量制御装置」を提供することにある。
【００２４】
本発明の一つの態様に係る内燃機関の燃料噴射量制御装置は、前記機関に対して燃料を噴射する燃料噴射弁と、前記機関の排気通路に配設された触媒よりも下流の位置に配設されるとともに同触媒から流出するガスの空燃比に応じた出力値を出力する下流側空燃比センサと、補正量算出手段と、学習手段と、燃料噴射制御手段と、を備える。
【００２５】
前記補正量算出手段は、所定の下流側フィードバック条件（サブフィードバック制御条件）が成立している期間において、
（１）「前記下流側空燃比センサの出力値と所定の下流側目標値との偏差」である出力偏差量に所定の比例ゲインを乗じることにより比例項を算出し、
（２）前記出力偏差量に所定の調整ゲインを乗じた値を積算することにより時間積分値を算出するとともに、その算出された時間積分値に比例した値を積分項として算出し、
（３）前記下流側空燃比センサの出力値を前記下流側目標値に一致させるための補正量であって前記燃料噴射弁から噴射される燃料の量をフィードバック補正する空燃比フィードバック量、を少なくとも前記比例項及び前記積分項に基いて算出する。
【００２６】
前記学習手段は、前記算出された積分項に相関する値を学習値として取得する。即ち、前記学習手段は、前記時間積分値、前記積分項、及び、それらに応じて変化する値（例えば、前記積分項の一次遅れフィルタ処理値）等を学習値として取得してもよい。
【００２７】
前記燃料噴射制御手段は、前記下流側フィードバック条件が成立している場合には少なくも前記空燃比フィードバック量に基いて最終燃料噴射量を算出する。前記燃料噴射制御手段は、前記下流側フィードバック条件が成立していない場合には少なくとも前記学習値に基いて最終燃料噴射量を算出する。更に、前記燃料噴射制御手段は、前記算出された最終燃料噴射量の燃料を前記燃料噴射弁から噴射させる。
【００２８】
更に、前記学習手段は、
（１）前記学習値が、所定の上限値と所定の下限値との間に所定時間に渡って存在している場合、又は、
（２）前記所定時間が経過する期間における前記学習値の変化量が判定用閾値幅よりも小さい場合、
前記学習値が収束したと判定するように構成される。
【００２９】
加えて、前記補正量算出手段は、
前記比例ゲインを、前記学習値が収束したと判定された後は前記学習値が収束したと判定される前に比べて小さい値に設定するとともに、
前記調整ゲインを、前記学習値が収束したと判定された後は前記学習値が収束したと判定される前に比べて小さい値に設定するように構成される。
【００３０】
上記構成によれば、学習値が収束値から大きく乖離している期間（図４の（Ａ）の第１期間を参照。）において、調整ゲインが相対的に大きい値に設定されるので、学習値を収束値へと迅速に近づけることができる。一方、この期間において比例ゲインは比較的大きい値に維持される。しかしながら、この期間において、積分項が収束すべき値から比較的大きく乖離しているから、所定の単位時間に対する「下流側空燃比センサの出力値がリッチ空燃比に対応する値になっている時間」の比は比例ゲインの大きさの影響を受け難い。従って、比例ゲインの大きさは学習値の更新速度に大きな影響を与えない。
【００３１】
その後、学習値が収束値に接近する。この場合においても、比例ゲインは比較的大きい値に設定されている。この結果、図４の（Ｂ）の時刻ｔ０−時刻ｔ４に示したように、下流側空燃比センサの出力値の反転周期は短くなり、従って、学習値の変化量は比較的小さくなる。
【００３２】
従って、学習値が「所定の上限値と所定の下限値との間」に所定時間に渡って存在するタイミングが早期に発生する。この結果、学習値が「所定の上限値と所定の下限値との間」に所定時間に渡って存在する場合に学習値が収束したと判定するように学習手段が構成されているとき、その学習手段は「学習値が収束したとの判定」を早期に行うことができる。
【００３３】
同様に、上記構成によれば、所定時間が経過する期間における前記学習値の変化量が判定用閾値幅よりも小さくなるタイミングが早期に発生する。この結果、所定時間が経過する期間における前記学習値の変化量が判定用閾値幅よりも小さい場合に学習値が収束したと判定するように学習手段が構成されているとき、その学習手段は「学習値が収束したとの判定」を早期に行うことができる。
【００３４】
加えて、上記構成によれば、前記学習値が収束したと判定された後の比例ゲインは、前記学習値が収束したと判定される前の比例ゲインに比べて小さい値に設定される。その結果、図４の（Ｂ）の時刻ｔ４以降に示したように、下流側空燃比センサの出力値の反転周期が長くなる。従って、触媒の酸素吸蔵量が「０」又は最大酸素吸蔵量Ｃmaxに到達する機会が減少するので、エミッションを改善することができる。
【００３５】
更に、前記学習値が収束したと判定された後の調整ゲインは、前記学習値が収束したと判定される前の調整ゲインに比べて小さい値に設定される。その結果、図４の（Ｂ）の時刻ｔ４以降において一点鎖線により示したように、下流側空燃比センサの出力値の反転周期が長くなっても学習値の変化量は小さくなる。その結果、学習値が収束していないと再び判定されてしまうことを回避することができる。
【００３６】
ところで、触媒に流入する空燃比が「ある値」であったとしても、吸入空気量が大きいほど触媒に流入する「過剰な酸素又は過剰な未燃物」の量は多くなる。従って、触媒の酸素吸蔵量の変化速度は吸入空気量が大きいほど大きくなる。このため、図１７に示したように、比例ゲインを吸入空気量に関わらず一定値に維持していると、吸入空気量が小さい場合の下流側空燃比センサの出力値の反転周期（時刻ｔ４以降を参照。）は、吸入空気量が大きい場合の下流側空燃比センサの出力値の反転周期（時刻ｔ１−時刻ｔ４を参照。）よりも長くなる。その結果、吸入空気量が小さい場合、学習値（サブＦＢ学習値）の変化量が大きくなる（変化量Ｄ１及びＤ２を参照。）。
【００３７】
そこで、本発明の他の態様に係る燃料噴射量制御装置における補正量算出手段は、前記学習値が収束したと判定される前において、前記比例ゲインを、前記機関の吸入空気量が小さいほど大きくするように構成される。例えば、前記比例ゲインは、吸入空気量に反比例するように設定される。
【００３８】
これによれば、図１８に示したように、吸入空気量Ｇａが変化した場合であっても（時刻ｔ４の前後を参照。）、下流側空燃比センサの出力値の反転周期を略一定に維持することが可能となる。その結果、吸入空気量が減少した場合であっても学習値の変化量が大きくならないので、学習手段は「学習値が収束したとの判定」を早期に行うことができる。
【００３９】
加えて、触媒に流入するガスの空燃比及び吸入空気量が一定であったとしても、下流側空燃比センサの出力値の反転周期は触媒の劣化の程度が進むほど短くなる。これは、触媒の劣化の程度が進むと、その触媒の最大酸素吸蔵量Ｃmaxが小さくなるので、酸素吸蔵量が「０」又は最大酸素吸蔵量Ｃmaxに早期に到達してしまうからである。
【００４０】
そこで、本発明の他の態様に係る燃料噴射量制御装置における補正量算出手段は、前記触媒の劣化の程度を示す触媒劣化指標値を取得するとともに、前記触媒の劣化の程度が進行しているほど前記比例ゲインが小さくなるように、前記比例ゲインを前記触媒劣化指標値に基いて決定するように構成される。
【００４１】
これによれば、触媒の劣化の程度に関わらず、下流側空燃比センサの出力値の反転周期を略一定に維持することが可能となる。その結果、触媒の劣化の程度に依らず、学習値が実質的に収束している場合においてその学習値の変化量を略一定に維持することができるので、学習手段は「学習値が収束したとの判定」を早期に行うことができる。
【００４２】
本発明の他の態様に係る燃料噴射量制御装置における補正量算出手段は、前記学習値が収束したと判定されたか否かに関わらず、前記比例ゲインを、前記機関の吸入空気量が小さいほど大きくするように構成される。
【００４３】
これによれば、学習値が収束したとの判定がなされる前において、吸入空気量が減少した場合であっても学習値の変化量が大きくならないので、学習手段は「学習値が収束したとの判定」を早期に行うことができる。更に、学習値が収束したとの判定がなされた後において吸入空気量が変化した場合であっても、下流側空燃比センサの出力値の反転周期をエミッションにとって適切な時間に設定することができる。この結果、学習値が収束しているか否かを迅速且つ精度良く判定することができ、且つ、学習値が収束したと判定した後におけるエミッションを改善することができる。
【００４４】
なお、前記学習手段は、
前記学習値が、前記上限値と前記下限値との間に前記所定時間に渡って存在している場合に前記学習値が収束したと判定するように構成され、且つ、前記上限値を前記学習値の過去の値に基いて算出される同学習値の過去の値の変動中心である判定基準値に正の特定値を加えた値として設定し、前記下限値を前記判定基準値から正の特定値を減じた値として設定するように構成され得る。
【００４５】
この学習手段は、「前記学習値が、前記判定基準値と前記学習値の最新値との差の大きさが所定の判定期間に渡り所定の閾値（前記特定値）よりも小さい場合、前記学習値が収束したと判定するように構成されている。」と言うこともできる。換言すると、前記学習手段は、前記判定基準値と前記学習値の最新値との差の大きさが前記閾値よりも大きくなった場合、前記学習値は収束していないと判定する。
【００４６】
この構成によれば、所定期間における学習値の判定基準値からの偏差の大きさが特定値を超えたか否かを判定することになるので、所定期間における学習値の変化量の大きさが閾値を超えたか否かを判定する場合に比べ、学習値が収束しているか否かを短い時間にて判定することができる。
【００４７】
本発明装置の他の目的、他の特徴及び付随する利点は、以下の図面を参照しつつ記述される本発明装置の各実施形態についての説明から容易に理解されるであろう。
【図面の簡単な説明】
【００４８】
【図１】図１は、本発明の第１実施形態に係る燃料噴射量制御装置（第１制御装置）を適用した内燃機関の概略図である。
【図２】図２は、図１に示した上流側空燃比センサの出力電圧と空燃比との関係を示したグラフである。
【図３】図３は、図１に示した下流側酸素濃度センサの出力電圧と空燃比との関係を示したグラフである。
【図４】図４の（Ａ）及び図４の（Ｂ）は、下流側空燃比センサの出力値及びサブＦＢ学習値等の変化の様子を示したタイムチャートである。
【図５】図５は、図１に示した電気制御装置が燃料噴射量制御（空燃比制御）を実行する際の機能を示した機能ブロック図である。
【図６】図６は、図５に示した基本補正値算出手段の機能ブロック図である。
【図７】図７は、第１制御装置のＣＰＵが実行するルーチンを示したフローチャートである。
【図８】図８は、第１制御装置のＣＰＵが実行するルーチンを示したフローチャートである。
【図９】図９は、第１制御装置のＣＰＵが実行するルーチンを示したフローチャートである。
【図１０】図１０は、第１制御装置のＣＰＵが実行するルーチンを示したフローチャートである。
【図１１】図１１は、第１制御装置のＣＰＵが実行するルーチンを示したフローチャートである。
【図１２】図１２は、第１制御装置のＣＰＵが実行するルーチンを示したフローチャートである。
【図１３】図１３は、第１制御装置のＣＰＵが実行するルーチンを示したフローチャートである。
【図１４】図１４は、第１制御装置のＣＰＵが実行するルーチンを示したフローチャートである。
【図１５】図１５は、第１制御装置のＣＰＵが実行するルーチンを示したフローチャートである。
【図１６】図１６は、第１制御装置のＣＰＵが実行するルーチンを示したフローチャートである。
【図１７】図１７は、吸入空気量が変化した場合における、下流側空燃比センサの出力値、サブフィードバック量の比例項及びサブＦＢ学習値等の変化の様子を示したタイムチャートである。
【図１８】図１８は、本発明の第２実施形態に係る燃料噴射量制御装置（第２制御装置）において、吸入空気量が変化した場合における、下流側空燃比センサの出力値、サブフィードバック量の比例項及びサブＦＢ学習値等の変化の様子を示したタイムチャートである。
【図１９】図１９は、第２制御装置のＣＰＵが実行するルーチンを示したフローチャートである。
【図２０】図２０は、本発明の第３実施形態に係る燃料噴射量制御装置（第３制御装置）のＣＰＵが実行するルーチンを示したフローチャートである。
【発明を実施するための形態】
【００４９】
以下、本発明の各実施形態に係る内燃機関の燃料噴射量制御装置（以下、単に「制御装置」とも称呼する。）について図面を参照しながら説明する。この制御装置は、内燃機関の空燃比制御装置でもある。
【００５０】
＜第１実施形態＞
（構成）
図１は、第１実施形態に係る制御装置（以下、「第１制御装置」とも称呼する。）を、４サイクル・火花点火式・多気筒（直列４気筒）・内燃機関１０に適用したシステムの概略構成を示している。
【００５１】
内燃機関１０は、機関本体部２０と、吸気系統３０と、排気系統４０と、を含む。
【００５２】
機関本体部２０は、シリンダブロック部及びシリンダヘッド部を含む。機関本体部２０は、複数の気筒（燃焼室）２１を備えている。各気筒は、図示しない「吸気ポート及び排気ポート」と連通している。吸気ポートと燃焼室２１との連通部は図示しない吸気弁により開閉される。排気ポートと燃焼室２１との連通部は図示しない排気弁により開閉される。各燃焼室２１には図示しない点火プラグが配設されている。
【００５３】
吸気系統３０は、インテークマニホールド３１、吸気管３２、複数の燃料噴射弁３３、及び、スロットル弁３４を備えている。
【００５４】
インテークマニホールド３１は、複数の枝部３１ａとサージタンク３１ｂとを備えている。複数の枝部３１ａのそれぞれの一端は、複数の吸気ポートのそれぞれに接続されている。複数の枝部３１ａの他端はサージタンク３１ｂに接続されている。
【００５５】
吸気管３２の一端はサージタンク３１ｂに接続されている。吸気管３２の他端には図示しないエアフィルタが配設されている。
【００５６】
燃料噴射弁３３は、一つの気筒（燃焼室）２１に対して一つずつ配設されている。燃料噴射弁３３は吸気ポートに設けられている。即ち、複数の気筒のそれぞれは、他の気筒とは独立して燃料供給を行う燃料噴射弁３３を備えている。燃料噴射弁３３は、噴射指示信号に応答して「その噴射指示信号に含まれる指示燃料噴射量の燃料」を吸気ポート内（従って、燃料噴射弁３３に対応する気筒２１）に噴射するようになっている。
【００５７】
スロットル弁３４は、吸気管３２内に回動可能に配設されている。スロットル弁３４は、吸気通路の開口断面積を可変とするようになっている。スロットル弁３４は、図示しないスロットル弁アクチュエータにより吸気管３２内で回転駆動されるようになっている。
【００５８】
排気系統４０は、エキゾーストマニホールド４１、エキゾーストパイプ４２、エキゾーストパイプ４２に配設された上流側触媒４３、及び、上流側触媒４３よりも下流においてエキゾーストパイプ４２に配設された「図示しない下流側触媒」を備えている。
【００５９】
エキゾーストマニホールド４１は、複数の枝部４１ａと集合部４１ｂとを備えている。複数の枝部４１ａのそれぞれの一端は、複数の排気ポートのそれぞれに接続されている。複数の枝部４１ａのそれぞれの他端は集合部４１ｂに集合している。この集合部４１ｂは、複数（２以上であり、本例では４つ）の気筒から排出された排ガスが集合する部分であるから、排気集合部ＨＫとも称呼される。
【００６０】
エキゾーストパイプ４２は集合部４１ｂに接続されている。排気ポート、エキゾーストマニホールド４１及びエキゾーストパイプ４２は、排気通路を構成している。
【００６１】
上流側触媒４３及び下流側触媒のそれぞれは、所謂、白金、ロジウム及びパラジウム等の貴金属（触媒物質）からなる活性成分を担持する三元触媒装置（排気浄化用の触媒）である。各触媒は、各触媒に流入するガスの空燃比が「三元触媒のウインドウ内の空燃比（例えば、理論空燃比）」であるとき、ＨＣ，ＣＯ，Ｈ２などの未燃成分を酸化するとともに窒素酸化物（ＮＯｘ）を還元する機能を有する。この機能は触媒機能とも称呼される。更に、各触媒は、酸素を吸蔵（貯蔵）し必要時に放出する酸素吸蔵（放出）機能を有する。各触媒は、酸素吸蔵機能により空燃比が理論空燃比から偏移したとしても未燃成分及び窒素酸化物を浄化することができる。つまり、酸素吸蔵機能により、ウインドウの幅が拡大する。酸素吸蔵機能は、触媒に担持されているセリア（ＣｅＯ２）等の酸素吸蔵材によってもたらされる。
【００６２】
このシステムは、熱線式エアフローメータ５１、スロットルポジションセンサ５２、水温センサ５３、クランクポジションセンサ５４、インテークカムポジションセンサ５５、上流側空燃比センサ５６、下流側空燃比センサ５７、及び、アクセル開度センサ５８を備えている。
【００６３】
エアフローメータ５１は、吸気管３２内を流れる吸入空気の質量流量（吸入空気流量）Ｇａに応じた信号を出力するようになっている。即ち、吸入空気量Ｇａは、単位時間あたりに機関１０に吸入される吸入空気量を表す。
【００６４】
スロットルポジションセンサ５２は、スロットル弁３４の開度（スロットル弁開度）を検出し、スロットル弁開度ＴＡを表す信号を出力するようになっている。
【００６５】
水温センサ５３は、内燃機関１０の冷却水の温度を検出し、冷却水温ＴＨＷを表す信号を出力するようになっている。冷却水温ＴＨＷは、機関１０の暖機状態（機関１０の温度）を表すパラメータである。
【００６６】
クランクポジションセンサ５４は、クランク軸が１０°回転する毎に幅狭のパルスを有するとともに同クランク軸が３６０°回転する毎に幅広のパルスを有する信号を出力するようになっている。この信号は、後述する電気制御装置７０によって機関回転速度ＮＥに変換される。
【００６７】
インテークカムポジションセンサ５５は、インテークカムシャフトが所定角度から９０度、次いで９０度、更に１８０度回転する毎に一つのパルスを出力するようになっている。後述する電気制御装置７０は、クランクポジションセンサ５４及びインテークカムポジションセンサ５５からの信号に基づいて、基準気筒（例えば第１気筒）の圧縮上死点を基準とした絶対クランク角度ＣＡを取得するようになっている。この絶対クランク角度ＣＡは、基準気筒の圧縮上死点において「０°クランク角度」に設定され、クランク軸の回転角度に応じて７２０°クランク角度まで増大し、その時点にて再び０°クランク角度に設定される。
【００６８】
上流側空燃比センサ５６は、エキゾーストマニホールド４１の集合部４１ｂ（排気集合部ＨＫ）と上流側触媒４３との間の位置において「エキゾーストマニホールド４１及びエキゾーストパイプ４２の何れか」に配設されている。
【００６９】
上流側空燃比センサ５６は、例えば、特開平１１−７２４７３号公報、特開２０００−６５７８２号公報及び特開２００４−６９５４７号公報等に開示された「拡散抵抗層を備える限界電流式広域空燃比センサ」である。
【００７０】
上流側空燃比センサ５６は、図２に示したように、上流側空燃比センサ５６の配設位置を流れる排ガスの空燃比に応じた出力値Vabyfsを「空燃比センサ出力」として出力する。この出力値Vabyfsは、上流側空燃比センサ５６に到達している排ガスの空燃比が大きくなるほど（リーンとなるほど）増大する。出力値Vabyfsは、上流側空燃比センサ５６に到達している排ガスの空燃比が理論空燃比であるとき、理論空燃比相当値Ｖstoichに一致する。
【００７１】
後述する電気制御装置７０は、図２に示された関係を「空燃比変換テーブルMapabyfs(Vabyfs)」としてＲＯＭ内に格納していて、実際の出力値Vabyfsを空燃比変換テーブルMapabyfs(Vabyfs)に適用することにより上流側空燃比abyfs（検出空燃比abyfs）を取得するようになっている。
【００７２】
再び、図１を参照すると、下流側空燃比センサ５７は、エキゾーストパイプ４２内に配設されている。下流側空燃比センサ５７の配設位置は、上流側触媒４３よりも下流側であり、且つ、下流側触媒よりも上流側（即ち、上流側触媒４３と下流側触媒との間の排気通路）である。下流側空燃比センサ５７は、周知の起電力式の酸素濃度センサ（安定化ジルコニア等の固体電解質を用いた周知の濃淡電池型の酸素濃度センサ）である。下流側空燃比センサ５７は、排気通路であって下流側空燃比センサ５７が配設されている部位を通過するガスである被検出ガスの空燃比に応じた出力値Voxsを発生するようになっている。換言すると、出力値Voxsは、上流側触媒４３から流出し且つ下流側触媒に流入するガスの空燃比（下流側空燃比afdown）に応じた値である。
【００７３】
この出力値Voxsは、図３に示したように、被検出ガスの空燃比が理論空燃比よりもリッチのとき最大出力値max（例えば、約０．９Ｖ〜１．０Ｖ）となる。出力値Voxsは、被検出ガスの空燃比が理論空燃比よりもリーンのとき最小出力値min（例えば、約０．１Ｖ〜０Ｖ）となる。更に、出力値Voxsは、被検出ガスの空燃比が理論空燃比であるとき最大出力値maxと最小出力値minの略中間の電圧Ｖst（中間電圧Ｖst、例えば、約０．５Ｖ）となる。出力値Voxsは、被検出ガスの空燃比が理論空燃比よりもリッチな空燃比からリーンな空燃比へと変化する際に最大出力値maxから最小出力値minへと急変する。同様に、出力値Voxsは、被検出ガスの空燃比が理論空燃比よりもリーンな空燃比からリッチな空燃比へと変化する際に最小出力値minから最大出力値maxへと急変する。
【００７４】
図１に示したアクセル開度センサ５８は、運転者によって操作されるアクセルペダルＡＰの操作量Accp（アクセルペダル操作量、アクセルペダルＡＰの開度）を表す信号を出力するようになっている。アクセルペダル操作量Accpは、アクセルペダルＡＰの操作量が大きくなるとともに大きくなる。
【００７５】
電気制御装置７０は、「ＣＰＵ、ＣＰＵが実行するプログラム、テーブル（マップ、関数）及び定数等を予め記憶したＲＯＭ、ＣＰＵが必要に応じてデータを一時的に格納するＲＡＭ、バックアップＲＡＭ、並びに、ＡＤコンバータを含むインターフェース等」からなる周知のマイクロコンピュータである。
【００７６】
バックアップＲＡＭは、機関１０を搭載した車両の図示しないイグニッション・キー・スイッチの位置（オフ位置、始動位置及びオン位置等の何れか）に関わらず、車両に搭載されたバッテリから電力の供給を受けるようになっている。バックアップＲＡＭは、バッテリから電力の供給を受けている場合、ＣＰＵの指示に応じてデータを格納する（データが書き込まれる）とともに、そのデータを読み出し可能となるように保持（記憶）する。従って、バックアップＲＡＭは、機関１０の運転停止中においてもデータを保持することができる。
【００７７】
バックアップＲＡＭは、バッテリが車両から取り外される等によりバッテリからの電力供給が遮断されると、データを保持することができない。そこで、ＣＰＵは、バックアップＲＡＭへの電力供給が再開されたとき、バックアップＲＡＭに保持されるべきデータを初期化（デフォルト値に設定）するようになっている。なお、バックアップＲＡＭは、ＥＥＰＲＯＭ等の読み書き可能な不揮発性メモリであってもよい。
【００７８】
電気制御装置７０は、上述したセンサ等と接続され、ＣＰＵにそれらのセンサからの信号を供給するようになっている。更に、電気制御装置７０は、ＣＰＵの指示に応じて、各気筒に対応して設けられた点火プラグ（実際にはイグナイタ）、各気筒に対応して設けられた燃料噴射弁３３、及び、スロットル弁アクチュエータ等に駆動信号（指示信号）を送出するようになっている。
【００７９】
なお、電気制御装置７０は、取得されたアクセルペダルの操作量Accpが大きくなるほどスロットル弁開度ＴＡが大きくなるように、スロットル弁アクチュエータに指示信号を送出するようになっている。即ち、電気制御装置７０は、運転者により変更される機関１０の加速操作量（アクセルペダル操作量Accp）に応じて「機関１０の吸気通路に配設されたスロットル弁３４」の開度を変更するスロットル弁駆動手段を備えている。
【００８０】
（第１制御装置による空燃比制御の概要）
第１制御装置は、上流側空燃比センサ５６の出力値Vabyfsにより表される上流側空燃比abyfsが所定の目標空燃比abyfrに一致するようにメインフィードバック制御を行う。更に、第１制御装置は、下流側空燃比センサ５７の出力値Voxsが所定の下流側目標値Voxsrefに一致するようにサブフィードバック制御を行う。メインフィードバック制御とサブフィードバック制御とにより燃料噴射量がフィードバック補正される。
【００８１】
サブフィードバック制御においては、サブフィードバック量ＫＳＦＢが算出される。このサブフィードバック量ＫＳＦＢは目標空燃比abyfrを変更するように作用する。但し、サブフィードバック量ＫＳＦＢは、上流側空燃比センサ５６の出力値Vabyfsを補正するように作用することにより、目標空燃比abyfrを実質的に変更してもよい。
【００８２】
第１制御装置は、サブフィードバック量ＫＳＦＢを「出力値Voxsと下流側目標値Voxsrefとの差（出力偏差量DVoxs）」に基くＰＩＤ制御により算出する。従って、サブフィードバック量ＫＳＦＢは、比例項、積分項及び微分項を含む。
【００８３】
第１制御装置は、サブフィードバック量ＫＳＦＢの比例項を算出するために、出力偏差量DVoxsに相関する値（実際には、出力偏差量DVoxsをローパスフィルタ処理した値DVoxslow）を算出し、その値（DVoxslow）に比例ゲインKpを乗じることにより比例項（＝kp・DVoxslow）を算出する。なお、値DVoxslowは、実質的に、出力値Voxsと下流側目標値Voxsrefとの偏差（出力偏差量）と称呼することができる。
【００８４】
更に、第１制御装置は、サブフィードバック量ＫＳＦＢの積分項を算出するために、出力偏差量DVoxsをローパスフィルタ処理した値DVoxslowに所定の調整ゲインＫを乗じた値Ｋ・DVoxslowを積算（積分）することによって時間積分値SDVoxslowを求める。加えて、第１制御装置は、その時間積分値SDVoxslowに積分ゲインKiを乗じることにより、サブフィードバック量ＫＳＦＢの積分項を求める。なお、本例において、積分ゲインKiは「１」であるので、第１制御装置は、時間積分値SDVoxslowに比例した値を積分項として算出すると言うこともできる。
【００８５】
第１制御装置は、サブフィードバック量ＫＳＦＢの積分項に応じた値（本例において、積分項Ki・SDVoxslowそのもの）をサブフィードバック量の学習値（サブＦＢ学習値ＫＳＦＢｇ）として取得する。サブＦＢ学習値ＫＳＦＢｇは、バックアップＲＡＭに格納され、少なくとも「サブフィードバック量を更新するためのサブフィードバック制御条件が成立しない場合」、燃料噴射量の補正に使用される。
【００８６】
一方、第１制御装置は、過去の所定の時点から現時点までのサブＦＢ学習値ＫＳＦＢｇの変動中心（サブＦＢ学習値ＫＳＦＢｇの加重平均値）を判定基準値Ｖkijunとして求める。そして、第１制御装置は、判定基準値Ｖkijunに正の特定値ΔＶ（ΔＶ１、ΔＶ２等）を加えた値を上限値Vgmaxthとして求めるとともに、判定基準値Ｖkijunから特定値ΔＶを減じた値を下限値Vgminthとして求める。
【００８７】
第１制御装置は、所定期間に渡り「サブＦＢ学習値ＫＳＦＢｇが上限値Vgmaxthと下限値Vgminthとの間に存在している場合」、サブＦＢ学習値ＫＳＦＢｇの収束度が上昇した（学習値が収束値に近づいている）と判定する。第１制御装置は、逆に、所定期間内において「サブＦＢ学習値ＫＳＦＢｇが上限値Vgmaxthと下限値Vgminthとの間に存在しなくなった場合」、サブＦＢ学習値ＫＳＦＢｇの収束度が低下した（学習値が収束値から乖離している）と判定する。サブＦＢ学習値ＫＳＦＢｇの収束度は、次に述べるステータス（status）の値により示される。
【００８８】
・status０（statusが「０」）：サブＦＢ学習値ＫＳＦＢｇの収束状態が良好でない。即ち、status０の状態は、サブＦＢ学習値ＫＳＦＢｇが「その収束値ki・SDVoxsfinalから乖離し」且つ「サブＦＢ学習値ＫＳＦＢｇの変化速度が大きい」という「不安定状態」にあることを意味する。
・status２（statusが「２」）：サブＦＢ学習値ＫＳＦＢｇの収束状態が良好である。即ち、status２の状態は、サブＦＢ学習値ＫＳＦＢｇが「その収束値ki・SDVoxsfinalの近傍にて安定している」という「安定状態」にあることを意味する。安定状態は、サブＦＢ学習値ＫＳＦＢｇの学習が完了している状態と言い換えることもできる。
・status１（statusが「１」）：サブＦＢ学習値ＫＳＦＢｇの収束状態が、前記安定状態と前記不安定状態との間の状態（即ち、準安定状態）にある。
【００８９】
ところで、図４の（Ｂ）に示したように、サブＦＢ学習値ＫＳＦＢｇが実質的に収束した状況において、サブＦＢ学習値ＫＳＦＢｇの変化量は「サブフィードバック量の比例項」の大きさに実質的に依存して変化する。
【００９０】
この理由は、概ね、次のように説明することができる。
【００９１】
前述したように、サブフィードバック量ＫＳＦＢは比例項、積分項及び微分項（本例においては、更にサブＦＢ学習値ＫＳＦＢｇ）の和である。そして、一般に、比例項の大きさは他の項に比べて大きい。或いは、サブＦＢ学習値ＫＳＦＢｇが実質的に収束している状況においては、積分項及びサブＦＢ学習値ＫＳＦＢｇは機関の空燃比の中心を理論空燃比近傍に維持するために必要な値になっている。従って、比例項が機関の空燃比を「理論空燃比よりもリッチな空燃比及び理論空燃比よりもリーンな空燃比」へと変更させる主たる要素である。
【００９２】
このため、図４の（Ｂ）の時刻ｔ４以前に示したように、サブフィードバック量ＫＳＦＢの比例項の大きさ（従って、比例ゲインの大きさ）が大きい場合には、触媒４３の酸素吸蔵量が「０」又は最大酸素吸蔵量Ｃmaxに短時間にて到達する。従って、サブフィードバック量ＫＳＦＢの比例項の大きさが大きい場合には、時間積分値が一方向（例えば、増大する方向）に継続的に変化する時間が短くなるので、サブＦＢ学習値ＫＳＦＢｇの変化量Ｄ２も小さくなる。
【００９３】
これに対し、図４の（Ｂ）の時刻ｔ４以降に示したように、サブフィードバック量ＫＳＦＢの比例項の大きさ（従って、比例ゲインの大きさ）が小さい場合には、触媒４３の酸素吸蔵量が「０」又は最大酸素吸蔵量Ｃmaxに到達するまでの時間が長くなる。従って、サブフィードバック量ＫＳＦＢの比例項の大きさが小さい場合には、時間積分値が一方向（例えば、増大する方向）に継続的に変化する時間が長くなるので、サブＦＢ学習値ＫＳＦＢｇの変化量Ｄ１が大きくなる。
【００９４】
このため、サブＦＢ学習値ＫＳＦＢｇが所定の上限値と所定の下限値との間に所定時間に渡って存在している場合、又は、所定時間が経過する期間におけるサブＦＢ学習値ＫＳＦＢｇの変化量が判定用閾値幅よりも小さい場合、サブＦＢ学習値ＫＳＦＢｇが収束したと判定する装置においては、比例項の大きさを実質的に定める比例ゲインを小さい値に設定した方が、サブＦＢ学習値ＫＳＦＢｇが収束しているとの判定をより早期に行うことができる。
【００９５】
しかしながら、触媒４３の酸素吸蔵量ＯＳＡが「最大酸素吸蔵量Ｃmax」及び「０」に到達する毎に、触媒４３からＮＯｘ及び未燃物がそれぞれ排出される。従って、サブＦＢ学習値ＫＳＦＢｇが収束したと判定された後においても比例ゲインが大きい値に設定され続けることは、エミッションを改善する上で好ましくない。
【００９６】
そこで、第１制御装置は、サブＦＢ学習値ＫＳＦＢｇの収束の程度が進むほど（サブフィードバック量ＫＳＦＢが収束値に近づくほど）、比例ゲインを小さくする。より具体的に述べると、第１制御装置は、statusが「２」であるときの比例ゲインKpをstatusが「１」であるときの比例ゲインKpよりも小さい値に設定し、statusが「１」であるときの比例ゲインKpをstatusが「０」であるときの比例ゲインKpよりも小さい値に設定する。
【００９７】
これにより、サブＦＢ学習値ＫＳＦＢｇが収束したと判定される前（例えば、statusが「２」であると判定される前）において、サブＦＢ学習値ＫＳＦＢｇの所定期間における変化量は小さくなるので、サブＦＢ学習値ＫＳＦＢｇが収束したとの判定を早期に行うことができる。加えて、サブＦＢ学習値ＫＳＦＢｇが収束したと判定された後（例えば、statusが「２」であると判定される後）において、触媒４３の酸素吸蔵量ＯＳＡが「最大酸素吸蔵量Ｃmax」及び「０」に到達する頻度が小さくなる（前述した出力値Voxsの反転周期が長くなる）ので、エミッションを改善することができる。
【００９８】
一方、第１制御装置は、サブＦＢ学習値ＫＳＦＢｇの収束の程度が進むほど、調整ゲインＫを小さくする。より具体的に述べると、第１制御装置は、statusが「２」であるときの調整ゲインＫをstatusが「１」であるときの調整ゲインＫよりも小さい値に設定し、statusが「１」であるときの調整ゲインＫをstatusが「０」であるときの調整ゲインＫよりも小さい値に設定する。
【００９９】
これにより、サブＦＢ学習値ＫＳＦＢｇが収束したと判定される前（statusが「０」又「１」であるとき）において、サブＦＢ学習値ＫＳＦＢｇを適切な値（収束すべき値）に迅速に近づけることができるとともに、サブＦＢ学習値ＫＳＦＢｇが収束したと判定された後（statusが「２」となった後）においてサブＦＢ学習値ＫＳＦＢｇを適切な値の近傍に安定して維持することができる。
【０１００】
（空燃比制御の詳細）
次に、第１制御装置が行う機関の空燃比制御の詳細について説明する。第１制御装置は、上述したように、下流側空燃比センサ５７の出力値Voxsを下流側目標値Voxsrefと一致させるためのサブフィードバック制御を実行する。
【０１０１】
一方、上流側触媒４３は酸素吸蔵機能を有するから、上流側触媒４３の上流の空燃比変化は所定の遅れ時間が経過した後に上流側触媒４３の下流の空燃比変化となって現れる。従って、サブフィードバック制御のみでは過渡的な空燃比変動を十分に抑制することが困難である。そこで、第１制御装置は、上述したように、上流側空燃比センサ５６の出力値Vabyfsに基く空燃比フィードバック制御（メインフィードバック制御）を実行する。
【０１０２】
第１制御装置は、メインフィードバック制御により機関の空燃比を増大しているときにサブフィードバック制御により機関の空燃比を減少させる事態、及び、メインフィードバック制御により機関の空燃比を減少しているときにサブフィードバック制御により機関の空燃比を増大させる事態、が発生することがないように、以下に述べる複数の手段による空燃比制御を行う。これにより、メインフィードバック制御とサブフィードバック制御との間に制御上の干渉が発生しない。
【０１０３】
第１制御装置は、機能ブロック図である図５に示した複数の手段等を含んで構成されている。以下、図５を参照しながら説明する。
【０１０４】
＜補正後基本燃料噴射量の算出＞
筒内吸入空気量算出手段Ａ１は、実際の吸入空気量Ｇａと、実際の機関回転速度ＮＥと、ＲＯＭに格納されているルックアップテーブルMapMcと、に基づき今回の吸気行程を迎える気筒の吸入空気量である筒内吸入空気量Mc(k)を求める。なお、添え字(k)が付された変数は、今回の吸気行程（又は現時点）に対応した値であることを示す。添え字の(k−N)は、今回の吸気行程からＮストローク（４気筒エンジンにおいて、Ｎ・１８０°ＣＡ、ＣＡ；クランク角）前の吸気行程に対した値であることを示す。この表記方法は、以下において他のパラメータについても同様に用いられる。筒内吸入空気量Mc(k)は、各気筒の吸気行程に対応されながらＲＡＭに記憶されていく。
【０１０５】
上流側目標空燃比設定（決定）手段Ａ２は、内燃機関１０の運転状態である機関回転速度ＮＥ及び機関の負荷（例えば、スロットル弁開度ＴＡ）等に基づいて上流側目標空燃比（目標空燃比）abyfr(k)を決定する。但し、本例においては、目標空燃比abyfrは、理論空燃比stoichに設定された基準空燃比abyfr0が「サブフィードバック制御を実現するサブフィードバック量ＫＳＦＢ」により補正されることにより決定される。即ち、目標空燃比abyfrは、理論空燃比stoichに設定された基準空燃比abyfr0からサブフィードバック量ＫＳＦＢを減じた値（AF0-ＫＳＦＢ）に設定される。上流側目標空燃比abyfr(k)は上流側空燃比センサ５６の出力値に基いて得られる検出空燃比abyfsの目標値の基礎となる値である。目標空燃比abyfr(k)は各気筒の吸気行程に対応されながらＲＡＭに記憶されていく。
【０１０６】
補正前基本燃料噴射量算出手段Ａ３は、下記の（１）式に示したように、手段Ａ１により求められた筒内吸入空気量Mc(k)を手段Ａ２により設定された上流側目標空燃比abyfr(k)で除することにより、基本燃料噴射量Fbaseb(k)を求める。基本燃料噴射量Fbaseb(k)は、後述する基本補正値KF等による補正がなされる前の基本燃料噴射量であるから、補正前基本燃料噴射量Fbaseb(k)とも称呼される。補正前基本燃料噴射量Fbaseb(k)は各気筒の吸気行程に対応されながらＲＡＭに記憶されていく。
Fbaseb(k)＝Mc(k)／abyfr(k)      …（１）
【０１０７】
補正後基本燃料噴射量算出手段Ａ４は、手段Ａ３により求められた今回の補正前基本燃料噴射量Fbaseb(k)に基本補正値KFを乗じることにより補正後基本燃料噴射量Fbase(k)（＝KF・Fbaseb(k)）を求める。基本補正値KFは、後述する基本補正値算出手段Ａ１６により求められ、バックアップＲＡＭに格納されている。
【０１０８】
＜最終燃料噴射量の算出＞
最終燃料噴射量算出手段Ａ５は、下記の（２）式により示したように、補正後基本燃料噴射量Fbase(k)（＝KF・Fbaseb(k)）にメインフィードバック量KFmainを乗じることにより、今回の最終燃料噴射量Fi(k)を求める。最終燃料噴射量Fi(k)は、各気筒の吸気行程に対応されながらＲＡＭに記憶されていく。メインフィードバック量KFmainは、後述するメインフィードバック量更新手段Ａ１５によって求められる。
Fi(k)＝（KF・Fbaseb(k)）・KFmain＝Fbase(k)・KFmain  …（２）
【０１０９】
第１制御装置は、この最終燃料噴射量Fi(k)の燃料が、今回の吸気行程を迎える気筒の燃料噴射弁３３から噴射されるように、その燃料噴射弁３３に対して噴射指示信号を送出する。換言すると、噴射指示信号は、最終燃料噴射量Fi(k)に関する情報を指示燃料噴射量として含んでいる。
【０１１０】
＜サブフィードバック量の算出＞
下流側目標値設定手段Ａ６は、「機関回転速度ＮＥ、吸入空気量Ｇａ、スロットル弁開度ＴＡ、及び、上流側触媒４３の劣化度（最大酸素吸蔵量Ｃmax）等」に基づいて下流側目標空燃比に対応する下流側目標値Voxsrefを決定する。下流側目標値Voxsrefは、本例において、理論空燃比に相当する値Vstである。下流側目標値Voxsrefは、触媒４３のウインドウ内の空燃比に相当する値であれば、理論空燃比に相当する値Vstと相違する値であってもよい。
【０１１１】
出力偏差量算出手段Ａ７は、下記（３）式に基づいて、手段Ａ６により設定されている現時点の下流側目標値Voxsrefから現時点での下流側空燃比センサ５７の出力値Voxsを減じることにより、出力偏差量DVoxsを求める。「現時点」とは、今回のFi(k)の噴射指示開始時点のことである。出力偏差量算出手段Ａ７は、求めた出力偏差量DVoxsをローパスフィルタＡ８に出力する。
DVoxs＝Voxsref−Voxs  …（３）
【０１１２】
ローパスフィルタＡ８は一次のデジタルフィルタである。ローパスフィルタＡ８の特性を表す伝達関数Ａ８（ｓ）は下記の（４）式により示される。（４）式において、ｓはラプラス演算子であり、τ1は時定数である。ローパスフィルタＡ８は周波数（１／τ1）以上の高周波数成分が通過することを実質的に禁止する。ローパスフィルタＡ８は出力偏差量DVoxsの値を入力するとともに、「出力偏差量DVoxsの値をローパスフィルタ処理した後の値」であるローパスフィルタ通過後出力偏差量DVoxslowをＰＩＤコントローラＡ９に出力する。
Ａ８（ｓ）＝１／（１+τ1・s）  …（４）
【０１１３】
ＰＩＤコントローラＡ９は、ローパスフィルタ通過後出力偏差量DVoxslowを下記（５）式に基づいて積分処理することにより、時間積分値（積分処理値）SDVoxslowを算出する。左辺のSDVoxslow(n)は更新後の時間積分値であり、右辺のSDVoxslow(n−1)は更新前の時間積分値である。Ｋは調整ゲイン（調整値）であり、後述するように設定・変更される値である。即ち、時間積分値SDVoxslowの１回あたりの更新量は、出力偏差量DVoxslowに調整ゲインＫを乗じた値Ｋ・DVoxslowである。この調整ゲインＫが変更されることにより、時間積分値SDVoxslowの更新速度（変化速度）が変更される。
SDVoxslow(n)＝SDVoxslow(n-1)＋Ｋ・DVoxslow  …（５）
【０１１４】
次いで、ＰＩＤコントローラＡ９は、下記（６）式に基づいて比例・積分・微分処理（ＰＩＤ処理）を実行し、サブフィードバック量ＫＳＦＢを求める。（６）式において、Kpは比例ゲイン（比例定数）、Kiは積分ゲイン（積分定数）、Kdは微分ゲイン（微分定数）である。DDVoxslowはローパスフィルタ通過後出力偏差量DVoxslowの時間微分値である。サブＦＢ学習値ＫＳＦＢｇは、積分項Ki・SDVoxslowを所定の学習間隔時間Ｔｔｈが経過する毎に取り込んだ値である。以上により、サブフィードバック量ＫＳＦＢが求められる。
ＫＳＦＢ＝Kp・DVoxslow＋Ki・SDVoxslow＋Kd・DDVoxslow＋ＫＳＦＢｇ  …（６）
【０１１５】
上記（６）式は積分項Ki・SDVoxslowを含んでいるので、定常状態では出力偏差量DVoxslowがゼロになることが保証される。換言すれば、下流側目標値Voxsrefと下流側空燃比センサ５７の出力値Voxsとの定常偏差がゼロになる。また、定常状態においては、出力偏差量DVoxsがゼロになるから、比例項Kp・DVoxslow及び微分項Kd・DDVoxslowの両者がゼロとなる。従って、サブフィードバック量ＫＳＦＢの定常状態における収束値は積分項Ki・SDVoxslowとサブＦＢ学習値ＫＳＦＢｇとの和に等しくなる。
【０１１６】
以上から明らかなように、下流側目標値設定手段Ａ６、出力偏差量算出手段Ａ７、ローパスフィルタＡ８及びＰＩＤコントローラＡ９はサブフィードバック量算出手段を構成している。
【０１１７】
＜メインフィードバック制御＞
先に説明したように、上流側触媒４３は酸素吸蔵機能を有している。従って、上流側触媒４３の上流の排ガスの空燃比の変動における「比較的周波数の高い高周波数成分（前記周波数１／τ1以上の高周波数成分）」及び「比較的周波数が低く且つ振幅が比較的小さい低周波数成分（前記周波数１／τ1以下の周波数にて変動するとともに理論空燃比からの偏移量が比較的小さい低周波成分）」は、上流側触媒４３の酸素吸蔵機能により吸収されるから、上流側触媒４３の下流の排ガスの空燃比の変動として現れ難い。
【０１１８】
従って、例えば、排ガスの空燃比が前記周波数（１／τ1）以上の高周波数で大きく変動するような「過渡運転状態における空燃比の急変」に対する補償は、サブフィードバック制御により行われ得ない。それ故、「過渡運転状態における空燃比の急変」に対する補償を確実に行うためには、上流側空燃比センサ５６の出力値Vabyfsに基づいたメインフィードバック制御を行う必要がある。
【０１１９】
一方、上流側触媒４３の上流の排ガスの空燃比の変動における「周波数が比較的低くて振幅が比較的大きい低周波数成分（例えば、前記周波数（１／τ1）以下の周波数で変動するとともに理論空燃比からの偏移量が比較的大きい低周波成分）」は、上流側触媒４３の酸素吸蔵機能では完全には吸収されない。従って、そのような上流側触媒４３の上流における空燃比の変動は、所定の遅れを有しながら上流側触媒４３の下流の排ガスの空燃比の変動として現れる。この結果、上流側空燃比センサ５６の出力値Vabyfsが目標空燃比abyfrよりもリッチ側となり、下流側空燃比センサ５７の出力値Voxsが下流側目標値Voxsrefよりもリーン側となる等の状態が発生し、メインフィードバック制御とサブフィードバック制御との間に前述した制御上の干渉が生じる場合がある。
【０１２０】
以上のことから、第１制御装置は、上流側空燃比センサ５６の出力値Vabyfsの変動における各周波数成分のうち「上流側触媒４３の下流の空燃比の変動として現れ得る程度の周波数成分である所定の周波数（本例では、周波数（１／τ1））以下の低周波数成分」をカットした後の上流側空燃比センサ５６の出力値Vabyfsに応じた値をメインフィードバック制御に使用する。このメインフィードバック制御に使用される「上流側空燃比センサ５６の出力値Vabyfsに応じた値」は、「目標空燃比abyfrtgt(k)と出力値Vabyfs(k)との偏差Dafに対してハイパスフィルタ処理を施した値」である。この結果、前述した空燃比制御の干渉が発生することを回避することができるとともに、メインフィードバック制御によって過渡運転状態における空燃比の急変に対する補償を確実に行うことができる。より具体的には、メインフィードバック量は以下に述べるようにして求められる。
【０１２１】
＜メインフィードバック量の算出＞
テーブル変換手段Ａ１０は、上流側空燃比センサ５６の出力値Vabyfsと、図２に示したテーブルMapabyfsと、に基づいて、現時点の検出空燃比abyfs(k)を求める。
【０１２２】
目標空燃比遅延手段Ａ１１は、上流側目標空燃比abyfrのうち、現時点からＮストローク（Ｎ回の吸気行程）前の時点の上流側目標空燃比abyfrをＲＡＭから読み出し、これを上流側目標空燃比abyfr(k−N)として設定する。上流側目標空燃比abyfr(k−N)は、現時点からＮストローク前に吸気行程を迎えた気筒の補正前基本燃料噴射量Fbaseb(k−N)を算出するために用いられた上流側目標空燃比である。
【０１２３】
前記値Ｎは、内燃機関１０の排気量及び燃焼室２１から上流側空燃比センサ５６までの距離等により異なる値である。このように、現時点からＮストローク前の実際の上流側目標空燃比abyfr(k−N)をメインフィードバック量KFmainの算出に用いるのは、燃料噴射弁３３から噴射された燃料を含み且つ燃焼室２１内で燃焼された混合気が上流側空燃比センサ５６に到達するまでには、Ｎストロークに相当する無駄時間Ｌ１を要しているからである。なお、値Ｎは、機関回転速度ＮＥが大きいほど小さくなり、且つ、機関の負荷（例えば、筒内吸入空気量Mc）が大きくなるほど小さくなるように変更されることが望ましい。
【０１２４】
ローパスフィルタＡ１２は、手段Ａ１１から出力された上流側目標空燃比abyfr(k−N)に対してローパスフィルタ処理を施し、メインフィードバック制御用目標空燃比（上流側フィードバック制御用目標空燃比）abyfrtgt(k)を算出する。メインフィードバック制御用目標空燃比abyfrtgt(k)は、上流側目標空燃比設定手段Ａ２により決定されていた上流側の目標空燃比abyfr(k−N)に応じた値である。
【０１２５】
このローパスフィルタＡ１２は一次のディジタルフィルタである。ローパスフィルタＡ１２の伝達特性Ａ１２（ｓ）は下記の（７）式により示される。（７）式において、ｓはラプラス演算子であり、τは時定数（応答性に関するパラメータ）である。この特性により、周波数（１／τ）以上の高周波数成分の通過が実質的に禁止される。
Ａ１２（ｓ）＝１／（１＋τ・s）  …（７）
【０１２６】
上流側空燃比センサ５６に到達している排ガスの空燃比の値を入力信号とし、上流側空燃比センサ５６の出力値Vabyfsに基いて求められる空燃比の値を出力信号とするとき、出力信号は入力信号に対してローパスフィルタ処理（例えば、所謂「なまし処理」を含む一次遅れ処理及び二次遅れ処理等）を施した信号と極めて似た信号となる。この結果、ローパスフィルタＡ１２により生成されるメインフィードバック制御用目標空燃比abyfrtgt(k)は、上流側空燃比センサ５６に目標空燃比abyfr(k−N)に応じた望ましい空燃比の排ガスが到達しているときに上流側空燃比センサ５６が実際に出力するであろう値となる。
【０１２７】
上流側空燃比偏差算出手段Ａ１３は、下記（８）式に基づいて、メインフィードバック制御用目標空燃比abyfrtgt(k)から現時点の検出空燃比abyfs(k)を減じることにより、空燃比偏差Dafを求める。この空燃比偏差Dafは、Ｎストローク前の時点において筒内に供給された混合気の実際の空燃比と目標空燃比との偏差を表す量である。
Daf＝abyfrtgt(k)−abyfs(k)  …（８）
【０１２８】
ハイパスフィルタＡ１４は一次のフィルタである。ハイパスフィルタＡ１４の特性を表す伝達関数Ａ１４（ｓ）は（９）式により示される。（９）式において、ｓはラプラス演算子であり、τ1は時定数である。時定数τ1は上記ローパスフィルタＡ８の時定数τ1と同一の時定数である。ハイパスフィルタＡ１４は、周波数（１／τ1）以下の低周波数成分が通過することを実質的に禁止する。
Ａ１４（ｓ）＝{１−１／（１+τ1・s）}  …（９）
【０１２９】
ハイパスフィルタＡ１４は、空燃比偏差Dafを入力するとともに、上記（９）式より表された特性式に従って「空燃比偏差Dafをハイパスフィルタ処理した後の値」である「メインフィードバック制御用偏差DafHi」を出力する。
【０１３０】
メインフィードバック量更新手段Ａ１５は、ハイパスフィルタＡ１４の出力値であるメインフィードバック制御用偏差DafHiを比例処理する。即ち、メインフィードバック量更新手段Ａ１５は、メインフィードバック制御用偏差DafHiに比例ゲインGpHiを乗じた値に「１」を加えることにより、メインフィードバック量KFmain（＝１＋GpHi・DafHi）を求める。このメインフィードバック量KFmainは、最終燃料噴射量算出手段Ａ５が今回の最終燃料噴射量Fi(k)を求める際に使用される。
【０１３１】
なお、メインフィードバック量更新手段Ａ１５は、下記（１０）式に基いて、メインフィードバック制御用偏差DafHiを比例・積分処理（ＰＩ処理）することにより、メインフィードバック量KFmainを求めてもよい。（１０）式において、Gphiは予め設定された比例ゲイン（比例定数）、Gihiは予め設定された積分ゲイン（積分定数）である。SDafHiはメインフィードバック制御用偏差DafHiの時間積分値である。係数KFBは本例では「１」である。係数KFBは、機関回転速度ＮＥ及び筒内吸入空気量Mc等により可変とすることが好適である。
KFmain＝１＋(Gphi・DafHi＋Gihi・SDafHi)・KFB  …（１０）
【０１３２】
以上から明らかなように、上流側目標空燃比設定手段Ａ２、テーブル変換手段Ａ１０、目標空燃比遅延手段Ａ１１、ローパスフィルタＡ１２、上流側空燃比偏差算出手段Ａ１３、ハイパスフィルタＡ１４及びメインフィードバック量更新手段Ａ１５は、メインフィードバック量算出手段（メインフィードバック制御手段）を構成している。
【０１３３】
＜基本補正値の算出＞
サブフィードバック量ＫＳＦＢはＰＩＤコントローラＡ９によりローパスフィルタ通過後出力偏差量DVoxslowを比例・積分・微分処理することによって算出される。しかしながら、上流側触媒４３の酸素吸蔵機能の影響により機関の空燃比の変化は少し遅れて上流側触媒４３の下流の排ガスの空燃比の変化として現れる。従って、エアフローメータ５１の検出精度や空気量推定モデルの推定精度に起因する定常的な誤差の大きさが運転領域の急変等によって比較的急激に増大する場合、その誤差に起因する燃料噴射量の過不足分をサブフィードバック制御のみにより直ちに補償することはできない。
【０１３４】
一方、上流側触媒４３の酸素吸蔵機能による遅れの影響がないメインフィードバック制御において、ハイパスフィルタＡ１４によるハイパスフィルタ処理は微分処理（Ｄ処理）と同等の機能を達成する処理である。従って、ハイパスフィルタＡ１４通過後の値がメインフィードバック量更新手段Ａ１５の入力値とされている上記メインフィードバック制御においては、仮にメインフィードバック量更新手段Ａ１５が積分処理を行うことによりメインフィードバック量KFmainを求めるように構成されている場合であっても、実質的な積分項を含むメインフィードバック量KFmainを算出することができない。それ故、上記メインフィードバック制御より、上記エアフローメータの検出精度や空気量推定モデルの推定精度に起因する燃料噴射量の定常的な誤差は補償され得ない。その結果、運転領域が変化した場合等において、一時的にエミッションが悪化する可能性がある。
【０１３５】
このため、上記定常的な誤差を補償するため、第１制御装置は、補正前基本燃料噴射量Fbasebを補正する基本補正値KFを求める。更に、第１制御装置は、下記の（１１）式に再度示したように、基本補正値KFによって補正後基本燃料噴射量Fbase(k)を求め、その補正後基本燃料噴射量Fbase(k)を更にメインフィードバック量KFmainにより補正している。
Fi(k)＝{KF・Fbaseb(k)}・KFmain  …（１１）
【０１３６】
基本補正値KFは、下記の（１２）式により定義される。
Fbaset(k−N)＝KF・Fbaseb(k−N)  …（１２）
【０１３７】
（１２）式において、Fbasetは、目標空燃比を得るために必要な真の指示噴射量であり、誤差を含まない基本燃料噴射量であるということもできる。以下、Fbasetを、「真の基本燃料噴射量」と称呼する。（１２）式の真の基本燃料噴射量Fbaset(k−N)は、下記の（１３）式により算出される。
Fbaset(k−N)＝（abyfs(k)・Fi(k−N)）／abyfr(k−N)  …（１３）
【０１３８】
上記（１３）式について説明を加える。上述したＮストロークは上記「無駄時間」に対応するストローク数に設定されている。つまり、現時点における検出空燃比abyfs(k)は最終燃料噴射量Fi(k−N)に基いて噴射された燃料によりもたらされている空燃比である。従って、（１３）式における右辺の分子のabyfs(k)・Fi(k−N)は、最終燃料噴射量Fi(k−N)を決定した際の筒内空気量を表していることになる。それ故、（１３）式に示したように、最終燃料噴射量Fi(k−N)を決定した時点の筒内空気量（abyfs(k)・Fi(k−N)）を、最終燃料噴射量Fi(k−N)を決定した時点の目標空燃比abyfr(k−N)で除することにより、真の基本燃料噴射量Fbaset(k−N)が算出される。
【０１３９】
一方、上記（１２）式にて使用される補正前基本燃料噴射量Fbaseb(k)は、下記（１４）式に基いて求められる。
Fbaseb(k)＝Mc(k)／abyfr(k)  …（１４）
【０１４０】
そこで、第１制御装置は、上記（１２）〜（１４）式から得られる下記（１５）式に基いて基本補正値KFを求め、求めた基本補正値KFを同基本補正値KFを算出したときの運転領域に対応させてメモリに記憶しておく。
KF＝Fbaset(k−N)／Fbaseb(k−N)
＝｛abyfs(k)・Fi(k−N)/abyfr(k−N)｝／｛Mc(k−N)/abyfr(k−N)｝…（１５）
【０１４１】
基本補正値KFは、上述した（１５）式により表された原理に従って構成された基本補正値算出手段Ａ１６によって算出される。以下、基本補正値算出手段Ａ１６の機能ブロック図である図６を参照しながら、基本補正値KFの実際の算出の仕方について説明する。基本補正値算出手段Ａ１６は、Ａ１６ａ〜Ａ１６ｆの各手段等を含んで構成されている。
【０１４２】
最終燃料噴射量遅延手段Ａ１６ａは、今回の最終燃料噴射量Fi(k)を遅延させることにより現時点からＮストローク前の最終燃料噴射量Fi(k−N)を求める。実際には、最終燃料噴射量遅延手段Ａ１６ａは最終燃料噴射量Fi(k−N)をＲＡＭから読み出す。
【０１４３】
目標空燃比遅延手段Ａ１６ｂは、今回の目標空燃比abyfr(k)を遅延させることにより現時点からＮストローク前の目標空燃比abyfr(k−N)を求める。実際には、目標空燃比遅延手段Ａ１６ｂは目標空燃比abyfr(k−N)をＲＡＭから読み出す。
【０１４４】
真の基本燃料噴射量算出手段Ａ１６ｃは、上記（１３）式（Fbaset(k−N)＝（(abyfs(k)・Fi(k−N)／abyfr(k−N)）に従って現時点からＮストローク前の真の基本燃料噴射量Fbaset(k−N)を求める。
【０１４５】
補正前基本燃料噴射量遅延手段Ａ１６ｄは、今回の補正前基本燃料噴射量Fbaseb(k)を遅延させることにより現時点からＮストローク前の補正前基本燃料噴射量Fbaseb(k−N)を求める。実際には、補正前基本燃料噴射量遅延手段Ａ１６ｄは補正前基本燃料噴射量Fbaseb(k−N)をＲＡＭから読み出す。
【０１４６】
フィルタ前基本補正値算出手段Ａ１６ｅは、上述した（１５）式に基く式（KFbf＝Fbaset(k−N)／Fbaseb(k−N)）に従って、真の基本燃料噴射量Fbaset(k−N)を補正前基本燃料噴射量Fbaseb(k−N)で除することにより、フィルタ前基本補正値KFbfを算出する。
【０１４７】
ローパスフィルタＡ１６ｆは、フィルタ前基本補正値KFbfに対してローパスフィルタ処理を施すことにより基本補正値KFを算出する。このローパスフィルタ処理は、基本補正値KFを安定化させるため（フィルタ前基本補正値KFbfに重畳しているノイズ成分を除去するため）に行われる。このようにして求められた基本補正値KFは、現時点からＮストローク前の運転状態が属していた運転領域に対応させられながらＲＡＭ及びバックアップＲＡＭに記憶・格納されて行く。
【０１４８】
このように、基本補正値算出手段Ａ１６は、最終燃料噴射量Fi(k)の計算時点が到来する毎に、Ａ１６ａ〜Ａ１６ｆの各手段等を利用して基本補正値KFを更新する。そして、基本補正値算出手段Ａ１６は、最終燃料噴射量Fi(k)の算出時において機関１０の運転状態が属する運転領域に格納されている基本補正値KFをバックアップＲＡＭから読み出し、読み出した基本補正値KFを補正後基本燃料噴射量算出手段Ａ４に提供する。この結果、燃料噴射量（補正前基本燃料噴射量）の定常的な誤差が迅速に補償されていく。以上が、第１制御装置のメインフィードバック制御及びサブフィードバック制御の概要である。
【０１４９】
（実際の作動）
次に、第１制御装置の実際の作動について説明する。以下、説明の便宜上、「MapX(a1,a2,…)」は、a1,a2,…を引数とする値Xを求めるためのルックアップテーブルを表すものとする。また、引数の値がセンサの検出値である場合、その引数の値には現在値が適用される。
【０１５０】
＜最終燃料噴射量Fi(k)の算出＞
ＣＰＵは、図７にフローチャートにより示した最終燃料噴射量Fiの計算及び噴射指示を行うルーチンを、各気筒のクランク角が各吸気上死点前の所定クランク角度（例えば、ＢＴＤＣ９０°ＣＡ）となる毎に、繰り返し実行するようになっている。従って、任意の気筒のクランク角度が上記所定クランク角度になると、ＣＰＵはステップ７００から処理を開始して以下に記載したステップ７１０乃至ステップ７３０の処理を順に行い、ステップ７４０に進む。
【０１５１】
ステップ７１０：ＣＰＵは、テーブルMapMc(Ga,NE)に基づいて今回の吸気行程を迎える気筒（以下、「燃料噴射気筒」と云うこともある。）に吸入される今回の筒内吸入空気量Mc(k)を推定・決定する。筒内吸入空気量Mc(k)は、周知の空気量推定モデル（吸気通路における空気の挙動を模した物理法則に従って構築されたモデル）により算出されてもよい。
【０１５２】
ステップ７２０：ＣＰＵは、下記の（１６）式に基いて目標空燃比abyfr(k)を決定する。目標空燃比abyfr(k)は各気筒の吸気行程に対応されながらＲＡＭに記憶されていく。（１６）式において、abyfr0は所定の基準空燃比であり、ここでは理論空燃比stoichに設定されている。従って、サブフィードバック量ＫＳＦＢが大きくなれば、目標空燃比abyfr(k)は小さくなる。なお、目標空燃比abyfr(k)は、更に、吸入空気量Ｇａ及び／又は機関回転速度ＮＥ等の機関１０の運転状態に基いて補正されてもよい。
abyfr(k)＝abyfr0−ＫＳＦＢ…（１６）
【０１５３】
ステップ７３０：ＣＰＵは、上記筒内吸入空気量Mc(k)を上記目標空燃比abyfr(k)で除することにより、補正前基本燃料噴射量Fbaseb(k)を算出する。補正前基本燃料噴射量Fbaseb(k)は各気筒の吸気行程に対応されながらＲＡＭに記憶されていく。
【０１５４】
次に、ＣＰＵはステップ７４０に進み、現在の運転状態がフューエルカット条件が成立しているか否かを判定する。フューエルカット条件が成立していれば、ＣＰＵはステップ７４０にて「Ｙｅｓ」と判定してステップ７９５に直接進み、本ルーチンを一旦終了する。従って、燃料噴射の指示を行うステップ７７０が実行されないので、燃料噴射は停止される（フューエルカット運転が実行される。）。
【０１５５】
一方、ステップ７４０の判定時点においてフューエルカット条件が成立していなければ、ＣＰＵはステップ７４０にて「Ｎｏ」と判定し、以下に記載したステップ７５０乃至ステップ７７０の処理を順に行い、その後、ステップ７９５に進んで本ルーチンを一旦終了する。
【０１５６】
ステップ７５０：ＣＰＵは、後述するルーチンによって計算されるとともにバックアップＲＡＭに運転領域毎に格納されている基本補正値KFの中から、現時点における運転状態が属する運転領域に格納されている基本補正値KFを読み出す。なお、メインフィードバック制御条件が不成立のとき、運転状態に関わらず基本補正値KFには値「１」が設定される。更に、ＣＰＵは、補正前基本燃料噴射量Fbaseb(k)に、読み出した基本補正値KFを乗じた値を補正後基本燃料噴射量Fbaseとして設定する。
【０１５７】
ステップ７６０：ＣＰＵは、上記（２）式及び上記（１１）式に従い、補正後基本燃料噴射量Fbaseに後述するルーチンにて求められているメインフィードバック量KFmainを乗じることにより、今回の最終燃料噴射量Fi(k)を求める。
ステップ７７０：ＣＰＵは、最終燃料噴射量Fi(k)の燃料が燃料噴射気筒に対する燃料噴射弁３３から噴射されるように、その燃料噴射弁３３に対して噴射指示を行う。
【０１５８】
以上により、補正前基本燃料噴射量Fbaseb(k)が目標空燃比abyfr(k)と今回の筒内吸入空気量Mc(k)とに基づいて取得され、その補正前基本燃料噴射量Fbaseb(k)と基本補正値KFとにより補正後基本燃料噴射量Fbaseが取得される。更に、その補正後基本燃料噴射量Fbaseがメインフィードバック量KFmainにより補正されることにより最終的な燃料噴射量（最終燃料噴射量）Fi(k)が求められ、その最終燃料噴射量Fi(k)の燃料の噴射指示が燃料噴射気筒の燃料噴射弁３３に対してなされる。
【０１５９】
＜メインフィードバック量の計算＞
ＣＰＵは図８にフローチャートにより示したルーチンを実行周期Δｔ１（一定）の経過毎に繰り返し実行するようになっている。従って、所定のタイミングにてＣＰＵはステップ８００から処理を開始し、以下に記載したステップ８０５及びステップ８１０の処理を順に行い、ステップ８１５に進む。なお、この実行周期Δｔ１は、例えば、機関回転速度ＮＥが想定される最大の機関回転速度である場合における連続する二つの噴射指示の発生時間間隔より短い時間に設定されている。
【０１６０】
ステップ８０５：ＣＰＵは、ステップ８０５に記載した簡易のローパスフィルタ式（abyfrtgt(k)＝α・abyfrtgtold＋(1−α)・abyfr(k−N)）に従ってメインフィードバック制御用目標空燃比abyfrtgt(k)を求める。ここで、αは０より大きく１より小さい定数であり、上記ローパスフィルタＡ１２の時定数τに応じて設定されている。abyfrtgtoldは、「前回本ルーチンを実行した際にステップ８１０にて算出されたメインフィードバック制御用目標空燃比abyfrtgt」である。abyfrtgtoldは、前回メインフィードバック制御用目標空燃比と称呼される。abyfr(k−N)は、現時点からＮストローク前の実際の上流側目標空燃比である。
【０１６１】
ステップ８１０：ＣＰＵは、次回の本ルーチンの実行のために、前回メインフィードバック制御用目標空燃比abyfrtgtoldにステップ８０５にて算出したメインフィードバック制御用目標空燃比abyfrtgt(k)を格納する。
【０１６２】
次に、ＣＰＵはステップ８１５に進み、メインフィードバック制御条件成立フラグXmainFBの値が「１」であるか否かを判定する。メインフィードバック制御条件成立フラグXmainFBの値は、メインフィードバック制御条件が成立したときに「１」に設定され、メインフィードバック制御条件が不成立のとき「０」に設定される。
【０１６３】
メインフィードバック制御条件は、例えば以下の総ての条件が成立するとき成立する。
・上流側空燃比センサ５６が活性化している。
・フューエルカット条件が成立していない（フューエルカット運転状態でない。）。
【０１６４】
いま、メインフィードバック制御条件成立フラグXmainFBの値が「１」であるとすると、ＣＰＵは、以下に記載したステップ８２０乃至ステップ８３５の処理を順に行い、ステップ８９５に進んで本ルーチンを一旦終了する。
【０１６５】
ステップ８２０：ＣＰＵは、現時点の上流側空燃比センサ５６の出力値Vabyfsを図２により示したテーブルMapabyfs(Vabyfs)に基づいて変換することにより、現時点の検出空燃比abyfs(k)を求める。
ステップ８２５：ＣＰＵは、上記（８）式であるステップ８２５内に記載した式に従ってメインフィードバック制御用目標空燃比abyfrtgt(k)から今回の検出空燃比abyfs(k)を減じることにより、空燃比偏差Dafを求める。
【０１６６】
ステップ８３０：ＣＰＵは、空燃比偏差Dafに上記（９）式により表された特性を有するハイパスフィルタ処理を施すことにより、メインフィードバック制御用偏差DafHiを取得する。
【０１６７】
ステップ８３５：ＣＰＵは、メインフィードバック制御用偏差DafHiに比例ゲインGpHiを乗じて得られる積に値「１」を加えることにより、メインフィードバック量KFmainを求める。
【０１６８】
一方、メインフィードバック制御条件成立フラグXmainFBの値が「０」であるとすると、ＣＰＵは、ステップ８１５から以下に記載したステップ８４０及びステップ８４５の処理を順に行い、ステップ８９５に進んで本ルーチンを一旦終了する。
【０１６９】
ステップ８４０：ＣＰＵは、メインフィードバック量KFmainを「１」に設定する。
ステップ８４５：ＣＰＵは、基本補正値KFを「１」に設定する。
【０１７０】
このように、メインフィードバック制御条件が不成立（XmainFB＝０）の場合、メインフィードバック量KFmainの更新が停止されるとともに、メインフィードバック量KFmainの値が「１」に設定されるので、メインフィードバック制御が停止される（メインフィードバック量KFmainの最終燃料噴射量Fiへの反映が停止される）。また、メインフィードバック制御条件が不成立（XmainFB＝０）の場合、基本補正値KFの値が「１」に設定されるので、基本補正値KFの最終燃料噴射量Fiへの反映が停止される。
【０１７１】
＜基本補正値の計算と記憶・格納＞
ＣＰＵは図９にフローチャートにより示したルーチンを、図７に示したルーチンの実行に先だって繰り返し実行するようになっている。従って、所定のタイミングにてＣＰＵはステップ９００から処理を開始し、ステップ９０５に進んでメインフィードバック制御条件成立フラグXmainFBの値が「１」であるか否かを判定する。いま、メインフィードバック制御条件成立フラグXmainFBの値が「１」であるとすると、ＣＰＵは、以下に記載したステップ９１０乃至ステップ９３０の処理を順に行い、ステップ９９５に進んで本ルーチンを一旦終了する。
【０１７２】
ステップ９１０：ＣＰＵは、上記（１３）式であるステップ９１０内に記載した式に従って「現時点からＮストローク前の真の基本燃料噴射量Fbaset」を算出する。なお、現時点からＮストローク前の最終燃料噴射量Fi(k−N)及び現時点からＮストローク前の目標空燃比abyfr(k−N)は、いずれもＲＡＭから読み出される。
【０１７３】
ステップ９１５：ＣＰＵは、上記（１５）式と同じ式であるステップ９１５に記載した式に基いて、現時点からＮストローク前の真の基本燃料噴射量Fbasetを現時点からＮストローク前の補正前基本燃料噴射量Fbaseb(k−N)により除することによって、基本補正値KFの基礎となる今回値KFnew（フィルタ前基本補正値KFbf）を算出する。なお、現時点からＮストローク前の補正前基本燃料噴射量Fbaseb(k−N)はＲＡＭから読み出される。
【０１７４】
ステップ９２０：ＣＰＵは、現時点からＮストローク前の時点における機関１０の運転状態が属する運転領域に対応してバックアップＲＡＭ内に格納してある基本補正値KFを同バックアップＲＡＭから読み出す。この読み出された基本補正値KFは、過去の基本補正値KFoldである。
ステップ９２５：ＣＰＵは、ステップ９２５に記載した簡易のローパスフィルタ式（KF＝β・KFold＋(1−β)・KFnew）に従って新たな基本補正値KF（最終基本補正値KF）を算出する。ここで、βは０より大きく１より小さい定数である。
【０１７５】
ステップ９３０：ＣＰＵは、ステップ９２５にて求められた基本補正値KFを、現時点からＮストローク前の時点における機関１０の運転状態が属する運転領域に対応したバックアップＲＡＭ内の格納領域に記憶・格納する。このようにして、基本補正値KFが更新され、且つ、記憶されて行く。
【０１７６】
一方、メインフィードバック制御条件成立フラグXmainFBの値が「０」であると、ＣＰＵはステップ９０５にて「Ｎｏ」と判定し、ステップ９９５に直ちに進んで本ルーチンを一旦終了する。この場合、基本補正値KFの更新及びバックアップＲＡＭへの記憶・格納処理は実行されない。
【０１７７】
なお、基本補正値KFnewの値をそのまま新たな基本補正値KFとして採用してもよい。その場合、ステップ９２０を省略し、ステップ９２５における定数βを「０」に設定すればよい。
【０１７８】
＜サブフィードバック量の計算＞
ＣＰＵは図１０にフローチャートにより示したルーチンを、所定時間が経過する毎に繰り返し実行するようになっている。従って、所定のタイミングになるとＣＰＵはステップ１０００から処理を開始し、ステップ１００５に進んでサブフィードバック制御条件が成立しているか否かを判定する。サブフィードバック制御条件はメインフィードバック制御条件が成立し、且つ、下流側空燃比センサ５７が活性化していると判定されるときに成立する。
【０１７９】
いま、サブフィードバック制御条件が成立しているものとして説明を続ける。この場合、ＣＰＵは以下に記載したステップ１０１０乃至ステップ１０４０の処理を順に行い、ステップ１０４５に進む。
【０１８０】
ステップ１０１０：ＣＰＵは、上記（３）式であるステップ１０１０内に記載した式に従って、下流側目標値Voxsrefから現時点の下流側空燃比センサ５７の出力値Voxsを減じることにより、出力偏差量DVoxsを求める。
ステップ１０１５：ＣＰＵは、出力偏差量DVoxsに対して上記（４）式により表された特性を有するローパスフィルタ処理を施すことによりローパスフィルタ通過後出力偏差量DVoxslowを算出する。
【０１８１】
ステップ１０２０：ＣＰＵは、下記（１７）式に基づきローパスフィルタ通過後出力偏差量DVoxslowの微分値DDVoxslowを求める。（１７）式において、DVoxslowoldは前回の本ルーチン実行時において「後述するステップ１０４０にて設定（更新）されたローパスフィルタ通過後出力偏差量DVoxslow」である。また、Δtは本ルーチンが前回実行された時点から今回実行された時点までの時間である。
DDVoxslow＝(DVoxslow-DVoxslowold)/Δt  …（１７）
【０１８２】
ステップ１０２５：ＣＰＵは、「後述する図１５に示したルーチンにより別途求められている比例ゲインKp」及び「後述する図１６に示したルーチンにより別途求められている調整ゲインＫ」を読み込む。
【０１８３】
比例ゲインKpは、サブＦＢ学習値ＫＳＦＢｇが収束している可能性（サブＦＢ学習値ＫＳＦＢｇの収束度）が高いと判定されるほど（即ち、ステータス（status）の値が大きいほど）、小さい値に設定される。
【０１８４】
調整ゲインＫは、最大酸素吸蔵量Cmaxが一定の場合において、サブＦＢ学習値ＫＳＦＢｇが収束している可能性（サブＦＢ学習値ＫＳＦＢｇの収束度）が高いと判定されるほど（即ち、ステータス（status）の値が大きいほど）、小さい値に設定される。更に、調整ゲインＫは、後述するステータス（status）の値が「ある値」であるとき、最大酸素吸蔵量Ｃmaxが大きいほど（即ち、触媒の劣化の程度が小さいほど）小さい値になるように設定される。
【０１８５】
ステップ１０３０：ＣＰＵは、上記（５）式であるステップ１０３０内に示した式に従って時間積分値SDVoxslowを求める。
ステップ１０３５：ＣＰＵは、上記（６）式であるステップ１０３５内に示した式に従ってサブフィードバック量ＫＳＦＢを求める。
ステップ１０４０：ＣＰＵは、ローパスフィルタ通過後出力偏差量DVoxslowの前回値DVoxslowoldに上記ステップ１０１０にて求めたローパスフィルタ通過後出力偏差量DVoxslowを格納する。
【０１８６】
次に、ＣＰＵはステップ１０４５に進み、前回のサブＦＢ学習値ＫＳＦＢｇの更新時点から学習間隔時間Ｔｔｈが経過しているか否かを判定する。このとき、前回のサブＦＢ学習値ＫＳＦＢｇの更新時点から学習間隔時間Ｔｔｈが経過していなければ、ＣＰＵはステップ１０４５にて「Ｎｏ」と判定し、ステップ１０９５に直接進んで本ルーチンを一旦終了する。
【０１８７】
これに対し、ＣＰＵがステップ１０４５の処理を実行する時点において、前回のサブＦＢ学習値ＫＳＦＢｇの更新時点から学習間隔時間Ｔｔｈが経過していると、ＣＰＵは以下に述べるステップ１０５５乃至ステップ１０６５の処理を順に行い、ステップ１０９５に進んで本ルーチンを一旦終了する。
【０１８８】
ステップ１０５５：ＣＰＵは、積分ゲインKiと時間積分値SDVoxslowとの積（即ち、積分項Ki・SDVoxslow）を「その時点の（即ち、更新前の）サブＦＢ学習値ＫＳＦＢｇ」に加えることによりサブＦＢ学習値ＫＳＦＢｇを更新し、更新されたサブＦＢ学習値ＫＳＦＢｇをバックアップＲＡＭに格納する。このように、ＣＰＵは、サブフィードバック量ＫＳＦＢが更新される期間よりも長い期間が経過した時点における「サブフィードバック量ＫＳＦＢの定常成分に応じた積分項Ki・SDVoxslow（時間積分値SDVoxslowに比例した値）」を、サブＦＢ学習値ＫＳＦＢｇとして順次取り込む。
【０１８９】
ステップ１０６０：ＣＰＵは、サブＦＢ学習値ＫＳＦＢｇの過去の値の変動中心（荷重平均値）Ｖｃを下記（１８）式に従って更新する。γはαは０より大きく１より小さい定数である。Ｖｃ(n)は更新後の中心値Ｖｃであり、Ｖｃ(n−１)は更新前の中心値Ｖｃである。
Ｖｃ（n)＝γ・Ｖｃ(n−1)  +  (1−γ)・ＫＳＦＢｇ  …（１８）
【０１９０】
ステップ１０６５：ＣＰＵは、時間積分値SDVoxslowを下記（１９）式に従って「０」に設定する。その後、ＣＰＵはステップ１０９５に進み、本ルーチンを一旦終了する。
SDVoxslow（n)＝０  …（１９）
【０１９１】
一方、ステップ１００５の判定時において、サブフィードバック制御条件が不成立であると、ＣＰＵはステップ１００５にて「Ｎｏ」と判定してステップ１０７０に進み、サブフィードバック量ＫＳＦＢにサブＦＢ学習値ＫＳＦＢｇを代入する。次に、ＣＰＵはステップ１０７５にて積分値SDVoxslowに「サブＦＢ学習値ＫＳＦＢｇを積分ゲインKiにて除した値（ＫＳＦＢｇ／Ki）を設定した後、ステップ１０９５に進んで本ルーチンを一旦終了する。
【０１９２】
＜statuの初期設定＞
上述したように、比例ゲインKp及び調整ゲインＫは、サブＦＢ学習値ＫＳＦＢｇの収束の程度（学習進行程度）」を表す「status（ステータス）」に基いて定められる。そこで、以下、「status（ステータス）」を設定する際のＣＰＵの作動について説明する。statusＮ（Ｎ＝０、１、２）は、上述したように定義されている。
【０１９３】
以下、説明の便宜上、現時点が内燃機関１０の始動直後であり、且つ、この機関始動前に「電気制御装置７０に電力を供給するためのバッテリ」の交換がなされていたと仮定する。ＣＰＵは図１１にフローチャートにより示した「status初期設定ルーチン」を、内燃機関１０の始動時点以降、所定時間が経過する毎に実行するようになっている。
【０１９４】
従って、内燃機関１０の始動時点以降において所定のタイミングが到来すると、ＣＰＵステップ１１００から処理を開始し、ステップ１１１０に進んで「現時点が、内燃機関１０の始動直後であるか否か」を判定する。
【０１９５】
前述の仮定に従うと、現時点は内燃機関１０の始動直後である。従って、ＣＰＵはステップ１１１０にて「Ｙｅｓ」と判定し、ステップ１１２０に進んで「電気制御装置７０に電力を供給するためのバッテリ」交換がなされたか否かを判定する。このとき、前述の仮定に従うと、事前にバッテリが交換されている。従って、ＣＰＵはステップ１１２０にて「Ｙｅｓ」と判定してステップ１１３０に進み、statusを「０」に設定・更新する。この「status」の値は、その値が更新される毎にバックアップＲＡＭに記憶・更新される。
【０１９６】
次に、ＣＰＵは、ステップ１１４０に進んでカウンタＣＩをクリアし（「０」に設定し）、続くステップ１１５０にて次の処理を行う。
ＣＰＵは、「バックアップＲＡＭに記憶されているサブＦＢ学習値ＫＳＦＢｇ」を「０（初期値、デフォルト値）」に設定する。
ＣＰＵは、時間積分値SDVoxslowを「０（初期値、デフォルト値）」に設定する。
ＣＰＵは、中心値Ｖｃを「０（初期値、デフォルト値）」に設定する。
ＣＰＵは、判定基準値Ｖkijunを「０（初期値、デフォルト値）」に設定する。
その後、ＣＰＵはステップ１１９５に進み、本ルーチンを一旦終了する。
【０１９７】
なお、ＣＰＵがステップ１１２０に進んだとき、バッテリ交換がされていないと判定した場合、ＣＰＵはそのステップ１１２０にて「Ｎｏ」と判定してステップ１１６０に進み、バックアップＲＡＭに記憶されているstatusを読み出す。次いで、ＣＰＵはステップ１１７０にて、「図１０のステップ１０６０において算出されている中心値Ｖｃ」及び「判定基準値Ｖkijun」をバックアップＲＡＭから読み出す。判定基準値Ｖkijunは、「status（ステータス）」の判定のために設定される閾値の基準となる値であり、後述する図１３のステップ１３４０にて更新される。
【０１９８】
以降、ＣＰＵはステップ１１１０にて「Ｎｏ」と判定し、ステップ１１９５に直接進んで本ルーチンを一旦終了するようになる。
【０１９９】
＜status判定その１（第１ステータス判定）＞
ＣＰＵは、status判定を行うために、所定時間が経過する毎に図１２にフローチャートにより示した「第１ステータス判定ルーチン」を実行するようになっている。従って、所定のタイミングになると、ＣＰＵは図１２のステップ１２００から処理を開始してステップ１２１０に進み、サブフィードバック制御条件が成立しているか否かを判定する。
【０２００】
このとき、サブフィードバック制御条件が成立していなければ、ＣＰＵはステップ１２１０にて「Ｎｏ」と判定してステップ１２２０に進む。そして、ＣＰＵはステップ１２２０にてカウンタＣＩを「０」に設定し、その後、ステップ１２９５に直接進んで本ルーチンを一旦終了する。なお、カウンタＣＩは、機関１０が搭載された車両の図示しないイグニッション・キー・スイッチがオフ位置からオン位置に切り換えられた際に実行される図示しないイニシャルルーチンにより「０」に設定されるようになっている。
【０２０１】
これに対し、ＣＰＵがステップ１２１０に進んだとき、サブフィードバック制御条件が成立していると、ＣＰＵはステップ１２１０にて「Ｙｅｓ」と判定してステップ１２３０に進み、現時点が「サブＦＢ学習値ＫＳＦＢｇが更新された直後の時点」であるか否か（図１０のステップ１０５５の処理を行った直後であるか否か）を判定する。
【０２０２】
このとき、現時点が「サブＦＢ学習値ＫＳＦＢｇが更新された直後の時点」でなければ、ＣＰＵはステップ１２３０にて「Ｎｏ」と判定し、ステップ１２９５に直接進んで本ルーチンを一旦終了する。
【０２０３】
これに対し、ＣＰＵがステップ１２３０に進んだとき、現時点が「サブＦＢ学習値ＫＳＦＢｇが更新された直後の時点」であると、ＣＰＵはそのステップ１２３０にて「Ｙｅｓ」と判定してステップ１２４０に進み、statusが「０」である（ステータスがstatus０である）か否かを判定する。このとき、statusが「０」でなければ、ＣＰＵはステップ１２４０にて「Ｎｏ」と判定し、ステップ１２９５に直接進んで本ルーチンを一旦終了する。
【０２０４】
これに対し、ＣＰＵがステップ１２４０に進んだとき、statusが「０」であると、ＣＰＵはそのステップ１２４０にて「Ｙｅｓ」と判定してステップ１２５０に進み、カウンタＣＩを「１」だけ増大する。次いで、ＣＰＵはステップ１２６０に進み、カウンタＣＩが更新回数閾値ＣＩｔｈ以上であるか否かを判定する。このとき、カウンタＣＩが更新回数閾値ＣＩｔｈよりも小さいと、ＣＰＵはステップ１２６０にて「Ｎｏ」と判定し、ステップ１２９５に直接進んで本ルーチンを一旦終了する。
【０２０５】
これに対し、ＣＰＵがステップ１２６０に進んだとき、カウンタＣＩが更新回数閾値ＣＩｔｈ以上であると、ＣＰＵはそのステップ１２６０にて「Ｙｅｓ」と判定してステップ１２７０に進み、statusを「１」に設定・更新する（ステータスをstatus１に設定する）。
【０２０６】
このように、statusが「０」であるとき、サブＦＢ学習値ＫＳＦＢｇの更新が更新回数閾値ＣＩｔｈ以上行われると、statusは「１」に変更される。これは、サブＦＢ学習値ＫＳＦＢｇの更新が更新回数閾値ＣＩｔｈ以上行われた時点においては、サブＦＢ学習値ＫＳＦＢｇはある程度まで収束値に接近したであろうと判断できるからである。なお、ステップ１２２０を省略してもよい。また、ステップ１２７０の実行後にカウンタＣＩを「０」に設定してもよい。更に、図１２のルーチン自体を省略してもよい。
【０２０７】
＜status判定その２（第２ステータス判定）＞
ＣＰＵは、status判定を行うために、所定時間が経過する毎に図１３にフローチャートにより示した「第２ステータス判定ルーチン」を実行するようになっている。以下においては、機関１０の始動前に「電気制御装置７０に電力を供給するためのバッテリ」が交換されたことによって、statusが図１１のステップ１１３０にて「０」に設定され、且つ、ステップ１１５０にてサブＦＢ学習値ＫＳＦＢｇが「０」に設定されたと仮定して説明を行う。更に、現時点は機関１０の始動直後であると仮定する。
【０２０８】
ＣＰＵは、所定のタイミングになると、図１３のステップ１３００から処理を開始してステップ１３０５に進み、サブフィードバック制御条件が成立しているか否かを判定する。機関１０の始動直後においては、サブフィードバック制御条件は一般に成立しない。従って、ＣＰＵはステップ１３０５にて「Ｎｏ」と判定してステップ１３５０に進み、カウンタＣＬを「０」に設定する。なお、カウンタＣＬは、上述したイニシャルルーチンにより「０」に設定されるようになっている。その後、ＣＰＵはステップ１３９５に直接進んで本ルーチンを一旦終了する。
【０２０９】
この場合、ＣＰＵは図１０のステップ１００５からステップ１０７０に進むので、ステップ１０５５の処理は実行されない。従って、サブＦＢ学習値ＫＳＦＢｇは「０」に維持される。
【０２１０】
その後、機関１０の運転が継続すると、サブフィードバック制御条件が成立する。従って、図１０のルーチンにより、サブフィードバック量ＫＳＦＢが更新される。
【０２１１】
係る状態において、ＣＰＵが図１３のステップ１３０５に進むと、ＣＰＵはそのステップ１３０５にて「Ｙｅｓ」と判定してステップ１３１０に進む。そして、ＣＰＵは、ステップ１３１０にて、現時点がサブＦＢ学習値ＫＳＦＢｇの更新直後の時点であるか否かを判定する。このとき、現時点がサブＦＢ学習値ＫＳＦＢｇの更新直後の時点でなければ、ＣＰＵはステップ１３１０にて「Ｎｏ」と判定し、ステップ１３９５に直接進んで本ルーチンを一旦終了する。
【０２１２】
一方、現時点がサブＦＢ学習値ＫＳＦＢｇの更新直後の時点（図１０のステップ１０５５の処理が実行された時点の直後）であると、ＣＰＵはステップ１３１０にて「Ｙｅｓ」と判定してステップ１３１５に進み、カウンタＣＬを「１」だけ増大する。次いで、ＣＰＵはステップ１３２０に進み、サブＦＢ学習値ＫＳＦＢｇの最大値Vgmax及び最小値Vgminを更新する。このサブＦＢ学習値ＫＳＦＢｇの最大値Vgmax及び最小値Vgminは、それぞれ、カウンタＣＬが「０」から次のステップ１３２５にて用いられる閾値ＣＬｔｈに至るまでの期間（サブＦＢ学習値ＫＳＦＢｇの収束度を判定するための所定時間、状態判定期間）におけるサブＦＢ学習値ＫＳＦＢｇの最大値及び最小値となる。
【０２１３】
次に、ＣＰＵはステップ１３２５に進み、カウンタＣＬが閾値ＣＬｔｈ以上であるか否かを判定する。このとき、カウンタＣＬが閾値ＣＬｔｈよりも小さいと、ＣＰＵはステップ１３２５にて「Ｎｏ」と判定し、ステップ１３９５に直接進んで本ルーチンを一旦終了する。
【０２１４】
その後、時間が経過すると、サブＦＢ学習値ＫＳＦＢｇが更新される毎に（即ち、学習間隔時間Ｔｔｈが経過する毎に）ステップ１３１５の処理が実行される。従って、カウンタＣＬは閾値ＣＬｔｈに到達する。このとき、ＣＰＵがステップ１３２５に進むと、ＣＰＵはそのステップ１３２５にて「Ｙｅｓ」と判定してステップ１３３０に進み、カウンタＣＬを「０」に設定する。
【０２１５】
次に、ＣＰＵはステップ１３３５に進み、図１４に示したルーチンを実行する。即ち、ＣＰＵは図１４のステップ１４００から処理を開始してステップ１４０５に進み、statusが「０」であるか否かを判定する。前述の仮定に従えば、statusは「０」であるから、ＣＰＵはステップ１４０５にて「Ｙｅｓ」と判定してステップ１４１０に進み、判定基準値Ｖkijunに「所定の正の特定値である第１値ΔＶ０」を加えた値（Ｖkijun＋ΔＶ０）を上限値（大側閾値）Vgmaxthとして設定する。更に、ＣＰＵは、判定基準値Ｖkijunから「第１値ΔＶ０」を減じた値（Ｖkijun−ΔＶ０）を下限値（小側閾値）Vgminthとして設定する。なお、この時点における判定基準値Ｖkijunの値は「０」である。
【０２１６】
次に、ＣＰＵはステップ１４１５に進み、図１３のステップ１３２０にて取得した最大値Vgmaxが上限値Vgmaxth以下であり、且つ、図１３のステップ１３２０にて取得した最小値Vgminが下限値Vgminth以上であるか否かを判定する。即ち、ＣＰＵは、状態判定期間（カウンタＣＬが０から閾値ＣＬｔｈに至るまでの所定時間）におけるサブＦＢ学習値ＫＳＦＢｇが、下限値Vgminthと上限値Vgmaxthとにより規定される閾値幅内であったか否かを判定する。
【０２１７】
ところで、前述の仮定に従えば、機関始動前にバッテリ交換がなされたため、サブＦＢ学習値ＫＳＦＢｇは図１１のステップ１１５０にて「０」に設定されている。この場合、一般に、サブＦＢ学習値ＫＳＦＢｇと収束値ki・SDVoxsfinalとの差（時間積分値SDVoxsと、その収束値SDVoxsfinalとの差）は大きいので、サブフィードバック量ＫＳＦＢ及びサブＦＢ学習値ＫＳＦＢｇの変化速度は大きい。従って、最大値Vgmaxが上限値Vgmaxthよりも大きいか、又は、最小値Vgminが下限値Vgminthよりも小さい。
【０２１８】
このため、ＣＰＵはステップ１４１５にて「Ｎｏ」と判定し、ステップ１４９５を経由して図１３のステップ１３４０に進み、判定基準値Ｖkijunに中心値Ｖｃを設定する。中心値Ｖｃは、図１０のステップ１０６０にて算出されている。従って、ＣＰＵは、ステップ１３３５にてステータス判定が実行される時点において、その時点から状態判定期間（カウンタＣＬが０から閾値ＣＬｔｈに至るまでの期間）前の時点から、その時点まで、の期間におけるサブＦＢ学習値ＫＳＦＢｇの加重平均値（一次遅れ相当値である中心値Ｖｃ）を、判定基準値Ｖkijunとして設定する。その後、ＣＰＵはステップ１３９５に進み、本ルーチンを一旦終了する。この結果、statusは「０」に維持される。
【０２１９】
この状態が継続すると、サブＦＢ学習値ＫＳＦＢｇは収束値ki・SDVoxsfinalに接近し、収束値ki・SDVoxsfinal近傍において比較的穏やかに変化するようになる。この結果、最大値Vgmaxは「ステップ１４１０にて算出される上限値Vgmaxth」以下となり、且つ、最小値Vgminは「ステップ１４１０にて算出される下限値Vgminth」以上となる。このとき、ＣＰＵが図１４のステップ１４１５に進むと、ＣＰＵはそのステップ１４１５にて「Ｙｅｓ」と判定し、ステップ１４２０に進んでstatusを「１」に設定する。その後、ＣＰＵはステップ１４９５を経由して図１３のステップ１３４０に進む。
【０２２０】
なお、statusが「０」であるときにステップ１４１５の条件が成立しない場合であっても、前述した図１２のステップ１２６０の条件（カウンタＣＩが更新回数閾値ＣＩｔｈ以上となる条件）が成立すれば、statusはステップ１２７０にて「１」に変更される。
【０２２１】
この時点以降、ＣＰＵが図１３のルーチンのステップ１３３５を経由して図１４のステップ１４０５に進むと、statusが「１」に設定されていることから、ＣＰＵはそのステップ１４０５にて「Ｎｏ」と判定する。そして、ＣＰＵはステップ１４３０に進んでstatusが「１」であるか否かを判定する。この場合、ＣＰＵはステップ１４３０にて「Ｙｅｓ」と判定してステップ１４３５に進み、判定基準値Ｖkijunに「第１値ΔＶ０よりも小さい第２値ΔＶ１（ΔＶ１＞０）」を加えた値（Ｖkijun＋ΔＶ１）を上限値Vgmaxthとして設定する。更に、ＣＰＵは、判定基準値Ｖkijunから「第２値ΔＶ１」を減じた値（Ｖkijun−ΔＶ１）を下限値Vgminthとして設定する。なお、第２値ΔＶ１も特定値と称呼される。
【０２２２】
次に、ＣＰＵはステップ１４４０に進み、図１３のステップ１３２０にて取得した最大値Vgmaxが上限値Vgmaxth以下であり、且つ、図１３のステップ１３２０にて取得した最小値Vgminが下限値Vgminth以上であるか否かを判定する。
【０２２３】
このとき、サブＦＢ学習値ＫＳＦＢｇが収束値ki・SDVoxsfinalに接近していると、最大値Vgmaxは上限値Vgmaxth以下であり、且つ、最小値Vgminは下限値Vgminth以上となる。この場合、ＣＰＵはステップ１４４０にて「Ｙｅｓ」と判定してステップ１４４５に進み、statusを「２」に設定する。その後、ＣＰＵはステップ１４９５を経由して図１３のステップ１３４０に進む。
【０２２４】
この時点以降、ＣＰＵが図１３のルーチンのステップ１３３５を経由して図１４のステップ１４０５に進むと、statusが「２」に設定されていることから、ＣＰＵはそのステップ１４０５にて「Ｎｏ」と判定し、ステップ１４３０にても「Ｎｏ」と判定してステップ１４５５に進む。
【０２２５】
ＣＰＵはステップ１４５５にて、判定基準値Ｖkijunに「第２値ΔＶ１よりも小さい第３値ΔＶ２（ΔＶ２＞０）」を加えた値（Ｖkijun＋ΔＶ２）を上限値Vgmaxthとして設定する。更に、ＣＰＵは、判定基準値Ｖkijunから「第３値ΔＶ２」を減じた値（Ｖkijun−ΔＶ２）を下限値Vgminthとして設定する。なお、第３値ΔＶ２も特定値と称呼される。また、第３値ΔＶ２は第２値ΔＶ１と等しい値であってもよい。
【０２２６】
次に、ＣＰＵはステップ１４６０に進み、図１３のステップ１３２０にて取得した最大値Vgmaxが上限値Vgmaxth以下であり、且つ、図１３のステップ１３２０にて取得した最小値Vgminが下限値Vgminth以上であるか否かを判定する。
【０２２７】
このとき、サブＦＢ学習値ＫＳＦＢｇが収束値ki・SDVoxsfinal付近において安定していると、最大値Vgmaxは上限値Vgmaxth以下であり、且つ、最小値Vgminは下限値Vgminth以上となる。この場合、ＣＰＵはステップ１４６０にて「Ｙｅｓ」と判定してステップ１４９５に進む。
【０２２８】
一方、何らかの理由（例えば、失火率が変化するなどの大きく空燃比を乱す外乱）により、最大値Vgmaxが「（Ｖkijun＋ΔＶ２）である上限値Vgmaxth」よりも大きくなるか、又は、最小値Vgminが「（Ｖkijun−ΔＶ２）である下限値Vgminth」よりも小さくなると、ＣＰＵはステップ１４６０にて「Ｎｏ」と判定してステップ１４６５に進み、statusを「１」に設定する。
【０２２９】
更に、statusが「１」に設定されている状態において、最大値Vgmaxが「（Ｖkijun＋ΔＶ１）である上限値Vgmaxth」よりも大きくなるか、又は、最小値Vgminが「（Ｖkijun−ΔＶ１）である下限値Vgminth」よりも小さくなると、ＣＰＵはステップ１４４０にて「Ｎｏ」と判定してステップ１４５０に進み、statusを「０」に設定する。
【０２３０】
＜比例ゲインKpの設定＞
ＣＰＵは、比例ゲインKpを決定するために、図１５にフローチャートにより示したルーチンを所定時間が経過する毎に繰り返し実行するようになっている。このルーチンにより、比例ゲインKpは、第１比例ゲイン（最小比例ゲイン）Kpsmall、第２比例ゲイン（中程度比例ゲイン）Kpmid、及び、第３比例ゲイン（最大比例ゲイン）Kplarge、のうちの何れかに設定される。第３比例ゲインKplargeは第２比例ゲインKpmidよりも大きく、、第２比例ゲインKpmidは第１比例ゲインKpsmallよりも大きい。即ち、Kpsmall＜Kpmid＜Kplargeである。
【０２３１】
所定のタイミングになると、ＣＰＵは図１５のステップ１５００から処理を開始し、ステップ１５１０にてステータス（status）を読み込む。
【０２３２】
次に、ＣＰＵはステップ１５２０に進み、statusが「２」であるか否かを判定する。即ち、ＣＰＵは、ステップ１５２０にてサブＦＢ学習値ＫＳＦＢｇの学習が完了しているか否か（サブＦＢ学習値ＫＳＦＢｇが収束値ki・SDVoxsfinalに十分近づいているか否か）を判定する。
【０２３３】
このとき、statusが「２」であると、ＣＰＵはステップ１５２０にて「Ｙｅｓ」と判定してステップ１５６０に進み、比例ゲインKpを第１比例ゲイン（最小比例ゲイン）Kpsmallに設定する。その後、ＣＰＵはステップ１５９５に進み、本ルーチンを一旦終了する。
【０２３４】
一方、ＣＰＵがステップ１５２０の処理を行う時点において、statusが「２」でなければ、ＣＰＵはステップ１５２０にて「Ｎｏ」と判定してステップ１５３０に進み、statusが「０」であるか否かを判定する。即ち、ＣＰＵは、ステップ１５３０にてサブＦＢ学習値ＫＳＦＢｇの学習が殆ど進んでいない状態であるか否か（サブＦＢ学習値ＫＳＦＢｇが収束値ki・SDVoxsfinalから大きく乖離しているか否か）を判定する。
【０２３５】
このとき、statusが「０」であると、ＣＰＵはステップ１５３０にて「Ｙｅｓ」と判定してステップ１５４０に進み、比例ゲインKpを第３比例ゲイン（最大比例ゲイン）Kplargeに設定する。その後、ＣＰＵはステップ１５９５に進み、本ルーチンを一旦終了する。
【０２３６】
更に、ＣＰＵがステップ１５３０の処理を行う時点において、statusが「０」でなければ、ＣＰＵはステップ１５３０にて「Ｎｏ」と判定してステップ１５５０に進み、比例ゲインKpを第２比例ゲインKpmidに設定する。その後、ＣＰＵはステップ１５９５に進み、本ルーチンを一旦終了する。
【０２３７】
以上をまとめると、ＣＰＵは、以下のように比例ゲインKpを設定する。
（１）statusが「０」であるとき：比例ゲインKp＝第３比例ゲインKplarge
（２）statusが「１」であるとき：比例ゲインKp＝第２比例ゲインKpmid
（３）statusが「２」であるとき：比例ゲインKp＝第１比例ゲインKpsmall
【０２３８】
＜調整ゲインＫの設定＞
ＣＰＵは、調整ゲインＫを決定するために、図１６にフローチャートにより示したルーチンを所定時間が経過する毎に繰り返し実行するようになっている。
【０２３９】
従って、所定のタイミングになると、ＣＰＵは図１６のステップ１６００から処理を開始し、ステップ１６１０に進んでステータス（status）を読み込む。
【０２４０】
次に、ＣＰＵはステップ１６２０に進み、ステップ１６２０内に記載されたテーブルMapK(Cmax,status)に基いて調整ゲインＫを決定する。その後、ＣＰＵはステップ１６９５に進んで本ルーチンを一旦終了する。
【０２４１】
このテーブルMapK(Cmax,status)によれば、最大酸素吸蔵量Cmaxが一定の場合において、status０での調整ゲインＫはstatus１での調整ゲインＫよりも大きく、status１での調整ゲインＫはstatus２での調整ゲインＫよりも大きくなるように、調整ゲインＫが決定される。
【０２４２】
更に、テーブルMapK(Cmax,status)によれば、ステータスの値が同じである場合、調整ゲインＫは最大酸素吸蔵量Cmaxが大きいほど「より小さい値」となるように決定される。
【０２４３】
なお、上流側触媒４３の最大酸素吸蔵量Cmaxは、上流側触媒４３が吸蔵し得る酸素の量の最大値であり、所謂、アクティブ空燃比制御によって別途取得されている。最大酸素吸蔵量Ｃmaxは、上流側触媒４３の劣化が進むほど小さくなる。アクティブ空燃比制御は、例えば、特開平５−１３３２６４号公報等に記載された周知の制御である。従って、ここではその詳細な説明を省略する。最大酸素吸蔵量Cmaxは、取得される毎にバックアップＲＡＭに記憶・更新されるようになっている。
【０２４４】
以上、説明したように、第１制御装置は、
所定の下流側フィードバック条件（サブフィードバック制御条件）が成立している期間において、下流側空燃比センサ５７の出力値Voxsと所定の下流側目標値Voxsrefとの偏差に相関する値である出力偏差量（DVoxslow）に所定の比例ゲインKpを乗じることにより比例項（＝kp・DVoxslow）を算出し、
前記出力偏差量（DVoxslow）に所定の調整ゲインＫを乗じた値（Ｋ・DVoxslow)を積算することにより時間積分値（SDVoxslow）を算出するとともに、その算出された時間積分値（SDVoxslow）に比例した値（Ki・SDVoxslow）を積分項として算出し、
サブフィードバック量ＫＳＦＢ（即ち、下流側空燃比センサ５７の出力値Voxsを下流側目標値Voxsrefに一致させるための補正量であり、且つ、燃料噴射弁３３から噴射される燃料の量をフィードバック補正する空燃比フィードバック量）を少なくとも「比例項（＝kp・DVoxslow）及び積分項（＝Ki・SDVoxslow）に基いて算出する補正量算出手段（図１０のステップ１００５乃至ステップ１０４０を参照。）を備える。
【０２４５】
更に、第１制御装置は、
前記算出された積分項（＝Ki・SDVoxslow）に相関する値（Ki・SDVoxslow）を学習値（サブＦＢ学習値ＫＳＦＢｇ）として取得する学習手段（図１０のステップ１０４５及びステップ１０５５を参照。）と、
前記下流側フィードバック条件が成立している場合には少なくも前記空燃比フィードバック量（サブフィードバック量ＫＳＦＢ）に基いて最終燃料噴射量Fi(k)を算出するとともに（図７のルーチンのステップ７２０乃至ステップ７６０、図８のルーチンを参照。）、前記下流側フィードバック条件が成立していない場合には少なくとも前記学習値（サブＦＢ学習値ＫＳＦＢｇ）に基いて最終燃料噴射量Fi(k)を算出し（図７のルーチンのステップ７２０乃至ステップ７６０、図８のルーチン、及び図１０のステップ１０７０を参照。）
、前記算出された最終燃料噴射量Fi(k)の燃料を燃料噴射弁３３から噴射させる燃料噴射制御手段（図７のステップ７７０）と、
を備える。
【０２４６】
加えて、第１制御装置の前記学習手段は、
前記学習値（サブＦＢ学習値ＫＳＦＢｇ）が、所定の上限値Vgmaxthと所定の下限値Vgminthとの間に所定時間に渡って存在している場合、前記学習値が収束したと判定するように構成されている（図１３の特にステップ１３２０、ステップ１３３５、図１４のルーチンを参照。）。
【０２４７】
加えて、第１制御装置の前記補正量算出手段は、
前記比例ゲインKpを、前記学習値（サブＦＢ学習値ＫＳＦＢｇ）が収束したと判定された後（例えば、statusが「２」に設定された後）は前記学習値が収束したと判定される前（例えば、statusが「１」に設定されているとき）に比べて小さい値に設定するとともに（図１５のルーチンを参照。）、
前記調整ゲインＫを、前記学習値（サブＦＢ学習値ＫＳＦＢｇ）が収束したと判定された後（例えば、statusが「２」に設定された後）は前記学習値が収束したと判定される前（例えば、statusが「１」に設定されているとき）に比べて小さい値に設定するように構成されている（図１６のステップ１６２０を参照。）。
【０２４８】
この結果、サブＦＢ学習値ＫＳＦＢｇが収束したと判定される前（例えば、statusが「２」であると判定される前）において、サブＦＢ学習値ＫＳＦＢｇの所定期間（カウンタＣＬが０から閾値ＣＬｔｈに至るまでの状態判定期間）における変化量は小さくなるので、サブＦＢ学習値ＫＳＦＢｇが収束したとの判定を早期に行うことができる。加えて、サブＦＢ学習値ＫＳＦＢｇが収束したと判定された後（例えば、statusが「２」であると判定される後）において、触媒４３の酸素吸蔵量ＯＳＡが「最大酸素吸蔵量Ｃmax」及び「０」に到達する頻度が小さくなる（前述した出力値Voxsの反転周期が長くなる）ので、エミッションを改善することができる。
【０２４９】
更に、第１制御装置によれば、サブＦＢ学習値ＫＳＦＢｇの収束の程度が進むほど、調整ゲインＫが小さくなる。これにより、サブＦＢ学習値ＫＳＦＢｇが収束したと判定される前（statusが「０」又「１」であるとき）において、サブＦＢ学習値ＫＳＦＢｇを適切な値（収束すべき値）に迅速に近づけることができるとともに、サブＦＢ学習値ＫＳＦＢｇが収束したと判定された後（statusが「２」となった後）においてサブＦＢ学習値ＫＳＦＢｇを適切な値の近傍に安定して維持することができる。
【０２５０】
＜第２実施形態＞
次に、本発明の第２実施形態に係る制御装置（以下、「第２制御装置」とも称呼する。）について説明する。この第２制御装置は、サブＦＢ学習値ＫＳＦＢｇが収束したと判定される前（例えば、statusが「０」又は「１」であるとき）において、比例ゲインKpを「吸入空気量Ｇａが大きいほど小さくなる値（実際には、吸入空気量Ｇａに反比例する値）」に設定する点のみにおいて、第１制御装置と相違している。以下、この相違点を中心に説明する。
【０２５１】
触媒４３に流入する空燃比が「ある値」であったとしても、吸入空気量Ｇａが大きいほど触媒４３に流入する「過剰な酸素又は過剰な未燃物」の量は多くなる。従って、触媒４３の酸素吸蔵量の変化速度は吸入空気量Ｇａが大きいほど大きくなる。このため、図１７に示したように、比例ゲインKpを吸入空気量Ｇａに関わらず一定値に維持していると、吸入空気量が小さい場合（時刻ｔ４以降）の「下流側空燃比センサ５７の出力値Voxsの反転周期」は、吸入空気量Ｇａが大きい場合（時刻ｔ１−時刻ｔ４）の「下流側空燃比センサ５７の出力値Voxsの反転周期」よりも長くなる。その結果、吸入空気量Ｇａが小さいほど学習値（サブＦＢ学習値）の変化量はより大きくなる（変化量Ｄ１及びＤ２を参照。）。
【０２５２】
これに対し、第２制御装置は、サブＦＢ学習値ＫＳＦＢｇが収束したと判定される前（例えば、statusが「０」又は「１」であるとき）において、比例ゲインKpを「吸入空気量Ｇａが大きいほど小さくなる値（実際には、吸入空気量Ｇａに反比例する値）」に設定する。
【０２５３】
この結果、図１８に示したように、吸入空気量Ｇａが変化した場合であっても（時刻ｔ４の前後を参照。）、「下流側空燃比センサ５７の出力値Voxsの反転周期」を略一定に維持することが可能となる。従って、吸入空気量Ｇａが減少した場合であっても状態判定期間におけるサブＦＢ学習値ＫＳＦＢｇの変化量が大きくならないので、第２制御装置は「サブＦＢ学習値ＫＳＦＢｇが収束したとの判定（statusが「２」であるとの判定）」を早期に行うことができる。
【０２５４】
（実際の作動）
次に、第２制御装置の実際の作動について説明する。第２制御装置のＣＰＵは、図７乃至図１４、図１５に代わる図１９、及び、図１６に示したルーチンを実行する。図１９以外の図に示したルーチンについては説明済みである。よって、以下、図１９に示したルーチンについて説明する。なお、図１９に示したステップのうち図１５に説明したステップと同一の処理を行うためのステップには、そのようなステップに付された符号と同一の符合が付されている。更に、以下に述べる値「Kplarge、Kpmid及びKpsmall」は、第１制御装置が使用する値「Kplarge、Kpmid及びKpsmall」とそれぞれ同一である。
【０２５５】
図１９のルーチンは、図１５のステップ１５４０及びステップ１５５０を、ステップ１９４０及びステップ１９５０にそれぞれ置換したルーチンである。従って、第２制御装置のＣＰＵは、サブＦＢ学習値ＫＳＦＢｇの学習が殆ど進んでいない状態である場合、即ち、statusが「０」である場合、ステップ１５３０からステップ１９４０に進み、比例ゲインKpを「吸入空気量Ｇａに反比例する第３比例ゲイン（最大比例ゲイン）Kplarge／Ｇａ）」に設定する。その後、ＣＰＵはステップ１９９５に進み、本ルーチンを一旦終了する。この結果、statusが「０」である場合、比例ゲインKpは吸入空気量Ｇａが大きいほど小さくなる値Kplarge／Ｇａに設定される。但し、値Kplarge／Ｇａは、第１比例ゲイン（最小比例ゲイン）Kpsmall以上の値である。
【０２５６】
更に、第２制御装置のＣＰＵは、サブＦＢ学習値ＫＳＦＢｇの収束状態が準安定状態状態である場合、即ち、statusが「１」である場合、ステップ１５３０からステップ１９５０に進み、比例ゲインKpを「吸入空気量Ｇａに反比例する第２比例ゲイン（中程度比例ゲイン）Kpmid／Ｇａ）」に設定する。その後、ＣＰＵはステップ１９９５に進み、本ルーチンを一旦終了する。この結果、statusが「１」である場合、比例ゲインKpは吸入空気量Ｇａが大きいほど小さくなる値Kpmid／Ｇａに設定される。但し、値Kpmid／Ｇａは、第１比例ゲイン（最小比例ゲイン）Kpsmall以上の値である。更に、値Kpmid／Ｇａは、吸入空気量Ｇａが「ある特定値」であるとき、値Kplarge／Ｇａよりも小さい。
【０２５７】
以上をまとめると、ＣＰＵは、以下のように比例ゲインKpを設定する。
（１）statusが「０」であるとき：比例ゲインKp＝Kplarge／Ｇａ
（２）statusが「１」であるとき：比例ゲインKp＝Kpmid／Ｇａ
（３）statusが「２」であるとき：比例ゲインKp＝Kpsmall
【０２５８】
以上、説明したように、第２制御装置は、第１制御装置と同様の補正量算出手段を備える。但し、第２制御装置の補正量算出手段は、学習値（サブＦＢ学習値ＫＳＦＢｇ）が収束したと判定される前（例えば、statusが「１」である場合）において、比例ゲインKpを、吸入空気量Ｇａが小さいほど大きくするように構成されている（図１９のステップ１９５０を参照。）。
【０２５９】
この結果、吸入空気量Ｇａが変化した場合であっても、「下流側空燃比センサ５７の出力値Voxsの反転周期」を略一定に維持することが可能となる。従って、吸入空気量Ｇａが減少した場合であっても状態判定期間におけるサブＦＢ学習値ＫＳＦＢｇの変化量が大きくならないので、第２制御装置は「サブＦＢ学習値ＫＳＦＢｇが収束したとの判定（statusが「２」であるとの判定）」を早期に行うことができる。
【０２６０】
なお、第２制御装置のＣＰＵは、ステップ１５６０にて、比例ゲインKpを「値Kpsmall／Ｇａ」に設定してもよい。即ち、第２制御装置は、サブＦＢ学習値ＫＳＦＢｇの収束の程度に依らず、比例ゲインKpを「吸入空気量Ｇａが大きいほど小さくなる値」に設定してもよい。
【０２６１】
＜第３実施形態＞
次に、本発明の第３実施形態に係る制御装置（以下、「第３制御装置」とも称呼する。）について説明する。この第３制御装置は、サブＦＢ学習値ＫＳＦＢｇが収束したと判定される前（例えば、statusが「０」又は「１」であるとき）において、比例ゲインKpを「吸入空気量Ｇａが大きいほど小さくなり、且つ、触媒４３の最大酸素吸蔵量Ｃmaxが小さくなるほど小さくなる値」に設定する点のみにおいて、第１制御装置と相違している。以下、この相違点を中心に説明する。
【０２６２】
触媒４３に流入する空燃比が「ある値」であり、且つ、吸入空気量Ｇａが「ある値」であっても、「下流側空燃比センサ５７の出力値Voxsの反転周期」は触媒４３の劣化の程度が進むほど短くなる。これは、触媒４３の劣化の程度が進むと、触媒４３の最大酸素吸蔵量Ｃmaxが小さくなるので、酸素吸蔵量が「０」又は最大酸素吸蔵量Ｃmaxに早期に到達してしまうからである。
【０２６３】
これに対し、第３制御装置は、サブＦＢ学習値ＫＳＦＢｇが収束したと判定される前（例えば、statusが「０」又は「１」であるとき）において、比例ゲインKpを「最大酸素吸蔵量Ｃmaxが小さいほど小さくなる値」に設定する。
【０２６４】
この結果、触媒４３の劣化の進行度（劣化度の程度、劣化度合い）に関わらず、「下流側空燃比センサ５７の出力値Voxsの反転周期」を略一定に維持することが可能となる。従って、触媒４３の劣化の程度に依らず、サブＦＢ学習値ＫＳＦＢｇが実質的に収束している場合においてサブＦＢ学習値ＫＳＦＢｇの変化量を略一定に維持することができるので、第３制御装置は「サブＦＢ学習値ＫＳＦＢｇが収束したとの判定（statusが「２」であるとの判定）」を早期に行うことができる。
【０２６５】
（実際の作動）
次に、第３制御装置の実際の作動について説明する。第３制御装置のＣＰＵは、図７乃至図１４、図１５に代わる図２０、及び、図１６に示したルーチンを実行する。図２０以外の図に示したルーチンについては説明済みである。よって、以下、図２０に示したルーチンについて説明する。
【０２６６】
第３制御装置のＣＰＵは、比例ゲインKpを決定するために、図２０にフローチャートにより示したルーチンを所定時間が経過する毎に繰り返し実行するようになっている。従って、所定のタイミングになると、ＣＰＵは図２０のステップ２０００から処理を開始し、ステップ２０１０にてステータス（status）を読み込む。
【０２６７】
次に、ＣＰＵはステップ２０２０に進み、statusが「２」であるか否かを判定する。即ち、ＣＰＵは、ステップ２０２０にてサブＦＢ学習値ＫＳＦＢｇの学習が完了しているか否か（サブＦＢ学習値ＫＳＦＢｇが収束値ki・SDVoxsfinalに十分近づいているか否か）を判定する。
【０２６８】
このとき、statusが「２」であると、ＣＰＵはステップ２０２０にて「Ｙｅｓ」と判定してステップ２０３０に進み、比例ゲインKpを第１制御装置が使用する第１比例ゲイン（最小比例ゲイン）Kpsmallに設定する。その後、ＣＰＵはステップ２０９５に進み、本ルーチンを一旦終了する。
【０２６９】
一方、ＣＰＵがステップ２０２０の処理を行う時点において、statusが「２」でなければ、ＣＰＵはステップ２０２０にて「Ｎｏ」と判定してステップ２０４０に進み、補正係数（触媒劣化度補正係数）ｋｈを決定する。補正係数ｋｈは、最大酸素吸蔵量Ｃmaxが小さいほど「１」よりも小さい範囲において小さくなるように決定される。但し、補正係数ｋｈは正の値である。
【０２７０】
次に、ＣＰＵはステップ２０５０に進み、statusが「０」であるか否かを判定する。即ち、ＣＰＵは、ステップ２０５０にてサブＦＢ学習値ＫＳＦＢｇの学習が殆ど進んでいない状態であるか否か（サブＦＢ学習値ＫＳＦＢｇが収束値ki・SDVoxsfinalから大きく乖離しているか否か）を判定する。
【０２７１】
このとき、statusが「０」であると、ＣＰＵはステップ２０５０にて「Ｙｅｓ」と判定してステップ２０６０に進み、比例ゲインKpを第３比例ゲイン（最大比例ゲイン）に設定する。第３比例ゲインは、補正係数ｋｈと第１制御装置が使用する最大比例ゲインKplargeとの積を吸入空気量Ｇａで除した値（＝ｋｈ・Kplarge／Ｇａ）である。その後、ＣＰＵはステップ２０９５に進み、本ルーチンを一旦終了する。
【０２７２】
この結果、statusが「０」である場合、比例ゲインKpは吸入空気量Ｇａが大きいほど小さくなり、且つ、最大酸素吸蔵量Ｃmaxが小さいほど小さくなる値ｋｈ・Kplarge／Ｇａに設定される。但し、値ｋｈ・Kplarge／Ｇａは、第１比例ゲイン（最小比例ゲイン）Kpsmall以上の値である。
【０２７３】
更に、ＣＰＵがステップ２０５０の処理を行う時点において、statusが「０」でなければ、ＣＰＵはステップ２０５０にて「Ｎｏ」と判定してステップ２０７０に進み、比例ゲインKpを第２比例ゲイン（中程度比例ゲイン）に設定する。第２比例ゲインは、補正係数ｋｈと第１制御装置が使用する中程度比例ゲインKpmidとの積を吸入空気量Ｇａで除した値（＝ｋｈ・Kpmid／Ｇａ）である。その後、ＣＰＵはステップ２０９５に進み、本ルーチンを一旦終了する。
【０２７４】
この結果、statusが「１」である場合、比例ゲインKpは吸入空気量Ｇａが大きいほど小さくなり、且つ、最大酸素吸蔵量Ｃmaxが小さいほど小さくなる値ｋｈ・Kpmid／Ｇａに設定される。但し、値ｋｈ・Kpmid／Ｇａは、第１比例ゲイン（最小比例ゲイン）Kpsmall以上の値である。
【０２７５】
以上をまとめると、ＣＰＵは、以下のように比例ゲインKpを設定する。
（１）statusが「０」であるとき：比例ゲインKp＝ｋｈ・Kplarge／Ｇａ
（２）statusが「１」であるとき：比例ゲインKp＝ｋｈ・Kpmid／Ｇａ
（３）statusが「２」であるとき：比例ゲインKp＝Kpsmall
【０２７６】
以上、説明したように、第３制御装置は、第１制御装置と同様の補正量算出手段を備える。但し、第３制御装置の補正量算出手段は、学習値（サブＦＢ学習値ＫＳＦＢｇ）が収束したと判定される前（例えば、statusが「１」である場合）において、比例ゲインKpを、吸入空気量Ｇａが大きいほど小さくし、触媒４３の劣化の程度が進行している（大きい）ほど小さくするように構成されている（図２０のステップ２０４０、及び、図２０のその他のステップを参照。）。
【０２７７】
この結果、第３制御装置は、触媒４３の劣化の程度に関わらず、且つ、吸入空気量Ｇａの大きさに関わらず、「下流側空燃比センサ５７の出力値Voxsの反転周期」を略一定に維持することが可能となる。よって、触媒４３の劣化の程度に依らず、学習値（サブＦＢ学習値ＫＳＦＢｇ）が実質的に収束している場合においてその学習値の変化量を略一定に維持することができる。従って、第３制御装置は、「サブＦＢ学習値ＫＳＦＢｇが収束したとの判定」を早期に行うことができる。
【０２７８】
なお、第３制御装置のＣＰＵは、ステップ２０３０にて、比例ゲインKpを「値ｋｈ・Kpsmall、又は、値ｋｈ・Kpsmall／Ｇａ」に設定してもよい。
【０２７９】
以上、説明したように、本発明の各実施形態に係る燃料噴射量制御装置は、サブフィードバック量ＫＳＦＢの比例ゲインKpを、サブＦＢ学習値ＫＳＦＢｇが収束したと判定された後はサブＦＢ学習値ＫＳＦＢｇが収束したと判定される前に比べて小さい値に設定する。その結果、サブＦＢ学習値ＫＳＦＢｇが収束したとの判定を迅速に行うことができ、且つ、サブＦＢ学習値ＫＳＦＢｇが収束したとの判定後においてエミッションを良好にすることができる。
【０２８０】
なお、本発明は上記実施形態に限定されることはなく、本発明の範囲内において種々の変形例を採用することができる。例えば、サブフィードバック制御は、サブフィードバック量により上流側空燃比センサ５６の出力値Vabyfsを補正する周知の態様であってもよい。加えて、上記実施形態における時間積分値SDVoxslowは、出力偏差量DVoxsをローパスフィルタ処理した値DVoxslowに所定の調整ゲインＫを乗じた値を積算することにより求められていたが、ローパスフィルタ処理を行わない出力偏差量DVoxsに所定の調整ゲインＫを乗じた値を積算することにより求められてもよい。
【０２８１】
更に、サブＦＢ学習値ＫＳＦＢｇは、時間積分値SDVoxslowそのものを取り込んだ値であってもよく、サブフィードバック量ＫＳＦＢにローパスフィルタ処理を施した値であってもよい。即ち、サブＦＢ学習値ＫＳＦＢｇは、サブフィードバック量ＫＳＦＢの定常成分に応じた値（サブフィードバック量ＫＳＦＢの積分項に相関する値）であればよい。
【０２８２】
加えて、上記各実施形態に係る燃料噴射量制御装置は、所定時間が経過する期間におけるサブＦＢ学習値ＫＳＦＢｇ（学習値）の変化量を求め、その変化量が所定の判定用閾値幅よりも小さい場合にサブＦＢ学習値ＫＳＦＢｇが収束したと判定し（例えば、statusが「２」であると判定し）、その変化量が所定の判定用閾値幅以上である場合にサブＦＢ学習値ＫＳＦＢｇが収束していないと判定する（例えば、statusが「１」又は「０」であると判定する）ように構成されていてもよい。
【０２８３】
更に、サブフィードバック量ＫＳＦＢは、サブＦＢ学習値ＫＳＦＢｇを含まないように算出されてもよい。即ち、ＫＳＦＢ＝Kp・DVoxslow＋Ki・SDVoxslow＋Kd・DDVoxslowであってもよい。
【０２８４】
加えて、第２及び第３制御装置において、サブＦＢ学習値ＫＳＦＢｇが収束したと判定される前に設定される比例ゲインKpは、吸入空気量Ｇａに反比例した値でなくてもよく、吸入空気量Ｇａが大きくなるほど小さくなる値であればよい。
【符号の説明】
【０２８５】
１０…内燃機関、２１…燃焼室、３０…吸気系統、３３…燃料噴射弁、４０…排気系統、４１…エキゾーストマニホールド、４１ｂ…集合部（排気集合部ＨＫ）、４２…エキゾーストパイプ、４３…上流側触媒（触媒）、５６…上流側空燃比センサ、５７…下流側空燃比センサ、７０…電気制御装置。
【図１】
0005644291.tif 000002
【図２】
0005644291.tif 000003
【図３】
0005644291.tif 000004
【図４】
0005644291.tif 000005
【図５】
0005644291.tif 000006
【図６】
0005644291.tif 000007
【図７】
0005644291.tif 000008
【図８】
0005644291.tif 000009
【図９】
0005644291.tif 000010
【図１０】
0005644291.tif 000011
【図１１】
0005644291.tif 000012
【図１２】
0005644291.tif 000013
【図１３】
0005644291.tif 000014
【図１４】
0005644291.tif 000015
【図１５】
0005644291.tif 000016
【図１６】
0005644291.tif 000017
【図１７】
0005644291.tif 000018
【図１８】
0005644291.tif 000019
【図１９】
0005644291.tif 000020
【図２０】
0005644291.tif 000021