(57)【要約】【課題】リア空燃比センサの出力が短い周期でリッチとリーンを繰り返す現象が生じるときにも検出可能とする。【解決手段】フロント空燃比センサ（４）の出力に基づいて酸素ストレージ量を推定し、この酸素ストレージ量推定値が目標値と一致するように空燃比を制御する手段（６）と、リア空燃比センサ出力がリーンを継続するときに酸素ストレージ量最大値より酸素ストレージ量推定値を差し引いた値を積算した面積を第一面積として、またリア空燃比センサ出力がリッチを継続するときに酸素ストレージ量推定値より酸素ストレージ量最小値を差し引いた値を積算した面積を第二面積としてそれぞれ演算する手段（６）と、これら第一面積と第二面積に基づいてフロント空燃比センサ（４）のストイキ点がリーンシフトしているときにフロント空燃比センサ（４）のストイキ点をリーン側に補正する手段（６）とを備える。【選択図】図１
2006002579.tif 000002
【特許請求の範囲】
【請求項１】
排気空燃比に応じて排気中の酸素を取り込み、あるいは放出する酸素ストレージ能力のある触媒と、この酸素ストレージ量が目標値になるように空燃比を制御する装置において、
前記触媒上流に設置したフロント空燃比センサと、
前記触媒下流に設置したリア空燃比センサと、
前記フロント空燃比センサの出力に基づいて酸素ストレージ量を推定し、この酸素ストレージ量推定値が目標値と一致するように空燃比を制御する空燃比制御手段と、
前記リア空燃比センサ出力がリーンを継続するときに酸素ストレージ量最大値より前記酸素ストレージ量推定値を差し引いた値を積算した面積を第一面積として演算する第一面積演算手段と、
前記リア空燃比センサ出力がリッチを継続するときに前記酸素ストレージ量推定値より酸素ストレージ量最小値を差し引いた値を積算した面積を第二面積として演算する第二面積演算手段と、
これら第一面積と第二面積に基づいて前記フロント空燃比センサのストイキ点がリーンシフトしているか否かを判定する判定手段と、
この判定結果より前記フロント空燃比センサのストイキ点がリーンシフトしているときに前記フロント空燃比センサのストイキ点をリーン側に補正するリーン側補正手段と
を備えることを特徴とする内燃機関の空燃比制御装置。
【請求項２】
前記判定手段は、前記第一面積と第二面積の比が一定値を超えるとき前記フロント空燃比センサのストイキ点がリーンシフトしていると判定することを特徴とする請求項１に記載の内燃機関の空燃比制御装置。
【請求項３】
排気空燃比に応じて排気中の酸素を取り込み、あるいは放出する酸素ストレージ能力のある触媒と、この酸素ストレージ量が目標値になるように空燃比を制御する装置において、
前記触媒上流に設置したフロント空燃比センサと、
前記触媒下流に設置したリア空燃比センサと、
前記フロント空燃比センサの出力に基づいて酸素ストレージ量を推定し、この酸素ストレージ量推定値が目標値と一致するように空燃比を制御する空燃比制御手段と、
前記リア空燃比センサ出力がストイキよりリッチへと横切ったときに酸素ストレージ量最大値より前記酸素ストレージ量推定値を差し引いた値を第一長さとして演算する第一長さ演算手段と、
前記リア空燃比センサ出力がストイキよりリーンへと横切ったときに前記酸素ストレージ量推定値より酸素ストレージ量最小値を差し引いた値を第二長さとして演算する第二長さ演算手段と、
これら第一長さと第二長さに基づいて前記フロント空燃比センサのストイキ点がリーンシフトしているか否かを判定する判定手段と、
この判定結果より前記フロント空燃比センサのストイキ点がリーンシフトしているときに前記フロント空燃比センサのストイキ点をリーン側に補正するリーン側補正手段と
を備えることを特徴とする内燃機関の空燃比制御装置。
【請求項４】
前記判定手段は、前記第一長さと第二長さの比が一定値を超えるとき前記フロント空燃比センサのストイキ点がリーンシフトしていると判定することを特徴とする請求項３に記載の内燃機関の空燃比制御装置。
【請求項５】
排気空燃比に応じて排気中の酸素を取り込み、あるいは放出する酸素ストレージ能力のある触媒と、この酸素ストレージ量が目標値になるように空燃比を制御する装置において、
前記触媒上流に設置したフロント空燃比センサと、
前記触媒下流に設置したリア空燃比センサと、
前記フロント空燃比センサの出力に基づいて酸素ストレージ量を推定し、この酸素ストレージ量推定値が目標値と一致するように空燃比を制御する空燃比制御手段と、
前記リア空燃比センサ出力がリーンを継続するときのリーン側出力を積算した面積を第三面積として演算する第三面積演算手段と、
前記リア空燃比センサ出力がリッチを継続するときのリッチ側出力を積算した面積を第四面積として演算する第四面積演算手段と、
これら第三面積と第四面積に基づいて前記フロント空燃比センサのストイキ点がリーンシフトしているか否かを判定する判定手段と、
この判定結果より前記フロント空燃比センサのストイキ点がリーンシフトしているときに前記フロント空燃比センサのストイキ点をリーン側に補正するリーン側補正手段と
を備えることを特徴とする内燃機関の空燃比制御装置。
【請求項６】
前記判定手段は、前記第三面積と第四面積の比が一定値を超えるとき前記フロント空燃比センサのストイキ点がリーンシフトしていると判定することを特徴とする請求項５に記載の内燃機関の空燃比制御装置。
【請求項７】
排気空燃比に応じて排気中の酸素を取り込み、あるいは放出する酸素ストレージ能力のある触媒と、この酸素ストレージ量が目標値になるように空燃比を制御する装置において、
前記触媒上流に設置したフロント空燃比センサと、
前記触媒下流に設置したリア空燃比センサと、
前記フロント空燃比センサの出力に基づいて酸素ストレージ量を推定し、この酸素ストレージ量推定値が目標値と一致するように空燃比を制御する空燃比制御手段と、
一定区間当たりに前記リア空燃比センサ出力が最小値より最大値までまたは最大値より最小値まで振れる振幅回数を演算する振幅回数演算手段と、
この一定区間当たりの振幅回数に基づいて前記フロント空燃比センサのストイキ点がリーンシフトしているか否かを判定する判定手段と、
この判定結果より前記フロント空燃比センサのストイキ点がリーンシフトしているときに前記フロント空燃比センサのストイキ点をリーン側に補正するリーン側補正手段と
を備えることを特徴とする内燃機関の空燃比制御装置。
【請求項８】
前記判定手段は、前記一定区間当たりの振幅回数が一定回数を超えるとき前記フロント空燃比センサのストイキ点がリーンシフトしていると判定することを特徴とする請求項７に記載の内燃機関の空燃比制御装置。
【請求項９】
排気空燃比に応じて排気中の酸素を取り込み、あるいは放出する酸素ストレージ能力のある触媒と、この酸素ストレージ量が目標値になるように空燃比を制御する装置において、
前記触媒上流に設置したフロント空燃比センサと、
前記触媒下流に設置したリア空燃比センサと、
前記フロント空燃比センサの出力に基づいて酸素ストレージ量を推定し、この酸素ストレージ量推定値が目標値と一致するように空燃比を制御する空燃比制御手段と、
前記フロント空燃比センサのストイキ点がリーンシフトしているときに前記リア空燃比センサ出力が横切らないリッチ側スライスレベルと、
前記フロント空燃比センサのストイキ点がリーンシフトしているときに前記リア空燃比センサ出力が横切るリーン側スライスレベルと、
一定区間当たりに前記リア空燃比センサ出力が前記リッチ側スライスレベルを横切ることなくかつ前記リーン側スライスレベルを連続して同じ方向に横切る回数を演算する連続横切り回数演算手段と、
この一定区間当たりの連続横切り回数に基づいて前記フロント空燃比センサのストイキ点がリーンシフトしているか否かを判定する判定手段と、
この判定結果より前記フロント空燃比センサのストイキ点がリーンシフトしているときに前記フロント空燃比センサのストイキ点をリーン側に補正するリーン側補正手段と
を備えることを特徴とする内燃機関の空燃比制御装置。
【請求項１０】
前記判定手段は、前記一定区間当たりの連続横切り回数が一定回数を超えるとき前記フロント空燃比センサのストイキ点がリーンシフトしていると判定することを特徴とする請求項９に記載の内燃機関の空燃比制御装置。
【請求項１１】
運転条件が所定の学習領域に継続して滞在している場合であるか否かを判定する判定手段を備え、
この判定結果より運転条件が学習領域に継続して滞在している場合に前記振幅回数を演算することを特徴とする請求項７または８に記載の内燃機関の空燃比制御装置。
【請求項１２】
運転条件が所定の学習領域に継続して滞在している場合であるか否かを判定する判定手段を備え、
この判定結果より運転条件が学習領域に継続して滞在している場合に前記連続横切り回数を演算することを特徴とする請求項９または１０に記載の内燃機関の空燃比制御装置。
【請求項１３】
前記学習領域は高空気流領域を除いた領域であることを特徴とする請求項１１または１２に記載の内燃機関の空燃比制御装置。
【請求項１４】
前記リーン側補正手段は、
前記フロント空燃比センサの出力を空燃比へと変換する空燃比変換手段と、
前記フロント空燃比センサのストイキ点がリーンシフトしていると判定したときに正の値のシフト補正量を演算するシフト補正量演算手段と、
このシフト補正量を前記フロント空燃比センサの出力を空燃比へと変換した値に加算した値を実空燃比として演算する実空燃比演算手段と
からなることを特徴とする請求項１から１０までのいずれか一つに記載の内燃機関の空燃比制御装置。
【請求項１５】
前記空燃比制御手段は、
前記酸素ストレージ量推定値と目標値との偏差を演算する偏差演算手段と、
この偏差に基づいて目標空燃比を演算する目標空燃比演算手段と、
前記実空燃比がこの目標空燃比と一致するように空燃比フィードバック補正係数を演算する空燃比フィードバック補正係数演算手段と、
この空燃比フィードバック補正係数でストイキ時の燃料供給量を補正する燃料供給量補正手段と
からなることを特徴とする請求項１４に記載の内燃機関の空燃比制御装置。
【請求項１６】
前記シフト補正量は学習値であることを特徴とする請求項１４または１５に記載の内燃機関の空燃比制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は内燃機関の空燃比センサの特性シフト検出装置に関するものである。
【背景技術】
【０００２】
内燃機関（エンジン）の排気中のＨＣ、ＣＯ、ＮＯｘを三元触媒によって同時に浄化するには、触媒雰囲気を理論空燃比（以下「ストイキ」という。）に維持する必要があり、ストイキから少しでもずれたときの浄化効率が低下することのないように、触媒に酸素ストレージ能力（酸素保持能力）を持たせているものが知られている。
【０００３】
ストイキよりもリーンな排気を与えると、触媒が排気中の酸素を取り込み、この酸素ストレージ量が飽和するまでは、触媒雰囲気をストイキに維持できる。また、ストイキよりもリッチな排気を与えると、触媒が保持している酸素が放出され、保持酸素のすべてを放出するまでは、触媒雰囲気をストイキに保持する。このようにして一時的な空燃比のずれから生じる酸素の過不足分を触媒が補い、触媒雰囲気を実質的にストイキに保つことが可能となる。
【０００４】
触媒の酸素ストレージ量が常に目標値、例えば最大ストレージ量の半分程度となるように空燃比を制御してやると、酸素の取り込みと放出の容量が均等化し、空燃比のストイキからのリッチ、リーンのいずれの側の変動に対しても吸収能力が高められ、排気の浄化効率を最良に保てる。
【０００５】
そこで、触媒上流に設置したフロント空燃比センサの出力に基づいて、触媒に流入する排気の酸素過不足量（空燃比から換算する）を積算して触媒の酸素ストレージ量を求め、この酸素ストレージ量が目標値と一致するように空燃比をフィードバック制御している。
【０００６】
しかし、フロント空燃比センサは、高い排気温度に晒されることなどから経時的に劣化しやすく、またセンサ製造時の品質のバラツキもあって空燃比のストイキ点にシフト（ずれている）、具体的にはストイキ点がリッチ側またはリーン側へのシフトを生じることがある。検出される空燃比にこのようなストイキ点のシフトを生じると、フロント空燃比センサの出力に基づいて演算した触媒の酸素ストレージ量が不正確になり、結果として触媒の酸素ストレージ量を目標値に収束させられなくなる。
【０００７】
このため、触媒下流にもリア空燃比センサを設け、このリア空燃比センサの出力からフロント空燃比センサのストイキ点のシフトを判断する提案が、特許文献１によってなされている。
【０００８】
これは、フロント空燃比センサの出力に基づいて酸素ストレージ量が目標値となるように制御しているにもかかわらず、リア空燃比センサの出力が一定時間以上にわたり、空燃比のリーンまたはリッチを検出することがあると、実際の酸素ストレージ量が目標値から大きくずれていると判定し、そして、この誤差の原因はフロント空燃比センサのストイキ点がリーン側やリッチ側にシフトしているためであると認定するものである。この場合、フロント空燃比センサのストイキ点がシフトしたときは、下流側で検出された空燃比から、フロント空燃比センサのストイキ点がどちらの方向にシフトしているか判断し、これに基づいて例えばリーン側にシフトしていればこれに応じてフロント空燃比センサのストイキ点をリーン側に補正することにより、酸素ストレージ量が正確に目標値に一致するようにしている。
【特許文献１】特開２００３−４１９９０公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
ところで、上記特許文献１に記載の技術では、フロント空燃比センサの出力に基づいて酸素ストレージ量が目標値となるように制御しているにもかかわらず、リア空燃比センサのストイキ点がリーンまたはリッチに切換わってから一定時間を経過したときにフロント空燃比センサのストイキ点がシフトしているとの判断を行っている。一定時間を経過したことを条件とするのは、ストイキ点のシフト以外の原因でフロント空燃比センサのストイキ点が一時的にリーンまたはリッチになっている場合などを除外するためで、定常的にフロント空燃比センサのストイキ点がリーンまたはリッチ側にずれているときに限り、フロント空燃比センサのストイキ点がリーン側やリッチ側へシフトしていると認定するためである。
【００１０】
しかしながら、実際にはフロント空燃比センサのストイキ点がリーンシフトしている場合に、リア空燃比センサの出力が短い周期でリッチとリーンを繰り返す現象が生じることがその後の実験により判明した。
【００１１】
これについて図２を参照してさらに説明すると、図２は低空気量時（定常）においてフロント空燃比センサのストイキ点がリーンシフトしている場合に、酸素ストレージ量、リア空燃比センサ出力、フロント空燃比がどのように変化するのかをモデル的に示している。なお、図２最上段において、実線は演算上の酸素ストレージ量（酸素ストレージ量推定値）の動きを、破線は実際の酸素ストレージ量の動きを表している。また、図２最下段において実線は目標空燃比の動きを、一点鎖線はストイキ点がストイキにあるフロント空燃比センサの出力を空燃比に換算した値の動きを、破線はストイキ点がリーンシフトしているフロント空燃比センサの出力を空燃比に換算した値の動きを表している。
【００１２】
図２において、演算上の酸素ストレージ量が実際の酸素ストレージ量と一致しているのであれば、演算上の酸素ストレージ量は目標酸素ストレージ量（ＥＭＰＴＹとＦＵＬＬのほぼ中間の値）に維持されているのであるから、ｔ１のタイミングでリア空燃比センサ出力がストイキよりリーンへと外れることはないはずであるが、実際にはｔ１のタイミングでリア空燃比センサ出力がストイキよりリーンへと外れている。このことは、実際の酸素ストレージ量は演算上の値のようでなく、破線で示したように増えていきｔ１のタイミングで酸素ストレージ量の最大値（ＦＵＬＬ）に達していることを表している。
【００１３】
ｔ１のタイミングでリア空燃比センサ出力がストイキよりリーンへと外れると、演算上の酸素ストレージ量は最大値（ＦＵＬＬ）へとステップ的にセットされ、この最大値にセットされた酸素ストレージ量と目標酸素ストレージ量との偏差に基づいて目標空燃比が設定されることから、目標空燃比はｔ１のタイミングで演算上の酸素ストレージ量を減らす側つまりリッチ側に向かい（ステップ的に小さくなり）、このリッチ側になった目標空燃比と、実空燃比（フロント空燃比センサにより検出される）との偏差に基づいて演算される空燃比フィードバック補正係数αにより空燃比がリッチ側へと戻されようとする。
【００１４】
この場合に、目標空燃比に対して実空燃比が遅れをもって追従するが、ストイキ点がリーンシフトしているフロント空燃比センサにより検出される実空燃比（図２最下段の破線参照）は、ストイキ点がストイキにあるフロント空燃比センサにより検出される実空燃比（図２最下段の一点鎖線参照）よりリーン側にシフトしている（これがそもそものストイキ点のリーンシフトである）ので、そのシフトしている分だけ目標空燃比との偏差が大きくなり、従って目標空燃比に対する実空燃比の遅れが大きくなり、このため、演算上の酸素ストレージ量が目標酸素ストレージ量を行き過ぎて最小値（ＥＭＰＴＹ）へと向かってしまい、ｔ２のタイミングでリア空燃比センサ出力が今度はリッチ側へと外れている。このとき、演算上の酸素ストレージ量は今度は最小値（ＥＭＰＴＹ）へとステップ的にセットされ、この最小値にセットされた酸素ストレージ量と目標酸素ストレージ量との偏差に基づいて目標空燃比が設定されると、目標空燃比はｔ２のタイミングで今度はリーン側に向かい（ステップ的に大きくなり）、このリーン側の目標空燃比と実空燃比との偏差に基づいて演算される空燃比フィードバック補正係数αにより、空燃比が今度はリーン側に戻されようとする。
【００１５】
この場合に、やはり目標空燃比に対して実空燃比が遅れをもって追従するため、演算上の酸素ストレージ量が目標酸素ストレージ量を行き過ぎて最大値（ＦＵＬＬ）へと向かい、ｔ３のタイミングでリア空燃比センサ出力が今度はリーン側に外れている。
【００１６】
ｔ３以降はｔ１以降と同様であり、このようにしてリア空燃比センサ出力が短い周期（ｔ１からｔ３までの周期）でリーンとリッチを繰り返すのであり、その原因は、フロント空燃比センサのストイキ点がリーンシフトしている点にあると考えられる。
【００１７】
従って、このようにリア空燃比センサ出力が短い周期でリーンとリッチを繰り返す現象が生じている場合をも検出してフロント空燃比センサのストイキ点のリーン側へのシフト補正を行う必要がある。
【００１８】
しかしながら、フロント空燃比センサのストイキ点がリーン側にシフトが生じていることに起因して図２に示したようにリア空燃比センサの出力が短い周期でリーンとリッチとを繰り返している場合には、上記の特許文献１に記載の技術によれば、予め定めている一定時間が経過する前にリア空燃比センサ出力が反対側へと反転してしまい、フロント空燃比センサのストイキ点がシフトしていると検出されることがないのある。
【００１９】
そこで本発明は、リア空燃比センサの出力に図２に示したような現象が生じるときにも検出可能として、フロント空燃比センサのストイキ点を補正する機会を増やすことを目的とする。
【課題を解決するための手段】
【００２０】
本発明は、排気空燃比に応じて排気中の酸素を取り込み、あるいは放出する酸素ストレージ能力のある触媒と、この酸素ストレージ量が目標値になるように空燃比を制御する装置において、フロント空燃比センサの出力に基づいて酸素ストレージ量を推定し、この酸素ストレージ量推定値ＨＯＳＣが目標値と一致するように空燃比を制御する一方で、リア空燃比センサ出力がリーンを継続するときに酸素ストレージ量最大値ＨＯＳＣＭＡＸより前記酸素ストレージ量推定値ＨＯＳＣを差し引いた値を積算した面積を第一面積Ｓ１として、またリア空燃比センサ出力がリッチを継続するときに前記酸素ストレージ量推定値ＨＯＳＣより酸素ストレージ量最小値ＨＯＳＣＭＩＮを差し引いた値を積算した面積を第二面積Ｓ２としてそれぞれ演算し、これら第一面積Ｓ１と第二面積Ｓ２に基づいてフロント空燃比センサのストイキ点がリーンシフトしているか否かを判定し、この判定結果よりフロント空燃比センサのストイキ点がリーンシフトしているときにフロント空燃比センサのストイキ点をリーン側に補正するように構成する。
【００２１】
また本発明は、排気空燃比に応じて排気中の酸素を取り込み、あるいは放出する酸素ストレージ能力のある触媒と、この酸素ストレージ量が目標値になるように空燃比を制御する装置において、フロント空燃比センサの出力に基づいて酸素ストレージ量を推定し、この酸素ストレージ量推定値ＨＯＳＣが目標値と一致するように空燃比を制御する一方で、リア空燃比センサ出力がストイキよりリッチへと横切ったときに酸素ストレージ量最大値ＨＯＳＣＭＡＸより前記酸素ストレージ量推定値ＨＯＳＣを差し引いた値を第一長さＬ１として、またリア空燃比センサ出力がストイキよりリーンへと横切ったときに前記酸素ストレージ量推定値ＨＯＳＣより酸素ストレージ量最小値ＨＯＳＣＭＩＮを差し引いた値を第二長さＬ２としてそれぞれ演算し、これら第一長さＬ１と第二長さＬ２に基づいてフロント空燃比センサのストイキ点がリーンシフトしているか否かを判定し、この判定結果よりフロント空燃比センサのストイキ点がリーンシフトしているときにフロント空燃比センサのストイキ点をリーン側に補正するように構成する。
【００２２】
また本発明は、排気空燃比に応じて排気中の酸素を取り込み、あるいは放出する酸素ストレージ能力のある触媒と、この酸素ストレージ量が目標値になるように空燃比を制御する装置において、フロント空燃比センサの出力に基づいて酸素ストレージ量を推定し、この酸素ストレージ量推定値ＨＯＳＣが目標値と一致するように空燃比を制御する一方で、リア空燃比センサ出力ＶＲＯ２がリーンを継続するときのリーン側出力を積算した面積を第三面積Ｓ３として、またリア空燃比センサ出力ＶＲＯ２がリッチを継続するときのリッチ側出力を積算した面積を第四面積Ｓ４としてそれぞれ演算し、これら第三面積Ｓ３と第四面積Ｓ４に基づいてフロント空燃比センサのストイキ点がリーンシフトしているか否かを判定し、この判定結果よりフロント空燃比センサのストイキ点がリーンシフトしているときにフロント空燃比センサのストイキ点をリーン側に補正するように構成する。
【００２３】
また本発明は、排気空燃比に応じて排気中の酸素を取り込み、あるいは放出する酸素ストレージ能力のある触媒と、この酸素ストレージ量が目標値になるように空燃比を制御する装置において、フロント空燃比センサの出力に基づいて酸素ストレージ量を推定し、この酸素ストレージ量推定値が目標値と一致するように空燃比を制御する一方で、一定区間当たりに前記リア空燃比センサ出力ＶＲＯ２が最小値より最大値までまたは最大値より最小値まで振れる振幅回数ＣＮＴ１を演算し、この一定区間当たりの振幅回数ＣＮＴ１に基づいてフロント空燃比センサのストイキ点がリーンシフトしているか否かを判定し、
この判定結果よりフロント空燃比センサのストイキ点がリーンシフトしているときにフロント空燃比センサのストイキ点をリーン側に補正するように構成する。
【００２４】
また本発明は、排気空燃比に応じて排気中の酸素を取り込み、あるいは放出する酸素ストレージ能力のある触媒と、この酸素ストレージ量が目標値になるように空燃比を制御する装置において、フロント空燃比センサの出力に基づいて酸素ストレージ量を推定し、この酸素ストレージ量推定値ＨＯＳＣが目標値と一致するように空燃比を制御する一方で、フロント空燃比センサのストイキ点がリーンシフトしているときにリア空燃比センサ出力ＶＲＯ２が横切らないリッチ側スライスレベルＧＲＳＬＩＣＥと、フロント空燃比センサのストイキ点がリーンシフトしているときにリア空燃比センサ出力ＶＲＯ２が横切るリーン側スライスレベルＧＬＳＬＩＣＥとを設け、一定区間当たりにリア空燃比センサ出力ＶＲＯ２が前記リッチ側スライスレベルＧＲＳＬＩＣＥを横切ることなくかつ前記リーン側スライスレベルＧＬＳＬＩＣＥを連続して同じ方向に横切る回数ＣＮＴ２を演算し、この一定区間当たりの連続横切り回数ＣＮＴ２に基づいてフロント空燃比センサのストイキ点がリーンシフトしているか否かを判定し、この判定結果よりフロント空燃比センサのストイキ点がリーンシフトしているときにフロント空燃比センサのストイキ点をリーン側に補正するように構成する。
【発明の効果】
【００２５】
本発明によれば、フロント空燃比センサのストイキ点のリーンシフトに起因して、リア空燃比センサの出力が短い周期でリッチとリーンとを繰り返す現象が生じている場合にもフロント空燃比センサのストイキ点がリーンシフトしているとの検出が可能となり、これにより、フロント空燃比センサのストイキ点を補正する機会を増やすことができる。
【発明を実施するための最良の形態】
【００２６】
以下、本発明の実施形態を図面に基づいて説明する。
【００２７】
図１は本発明が適用される排気浄化装置の概略構成を示し、エンジン１の排気管２には触媒３が設けられ、その上流にはリニアな特性のフロント空燃比センサ４、下流にはリア空燃比センサ５が設置され、これらセンサ出力に基づいてエンジン１に供給する燃料の空燃比を制御するコントローラ６が備えられる。
【００２８】
エンジン１の吸気管７にはスロットル弁８と、スロットル弁８により調整された吸入空気量を測定するエアフローメータ９が設けられる。
【００２９】
触媒３はいわゆる三元触媒であって、触媒雰囲気が理論空燃比のときにＮＯｘ、ＨＣ、ＣＯを最大効率で浄化する。触媒３は触媒担体にセリア等の酸素ストレージ材で被覆されており、流入する排気の空燃比に応じて酸素を保持したり、放出したりする機能（酸素ストレージ機能）を有している。
【００３０】
上記のフロント空燃比センサ４は排気中の酸素濃度に応じたリニアな出力特性をもち、上記のリア空燃比センサ５はストイキの付近で２値的に切換わる特性をもっている。
【００３１】
また、エンジン１には冷却水の温度を検出する温度センサ１０が取付けられ、エンジン１の運転状態と共に触媒３の活性化状態などを判定するため等に用いられる。
【００３２】
コントローラ６はマイクロプロセッサ、ＲＯＭ、ＲＡＭ、Ｉ／Ｏインターフェースなどで構成され、エアフローメータ９と、フロント空燃比センサ４の出力に基づいて触媒３の酸素ストレージ量を演算し、このストレージ量が目標値となるように空燃比をフィードバック制御する。
【００３３】
触媒３の酸素ストレージ量の演算は、触媒上流の排気空燃比とそのときの吸入空気量から推定する。まず、触媒上流の排気空燃比から換算して排気中の酸素の過剰または不足する割合である酸素過剰率を求める。酸素過剰率はストイキのときをゼロとして、リーン側で正、リッチ側で負の値となる。
【００３４】
酸素過剰率とそのときの吸入空気量とから触媒３に吸収される酸素量または放出される酸素量が分かり、これを積算していくことで触媒３の酸素ストレージ量を推定できる。予め触媒３の最大酸素ストレージ量を実験等により確認しておき、例えばその半分の保持量を目標値として設定し、酸素ストレージ量がこの目標値と一致するように空燃比を制御するのである。
【００３５】
演算した酸素ストレージ量が目標値よりも少ないときは、目標空燃比をリーン側にして保持量を増やし、逆に目標値よりも多いときはリッチ側にして酸素ストレージ量を減らし、これらにより目標値に一致させる。
【００３６】
ただし、空燃比の目標値としては、エンジンの運転要求からも制御され、基本的にはストイキとなるようにフィードバック制御されるので、目標ストレージ量からのずれ分を修正するにしても、その修正量については運転性を悪化させない範囲に、ストイキに対しての修正幅が制限される。
【００３７】
また、演算誤差により、演算された酸素ストレージ量と実際の酸素ストレージ量との間にずれを生じるが、リア空燃比センサ５の検出する酸素濃度に基づいて、例えばエンジンの燃料カット時などに、燃料カットに移行してから所定のタイミングで演算した酸素ストレージ量のリセットを行い、ずれを修正する。
【００３８】
さらに本発明では、コントローラ６は、酸素ストレージ量を演算するためのフロント空燃比センサ４のストイキ点がリーン側にシフトしているかどうか判断し、もしもセンサ劣化などによりフロント空燃比センサ４のストイキ点がリーンシフトしているときは、これに応じてフロント空燃比センサ４のストイキ点をリーン側に補正し、酸素ストレージ量を正しく目標値に収束させるようになっている。
【００３９】
触媒３の酸素ストレージ量は常に目標値になるように制御されるため、触媒上流側の空燃比に多少の変動があっても、触媒の酸素ストレージ能力により、触媒下流側の空燃比はストイキに維持される。しかし、フロント空燃比センサ４のストイキ点がリーン側にシフトしていると、触媒の酸素ストレージ量が飽和し、リア空燃比センサ出力がストイキからリーン側となる。その後は目標空燃比に対する実空燃比の遅れに起因して、リア空燃比センサ出力が短い周期でリッチとリーンを繰り返す現象が生じる（図２参照）。
【００４０】
このような現象が生じたか否かを判定し、このような現象が生じたこと判定したときに、フロント空燃比センサ４のストイキ点がリーンシフトしていると判断して、フロント空燃比センサ４のストイキ点をリーン側へと補正するのである。
【００４１】
この判定について、図３を参照して説明すると、図３の左半分にリーンシフトが生じている場合のリア空燃比センサ出力と酸素ストレージ量の変化を、同様に図３の右半分にリーンシフトが生じていない場合のリア空燃比センサ出力と酸素ストレージ量の変化を示している。なお、図３の左半分は図２と基本的に同じものであり、ただし横軸の時間的スケールは相違している。
【００４２】
図３に示すように、リア空燃比センサ出力がリーンを継続する場合に酸素ストレージ量最大値ＨＯＳＣＭＡＸと酸素ストレージ量今回値ＨＯＳＣ（new）とで囲まれた面積（Ｓ１で示す）を「第一面積」、リア空燃比センサ出力がリッチを継続する場合に酸素ストレージ量今回値ＨＯＳＣ（new）と酸素ストレージ量最小値ＨＯＳＣＭＩＮ（＝０）とで囲まれた面積（Ｓ２で示す）を「第二面積」として、これらの面積比率ＲＡＴＥＳＭＯ２（＝第一面積／第二面積）を考えたとき、フロント空燃比センサのストイキ点がリーンシフトしている場合にはこの面積比率ＲＡＴＥＳＭＯ２が１を超える（図３の左半分参照）のに対して、リーンシフトが生じてない場合には面積比率ＲＡＴＥＳＭＯ２が１以下となる（図３の右半分参照）ことに着目して、フロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定する。
【００４３】
この制御内容を以下のフローチャートに従って詳しく説明する。
【００４４】
図４は酸素ストレージ量ＨＣＳＣを演算（推定）するためのもので、一定時間毎（例えば１０ｍｓ毎）に実行する。
【００４５】
まずステップ１では冷却水温等の条件により触媒３が活性化しているかどうかをみる。触媒３が活性化していなければ、触媒３の酸素ストレージ能力が働かないので、そのまま今回の処理を終了する。
【００４６】
触媒３が活性化していればステップ２に進み、フロント空燃比センサ４の出力を空燃比ＡＦｓに変換する。これは例えばフロント空燃比センサ４の出力と空燃比との関係を表すテーブルを予め作成しておき、このテーブルを検索することにより空燃比を求めるようにすればよい。
【００４７】
ステップ４ではＥＥＰＲＯＭなどのメモリからシフト補正量学習値を読み出し、このシフト補正量学習値によりステップ５でフロント空燃比センサ４のストイキ点のリーン側へのシフト補正を行う。これは、次式により実空燃比ＡＦｒを算出することである。
【００４８】
ＡＦｒ＝ＡＦｓ＋シフト補正量学習値                    …（１）
ここで、（１）式右辺のＡＦｓはフロント空燃比センサ４により検出される見かけ上の空燃比であり、フロント空燃比センサ４のストイキ点がリーンシフトしているときには実際の空燃比はこの見かけ上の空燃比よりリーン側にあるのであるから、その差の分をシフト補正量学習値により埋め合わせようというものである。従って、フロント空燃比センサ４のストイキ点がリーンシフトしているときにはシフト補正量学習値は正の値であり、この正の値のシフト補正量学習によって空燃比が大きくなる側（つまりリーン側）に補正される。シフト補正量学習値の演算については後述する。
【００４９】
ステップ６ではこのようして求めたシフト補正後の空燃比である実空燃比ＡＦｒから、排気中の過不足酸素濃度ＦＯ２を所定のテーブルを検索することにより求める。
【００５０】
ここで、排気中の過不足酸素濃度ＦＯ２は、図５に示すように、ストイキでの値を基準のゼロとしてそのときの空燃比を酸素濃度に換算した値である。従って、例えば空燃比がリーンのときは、ストイキの酸素濃度よりも過剰となるので、ＦＯ２はプラスの値となり、また空燃比がリッチのときはストイキの酸素濃度よりも不足するので、マイナスの値となる。
【００５１】
ステップ７ではこの過不足酸素濃度ＦＯ２に基づいて酸素ストレージ量ＨＯＳＣを演算する。この酸素ストレージ量ＨＯＳＣの演算については図６、図７（図４のステップ７のサブルーチン）のフローにより説明する。
【００５２】
触媒３の酸素ストレージ特性は、触媒３の貴金属に高速で吸収／放出される特性と、触媒３のセリアなどの酸素ストレージ材に低速で吸収／放出される特性に分かれる。したがって酸素ストレージ量をこの特性に合わせて高速成分と低速成分に分けて演算することにより、触媒３の特性に応じた実際のストレージ量を正確に演算できる。
【００５３】
図６は酸素ストレージ量の高速成分を演算するための、図７は同じく低速成分を演算するためのものである。
【００５４】
図６において、ステップ１１では演算サイクル時間当たりの酸素過不足量Ｏ２ＩＮを次式により演算する。
【００５５】
Ｏ２ＩＮ＝ａ×ＦＯ２×Ｑ×ｔ                          …（２）
ただし、ａ：定数（単位換算のための値）、
Ｑ：排気流量（吸入空気流量で代用する）、
ｔ：図６の演算サイクル時間、
ステップ１２では酸素過不足量Ｏ２ＩＮの値に基づき高速成分の酸素を吸収する状態にあるのかあるいは高速成分の酸素を放出する状態にあるかをみる。触媒３に流入する排気の空燃比がリーンであって酸素過不足量Ｏ２ＩＮがゼロより大きい場合には高速成分の酸素を吸収する状態にあると判断してステップ１３に進み、次式により高速成分を演算する。
【００５６】
ＨＯ２（new）＝ＨＯ２（old）＋Ｏ２ＩＮ                …（３）
ただし、ＨＯ２（new）：高速成分の今回値、
ＨＯ２（old）：高速成分の前回値、
一方、酸素過不足量Ｏ２ＩＮがゼロ以下の値で、高速成分の酸素を放出する状態にあると判断した場合にはステップ１２よりステップ１４に進み次式により高速成分を演算する。
【００５７】
ＨＯ２（new）＝ＨＯ２（old）＋Ｏ２ＩＮ×Ａ            …（４）
ただし、ＨＯ２（new）：高速成分の今回値、
ＨＯ２（old）：高速成分の前回値、
Ａ：高速成分の酸素放出率、
このようにして高速成分今回値ＨＯ２（new）を演算したら、ステップ１５、１６でその値が高速成分の最大値ＨＯ２ＭＡＸを超えていないか、あるいは最小値ＨＯ２ＭＩＮ（＝０）以下になっていないかをみる。そして、高速成分今回値ＨＯ２（new）が最大値ＨＯ２ＭＡＸ以上になっている場合にはステップ１５よりステップ１７に進み高速成分として吸収されずに溢れ出るオーバフロー分（過剰量）ＯＶＥＲＦＬＯＷを次式により演算し、さらに、高速成分今回値ＨＯ２（new）を最大値ＨＯ２ＭＡＸに制限する。
【００５８】
ＯＶＥＲＦＬＯＷ＝ ＨＯ２（new）−ＨＯ２ＭＡＸ        …（５）
高速成分今回値ＨＯ２（new）が最小値ＨＯ２ＭＩＮ以下になっている場合にはステップ１６よりステップ１８に進み、高速成分として吸収されずに溢れ出るオーバフロー分（不足量）ＯＶＥＲＦＬＯＷを次式により演算し、さらに、高速成分今回値ＨＯ２（new）を最小値ＨＯ２ＭＩＮに制限する。
【００５９】
ＯＶＥＲＦＬＯＷ＝ＨＯ２（new）−ＨＯ２ＭＩＮ         …（６）
なお、ここでは最小値ＨＯ２ＭＩＮとして０を与えているから、高速成分の酸素をすべて放出した状態で不足する酸素量が負のオーバフロー分として算出される。
【００６０】
一方、高速成分今回値ＨＯ２（new）が最大値ＨＯ２ＭＡＸと最小値ＨＯ２ＭＩＮの間にあるときには、触媒３に流入した排気の酸素過不足量Ｏ２ＩＮは全て高速成分の酸素として吸収されるので、このときにはステップ１９に進んでオーバフロー分ＯＶＥＲＦＬＯＷにゼロを設定する。
【００６１】
ステップ２０、２２ではリア空燃比センサ出力がストイキよりリーンへと変化したか否か、またはリア空燃比センサ出力がストイキよりリッチへと変化したか否かをみる。リア空燃比センサ出力がストイキよりリーンへと変化したときにはステップ２０よりステップ２１に進んで高速成分今回値ＨＯ２（new）を最大値ＨＯ２ＭＡＸに、またリア空燃比センサ出力がストイキよりリッチへと変化したときにはステップ２０、２２よりステップ２３に進んで高速成分今回値ＨＯ２（new）を最小値ＨＯ２ＭＩＮにセットする。このようにリア空燃比センサ出力がストイキよりリーンへと変化したときに高速成分今回値ＨＯ２（new）を最大値ＨＯ２ＭＡＸにセットし、またリア空燃比センサ出力がストイキよりリッチへと変化したときに高速成分今回値ＨＯ２（new）を最小値ＨＯ２ＭＩＮにセットするのは、演算上の酸素ストレージ量である高速成分今回値ＨＯ２（new）を実際の酸素ストレージ量に合わせるためである。
【００６２】
さて、高速成分今回値ＨＯ２（new）が最大値ＨＯ２ＭＡＸ以上あるいは最小値ＨＯ２ＭＩＮ以下となって高速成分の酸素とならずに溢れ出たオーバフロー分ＯＶＥＲＦＬＯＷは、低速成分の酸素として吸収あるいは放出される。図７は酸素ストレージ量の低速成分を演算するためのサブルーチンで、このサブルーチンでは高速成分の酸素とならずに溢れ出たオーバフロー分ＯＶＥＲＦＬＯＷに基づき低速成分を演算する。
【００６３】
図７においてステップ４１では低速成分を次式により演算する。
【００６４】
ＬＯ２（new）＝ ＬＯ２（old）z＋ＯＶＥＲＦＬＯＷ×Ｂ  …（７）
ただし、ＬＯ２（new）：低速成分の今回値、
ＬＯ２（old）：低速成分の前回値、
Ｂ：低速成分の酸素吸収放出率、
ここで、低速成分の酸素吸収放出率Ｂとしては１以下の正の値を設定するが、実際には吸収と放出とで異なる特性を有し、また実際の吸収放出率は触媒温度ＴＣＡＴ、低速成分等の影響を受けるので、吸収率と放出率とをそれぞれ分離して設定するようにしてもよい。その場合、オーバフロー分ＯＶＥＲＦＬＯＷが正であるとき酸素が過剰であり、このときの酸素吸収率Ｂとしては、例えば触媒温度ＴＣＡＴが高いほど、また低速成分ＬＯ２が小さいほど大きな値を設定する。また、オーバフロー分ＯＶＥＲＦＬＯＷが負であるとき酸素が不足しており、このときの酸素放出率Ｂとしては、例えば触媒温度ＴＣＡＴが高いほど、また低速成分が大きいほど大きな値を設定する。
【００６５】
ステップ４２、４３では、高速成分の演算時と同様に、演算された低速成分今回値ＬＯ２（new）がその最大値ＬＯ２ＭＡＸを超えていないか、あるいは最小値ＬＯ２ＭＩＮ（＝０）以下になっていないかをみる。最大値ＬＯ２ＭＡＸを超えている場合にはステップ４２よりステップ４４に進み低速成分今回値ＬＯ２（new）から溢れる酸素過不足量Ｏ２ＯＵＴを次式により演算し低速成分今回値ＬＯ２（new）を最大値ＬＯ２ＭＡＸに制限する。
【００６６】
Ｏ２ＯＵＴ＝ ＬＯ２（new）−ＬＯ２ＭＡＸ              …（８）
酸素過不足量Ｏ２ＯＵＴはそのまま触媒３の下流に流出する酸素である。
【００６７】
一方、最小値ＬＯ２ＭＩＮ以下になっている場合にはステップ４３よりステップ４５へと進み低速成分今回値ＬＯ２（new）を最小値ＬＯ２ＭＩＮに制限する。
【００６８】
このようにして触媒３の酸素ストレージ量を演算している。
【００６９】
図８は空燃比フィードバック補正係数αを演算するためのもので、各気筒のＲｅｆ信号（クランク角の基準位置信号）の入力毎に実行する。これは、Ｒｅｆ信号に同期して燃料噴射が行われ、この燃料噴射により排気中の空燃比が変化するので、これに合わせたもである。
【００７０】
ステップ５１では空燃比フィードバック制御条件の成立時であるか否かをみる。空燃比フィードバック制御条件の成立時は従来と同じで、例えばフロント空燃比センサ４が活性化していること等が成立したとき、空燃比フィードバック制御条件の成立時となる。また、燃料カット時やエンジン高負荷時は空燃比フィードバック制御条件の非成立時である。空燃比フィードバック制御条件の成立時でないときにはステップ５２に進んで空燃比フィードバック補正係数α＝１．０として今回の処理を終了する。
【００７１】
空燃比フィードバック制御条件の成立時であるときにはステップ５１よりステップ５３に進み、図６のフローで得られている高速成分今回値ＨＯ２（new）、図４のステップ５で得られている実空燃比ＡＦｒを読み込み、ステップ５４で高速成分今回値ＨＯ２（new）を酸素ストレージ量ＨＯＳＣに移す。酸素ストレージ量ＨＯＳＣについて図６、図７では高速成分と低速成分に分けて演算する場合で説明したが、ここでは簡単のため高速成分今回値ＨＯ２（new）を酸素ストレージ量ＨＯＳＣとしている。
【００７２】
ステップ５５では酸素ストレージ量ＨＯＳＣの目標酸素ストレージ量からの偏差ＨＯＳＣＳを次式により演算する。
【００７３】
ＨＯＳＣＳ＝ＨＯＳＣ−目標酸素ストレージ量            …（９）
ここで、（９）式の目標酸素ストレージ量としては最大酸素ストレージ量の１／２を設定しておく。
【００７４】
ステップ５６ではこの偏差ＨＯＳＣＳに基づいて次式により目標酸素ストレージ量ＦＯ２ｔを演算する。
【００７５】
ＦＯ２ｔ＝Ｇｐ×ＨＯＳＣＳ                            …（１０）
ただし、Ｇｐ：比例ゲイン（適合値）、
ここで、（１０）式の比例ゲインＧｐは目標空燃比への応答を高めたい要求がある場合に対応するため導入している。従って、目標空燃比への応答を高める必要がないときにはＧｐ＝１．０とすればよい。
【００７６】
ステップ５７ではこの目標酸素ストレージ量ＦＯ２ｔを次式により目標空燃比ＡＦｔへと変換する。
【００７７】
ＡＦｔ＝１４．７＋１４．７×ＦＯ２ｔ／Ｑ              …（１１）
ただし、Ｑ：排気流量（吸入空気流量で代用する）、
ここで、（１１）式右辺第２項は目標酸素ストレージ量ＦＯ２ｔを空燃比に換算した値で、（１１）式は理論空燃比（１４．７）よりこの空燃比換算分だけシフトさせた値を目標空燃比として設定するものである。例えば、酸素ストレージ量ＨＯＳＣが目標値より大きい（偏差ＨＯＳＣＳが正）ときには目標酸素ストレージ量ＦＯ２ｔが正の値となり、（１１）式によれば目標空燃比ＡＦｔが１４．７よりも大きくなる（ストイキよりもリーン側）。すなわち、酸素ストレージ量ＨＯＳＣが目標値より大きいときには目標値へと戻すため目標空燃比をストイキよりもリーン側へと移行させる。この逆に、酸素ストレージ量ＨＯＳＣが目標値より小さい（偏差ＨＯＳＣＳが負）ときには目標酸素ストレージ量ＦＯ２ｔが負の値となり、（１１）式によれば目標空燃比ＡＦｔが１４．７よりも小さくなる（ストイキよりもリッチ側）。すなわち、酸素ストレージ量ＨＯＳＣが目標値より小さいときには目標値へと戻すため目標空燃比をストイキよりもリッチ側へと移行させる。
【００７８】
ここでの空燃比制御はフィードバック制御であるため、ステップ５８ではフロント空燃比センサ４により検出される実空燃比ＡＦｒの、この目標空燃比ＡＦｔからの偏差ｄＡＦを次式により演算する。
【００７９】
ｄＡＦ＝ＡＦｒ−ＡＦｔ                                …（１２）
ただし、（１２）式右辺のフロント空燃比センサ４により検出される実空燃比ＡＦｒは、前記（１）式に示したようにシフト補正量学習値によりリーン側に補正されている値である。
【００８０】
ステップ５９ではこの空燃比偏差ｄＡＦに基づいて次式により空燃比フィードバック補正係数αを演算する。
【００８１】
α＝ｄＡＦ×ＰＧａｉｎ＋ΣｄＡＦ×ＩＧａｉｎ＋ΔｄＡＦ×ＤＧａｉｎ
…（１３）
ただし、ＰＧａｉｎ：比例ゲイン（正の値）、
ＩＧａｉｎ：積分ゲイン（正の値）、
ＤＧａｉｎ：微分ゲイン（正の値）、
（１３）式右辺の第１項、第２項、第３項はそれぞれ比例分、積分分、微分分で、（１３）式はこれらの和を空燃比のフィードバック補正量とするものである。
【００８２】
図示しない燃料噴射量演算ルーチンではこのようにして演算した空燃比フィードバック補正係数αを用いて次式によりシーケンシャル噴射時の燃料噴射パルス幅Ｔｉを演算する。
【００８３】
Ｔｉ＝Ｔｐ×ＴＦＢＹＡ×α×２＋Ｔｓ                  …（１４）
ただし、Ｔｐ：基本噴射パルス幅、
ＴＦＢＹＡ：目標当量比、
Ｔｓ：無効噴射パルス幅、
そして、所定の噴射タイミングとなったときこの燃料噴射パルス幅Ｔｉの分だけ各気筒に設けた燃料インジェクタが開かれ、燃料噴射が行われる。
【００８４】
空燃比フィードバック制御条件の成立時（このときＴＦＢＹＡ＝１．０）において、例えば実空燃比ＡＦｒが目標空燃比ＡＦｔより大きい（空燃比偏差ｄＡＦが正）ときには空燃比フィードバック補正係数αが１．０を超える値となり、この１．０を超える値のαによりストイキの混合気の得られる燃料量よりも増量されて排気中の空燃比がストイキへと戻される。この逆に、実空燃比ＡＦｒが目標空燃比ＡＦｔより小さい（空燃比偏差ｄＡＦが負）ときには空燃比フィードバック補正係数αが１．０より小さな正の値となり、この１．０より小さな正の値のαによりストイキの混合気の得られる燃料量よりも減量されて排気中の空燃比がストイキへと戻される。つまり、空燃比フィードバック制御条件の成立時おいてはフロント空燃比センサ４により検出される実空燃比ＡＦｒが、目標空燃比ＡＦｔと一致するように燃料制御が行われる。この場合に、上記（１３）式右辺のフィードバックゲイン（ＰＧａｉｎ、ＩＧａｉｎ、ＤＧａｉｎ）を大きくし過ぎると、実空燃比ＡＦｒが目標空燃比ＡＦｔを行き過ぎる、いわゆるオーバーシュートを生じるので、フィードバックゲインはあまり大きくすることができず、従って空燃比フィードバック制御を行うとき、目標空燃比ＡＦｔに対して実空燃比ＡＦｒは応答遅れを持って追従してゆく。
【００８５】
図９、図１０はフロント空燃比センサ４のストイキ点をリーン側に補正するのに用いるシフト補正量学習値を演算するためのもので、一定時間毎に実行する。ここでは、シフト補正量が学習値の場合で説明するが、学習値でなくてもよいことはもちろんである。
【００８６】
ステップ６１ではエンジン回転速度と基本噴射パルス幅Ｔｐとから定まる運転条件が学習領域にあるか否かをみる。シフト補正量学習値を演算（更新）する領域は図１１に示したように予め定められている。高空気量域を学習領域としていないのは、高空気量域では図２や図３左半分に示した現象が生じにくいためである。運転条件が学習領域にない場合にはそのまま今回の処理を終了する。
【００８７】
運転条件が学習領域にあるときにはステップ６１よりステップ６２以降に進む。このうち、図９のステップ６２〜７０及び図１０のステップ７１〜７５、８０は図３に示した第一面積Ｓ１及び第二面積Ｓ２を演算する部分、図１０のステップ７４〜７７、７９〜８５は、第一面積平均値ＡＥＶＳ１及び第二面積平均値ＡＶＥＳ２を演算する部分、図１０のステップ８６は面積比率ＲＡＴＥＳＭＯ２を演算する部分、図１０のステップ８７はフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定する部分、図１０のステップ８８はその判定結果に基づき、フロント空燃比センサ４のストイキ点がリーンシフトしている場合にシフト補正量学習値を正の値で大きくなる側に更新する部分である。
【００８８】
ここでは、第一面積の平均値と第二面積の平均値を演算し、これらの比率を面積比率として演算する場合で説明するが、簡単には第一面積と第二面積を演算し、これらの比率を面積比率として演算してもかまわない。
【００８９】
以下具体的に説明する。図９においてまずステップ６２ではリア空燃比センサ出力がストイキにあるか否かをみる。
【００９０】
ここで、ヒステリシスを有するリア空燃比センサ出力に基づくリッチ、リーン、ストイキの各判定は次のようなものである。すなわち、図２３に示したように、リア空燃比センサ出力がリッチ側よりリーン側に向かうときにはリア空燃比センサ出力がリッチ側スライスレベルＲＳＬＩＣＥを横切る前はリッチ側にあると、またこのリッチ側スライスレベルＲＳＬＩＣＥを横切って小さくなったタイミングでストイキに戻ったと判断される。この逆に、リア空燃比センサ出力がリーン側よりリッチ側に向かうときにはリア空燃比センサ出力がリーン側スライスレベルＬＳＬＩＣＥを横切る前はリーン側にあると、またこのリーン側スライスレベルＬＳＬＩＣＥを横切って大きくなったタイミングでストイキに戻ったと判断される。
【００９１】
リア空燃比センサ出力がストイキでないとき（つまりリッチまたはリーンのとき）にはステップ６３に進んで酸素ストレージ量ＨＯＳＣを読み込む。この酸素ストレージ量ＨＯＳＣとしては、図８のステップ５３、５４で前述したように高速成分ＨＯ２今回値（new）を用いればよい。
【００９２】
ステップ６４、６５ではリア空燃比センサ出力が今回リーンであるのか否か、またリア空燃比センサ出力が前回リーンであったか否かをみる。リア空燃比センサ出力が今回リーンでありかつ前回もリーンであった、つまりリア空燃比センサ出力がリーンを継続するときにはステップ６４、６５よりステップ６６に進んで次式により、図３に示した第一面積Ｓ１を演算するため、酸素ストレージ量の最大値ＨＯＳＣＭＡＸより酸素ストレージ量ＨＯＳＣを差し引いた値を積算する。
【００９３】
ＬＳＭＯＳＱ（new）＝ＬＳＭＯＳＱ（old）＋（ＨＯＳＣＭＡＸ−ＨＯＳＣ）
…（１５）
ただし、ＬＳＭＯＳＱ（new）：リーン時面積今回値、
ＬＳＭＯＳＱ（old）：リーン時面積前回値、
ステップ６７では次回処理のためリーン時面積今回値ＬＳＭＯＳＱ（new）の値をリーン時面積前回値ＬＳＭＯＳＱ（old）に移しておく。
【００９４】
次回以降もリア空燃比センサ出力がリーンであればステップ６６、６７の操作を繰り返し実行する。この結果、（１５）式によれば、リア空燃比センサ出力が継続してリーンである間、（１５）式右辺第２項を積算することになるので、図３に示した面積Ｓ１が求められることになる。リーン時面積前回値ＬＳＭＯＳＱ（old）の初期値にはゼロをいれておく。
【００９５】
これに対して、リア空燃比センサ出力が今回リッチであるときにはステップ６４よりステップ６８に進んでリア空燃比センサ出力が前回リッチであったか否かをみる。リア空燃比センサ出力が今回リッチでありかつ前回もリッチであった、つまりリア空燃比センサ出力がリッチを継続するときにはステップ６４、６８よりステップ６９に進んで次式により、図３に示した第二面積Ｓ２を演算するため、酸素ストレージ量ＨＯＳＣから酸素ストレージ量の最小値ＨＯＳＣＭＩＮ（＝０）を差しひいた値を積算する。
【００９６】
ＲＳＭＯＳＱ（new）＝ＲＳＭＯＳＱ（old）＋ＨＯＳＣ−ＨＯＳＣＭＩＮ
…（１６）
ただし、ＲＳＭＯＳＱ（new）：リッチ時面積今回値、
ＲＳＭＯＳＱ（old）：リッチ時面積前回値、
ステップ７０では次回処理のためリッチ時面積今回値ＲＳＭＯＳＱ（new）の値をリッチ時面積前回値ＲＳＭＯＳＱ（old）に移しておく。
【００９７】
次回以降もリア空燃比センサ出力がリッチであればステップ６９、７０の操作を繰り返し実行する。この結果、（１６）式によれば、リア空燃比センサ出力が継続してリッチである間、（１６）式右辺第２項を積算することになるので、リッチ時面積は図３に示した第二面積Ｓ２が求められることになる。リッチ時面積前回値ＲＳＭＯＳＱ（old）の初期値にもゼロを入れておく。
【００９８】
一方、リア空燃比センサ出力が今回ストイキにあるときには図９のステップ６２より図１０のステップ７１、７２に進みリア空燃比センサ出力が前回ストイキであったか否か、あるいは前回リーンであったか否かをみる。リア空燃比センサ出力が今回ストイキにありかつ前回リーンであったとき、つまりリア空燃比センサ出力がリーンからストイキへと切換わったときにはステップ７１、７２よりステップ７３に進みそのときのリーン時面積今回値ＬＳＭＯＳＱ（new）を面積Ｓ１に移し、ステップ７４で次式によりリーン時面積を積算する。
【００９９】
ＬＳＵＭ１（new）＝ＬＳＵＭ１（old）＋Ｓ１            …（１７）
ただし、ＬＳＵＭ１（new）：リーン時面積積算値今回値、
ＬＳＵＭ１（old）：リーン時面積積算値前回値、
ここで、（１７）式右辺第２項の面積Ｓ１はリア空燃比センサ出力がリーンからストイキへと切換わったタイミングでの値であるから、図３に示した第一面積Ｓ１そのものである。従って、（１７）式は第一面積Ｓ１をさらに積算していくものである。これは、第一面積Ｓ１をいくつかサンプリングして積算した後でその平均値を求めるためである。
【０１００】
ステップ７５ではサンプル回数ｍ１（ゼロに初期設定）を１だけ増やす。サンプル回数ｍ１は（１７）式により第一面積Ｓ１を積算した回数を表す。ステップ７６では次回処理のためリーン時面積積算値今回値ＬＳＵＭ１（new）の値をリーン時面積積算値前回値ＬＳＵＭ１（old）に移しておく。リーン時面積積算値前回値ＬＳＵＭ１（old）の初期値にはゼロを入れておく。
【０１０１】
ステップ７７では次にリア空燃比センサ出力がリーンを継続するときに備えて、再び図３に示した第一面積Ｓ１を求めるため、リーン時面積前回値ＬＳＭＯＳＱ（old）＝０としておく。
【０１０２】
これに対して、リア空燃比センサ出力が今回ストイキにありかつ前回リッチであったとき、つまりリア空燃比センサ出力がリッチからストイキへと切換わったときにはステップ７１、７２よりステップ７８に進みそのときのリッチ時面積今回値ＲＳＭＯＳＱ（new）を面積Ｓ２に移し、ステップ７９で次式によりリッチ時面積を積算する。
【０１０３】
ＲＳＵＭ１（new）＝ＲＳＵＭ１（old）＋Ｓ２            …（１８）
ただし、ＲＳＵＭ１（new）：リッチ時面積積算値今回値、
ＲＳＵＭ１（old）：リッチ時面積積算値前回値、
ここで、（１８）式右辺第２項の面積Ｓ２はリア空燃比センサ出力がリッチからストイキへと切換わったタイミングでの値であるから、図３に示した第二面積Ｓ２そのものである。従って、（１８）式は第二面積Ｓ２をさらに積算していくものである。これは、第二面積Ｓ２をいくつかサンプリングして積算した後でその平均値を求めるためである。
【０１０４】
ステップ８０ではサンプル回数ｎ１（ゼロに初期設定）を１だけ増やす。サンプル回数ｎ１は（１８）式により第二面積Ｓ２を積算した回数を表す。ステップ８１では次回処理のためリッチ時面積積算値今回値ＲＳＵＭ１（new）の値をリッチ時面積積算値前回値ＲＳＵＭ１（old）に移しておく。リッチ時面積積算値前回値ＲＳＵＭ１（old）の初期値にもゼロを入れておく。
【０１０５】
ステップ８２では次にリア空燃比センサ出力がリッチを継続するときに備えて、再び図３に示した第二面積Ｓ２を求めるため、リッチ時面積前回値ＲＳＭＯＳＱ（old）＝０としておく。
【０１０６】
このようにして、リア空燃比センサ出力がリーンよりストイキへと切換わるたびにステップ７４において図３に示した第一面積Ｓ１が積算され、またリア空燃比センサ出力がリッチよりストイキへと切換わるたびにステップ７９において図３に示した第二面積Ｓ２が積算されてゆく。
【０１０７】
ステップ８３ではサンプル回数ｍ１及びｎ１と一定値（適合値）とを比較する。サンプル回数ｍ及びｎが一定値に達していなければそのまま今回の処理を終了する。
【０１０８】
サンプル回数ｍ１及びｎ１がいずれも一定値に達していればステップ８４、８５に進み次式により第一面積Ｓ１の平均値ＡＶＥＳ１、第二面積Ｓ２の平均値ＡＶＥＳ２をそれぞれ演算する。
【０１０９】
ＡＶＥＳ１＝ＬＳＵＭ１（new）／ｍ１                   …（１９）
ＡＶＥＳ２＝ＲＳＵＭ１（new）／ｎ１                   …（２０）
ステップ８６では次式によりこれらの面積比率ＲＡＴＥＳＭＯ２を演算する。
【０１１０】
ＲＡＴＥＳＭＯ２＝ＡＶＥＳ１／ＡＶＥＳ２              …（２１）
ステップ８７ではこの面積比率ＲＡＴＥＳＭＯ２と１（一定値）を比較する。面積比率ＲＡＴＥＳＭＯ２が１を超えるときにはフロント空燃比センサ４のストイキ点がリーンシフトしていると判定し、ステップ８８に進んでシフト補正量学習値（ゼロに初期設定）を次式により大きくなる側に更新する。
【０１１１】
シフト補正量学習値（new）＝シフト補正量学習値（old）＋所定値
…（２２）
ただし、シフト補正量学習値（new）：更新前のシフト補正量学習値、
シフト補正量学習値（old）：更新後のシフト補正量学習値、
所定値：更新量を定める正の一定値（適合値）、
このようにして求めたシフト補正量学習値はＥＥＰＲＯＭなどのメモリに保存しておく。
【０１１２】
一方、面積比率ＲＡＴＥＳＭＯ２が１以下であればフロント空燃比センサ４のストイキ点がリーンシフトしていないので、このときにはステップ８８を飛ばしてステップ８９に進む。
【０１１３】
ステップ８９では次回のシフト補正量学習値の更新に備えるため、リーン時面積積算値前回値ＬＳＵＭ１（old）、リッチ時面積積算値前回値ＲＳＵＭ１（old）、サンプル回数ｍ１、ｎ１にいずれもゼロを入れておく。
【０１１４】
ここで、本実施形態の作用を説明する。
【０１１５】
フロント空燃比センサ４のストイキ点がリーンシフトしていないときにはシフト補正量学習値＝０であり、従ってフロント空燃比センサ４の出力を空燃比へと変換した値ＡＦｓが実際の空燃比とよく一致することになる。ところが、経時劣化などにより図３左半分に示したようにリア空燃比センサ５の出力が短い周期でリーンとリッチを繰り返し、しかも振幅の中心がリーン側に偏った現象が生じる。これはフロント空燃比センサ４が、見かけ上ストイキ点でリッチ側の出力をするためであるから、シフト補正量学習値をこの見かけ上の空燃比であるＡＦｓに足すことによってリーン側へと補正してやればよい。
【０１１６】
そこで、図３左半分に示す現象が生じているときにはフロント空燃比センサ４のストイキ点がリーンシフトしていると判断され、シフト補正量学習値が正の値で大きくなる側に更新されると、シフト補正量学習値は正の値をもつことになり、このときには、上記図４のステップ５においてこのシフト補正量学習値によりフロント空燃比センサ出力を空燃比へと変換した値ＡＦｓが補正され（シフト補正量学習値が、フロント空燃比センサ出力を空燃比へと変換した値ＡＦｓに加わる）、実空燃比ＡＦｒが大きくなる。この補正により演算値としての実空燃比ＡＦｒが実際の空燃比へと近づくのであるが、それでも、図３左半分に示す現象が生じるのであればリーン側への補正が足りない。このときには再びシフト補正量学習値が正の値で大きくなる側に更新され、シフト補正量学習値が前回よりも正の値で大きくなり、この大きくなったシフト補正量学習値によりＡＦｓが補正されると、演算値としての実空燃比ＡＦｒがさらに実際の空燃比へと近づく。このようにして、シフト補正量学習値の更新を繰り返すと、やがて演算値としての実空燃比ＡＦｒが実際の空燃比へと収束する。このときには、図３の右半分に示したようになり、リア空燃比センサ出力が短い周期でリッチとリーンを繰り返す現象がやむ。このように、シフト補正量学習値は運転条件が学習領域に滞在する限り、所定の時間毎に何度も更新し、これによりシフト補正量学習値が収束するようにする。
【０１１７】
このようにして、本実施形態（請求項１、２に記載の発明）によれば、フロント空燃比センサ４の出力に基づいて酸素ストレージ量を推定し、この酸素ストレージ量推定値ＨＯＳＣが目標値と一致するように空燃比を制御する（図４、図８参照）一方で、リア空燃比センサ出力がリーンを継続するときに酸素ストレージ量最大値ＨＯＳＣＭＡＸより酸素ストレージ量推定値ＨＯＳＣを差し引いた値を積算した面積を第一面積Ｓ１として、また、リア空燃比センサ出力がリッチを継続するときに酸素ストレージ量推定値ＨＯＳＣより酸素ストレージ量最小値ＨＯＳＣＭＩＮを差し引いた値を積算した面積を第二面積Ｓ２としてそれぞれ演算し（図１０のステップ７３、７８参照）、これら第一面積Ｓ１と第二面積Ｓ２に基づいてフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定し（図１０のステップ８４、８５、８６、８７参照）、この判定結果よりフロント空燃比センサ４のストイキ点がリーンシフトしているときにフロント空燃比センサ４のストイキ点をリーン側に補正する（図１０のステップ８７、８８、図４のステップ４、５参照）ので、フロント空燃比センサ４のストイキ点のリーンシフトに起因して、リア空燃比センサ５の出力が短い周期でリーンとリッチとを繰り返す現象が生じている場合にもフロント空燃比センサ４のストイキ点がリーンシフトしているとの検出が可能となり、これにより、フロント空燃比センサ４のストイキ点を補正する機会を増やすことができる。
【０１１８】
また、第１実施形態（請求項２に記載の発明）によれば、面積比率ＲＡＴＥＳＭＯ２と比較する相手が１でよいので、面積比率ＲＡＴＥＳＭＯ２と比較する相手をわざわざ適合する必要がなく簡素な構成となっている。
【０１１９】
図１３、図１４のフローチャートは第２実施形態で、第１実施形態の図９、図１０と置き換わるものである。図１３、図１４において図９、図１０と同一部分には同一のステップ番号をつけている。
【０１２０】
第１実施形態では、図３左半分の下段に示したように酸素ストレージ量について第一面積Ｓ１と第二面積Ｓ２をいくつかサンプリングして積算した後でその平均値ＡＶＥＳ１、ＡＶＥＳ２を求め、その２つの平均値ＡＶＥＳ１、ＡＶＥＳ２から面積比率ＲＡＴＥＳＭＯ２を演算し、その面積比率ＲＡＴＥＳＭＯ２が１を超えるか否かによりフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定したが、第２実施形態では、図１２（基本的に図３と同じもの）左半分に示したように、リア空燃比センサ出力がストイキよりリッチへと切換わっときの酸素ストレージ量最大値ＨＯＳＣＭＡＸとそのときの酸素ストレージ量ＨＯＳＣとの差（Ｌ１で示す）を「第一長さ」、リア空燃比センサ出力がストイキよりリーンへと切換わっときの酸素ストレージ量ＨＯＳＣとその最小値ＨＯＳＣＭＩＮ（＝０）との差（Ｌ２で示す）を「第二長さ」として、これらの比率ＲＡＴＥＯ２（＝第一長さ／第二長さ）を考えたとき、フロント空燃比センサ４のストイキ点がリーンシフトしている場合にこの比率ＲＡＴＥＯ２が１を超える（図１２の左半分参照）のに対して、リーンシフトが生じてない場合には比率ＲＡＴＥＯ２が１以下となる（図１２の右半分参照）ことに着目し、比率ＲＡＴＥＯ２が１を超えるか否かによりフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定するものである。
【０１２１】
すなわち、図１３のステップ６２、７１、６３、６４、１１１、１１６が図１２に示した第一長さＬ１及び第二長さＬ２を演算する部分、図１３のステップ１１２〜１１５、１１７〜１２０及び図１４のステップ１２１〜１２３が第一長さ平均値ＡＥＶＬ１及び第二長さ平均値ＡＶＥＬ２を演算する部分、図１４のステップ１２４が比率ＲＡＴＥＯ２を演算する部分、図１４のステップ１２５がフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定する部分、図１４のステップ８８がその判定結果に基づき、フロント空燃比センサ４のストイキ点がリーンシフトしている場合にシフト補正量学習値を正の値で大きくなる側に更新する部分である。
【０１２２】
ただし、ここでも第一長さの平均値と第二長さの平均値を演算し、これらの比率を演算する場合で説明するが、簡単には第一長さと第二長さを演算し、これらの比率を演算してもかまわない。
【０１２３】
第１実施形態と異なる部分を主に述べると、図１３においてステップ６２、７１、６４では、リア空燃比センサ出力が今回ストイキにあるか、前回ストイキにあったか、今回リーンにあるかをみる。リア空燃比センサ出力が今回ストイキになくかつ前回ストイキであってかつ今回リーンにないときつまりリア空燃比センサ出力がストイキよりリッチへと切換わったときにはステップ６２、７１、６４よりステップ１１１に進んで酸素ストレージ量最大値ＨＯＳＣＭＡＸからそのときの酸素ストレージ量今回値ＨＯＳＣを差し引いた値を長さＬ１に移し、ステップ１１２で次式によりリッチ切換時長さを積算する。
【０１２４】
ＲＳＵＭ２（new）＝ＲＳＵＭ２（old）＋Ｌ１            …（２３）
ただし、ＲＳＵＭ２（new）：リッチ切換時長さ積算値今回値、
ＲＳＵＭ２（old）：リッチ切換時長さ積算値前回値、
ここで、（２３）式右辺第２項の長さＬ１はリア空燃比センサ出力がストイキよりリッチへと切換わったタイミングでの値であるから、図１２に示した第一長さＬ１そのものである。従って、（２３）式は第一長さＬ１をさらに積算していくものである。これは、第一長さＬ１をいくつかサンプリングして積算した後でその平均値を求めるためである。
【０１２５】
ステップ１１３ではサンプル回数ｍ２（ゼロに初期設定）を１だけ増やす。サンプル回数ｍ２は（２３）式により第一長さＬ１を積算した回数を表す。ステップ１１４では次回処理のためリッチ切換時長さ積算値今回値ＲＳＵＭ２（new）の値をリッチ切換時長さ積算値前回値ＲＳＵＭ２（old）に移しておく。リッチ切換時長さ積算値前回値ＲＳＵＭ２（old）の初期値にはゼロを入れておく。
【０１２６】
これに対して、リア空燃比センサ出力が今回ストイキになくかつ前回ストイキであってかつ今回リーンにあるときつまりリア空燃比センサ出力がストイキよりリーンへと切換わったときにはステップ６２、７１、６４よりステップ１１６に進んでそのときの酸素ストレージ量ＨＯＳＣから酸素ストレージ量の最小値ＨＯＳＣＭＩＮ（＝０）を差し引いた値を長さＬ２に移し、ステップ１１７で次式によりリーン切換時長さを積算する。
【０１２７】
ＬＳＵＭ２（new）＝ＬＳＵＭ２（old）＋Ｌ２            …（２４）
ただし、ＬＳＵＭ２（new）：リーン切換時長さ積算値今回値、
ＬＳＵＭ２（old）：リーン切換時長さ積算値前回値、
ここで、（２４）式右辺第２項の長さＬ２はリア空燃比センサ出力がストイキよりリーンへと切換わったタイミングでの値であるから、図１２に示した第二長さＬ２そのものである。従って、（２４）式は第二長さＬ２をさらに積算していくものである。これは、第二長さＬ２をいくつかサンプリングして積算した後でその平均値を求めるためである。
【０１２８】
ステップ１１８ではサンプル回数ｎ２（ゼロに初期設定）を１だけ増やす。サンプル回数ｎ２は（２４）式により第二長さＬ２を積算した回数を表す。ステップ１１９では次回処理のためリーン切換時長さ積算値今回値ＬＳＵＭ２（new）の値をリーン切換時長さ積算値前回値ＬＳＵＭ２（old）に移しておく。リーン切換時長さ積算値前回値ＬＳＵＭ２（old）の初期値にもゼロを入れておく。
【０１２９】
このようにして、リア空燃比センサ出力がストイキよりリッチへと切換わるたびに図１３のステップ１１２において図１２に示した第一長さＬ１が積算され、またリア空燃比センサ出力がストイキよりリーンへと切換わるたびに図１３のステップ１１７において図１２に示した第二長さＬ２が積算されてゆく。
【０１３０】
図１４において、ステップ１２１ではサンプル回数ｍ２及びｎ２と一定値（適合値）とを比較する。サンプル回数ｍ２及びｎ２が一定値に達していなければそのまま今回の処理を終了する。
【０１３１】
サンプル回数ｍ２及びｎ２がいずれも一定値に達していればステップ１２２、１２３に進み次式により第一長さＬ１の平均値ＡＶＥＬ１、第二長さＬ２の平均値ＡＶＥＬ２を演算する。
【０１３２】
ＡＶＥＬ１＝ＬＳＵＭ２（new）／ｍ２                   …（２５）
ＡＶＥＬ２＝ＲＳＵＭ２（new）／ｎ２                   …（２６）
ステップ１２４では次式によりこれらの比率ＲＡＴＥＯ２を演算する。
【０１３３】
ＲＡＴＥＯ２＝ＡＶＥＬ１／ＡＶＥＬ２                  …（２７）
ステップ１２５ではこの比率ＲＡＴＥＯ２と１を比較する。比率ＲＡＴＥＯ２が１より大きいときにはフロント空燃比センサ４のストイキ点がリーンシフトしていると判定し、ステップ８８に進んでシフト補正量学習値を上記の（２２）式により正の値で大きくなる側に更新する。このようにして求めたシフト補正量学習値はＥＥＰＲＯＭなどのメモリに保存しておく。
【０１３４】
一方、面積比率ＲＡＴＥＳＭＯ２が１以下であればフロント空燃比センサ４のストイキ点がリーンシフトしていないので、このときにはステップ８８を飛ばしてステップ１２６に進む。
【０１３５】
ステップ１２６では次回のシフト補正量学習値の更新に備えるため、リッチ切換時長さ積算値前回値ＬＳＵＭ２（old）、リーン切換時長さ積算値前回値ＲＳＵＭ２（old）、サンプル回数ｍ２、ｎ２にいずれもゼロを入れておく。
【０１３６】
このように、第２実施形態（請求項３、４に記載の発明）によれば、フロント空燃比センサの出力に基づいて酸素ストレージ量を推定し、この酸素ストレージ量推定値がＨＯＳＣ目標値と一致するように空燃比を制御する一方で、リア空燃比センサ出力がストイキよりリッチへと横切ったときに酸素ストレージ量最大値ＨＯＳＣＭＡＸより酸素ストレージ量推定値ＨＯＳＣを差し引いた値を第一長さとして、また、リア空燃比センサ出力がストイキよりリーンへと横切ったときに酸素ストレージ量推定値ＨＯＳＣより酸素ストレージ量最小値ＨＯＳＣＭＩＮを差し引いた値を第二長さとしてそれぞれ演算し（図１３のステップ１１１、１１６参照）、これら第一長さと第二長さに基づいてフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定し（図１４のステップ１２２、１２３、１２４、１２５参照）、この判定結果よりフロント空燃比センサ４のストイキ点がリーンシフトしているときにフロント空燃比センサ４のストイキ点をリーン側に補正する（図１４のステップ１２５、８８、図４のステップ４、５参照）ので、第１実施形態と同様に、フロント空燃比センサ４のストイキ点のリーンシフトに起因して、リア空燃比センサの出力が短い周期でリーンとリッチとを繰り返す現象が生じている場合にもフロント空燃比センサ４のストイキ点がリーンシフトしているとの検出が可能となり、これにより、フロント空燃比センサ４のストイキ点を補正する機会を増やすことができる。
【０１３７】
この場合に、フロント空燃比センサ４のストイキ点がリーンシフトしているか否かの判定方法が第１実施形態より簡単になっている。
【０１３８】
また、第２実施形態（請求項４に記載の発明）においても、第１実施形態と同様に、比率ＲＡＴＥＯ２と比較する相手が１でよいので、比率ＲＡＴＥＯ２と比較する相手をわざわざ適合する必要がなく簡素な構成となっている。
【０１３９】
図１６、図１７のフローチャートは第３実施形態、図１９のフローチャートは第４実施形態、図２１のフローチャートは第５実施形態で、それぞれ第１実施形態の図９、図１０と置き換わるものである。図１６、図１７、図１９、図２１において図９、図１０と同一部分には同一のステップ番号をつけている。
【０１４０】
第１、第２の実施形態では、図３、図１２の各左半分に示したように酸素ストレージ量に基づいてフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定するものであったが、第３、第４、第５の実施形態では、図１５、図１８、図２０の各左半分に示したようにリア空燃比センサ出力そのものに基づいてフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定するものである。すなわち、第３実施形態では、図１５左半分に示したようにリア空燃比センサ出力が継続してリーンであるときの面積（Ｓ３で示す）を「第三面積」、リア空燃比センサ出力が継続してリッチであるときの面積（Ｓ４で示す）を「第四面積」として、これらの面積比率ＲＡＴＥＲＯ２（＝第三面積／第四面積）を考えたとき、フロント空燃比センサ４のストイキ点がリーンシフトしている場合にはこの面積比率ＲＡＴＥＲＯ２が一定値を超える（図１５の左半分参照）のに対して、リーンシフトが生じてない場合には面積比率ＲＡＴＥＲＯ２が一定値を超えない（図１５の右半分参照）ことに着目し、第三面積Ｓ３と第四面積Ｓ４をいくつかサンプリングして積算した後でその平均値ＡＶＥＳ３、ＡＶＥＳ４を求め、その２つの平均値ＡＶＥＳ３、ＡＶＥＳ４から面積比率ＲＡＴＥＲＯ２を演算し、その面積比率ＲＡＴＥＲＯ２が一定値を超えるか否かによりフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定する。
【０１４１】
この場合、面積比率ＲＡＴＥＲＯ２と比較する相手である一定値は第１、第２の実施形態と相違して１より大きな値である。
【０１４２】
第４実施形態では、図１８左半分に示したように運転条件が学習領域に続けて滞在する場合において、一定区間当たりにリア空燃比センサ出力が最小値から最大値まで及び最大値より最小値まで振れた振幅回数ＣＮＴ１を演算し、この振幅回数ＣＮＴ１が基準値１（適合値）を超えるか否かによりフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定する。
【０１４３】
第５実施形態では、図２０左半分に示したように通常時のスライスレベル（ＲＳＬＩＣＥ、ＬＳＬＩＣＥ）とは別に学習用のスライスレベル（学習用リッチ側スライスレベルＧＲＳＬＩＣＥと学習用リーン側スライスレベルＧＬＳＬＩＣＥ）を新たに設定し、運転条件が学習領域に続けて滞在する場合において、この学習用スライスレベルのうち学習用リッチ側スライスレベルＧＲＳＬＩＣＥを横切ることなく学習用リーン側スライスレベルＧＬＳＬＩＣＥを同じ方向（図ではストイキよりリーンへ）に一定回数以上連続して横切ったか否かによりフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定する。ここで、フロント空燃比センサ４のストイキ点がリーンシフトしているときに、学習用リッチ側スライスレベルＧＲＳＬＩＣＥをリア空燃比センサ出力ＶＲＯ２が横切ることがない位置に、かつ学習用リーン側スライスレベルＧＬＳＬＩＣＥをリア空燃比センサ出力ＶＲＯ２が横切る位置に、２つの学習用スライスレベル（ＧＲＳＬＩＣＥとＧＬＳＬＩＣＥ）を予め設定しておく。
【０１４４】
第３実施形態から説明すると、図１６のステップ６２、１３１、６４、６５、６８、１３２〜１３５及び図１７のステップ７１、７２、１３５、１４０が図１５に示した第三面積Ｓ３及び第四面積Ｓ４を演算する部分、図１７のステップ１３６〜１３９、１４１〜１４７が第三面積平均値ＡＥＶＳ３及び第四面積平均値ＡＶＥＳ４を演算する部分、図１７のステップ１４８が面積比率ＲＡＴＥＲＯ２を演算する部分、図１７のステップ１４９がフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定する部分、図１７のステップ８８がその判定結果に基づき、フロント空燃比センサ４のストイキ点がリーンシフトしている場合にシフト補正量学習値を正の値で大きくなる側に更新する部分である。
【０１４５】
ただし、ここでも第三面積の平均値と第四面積の平均値を演算し、これらの面積比率を演算する場合で説明するが、簡単には第三面積と第四面積を演算し、これらの面積比率を演算してもかまわない。
【０１４６】
第３実施形態について第１実施形態と異なる部分を主に述べると、図１６においてリア空燃比センサ出力がストイキでないときにはステップ６２よりステップ１３１に進んでリア空燃比センサ出力ＶＲＯ２を読み込む。このリア空燃比センサは第１実施形態と同じに２値的に変化するセンサである。
【０１４７】
ステップ６４、６５ではリア空燃比センサ出力が今回リーンであるのか否か、またリア空燃比センサ出力が前回リーンであったか否かをみる。リア空燃比センサ出力が今回リーンでありかつ前回もリーンであった、つまりリア空燃比センサ出力がリーンを継続するときにはステップ６４、６５よりステップ１３２に進んで次式により、図１５に示した第三面積Ｓ３を演算するため、リーン側スライスレベルＬＳＬＩＣＥよりリア空燃比センサ出力を差引いた値を積算する。
【０１４８】
ＬＳＭＲＯ２（new）＝ＬＳＭＲＯ２（old）＋（ＬＳＬＩＣＥ−ＶＲＯ２）
…（２８）
ただし、ＬＳＭＲＯ２（new）：リーン時面積今回値、
ＬＳＭＲＯ２（old）：リーン時面積前回値、
ＬＳＬＩＣＥ：リーン側スライスレベル（通常時）、
ステップ１３３では次回処理のためリーン時面積今回値ＬＳＭＲＯ２（new）の値をリーン時面積前回値ＬＳＭＲＯ２（old）に移しておく。
【０１４９】
次回以降もリア空燃比センサ出力がリーンであればステップ１３２、１３３の操作を繰り返し実行する。この結果、（２８）式によれば、リア空燃比センサ出力が継続してリーンである間、（２８）式右辺第２項を積算することになるので、図１５に示した面積Ｓ３が求められることになる。リーン時面積前回値ＬＳＭＲＯ２（old）の初期値にはゼロをいれておく。
【０１５０】
これに対して、リア空燃比センサ出力が今回リッチであるときにはステップ６４よりステップ６８に進みリア空燃比センサ出力が前回リッチであったか否かをみる。リア空燃比センサ出力が今回リッチでありかつ前回もリッチであった、つまりリア空燃比センサ出力がリッチを継続するときにはステップ６４、６８よりステップ１３４に進んで次式により、図１５に示した第四面積Ｓ４を演算するため、リア空燃比センサ出力ＶＲＯ２よりリッチ側スライスレベルＲＳＬＩＣＥを差し引いた値を積算する。
【０１５１】
ＲＳＭＲＯ２（new）＝ＲＳＭＲＯ２（old）＋（ＶＲＯ２−ＲＳＬＩＣＥ）
…（２９）
ただし、ＲＳＭＲＯ２（new）：リッチ時面積今回値、
ＲＳＭＲＯ２（old）：リッチ時面積前回値、
ステップ１３５では次回処理のためリッチ時面積今回値ＲＳＭＲＯ２（new）の値をリッチ時面積前回値ＲＳＭＲＯ２（old）に移しておく。
【０１５２】
次回以降もリア空燃比センサ出力がリッチであればステップ１３４、１３５の操作を繰り返し実行する。この結果、（２９）式によれば、リア空燃比センサ出力が継続してリッチである間、（２９）式右辺第２項を積算することになるので、図１５に示した第四面積Ｓ４が求められることになる。リッチ時面積前回値ＲＳＭＲＯ２（old）の初期値にもゼロを入れておく。
【０１５３】
一方、リア空燃比センサ出力が今回ストイキにあるときには図１６のステップ６２より図１７のステップ７１、７２に進みリア空燃比センサ出力が前回ストイキであったか否か、あるいは前回リーンであったか否かをみる。リア空燃比センサ出力が今回ストイキにありかつ前回リーンであったとき、つまりリア空燃比センサ出力がリーンからストイキへと切換わったときにはステップ７１、７２よりステップ１３５に進みそのときのリーン時面積今回値ＬＳＭＲＯ２（new）を面積Ｓ３に移し、ステップ１３６で次式によりリーン時面積を積算する。
【０１５４】
ＬＳＵＭ３（new）＝ＬＳＵＭ３（old）＋Ｓ３            …（３０）
ただし、ＬＳＵＭ３（new）：リーン時面積積算値今回値、
ＬＳＵＭ３（old）：リーン時面積積算値前回値、
ここで、（３０）式右辺第２項の面積Ｓ３はリア空燃比センサ出力がリーンからストイキへと切換わったタイミングでの値であるから、図１５に示した第三面積Ｓ３そのものである。従って、（３０）式は第三面積Ｓ３をさらに積算していくものである。これは、第三面積Ｓ３をいくつかサンプリングして積算した後でその平均値を求めるためである。
【０１５５】
ステップ１３７ではサンプル回数ｍ３（ゼロに初期設定）を１だけ増やす。サンプル回数ｍ３は（３０）式により第三面積Ｓ３を積算した回数を表す。ステップ１３８では次回処理のためリーン時面積積算値今回値ＬＳＵＭ３（new）の値をリーン時面積積算値前回値ＬＳＵＭ３（old）に移しておく。リーン時面積積算値前回値ＬＳＵＭ３（old）の初期値にはゼロを入れておく。
【０１５６】
ステップ１３９では次にリア空燃比センサ出力がリーンを継続するときに備えて、再び図１５に示した第三面積Ｓ３を求めるため、リーン時面積前回値ＬＳＭＲＯ２（old）＝０としておく。
【０１５７】
これに対して、リア空燃比センサ出力が今回ストイキにありかつ前回リッチであったとき、つまりリア空燃比センサ出力がリッチからストイキへと切換わったときにはステップ７１、７２よりステップ１４０に進みそのときのリッチ時面積今回値ＲＳＭＲＯ２（new）を面積Ｓ４に移し、ステップ１４１で次式によりリッチ時面積を積算する。
【０１５８】
ＲＳＵＭ３（new）＝ＲＳＵＭ３（old）＋Ｓ４            …（３１）
ただし、ＲＳＵＭ３（new）：リッチ時面積積算値今回値、
ＲＳＵＭ３（old）：リッチ時面積積算値前回値、
ここで、（３１）式右辺第２項の面積Ｓ４はリア空燃比センサ出力がリッチからストイキへと切換わったタイミングでの値であるから、図１５に示した第四面積Ｓ４そのものである。従って、（３１）式は第四面積Ｓ４をさらに積算していくものである。これは、第四面積Ｓ４をいくつかサンプリングして積算した後でその平均値を求めるためである。
【０１５９】
ステップ１４２ではサンプル回数ｎ３（ゼロに初期設定）を１だけ増やす。サンプル回数ｎ３は（３１）式により第四面積Ｓ４を積算した回数を表す。ステップ１４３では次回処理のためリッチ時面積積算値今回値ＲＳＵＭ３（new）の値をリッチ時面積積算値前回値ＲＳＵＭ３（old）に移しておく。リッチ時面積積算値前回値ＲＳＵＭ３（old）の初期値にもゼロを入れておく。
【０１６０】
ステップ１４４では次にリア空燃比センサ出力がリッチを継続するときに備えて、再び図１５に示した第四面積Ｓ４を求めるため、リッチ時面積前回値ＲＳＭＲＯ２（old）＝０としておく。
【０１６１】
このようにして、リア空燃比センサ出力がリーンよりストイキへと切換わるたびにステップ１３６において図１５に示した第三面積Ｓ３が積算され、またリア空燃比センサ出力がリッチよりストイキへと切換わるたびにステップ１４１において図１５に示した第四面積Ｓ４が積算されてゆく。
【０１６２】
ステップ１４５ではサンプル回数ｍ３及びｎ３と一定値（適合値）とを比較する。サンプル回数ｍ３及びｎ３が一定値に達していなければそのまま今回の処理を終了する。
【０１６３】
サンプル回数ｍ３及びｎ３がいずれも一定値に達していればステップ１４６、１４７に進み次式により第三面積Ｓ３の平均値ＡＶＥＳ３、第四面積Ｓ４の平均値ＡＶＥＳ４を演算する。
【０１６４】
ＡＶＥＳ３＝ＬＳＵＭ３（new）／ｍ３                   …（３２）
ＡＶＥＳ４＝ＲＳＵＭ３（new）／ｎ３                   …（３３）
ステップ１４８では次式によりこれらの面積比率ＲＡＴＥＲＯ２を演算する。
【０１６５】
ＲＡＴＥＲＯ２＝ＡＶＥＳ３／ＡＶＥＳ４                …（３４）
ステップ１４９ではこの面積比率ＲＡＴＥＲＯ２と一定値（適合値）を比較する。ここで、第３実施形態において面積比率ＲＡＴＥＲＯ２と比較する相手を１ではなく一定値（１を超える値）としたのは、リア空燃比センサ出力と酸素ストレージ量の波形の違いによるものである（図３左半分の上段と下段の違いを参照）。面積比率ＲＡＴＥＲＯ２が一定値より大きいときにはフロント空燃比センサ４のストイキ点がリーンシフトしていると判定し、ステップ８８に進んでシフト補正量学習値を上記の（２２）式により正の値で大きくなる側に更新する。このようにして求めたシフト補正量学習値はＥＥＰＲＯＭなどのメモリに保存しておく。
【０１６６】
一方、面積比率ＲＡＴＥＲＯ２が一定値以下であればフロント空燃比センサ４のストイキ点がリーンシフトしていないので、このときにはステップ８８を飛ばしてステップ１５０に進む。
【０１６７】
ステップ１５０では次回のシフト補正量学習値の更新に備えるため、リーン時面積積算値前回値ＬＳＵＭ３（old）、リッチ時面積積算値前回値ＲＳＵＭ３（old）、サンプル回数ｍ３、ｎ３にすべてゼロを入れておく。
【０１６８】
シフト補正量学習値は運転条件が学習領域に滞在する限り、所定の時間毎に何度も更新する。これにより、やがてシフト補正量学習値が収束し、収束した学習値によりフロント空燃比センサ４の出力を空燃比へと変換した値（ＡＦｓ）が上記（１）式により大きくなる側に補正されると、フロント空燃比センサ４のストイキ点が実際にはリーンシフトしている状態となっていても、補正後の値である実空燃比ＡＦｒは、ストイキ点がリーンシフトしていないフロント空燃比センサ４により検出される空燃比と同じになる。従って、シフト補正量学習値が収束した後では、図１５左半分に示した現象、つまりリア空燃比センサ出力が短い周期でリーンとリッチを繰り返しさらにその振幅の中心がリーン側に偏っている現象がやんで、図１５の右半分に示したようになる。
【０１６９】
このように第３実施形態（請求項５に記載の発明）によれば、フロント空燃比センサ４の出力に基づいて酸素ストレージ量を推定し、この酸素ストレージ量推定値ＨＯＳＣが目標値と一致するように空燃比を制御する一方で、リア空燃比センサ出力ＶＲＯ２がリーンを継続するときの面積を第三面積Ｓ３として、また、リア空燃比センサ出力ＶＲＯ２がリッチを継続するときの面積を第四面積Ｓ４としてそれぞれ演算し（図１７のステップ１３５、１４０参照）、これら第三面積と第四面積に基づいてフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定し（図１７のステップ１４６、１４７、１４８、１４９参照）、この判定結果よりフロント空燃比センサ４のストイキ点がリーンシフトしているときにフロント空燃比センサ４のストイキ点を補正する（図１７のステップ１４９、８８、図４のステップ４、５参照）ので、第１実施形態と同様に、フロント空燃比センサ４のストイキ点のリーンシフトに起因して、リア空燃比センサの出力が短い周期でリーンとリッチとを繰り返す現象が生じている場合にもフロント空燃比センサ４のストイキ点がリーンシフトしているとの検出が可能となり、これにより、フロント空燃比センサ４のストイキ点を補正する機会を増やすことができる。
【０１７０】
次に、第４実施形態について述べると、図１９においてステップ１６３〜１６４は運転条件が継続して学習領域に滞在しているか否かを判定する部分、ステップ１６５〜１６８は運転条件が継続して学習領域に滞在している場合に、一定区間当たりに前記リア空燃比センサ出力が最小値より最大値までまたは最大値より最小値まで振れる振幅回数ＣＮＴ１を演算する部分、ステップ１６９がこの振幅回数ＣＮＴ１に基づいてフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定する部分、ステップ８８がその判定結果に基づき、フロント空燃比センサ４のストイキ点がリーンシフトしている場合にシフト補正量学習値を正の値で大きくなる側に更新する部分である。
【０１７１】
詳細には図１９において運転条件が学習領域にあるときにステップ６１よりステップ１６１に進んでフラグＦ１＝１とし、運転条件が学習領域にないときにはステップ６１よりステップ１６２に進んでフラグＦ１＝０とする。フラグＦ１＝１は運転条件が学習領域にあることを、またフラグＦ１＝０は運転条件が学習領域にないことを表す。
【０１７２】
ステップ１６３、１６４ではフラグＦ１の値とフラグＦ１（前回）の値をみる。ここで、フラグＦ１（前回）にはフラグＦ１の前回の値が入っている。フラグＦ１＝１かつＦ１（前回）＝０のとき、つまりフラグＦ１が０より１へと切換わったとき（運転条件が学習領域外より学習領域へと入ったとき）にはステップ１６３、１６４よりステップ１６５、１６６に進んで振幅回数ＣＮＴ１＝０とすると共に、タイマを起動する（ｔ＝０）。タイマは学習領域に継続して滞在する時間を計測するためのものである。
【０１７３】
ステップ１７２では次回処理のため、フラグＦ１の値をフラグＦ１（前回）に移しておく。
【０１７４】
フラグＦ１＝１かつＦ１（前回）＝１のとき、つまりフラグＦ１が継続して１になると（運転条件が学習領域に継続して滞在するとき）、ステップ１６３、１６４よりステップ１６７に進んで振幅回数ＣＮＴ１を演算する。ここでの操作は図示しないが、図１８左半分に示したようにリア空燃比センサ出力をモニターしてリア空燃比センサ出力が最小値から最大値まで振れたときに振幅回数ＣＮＴ１を１だけ増やし、またリア空燃比センサ出力が最大値より最小値まで振れたとき振幅回数ＣＮＴ１を１だけ増やし、これらの操作を繰り返し実行することである。図１８左半分には５回の振幅回数を記載している。
【０１７５】
ステップ１６８ではタイマ値ｔと一定時間を比較する。一定時間は図１８の一定区間を定めるための値（適合値）である。タイマ値ｔが一定時間以下の場合にはステップ１６９〜１７１を飛ばしステップ１７２の操作を実行して今回の処理を終了する。
【０１７６】
運転条件が学習領域に継続して滞在していれば次回以降ステップ１６３、１６４、１６７、１６８の操作を繰り返すことになり、この操作により、フロント空燃比センサ４のストイキ点がリーンシフトしていれば振幅回数ＣＮＴ１が増えてゆく。やがて、タイマ値ｔが一定時間を超えると、ステップ１６８よりステップ１６９に進んで振幅回数ＣＮＴ１と基準値１（適合値）を比較する。振幅回数ＣＮＴ１が基準値１を超えていればフロント空燃比センサ４のストイキ点がリーンシフトしていると判断し、ステップ８８に進んでシフト補正量学習値を上記の（２２）式により正の値で大きくなる側に更新する。このようにして求めたシフト補正量学習値はＥＥＰＲＯＭなどのメモリに保存しておく。これで一回目のシフト補正量学習値の更新が終了する。
【０１７７】
一方、振幅回数ＣＮＴ１が基準値１以下であればフロント空燃比センサ４のストイキ点がリーンシフトしていないので、このときにはステップ８８を飛ばしてステップ１７０に進む。
【０１７８】
ステップ１７０、１７１では２回目のシフト補正量学習値の更新を準備するため振幅回数ＣＮＴ１＝０とする共にタイマを再起動（ｔ＝０）した後、ステップ１７２の操作を実行する。これによって、運転条件が学習領域に継続して滞在している限り、一定時間が経過するたびにシフト補正量学習値の更新が行われる。
【０１７９】
一方、タイマ値ｔが一定時間を超える前に運転条件が学習領域から外れたときにはステップ６１、１６２、１６３よりステップ１７３、１７４へと進むことになり振幅回数ＣＮＴ１＝０とする共にタイマをリセット（ｔ＝０）した後、ステップ１７２の操作を実行する。
【０１８０】
このように第４実施形態（請求項７、８に記載の発明）によれば、フロント空燃比センサ４の出力に基づいて酸素ストレージ量を推定し、この酸素ストレージ量推定値ＨＯＳＣが目標値と一致するように空燃比を制御する一方で、一定区間当たりにリア空燃比センサ出力が最小値より最大値までまたは最大値より最小値まで振れる振幅回数ＣＮＴ１を演算し（図１９のステップ１６７、１６８参照）、この一定区間当たりの振幅回数ＣＮＴ１に基づいてフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定し（図１９のステップ１６８、１６９参照）、この判定結果よりフロント空燃比センサ４のストイキ点がリーンシフトしているときにフロント空燃比センサ４のストイキ点をリーン側に補正する（図１９のステップ１６９、８８、図４のステップ４、５参照）ので、第１実施形態と同様に、フロント空燃比センサ４のストイキ点のリーンシフトに起因して、リア空燃比センサの出力が短い周期でリーンとリッチとを繰り返す現象が生じている場合にもフロント空燃比センサ４のストイキ点がリーンシフトしているとの検出が可能となり、これにより、フロント空燃比センサ４のストイキ点を補正する機会を増やすことができる。
【０１８１】
次に、第５実施形態について述べると、第５実施形態の図２１は第４実施形態の図１９において振幅回数ＣＮＴ１を連続横切り回数ＣＮＴ２に置き換えたものである（図２１のステップ１８１〜１８５参照）。
【０１８２】
この場合に、第５実施形態では、図２０に示したように通常時のスライスレベル（ＲＳＬＩＣＥとＬＳＬＩＣＥ）とは別に学習用のスライスレベル（ＧＲＳＬＩＣＥとＧＬＳＬＩＣＥ）を設けている。そして、図２１においてステップ１８２、１６８は一定区間当たりに前記フロント空燃比センサが、新たに設けた学習用リッチ側スライスレベルＧＲＳＬＩＣＥを横切ることなくかつ新たに設けたもう一つの学習用リーン側スライスレベルＧＬＳＬＩＣＥを連続してストイキよりリーンへと横切る連続横切り回数ＣＮＴ２を演算する部分、ステップ１８３がこの連続横切り回数ＣＮＴ２に基づいてフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定する部分、ステップ８８がその判定結果に基づき、フロント空燃比センサ４のストイキ点がリーンシフトしている場合にシフト補正量学習値を正の値で大きくなる側に更新する部分である。
【０１８３】
ただし、ここではフロント空燃比センサが学習用リーン側スライスレベルＧＬＳＬＩＣＥを連続してストイキよりリーンへと横切る連続横切り回数ＣＮＴ２を演算する場合で説明するが、フロント空燃比センサが学習用リーン側スライスレベルＧＬＳＬＩＣＥを連続してリーンよりストイキへと横切る連続横切り回数を演算する場合でもかまわない。
【０１８４】
詳細には、第５実施形態でも、第４実施形態と同じに、運転条件が学習領域に継続して滞在する場合に、ステップ１６３、１６４よりステップ１８２に進んで連続横切り回数ＣＮＴ２を演算する。この連続横切り回数ＣＮＴ２の演算については図２２のフローにより説明する。
【０１８５】
図２２（図２１のステップ１８２のサブルーチン）において、ステップ１９１ではリア空燃比センサ出力ＶＲＯ２を読み込み、このリア空燃比センサ出力ＶＲＯ２と学習用リッチ側スライスレベルＧＲＳＬＩＣＥとをステップ１９２で比較する。リア空燃比センサ出力ＶＲＯ２と学習用リッチ側スライスレベルＧＲＳＬＩＣＥ以上である（リア空燃比センサ出力ＶＲＯ２がリッチにある）ときにはステップ２００に進んで連続横切り回数ＣＮＴ２＝０として今回の処理を終了する。
【０１８６】
リア空燃比センサ出力ＶＲＯ２が学習用リッチ側スライスレベルＧＲＳＬＩＣＥ未満であるときにはリア空燃比センサ出力ＶＲＯ２がストイキまたはリーンにあると判断しステップ１９３に進んでリア空燃比センサ出力ＶＲＯ２と学習用リーン側スライスレベルＧＬＳＬＩＣＥとをステップ１９２で比較する。リア空燃比センサ出力ＶＲＯ２が学習用リーン側スライスレベルＧＬＳＬＩＣＥを超えているときにはリア空燃比センサ出力ＶＲＯ２がストイキにあると判断しステップ１９４に進んでフラグＦ２＝１とし、リア空燃比センサ出力ＶＲＯ２が学習用リーン側スライスレベルＧＬＳＬＩＣＥ以下であるときにはリア空燃比センサ出力ＶＲＯ２がリーンにあると判断しステップ１９３よりステップ１９５に進んでフラグＦ２＝０とする。フラグＦ２＝１はリア空燃比センサ出力ＶＲＯ２がストイキにあることを、またフラグＦ２＝０はリア空燃比センサ出力ＶＲＯ２がリーンにあることを表す。
【０１８７】
ステップ１９６、１９７ではこのフラグＦ２の値ともう一つのフラグＦ２（前回）の値をみる。フラグＦ２（前回）にはフラグＦ２の前回の値が入っている。フラグＦ２＝０かつＦ２（前回）＝１のときつまりフラグＦ２が１より０へと切換わったときにはリア空燃比センサ出力ＶＲＯ２がストイキよりリーンへと横切ったと判断しステップ１９６、１９７よりステップ１９８に進んで連続横切り回数ＣＮＴ２（ゼロに初期設定）を１だけ増加する。
【０１８８】
ステップ１９９では次回処理のためフラグＦ２の値をフラグＦ２（前回）に移しておく。
【０１８９】
図２１において運転条件が学習領域に継続して滞在するときに、ステップ１９８で連続横切り回数ＣＮＴ２の演算を行うことで、フロント空燃比センサ４にストイキ点のリーンシフトがあれば、連続横切り回数ＣＮＴ２が連続的に増えてゆく。なお、それまで連続横切り回数ＣＮＴ２が増えていても、何かの原因でリア空燃比センサ出力ＶＲＯ２が学習用リッチ側スライスレベルＧＲＳＬＩＣＥを超えたときには図２２においてステップ２００に進んで連続横切り回数ＣＮＴ２＝０となるので、結局、フロント空燃比センサ４のストイキ点がリーンシフトしている場合に限って、連続横切り回数ＣＮＴ２が連続的に増えてゆく。
【０１９０】
やがて、タイマ値ｔが一定時間を超えると、図２１においてステップ１６８よりステップ１８３に進んで連続横切り回数ＣＮＴ２と基準値２（適合値）を比較する。連続横切り回数ＣＮＴ２が基準値２を超えていればフロント空燃比センサ４のストイキ点にリーンシフトが生じていると判定し、ステップ８８に進んでシフト補正量学習値を上記の（２２）式により正の値で大きくなる側に更新する。このようにして求めたシフト補正量学習値はＥＥＰＲＯＭなどのメモリに保存しておく。これで一回目の学習値の更新が終了する。
【０１９１】
一方、連続横切り回数ＣＮＴ２が基準値２以下であればフロント空燃比センサ４のストイキ点がリーンシフトしていないので、このときにはステップ８８を飛ばしてステップ１８４に進む。
【０１９２】
ステップ１８４、１７１では２回目のシフト補正量学習値の更新を準備するため連続横切り回数ＣＮＴ２＝０とする共にタイマを再起動（ｔ＝０）した後、ステップ１７２の操作を実行する。これによって、運転条件が学習領域に継続して滞在している限り、一定時間が経過するたびにシフト補正量学習値の更新が行われる。
【０１９３】
一方、タイマ値ｔが一定時間を超える前に運転条件が学習領域から外れたときにはステップ６１、１６２、１６３よりステップ１８５、１７４へと進むことになり連続横切り回数ＣＮＴ２＝０とする共にタイマをリセット（ｔ＝０）した後、ステップ１７２の操作を実行する。
【０１９４】
このように第５実施形態（請求項９、１０に記載の発明）によれば、一定区間当たりにリア空燃比センサ出力ＶＲＯ２が学習用リッチ側スライスレベルＧＲＳＬＩＣＥを横切ることなくかつ学習用リーン側スライスレベルＧＬＳＬＩＣＥを連続して同じ方向に横切る回数ＣＮＴ２を演算し（図２２のステップ１９１〜１９９参照）、この一定区間当たりの連続横切り回数ＣＮＴ２に基づいてフロント空燃比センサ４のストイキ点がリーンシフトしているか否かを判定し（図２１のステップ１６８、１８３参照）、この判定結果よりフロント空燃比センサ４のストイキ点がリーンシフトしているときにフロント空燃比センサのス４トイキ点をリーン側に補正する（図２１のステップ１８３、８８、図４のステップ４、５参照）ので、第１実施形態と同様に、フロント空燃比センサ４のストイキ点のリーンシフトに起因して、リア空燃比センサの出力が短い周期でリーンとリッチとを繰り返す現象が生じている場合にもフロント空燃比センサ４のストイキ点がリーンシフトしているとの検出が可能となり、これにより、フロント空燃比センサ４のストイキ点を補正する機会を増やすことができる。
【０１９５】
第１から第３までの実施形態では、運転条件が学習領域にあることを条件とするだけで運転条件が学習領域に継続して滞在することまでは必ずしも条件としていないが、第４、第５の実施形態のように、運転条件が学習領域に継続して滞在することを条件とすることもできる。
【０１９６】
請求項１に記載の空燃比制御手段の機能は図４、図８のフローにより、第一面積演算手段の機能は図１０のステップ７３により、第二面積演算手段の機能は図１０のステップ７８により、判定手段の機能は図１０のステップ８４、８５、８６、８７により、リーン側補正手段の機能は図１０のステップ８７、８８及び図４のステップ４、５によりそれぞれ果たされている。
【０１９７】
請求項３に記載の空燃比制御手段の機能は図４、図８のフローにより、第一長さ演算手段の機能は図１３のステップ１１１により、第二長さ演算手段の機能は図１３のステップ１１６により、判定手段の機能は図１４のステップ１２２、１２３、１２４、１２５により、リーン側補正手段の機能は図１４のステップ１２５、８８及び図４のステップ４、５によりそれぞれ果たされている。
【０１９８】
請求項５に記載の空燃比制御手段の機能は図４、図８のフローにより、第三面積演算手段の機能は図１７のステップ１３５により、第四面積演算手段の機能は図１７のステップ１４０により、判定手段の機能は図１７のステップ１４６、１４７、１４８、１４９により、リーン側補正手段の機能は図１７のステップ１４９、８８及び図４のステップ４、５によりそれぞれ果たされている。
【０１９９】
請求項７に記載の空燃比制御手段の機能は図４、図８のフローにより、振幅回数演算手段の機能は図１９のステップ１６７、１６８により、判定手段の機能は図１９のステップ１６９により、リーン側補正手段の機能は図１９のステップ１６９、８８及び図４のステップ４、５によりそれぞれ果たされている。
【０２００】
請求項９に記載の空燃比制御手段の機能は図４、図８のフローにより、連続横切り回数演算手段の機能は図２１のステップ１８２、１６８及び図２２のフローにより、判定手段の機能は図２１のステップ１８３により、リーン側補正手段の機能は図２１のステップ１８３、８８及び図４のステップ４、５によりそれぞれ果たされている。
【図面の簡単な説明】
【０２０１】
【図１】本発明を適用したエンジンの一実施形態の概略構成図。
【図２】低空気量時（定常）においてフロント空燃比センサのストイキ点がリーンシフトしている場合に、酸素ストレージ量、リア空燃比センサ出力、フロント空燃比がどのように変化するのかをモデル的に示す波形図。
【図３】リア空燃比センサ出力、酸素ストレージ量についてのリーンシフト時、リーンシフトなし時の変化を表す波形図。
【図４】酸素ストレージ量の演算を説明するためのフローチャート。
【図５】フロント空燃比センサにより検出される空燃比と過不足酸素濃度の関係を示す特性図。
【図６】酸素ストレージ量の高速成分の演算を説明するためのフローチャート。
【図７】酸素ストレージ量の低速成分の演算を説明するためのフローチャート。
【図８】空燃比フィードバック補正係数の演算を説明するためのフローチャート。
【図９】シフト補正量学習値の演算を説明するためのフローチャート。
【図１０】シフト補正量学習値の演算を説明するためのフローチャート。
【図１１】学習領域図。
【図１２】第２実施形態のリア空燃比センサ出力、酸素ストレージ量についてのリーンシフト時、リーンシフトなし時の変化を表す波形図。
【図１３】第２実施形態のシフト補正量学習値の演算を説明するためのフローチャート。
【図１４】第２実施形態のシフト補正量学習値の演算を説明するためのフローチャート。
【図１５】第３実施形態のリア空燃比センサ出力についてのリーンシフト時、リーンシフトなし時の変化を表す波形図。
【図１６】第３実施形態のシフト補正量学習値の演算を説明するためのフローチャート。
【図１７】第３実施形態のシフト補正量学習値の演算を説明するためのフローチャート。
【図１８】第４実施形態のリア空燃比センサ出力についてのリーンシフト時、リーンシフトなし時の変化を表す波形図。
【図１９】第４実施形態のシフト補正量学習値の演算を説明するためのフローチャート。
【図２０】第５実施形態のリア空燃比センサ出力についてのリーンシフト時、リーンシフトなし時の変化を表す波形図。
【図２１】第５実施形態のシフト補正量学習値の演算を説明するためのフローチャート。
【図２２】連続横切り回数の演算を説明するためのフローチャート。
【図２３】リア空燃比センサ出力の特性図。
【符号の説明】
【０２０２】
１  エンジン
３  触媒
４  フロント空燃比センサ
５  リア酸素センサ
６  コントローラ
【図１】
2006002579.tif 000003
【図２】
2006002579.tif 000004
【図３】
2006002579.tif 000005
【図４】
2006002579.tif 000006
【図５】
2006002579.tif 000007
【図６】
2006002579.tif 000008
【図７】
2006002579.tif 000009
【図８】
2006002579.tif 000010
【図９】
2006002579.tif 000011
【図１０】
2006002579.tif 000012
【図１１】
2006002579.tif 000013
【図１２】
2006002579.tif 000014
【図１３】
2006002579.tif 000015
【図１４】
2006002579.tif 000016
【図１５】
2006002579.tif 000017
【図１６】
2006002579.tif 000018
【図１７】
2006002579.tif 000019
【図１８】
2006002579.tif 000020
【図１９】
2006002579.tif 000021
【図２０】
2006002579.tif 000022
【図２１】
2006002579.tif 000023
【図２２】
2006002579.tif 000024
【図２３】
2006002579.tif 000025