(57)【要約】【課題】エンジンの各気筒の空燃比を正しく制御できない状態で気筒別空燃比制御が継続されることを回避できるようにする。【解決手段】エンジン１１の排気集合部３４ａに設置した空燃比センサ３６の検出値に基づいて各気筒の空燃比を推定する気筒別空燃比推定を実行し、各気筒の推定空燃比に基づいて気筒間の空燃比ばらつきを小さくするように各気筒の空燃比を制御する気筒別空燃比制御を実行する。また、エンジン１１の失火の有無を判定し、エンジン１１の失火有りと判定されたときに、気筒別空燃比推定と気筒別空燃比制御を停止すると共に、気筒別空燃比制御による気筒別補正値をリセットする。これにより、失火の影響で各気筒の空燃比を正しく制御できない状態で気筒別空燃比制御が通常通りに継続されることを回避する。【選択図】図１
2016041922.tif 000002
【特許請求の範囲】
【請求項１】
内燃機関（１１）の各気筒の排出ガスが合流して流れる排気集合部（３４ａ）に該排出ガスの空燃比を検出する空燃比センサ（３６）を設置し、前記各気筒の空燃比検出タイミング毎に検出された前記空燃比センサ（３６）の検出値に基づいて前記各気筒の空燃比を推定する気筒別空燃比推定を実行する気筒別空燃比推定手段（３９）と、前記各気筒の推定空燃比に基づいて前記各気筒の空燃比を制御する気筒別空燃比制御を実行する気筒別空燃比制御手段（３９）とを備えた内燃機関の気筒別空燃比制御装置において、
前記内燃機関（１１）の失火の有無を判定する失火判定手段（３９）と、
前記失火判定手段（３９）により前記内燃機関（１１）の失火有りと判定されたときに、前記気筒別空燃比推定と前記気筒別空燃比制御のうちの少なくとも一方を停止する停止手段（３９）と
を備えていることを特徴とする内燃機関の気筒別空燃比制御装置。
【請求項２】
前記停止手段（３９）は、前記失火判定手段（３９）により前記内燃機関（１１）の失火有りと判定されたときに、前記気筒別空燃比制御による気筒別補正値をリセットすることを特徴とする請求項１に記載の内燃機関の気筒別空燃比制御装置。
【請求項３】
内燃機関（１１）の各気筒の排出ガスが合流して流れる排気集合部（３４ａ）に該排出ガスの空燃比を検出する空燃比センサ（３６）を設置し、前記各気筒の空燃比検出タイミング毎に検出された前記空燃比センサ（３６）の検出値に基づいて前記各気筒の空燃比を推定する気筒別空燃比推定を実行する気筒別空燃比推定手段（３９）と、前記各気筒の推定空燃比に基づいて前記各気筒の空燃比を制御する気筒別空燃比制御を実行する気筒別空燃比制御手段（３９）と、前記気筒別空燃比制御中に前記各気筒の推定空燃比に基づいて前記空燃比検出タイミングを補正する空燃比検出タイミング補正を実行する検出タイミング補正手段（３９）とを備えた内燃機関の気筒別空燃比制御装置において、
前記内燃機関（１１）の排気の流れが停滞した状態（以下「排気流停滞状態」という）か否かを判定する排気流判定手段（３９）と、
前記排気流判定手段（３９）により前記排気流停滞状態と判定されたときに、前記気筒別空燃比推定と前記気筒別空燃比制御と前記空燃比検出タイミング補正のうちの少なくとも一つを停止する停止手段（３９）と
を備えていることを特徴とする内燃機関の気筒別空燃比制御装置。
【請求項４】
前記排気流判定手段（３９）は、前記内燃機関（１１）の急加速後の急減速時に前記排気流停滞状態と判定することを特徴とする請求項３に記載の内燃機関の気筒別空燃比制御装置。
【請求項５】
前記排気流判定手段（３９）は、前記内燃機関（１１）の吸入空気量の変化量が所定の増加判定値よりも大きい状態から所定の減少判定値よりも小さい状態に変化したときに、前記急加速後の急減速時と判定することを特徴とする請求項４に記載の内燃機関の気筒別空燃比制御装置。
【請求項６】
前記排気流判定手段（３９）は、前記急加速後の急減速時と判定してから所定時間が経過したとき又は前記内燃機関（１１）の吸入空気量の変化量が所定値よりも大きくなったときに、前記急加速後の急減速時ではないと判定することを特徴とする請求項５に記載の内燃機関の気筒別空燃比制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、内燃機関の各気筒の空燃比を推定し、その推定空燃比に基づいて各気筒の空燃比を制御する内燃機関の気筒別空燃比制御装置に関する発明である。
【背景技術】
【０００２】
内燃機関の気筒間の空燃比ばらつきを小さくする技術として、例えば、特許文献１（特開２０１３−２５３５９３号公報）に記載されているように、内燃機関の排気集合部に設置した空燃比センサの検出値に基づいて各気筒の空燃比を推定し、各気筒の推定空燃比に基づいて各気筒の空燃比を制御する気筒別空燃比制御を行うようにしたものがある。更に、この特許文献１では、気筒別空燃比制御中に推定空燃比に基づいて空燃比検出タイミングのずれの有無を判定し、空燃比検出タイミングのずれ有りと判定されたときに空燃比検出タイミングを補正する空燃比検出タイミング補正を行うようにしている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１３−２５３５９３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ところで、気筒別空燃比制御中に、内燃機関の失火（例えば特定の気筒での連続失火）が発生すると、その影響で各気筒の空燃比の推定精度が悪化してしまうことがある。このような場合、各気筒の推定空燃比が発散して、各気筒の空燃比を正しく制御する（気筒間の空燃比ばらつきを小さくするように制御する）ことができず、排気エミッションの悪化を招く可能性がある。
【０００５】
また、内燃機関が急加速した後に急減速すると、排気流速が大きく低下して、排気の流れが停滞することがある。気筒別空燃比制御中に、空燃比センサ付近の排気の流れが停滞すると、その影響で空燃比センサ出力の振幅が小さくなってしまい、各気筒の空燃比検出タイミング毎の空燃比センサ出力を正しく読み込むことが困難になることがある。このような場合、推定気筒間違え（各気筒と推定空燃比との対応関係の間違え）が発生して、各気筒の空燃比を正しく制御することができず、排気エミッションの悪化を招く可能性がある。このような状態で、空燃比検出タイミング補正を行うと、各気筒の空燃比の推定精度が更に悪化する可能性もある。
【０００６】
そこで、本発明が解決しようとする課題は、各気筒の空燃比を正しく制御できない状態で気筒別空燃比制御が継続されることを回避して排気エミッションの悪化を抑制することができる内燃機関の気筒別空燃比制御装置を提供することにある。
【課題を解決するための手段】
【０００７】
上記課題を解決するために、請求項１に係る発明は、内燃機関（１１）の各気筒の排出ガスが合流して流れる排気集合部（３４ａ）に該排出ガスの空燃比を検出する空燃比センサ（３６）を設置し、各気筒の空燃比検出タイミング毎に検出された空燃比センサ（３６）の検出値に基づいて各気筒の空燃比を推定する気筒別空燃比推定を実行する気筒別空燃比推定手段（３９）と、各気筒の推定空燃比に基づいて各気筒の空燃比を制御する気筒別空燃比制御を実行する気筒別空燃比制御手段（３９）とを備えた内燃機関の気筒別空燃比制御装置において、内燃機関（１１）の失火の有無を判定する失火判定手段（３９）と、失火判定手段（３９）により内燃機関（１１）の失火有りと判定されたときに、気筒別空燃比推定と気筒別空燃比制御のうちの少なくとも一方を停止する停止手段（３９）とを備えた構成としたものである。
【０００８】
気筒別空燃比推定を停止（各気筒の推定空燃比の算出を停止）することで、気筒別空燃比制御による各気筒の気筒別補正値の更新が停止することができるため、気筒別空燃比推定のみを停止しても、気筒別空燃比制御を停止（各気筒の気筒別補正値の算出を停止）するのとほぼ同様の状態にできる。
【０００９】
従って、内燃機関の失火有りと判定されたときに、気筒別空燃比推定や気筒別空燃比制御を停止すれば、失火により各気筒の空燃比を正しく制御できない状態で気筒別空燃比制御が通常通りに継続されることを回避して排気エミッションの悪化を抑制することができる。
【００１０】
また、請求項３に係る発明は、内燃機関（１１）の各気筒の排出ガスが合流して流れる排気集合部（３４ａ）に該排出ガスの空燃比を検出する空燃比センサ（３６）を設置し、各気筒の空燃比検出タイミング毎に検出された空燃比センサ（３６）の検出値に基づいて各気筒の空燃比を推定する気筒別空燃比推定を実行する気筒別空燃比推定手段（３９）と、各気筒の推定空燃比に基づいて各気筒の空燃比を制御する気筒別空燃比制御を実行する気筒別空燃比制御手段（３９）と、気筒別空燃比制御中に各気筒の推定空燃比に基づいて空燃比検出タイミングを補正する空燃比検出タイミング補正を実行する検出タイミング補正手段（３９）とを備えた内燃機関の気筒別空燃比制御装置において、内燃機関（１１）の排気の流れが停滞した状態（以下「排気流停滞状態」という）か否かを判定する排気流判定手段（３９）と、排気流判定手段（３９）により排気流停滞状態と判定されたときに、気筒別空燃比推定と気筒別空燃比制御と空燃比検出タイミング補正のうちの少なくとも一つを停止する停止手段（３９）とを備えた構成としたものである。
【００１１】
排気流停滞状態と判定されたときに、気筒別空燃比推定や気筒別空燃比制御を停止すれば、排気の流れの停滞により各気筒の空燃比を正しく制御できない状態で気筒別空燃比制御が通常通りに継続されることを回避して排気エミッションの悪化を抑制することができる。また、空燃比検出タイミング補正を停止しても、各気筒の空燃比の推定精度の悪化を抑制して、気筒別空燃比制御の制御精度の悪化を抑制することができる。
【図面の簡単な説明】
【００１２】
【図１】図１は本発明の実施例１におけるエンジン制御システムの概略構成を示す図である。
【図２】図２は空燃比制御機能を説明するブロック図である。
【図３】図３は各気筒の推定空燃比と気筒別補正値と実空燃比の挙動を示す図である。
【図４】図４は失火判定ルーチンの処理の流れを示すフローチャートである。
【図５】図５は実施例１の実行条件判定ルーチンの処理の流れを示すフローチャートである。
【図６】図６は気筒別空燃比制御ルーチンの処理の流れを示すフローチャートである。
【図７】図７は空燃比検出タイミング判定ルーチンの処理の流れを示すフローチャートである。
【図８】図８は空燃比検出タイミングずれ学習補正ルーチンの処理の流れを示すフローチャートである。
【図９】図９はＬｏｃａｌ学習実行ルーチンの処理の流れを示すフローチャートである。
【図１０】図１０はＬｏｃａｌ学習指標算出ルーチンの処理の流れを示すフローチャートである。
【図１１】図１１はＧｌｏｂａｌ学習実行ルーチンの処理の流れを示すフローチャートである。
【図１２】図１２はＧｌｏｂａｌ学習指標算出ルーチンの処理の流れを示すフローチャートである。
【図１３】図１３は空燃比検出タイミングの変更を仮定した場合の想定気筒を示す図である。
【図１４】図１４は急加減速判定ルーチンの処理の流れを示すフローチャートである。
【図１５】図１５は実施例２の実行条件判定ルーチンの処理の流れを示すフローチャートである。
【図１６】図１６は実施例２の制御の実行例（その１）を示すタイムチャートである。
【図１７】図１７は実施例２の制御の実行例（その２）を示すタイムチャートである。
【発明を実施するための形態】
【００１３】
以下、本発明を実施するための形態を具体化した幾つかの実施例を説明する。
【実施例１】
【００１４】
本発明の実施例１を図１乃至図１３に基づいて説明する。
まず、図１に基づいてエンジン制御システム全体の概略構成を説明する。
内燃機関である例えば直列４気筒のエンジン１１は、第１気筒＃１〜第４気筒＃４の四つの気筒を有し、このエンジン１１の吸気管１２の最上流部には、エアクリーナ１３が設けられ、このエアクリーナ１３の下流側に、吸入空気量を検出するエアフローメータ１４が設けられている。このエアフローメータ１４の下流側には、モータ等によって開度調節されるスロットルバルブ１５と、このスロットルバルブ１５の開度（スロットル開度）を検出するスロットル開度センサ１６とが設けられている。
【００１５】
更に、スロットルバルブ１５の下流側には、サージタンク１７が設けられ、このサージタンク１７には、吸気管圧力を検出する吸気管圧力センサ１８が設けられている。また、サージタンク１７には、エンジン１１の各気筒に空気を導入する吸気マニホールド１９が設けられ、各気筒の吸気マニホールド１９の吸気ポート近傍に、それぞれ燃料を吸気ポートに向けて噴射する燃料噴射弁２０が取り付けられている。エンジン運転中は、燃料タンク２１内の燃料が燃料ポンプ２２によりデリバリパイプ２３に送られ、各気筒の噴射タイミング毎に各気筒の燃料噴射弁２０から燃料が噴射される。デリバリパイプ２３には、燃料圧力（燃圧）を検出する燃圧センサ２４が取り付けられている。
【００１６】
また、エンジン１１には、吸気バルブ２５と排気バルブ２６のバルブタイミング（開閉タイミング）をそれぞれ変化させる可変バルブタイミング機構２７，２８が設けられている。更に、エンジン１１には、吸気カム軸２９と排気カム軸３０の回転に同期してカム角信号を出力する吸気カム角センサ３１と排気カム角センサ３２が設けられていると共に、エンジン１１のクランク軸の回転に同期して所定クランク角毎（例えば３０ＣＡ毎）にクランク角信号のパルスを出力するクランク角センサ３３が設けられている。
【００１７】
一方、エンジン１１の排気管３４のうちの各気筒の排出ガスが合流して流れる排気集合部３４ａ（各気筒の排気マニホールド３５が集合する部分又はそれよりも下流側）には、排出ガスの空燃比を検出する空燃比センサ３６が設けられている。この空燃比センサ３６の下流側に、排出ガス中のＣＯ，ＨＣ，ＮＯX 等を浄化する三元触媒等の触媒３７が設けられている。また、エンジン１１のシリンダブロックには、冷却水温を検出する冷却水温センサ３８が取り付けられている。
【００１８】
これら各種センサの出力は、電子制御ユニット（以下「ＥＣＵ」と表記する）３９に入力される。このＥＣＵ３９は、マイクロコンピュータを主体として構成され、内蔵されたＲＯＭ（記憶媒体）に記憶された各種のエンジン制御用のプログラムを実行することで、エンジン運転状態に応じて、燃料噴射量、点火時期、スロットル開度（吸入空気量）等を制御する。
【００１９】
その際、ＥＣＵ３９は、所定の空燃比Ｆ／Ｂ制御実行条件が成立したときに、空燃比センサ３６の出力に基づいて排出ガスの空燃比を目標空燃比に一致させるように混合気の空燃比（例えば燃料噴射量）をＦ／Ｂ制御する空燃比Ｆ／Ｂ制御を実行する。ここで、「Ｆ／Ｂ」は「フィードバック」を意味する（以下、同様）。
【００２０】
具体的には、図２に示すように、まず、空燃比偏差算出部４０で、検出空燃比（空燃比センサ３６で検出した排出ガスの空燃比）と目標空燃比との偏差を算出し、空燃比Ｆ／Ｂ制御部４１で、検出空燃比と目標空燃比との偏差が小さくなるように空燃比補正係数を算出する。そして、噴射量算出部４２で、エンジン回転速度やエンジン負荷（吸気管負圧や吸入空気量等）に基づいて算出されたベース噴射量や空燃比補正係数等に基づいて燃料噴射量を算出し、その燃料噴射量に基づいて各気筒の燃料噴射弁２０を制御する。
【００２１】
更に、ＥＣＵ３９は、後述する図６の気筒別空燃比制御ルーチンを実行することで、各気筒の空燃比検出タイミング毎に検出された空燃比センサ３６の検出値に基づいて各気筒の空燃比を気筒毎に推定する気筒別空燃比推定を実行し、各気筒の推定空燃比に基づいて各気筒の空燃比を気筒毎に制御する気筒別空燃比制御を実行する。
【００２２】
具体的には、図２に示すように、まず、気筒別空燃比推定部４３で、後述する気筒別空燃比推定モデルを用いて空燃比センサ３６の検出値（排気集合部３４ａを流れる排出ガスの実空燃比）に基づいて各気筒の空燃比を気筒毎に推定し、基準空燃比算出部４４で、全気筒の推定空燃比の平均値を算出して、その平均値を基準空燃比に設定する。この後、気筒別空燃比偏差算出部４５で、各気筒の推定空燃比と基準空燃比との偏差を気筒毎に算出し、気筒別空燃比制御部４６で、各気筒の推定空燃比と基準空燃比との偏差が小さくなるように気筒別補正値として例えば燃料補正量（燃料噴射量の補正量）を気筒毎に算出する。その算出結果に基づいて各気筒の燃料噴射量を気筒毎に補正することで、各気筒に供給する混合気の空燃比を気筒毎に補正して気筒間の空燃比ばらつきを小さくする。
【００２３】
ここで、空燃比センサ３６の検出値（排気集合部３４ａを流れる排出ガスの実空燃比）に基づいて各気筒の空燃比を推定するモデル（以下「気筒別空燃比推定モデル」という）の具体例を説明する。
【００２４】
排気集合部３４ａにおけるガス交換に着目して、空燃比センサ３６の検出値を、排気集合部３４ａにおける各気筒の推定空燃比の履歴と空燃比センサ３６の検出値の履歴とにそれぞれ所定の重みを乗じて加算したものとしてモデル化し、このモデルを用いて各気筒の空燃比を推定するようにしている。この際、オブザーバとしてはカルマンフィルタを用いる。
【００２５】
より具体的には、排気集合部３４ａにおけるガス交換のモデルを次の（１）式にて近似する。
ｙs(t)＝ｋ1 ×ｕ(t-1) ＋ｋ2 ×ｕ(t-2) −ｋ3 ×ｙs(t-1)−ｋ4 ×ｙs(t-2)
……（１）
ここで、ｙs は空燃比センサ３６の検出値、ｕは排気集合部３４ａに流入するガスの空燃比、ｋ1 〜ｋ4 は定数である。
【００２６】
排気系では、排気集合部３４ａにおけるガス流入及び混合の一次遅れ要素と、空燃比センサ３６の応答遅れによる一次遅れ要素とが存在する。そこで、上記（１）式では、これらの一次遅れ要素を考慮して過去２回分の履歴を参照することとしている。
【００２７】
上記（１）式を状態空間モデルに変換すると、次の（２ａ）、（２ｂ）式が導き出される。
Ｘ(t+1) ＝Ａ・Ｘ(t) ＋Ｂ・ｕ(t) ＋Ｗ(t)       ……（２ａ）
Ｙ(t) ＝Ｃ・Ｘ(t) ＋Ｄ・ｕ(t)                 ……（２ｂ）
ここで、Ａ，Ｂ，Ｃ，Ｄはモデルのパラメータ、Ｙは空燃比センサ３６の検出値、Ｘは状態変数としての各気筒の推定空燃比、Ｗはノイズである。
【００２８】
更に、上記（２ａ）、（２ｂ）式によりカルマンフィルタを設計すると、次の（３）式が得られる。
Ｘ＾(k+1｜k)＝Ａ・Ｘ＾(k｜k-1)＋Ｋ｛Ｙ(k) −Ｃ・Ａ・Ｘ＾(k｜k-1)｝  ……（３）  ここで、Ｘ＾（エックスハット）は各気筒の推定空燃比、Ｋはカルマンゲインである。Ｘ＾(k+1｜k)の意味は、時間(k) の推定値により次の時間(k+1) の推定値を求めることを表す。
【００２９】
以上のようにして、気筒別空燃比推定モデルをカルマンフィルタ型オブザーバにて構成することにより、燃焼サイクルの進行に伴って各気筒の空燃比を順次推定することができる。
【００３０】
次に、各気筒の空燃比検出タイミング（空燃比センサ３６の出力のサンプルタイミング）の設定方法について説明する。各気筒から排出される排出ガスが空燃比センサ３６付近に到達してその空燃比が検出されるまでの遅れ（以下「排気系の応答遅れ」という）がエンジン運転状態によって変化する。これを考慮して、本実施例では、エンジン運転状態（例えばエンジン負荷、エンジン回転速度等）に応じてマップにより各気筒の空燃比検出タイミングを設定し、空燃比センサ３６の出力をＥＣＵ３９に取り込むようにしている。一般に、エンジン負荷が小さくなるほど、排気系の応答遅れが大きくなるため、各気筒の空燃比検出タイミングは、エンジン負荷が小さくなるほど、遅角側にシフトされるように設定されている。
【００３１】
しかしながら、各気筒の排気ポートから空燃比センサ３６までの排気マニホールド３５の長さが各気筒毎に異なると共に、各気筒の排出ガスの流れがエンジン運転状態（エンジン回転速度や筒内充填空気量等）によって複雑に変化する。しかも、エンジン１１の製造ばらつきや経年変化によっても排気系の応答遅れが変化するため、エンジン設計・製造過程で、各気筒の排気系の応答遅れ（各気筒の空燃比検出タイミング）とエンジン負荷との関係を精度良くマップ化しておくことは困難である。このため、各気筒の空燃比検出タイミングが適正な空燃比検出タイミングからずれる可能性がある。
【００３２】
もし、各気筒の空燃比検出タイミングがずれると、各気筒の空燃比の推定精度が悪化して、気筒別空燃比制御を続けても気筒間の推定空燃比のばらつきがいつまでも小さくならならない状態となる。
【００３３】
そこで、ＥＣＵ３９は、後述する図７乃至図１２の各ルーチンを実行することで、気筒別空燃比制御中に推定空燃比に基づいて空燃比検出タイミングのずれの有無を判定する空燃比検出タイミング判定を行い、空燃比検出タイミングのずれ有りと判定されたときに空燃比検出タイミングを補正する空燃比検出タイミング補正を行う。
【００３４】
例えば、エンジン１１の１サイクル（７２０ＣＡ）内で空燃比センサ３６の検出値のばらつき（変動）が最大となるように空燃比検出タイミングを補正するＬｏｃａｌ学習を実行する。このＬｏｃａｌ学習の実行後に、気筒別空燃比制御中に少なくとも一つの気筒の推定空燃比の変化とその気筒の気筒別補正値（例えば燃料補正量）の変化との関係に基づいて空燃比検出タイミングを補正するＧｌｏｂａｌ学習を実行する。このＧｌｏｂａｌ学習では、各気筒の推定空燃比が想定している各気筒番号を仮想的に複数通り変更した場合の各々において少なくとも一つの気筒の推定空燃比の変化とその推定空燃比の変更後の気筒番号の気筒別補正値の変化との相関値を算出し、この相関値が最大となるように空燃比検出タイミングを補正する。
【００３５】
各気筒の空燃比検出タイミングがずれた場合、ある気筒の正しい空燃比検出タイミングがその気筒の現在の空燃比検出タイミングの近傍であるとは限らず、例えば、次の燃焼気筒の現在の空燃比検出タイミング又はそれよりも遅角側まで遅れることや、前の燃焼気筒の現在の空燃比検出タイミング又はそれよりも進角側まで進むことも想定される。例えば、図３（ｂ）に示すように、ある気筒（第１気筒＃１と仮定）の正しい空燃比検出タイミングが他の気筒（第３気筒＃３と仮定）の現在の空燃比検出タイミングまでずれた場合、第１気筒＃１の実空燃比を最もよく検出しているタイミングは、第１気筒＃１の現在の空燃比検出タイミングではなく、第３気筒＃３の現在の空燃比検出タイミングとなる。この場合、第１気筒＃１の現在の空燃比検出タイミングに基づき推定した第１気筒＃１の推定空燃比に基づき算出した第１気筒＃１の気筒別補正値（例えば燃料補正量）で気筒別空燃比制御を実施すると、第１気筒＃１の実空燃比は第１気筒＃１の気筒別補正値の変化に応じて変化する。しかし、第１気筒＃１の推定空燃比は第１気筒＃１の気筒別補正値の変化に応じて変化せず、第３気筒＃３の推定空燃比が第１気筒＃１の気筒別補正値の変化に応じて変化することになる。
【００３６】
この特性に着目して、本実施例では、Ｇｌｏｂａｌ学習によって、気筒別空燃比制御中に少なくとも一つの気筒の推定空燃比の変化とその気筒の気筒別補正値（例えば燃料補正量）の変化との関係に基づいて空燃比検出タイミングを補正するようにしているため、空燃比検出タイミングのずれを修正することができる。しかも、各気筒の推定空燃比が想定している各気筒番号を仮想的に複数通り変更した場合の各々において少なくとも一つの気筒の推定空燃比の変化とその推定空燃比の変更後の気筒番号の気筒別補正値（例えば燃料補正量）の変化との相関値を算出し、その相関値に基づいて空燃比検出タイミングを補正するようにしている。これにより、実際に現在の空燃比検出タイミングを順次ずらして相関値を算出する必要がなく、現在の空燃比検出タイミングでの各気筒の推定空燃比とそれに基づく各気筒の気筒別補正値のみに基づいて、仮想的に想定気筒を入れ替えた場合の各々の相関値を同時に算出して比較することができる。これにより、最適な空燃比検出タイミングが現在の空燃比検出タイミングから大きく乖離している場合でも、短時間で空燃比検出タイミングのずれを修正することができる。
【００３７】
また、例えば、ある気筒（第１気筒＃１と仮定）の正しい空燃比検出タイミングが他の連続する気筒（第２気筒＃２、第４気筒＃４と仮定）の現在の空燃比検出タイミングの中間までずれた場合、第１気筒＃１の実空燃比を最も精度良く検出することができる空燃比検出タイミングは、第１気筒＃１の現在の空燃比検出タイミングではなく、第２気筒＃２と第４気筒＃４の現在の空燃比検出タイミングの中間となる。この場合、前述の第１気筒＃１の気筒別補正値の変化に最も相関があるタイミングでの推定空燃比は現在の空燃比検出タイミングでの推定において得ることができないため、最適な空燃比検出タイミングに修正できない可能性がある。従って、各気筒の空燃比検出タイミングでの空燃比センサ３６の検出値のいずれかが、各気筒の実空燃比のいずれかを精度良く検出していることが望ましい。
【００３８】
そこで、本実施例では、Ｌｏｃａｌ学習によって、エンジン１１の１サイクル（７２０ＣＡ）内で空燃比センサ３６の検出値のばらつき（変動）が最大となるように空燃比検出タイミングを補正するようにしている。これにより、各気筒の実空燃比がばらついている場合、１サイクル内で空燃比が変動するが、その変動を最大に検出することができ、各気筒の空燃比検出タイミングでの空燃比センサ３６の検出値のいずれかが、各気筒の実空燃比のいずれかを精度良く検出しているようにできる。これにより、各気筒の推定空燃比のいずれかが各気筒の実空燃比のいずれかを検出することができるため、Ｇｌｏｂａｌ学習において、空燃比検出タイミングのずれを精度良く修正することができる。
【００３９】
ところで、気筒別空燃比制御中に、エンジン１１の失火（例えば特定の気筒での連続失火）が発生すると、その影響で各気筒の空燃比の推定精度が悪化してしまうことがある。このような場合、各気筒の推定空燃比が発散して、各気筒の空燃比を正しく制御する（気筒間の空燃比ばらつきを小さくするように制御する）ことができず、排気エミッションの悪化を招く可能性がある。
【００４０】
この対策として、本実施例１では、ＥＣＵ３９により後述する図４及び図５の各ルーチンを実行することで、エンジン１１の失火の有無を判定し、エンジン１１の失火有りと判定されたときに、気筒別空燃比推定と気筒別空燃比制御を停止すると共に、気筒別空燃比制御による気筒別補正値をリセットするようにしている。
以下、本実施例１でＥＣＵ３９が実行する図４乃至図１２の各ルーチンの処理内容を説明する。
【００４１】
［失火判定ルーチン］
図４に示す失火判定ルーチンは、クランク角センサ３３の出力パルスに同期して所定クランク角毎（例えば３０ＣＡ毎）に起動され、特許請求の範囲でいう失火判定手段としての役割を果たす。
【００４２】
本ルーチンが起動されると、まず、ステップ１０１で、所定タイミング毎（例えば所定の失火判定クランク角区間毎）にクランク角センサ３３の出力信号に基づいてエンジン１１のクランク軸が３０ＣＡ回転するのに要した時間である３０ＣＡ時間Ｔ３０を算出する。
【００４３】
この後、ステップ１０２に進み、今回の３０ＣＡ時間Ｔ３０(i) と前回の３０ＣＡ時間Ｔ３０(i-1) との差である時間変化量ＤＭＦ（エンジン回転変動の情報）を算出する。
この後、ステップ１０３に進み、時間変化量ＤＭＦが失火判定値よりも大きいか否かを判定する。
【００４４】
このステップ１０３で、時間変化量ＤＭＦが失火判定値以下であると判定された場合には、ステップ１０４に進み、エンジン１１の失火無しと判定して、失火フラグを「０」にリセットした後、本ルーチンを終了する。
【００４５】
これに対して、上記ステップ１０３で、時間変化量ＤＭＦが失火判定値よりも大きいと判定された場合には、ステップ１０５に進み、エンジン１１の失火有りと判定して、失火フラグを「１」にセットした後、本ルーチンを終了する。尚、連続して時間変化量ＤＭＦが失火判定値よりも大きいと判定された回数（連続回数）が所定値を越えたときに失火有りと判定するようにしたり、或は、所定期間内に時間変化量ＤＭＦが失火判定値よりも大きいと判定された回数（積算回数）が所定値を越えたときに失火有りと判定するようにしても良い。
【００４６】
また、図４のルーチンでは、時間変化量ＤＭＦを失火判定値と比較して失火の有無を判定するようにしたが、失火判定方法は、これに限定されず、適宜変更しても良く、例えば、エンジン回転変動量を失火判定値と比較して失火の有無を判定するようにしても良い。
【００４７】
［実行条件判定ルーチン］
図５に示す実行条件判定ルーチンは、クランク角センサ３３の出力パルスに同期して所定クランク角毎（例えば３０ＣＡ毎）に起動される。本ルーチンが起動されると、まず、ステップ２０１で、失火フラグ＝０（失火無し）であるか否かを判定する。
【００４８】
このステップ２０１で、失火フラグ＝０（失火無し）と判定された場合には、ステップ２０２に進み、空燃比センサ３６が使用可能（例えば空燃比センサ３６が正常で且つ活性状態）であるか否かを判定する。
【００４９】
このステップ２０２で、空燃比センサ３６が使用可能であると判定された場合には、ステップ２０３に進み、エンジン運転状態（例えばエンジン負荷とエンジン回転速度）が所定領域内（例えば空燃比推定精度を確保できる領域内）であるか否かを判定する。
【００５０】
上記ステップ２０１〜２０３で全て「Ｙｅｓ」と判定された場合（つまり上記ステップ２０１〜２０３の条件を全て満たした場合）には、ステップ２０４に進み、気筒別空燃比制御の実行条件が成立していると判定して、実行条件フラグを「１」にセットした後、本ルーチンを終了する。
【００５１】
これに対して、上記ステップ２０１で、失火フラグ＝１（失火有り）と判定された場合には、ステップ２０５に進み、各気筒の気筒別補正値（燃料補正量）を所定値（例えば初期値又は失火有り判定前の値）にリセットする。この後、ステップ２０６に進み、気筒別空燃比制御の実行条件が不成立であると判定して、実行条件フラグを「０」にリセットした後、本ルーチンを終了する。これらの処理により、エンジン１１の失火有り（失火フラグ＝１）と判定されたときに、気筒別空燃比制御の実行条件を不成立（実行条件フラグ＝０）にして、気筒別空燃比推定と気筒別空燃比制御を停止すると共に、各気筒の気筒別補正値をリセットするようになっている。従って、本実施例１では、図５のルーチン等が特許請求の範囲でいう停止手段としての役割を果たす。
【００５２】
また、上記ステップ２０２又は２０３で「Ｎｏ」と判定された場合には、ステップ２０６に進み、気筒別空燃比制御の実行条件が不成立であると判定して、実行条件フラグを「０」にリセットした後、本ルーチンを終了する。
【００５３】
［気筒別空燃比制御ルーチン］
図６に示す気筒別空燃比制御ルーチンは、クランク角センサ３３の出力パルスに同期して所定クランク角毎（例えば３０ＣＡ毎）に起動され、特許請求の範囲でいう気筒別空燃比制御手段としての役割を果たす。
【００５４】
本ルーチンが起動されると、まず、ステップ３０１で、気筒別空燃比制御の実行条件が成立しているか否かを、実行条件フラグが「１」にセットされているか否かによって判定する。
【００５５】
このステップ３０１で、気筒別空燃比制御の実行条件が不成立（実行条件フラグ＝０）と判定された場合には、ステップ３０２以降の気筒別空燃比制御に関する処理を実行することなく、本ルーチンを終了する。これにより、エンジン１１の失火有り（失火フラグ＝１）と判定されて、気筒別空燃比制御の実行条件が不成立（実行条件フラグ＝０）と判定された場合には、気筒別空燃比推定と気筒別空燃比制御が停止される。
【００５６】
一方、上記ステップ３０１で、気筒別空燃比制御の実行条件が成立している（実行条件フラグ＝１）と判定された場合には、ステップ３０２以降の気筒別空燃比制御に関する処理を次のようにして実行する。
【００５７】
まず、ステップ３０２で、各気筒の空燃比検出タイミング（空燃比センサ３６の出力のサンプルタイミング）を、その時点のエンジン負荷（例えば吸気管圧力）に応じてマップにより設定する。尚、各気筒の空燃比検出タイミングをエンジン負荷とエンジン回転速度に応じてマップにより設定しても良い。この空燃比検出タイミングを設定するマップは、後述する図９のＬｏｃａｌ学習実行ルーチン及び図１１のＧｌｏｂａｌ学習実行ルーチンによって学習補正される。
【００５８】
この後、ステップ３０３に進み、現在のクランク角が上記ステップ３０２で設定した空燃比検出タイミングであるか否かを判定し、空燃比検出タイミングでなければ、以降の処理を行うことなく、本ルーチンを終了する。
【００５９】
これに対して、現在のクランク角が上記ステップ３０２で設定した空燃比検出タイミングであれば、ステップ３０４に進み、空燃比センサ３６の出力（空燃比検出値）を読み込む。
【００６０】
この後、ステップ３０５に進み、前記気筒別空燃比推定モデルを用いて今回の空燃比推定対象となる気筒の空燃比を空燃比センサ３６の検出値に基づいて推定する。このステップ３０５の処理が特許請求の範囲でいう気筒別空燃比推定手段としての役割を果たす。
【００６１】
この後、ステップ３０６に進み、全気筒の推定空燃比の平均値を算出して、その平均値を基準空燃比（全気筒の目標空燃比）に設定する。
この後、ステップ３０７に進み、各気筒の推定空燃比と基準空燃比との偏差を算出して、その偏差が小さくなるように各気筒の気筒別補正値として燃料補正量を算出する。
【００６２】
この後、ステップ３０８に進み、各気筒の燃料補正量に基づいて各気筒の燃料噴射量を補正することで、各気筒に供給する混合気の空燃比を各気筒毎に補正して気筒間の空燃比ばらつきを小さくするように制御する。
【００６３】
［空燃比検出タイミング判定ルーチン］
図７に示す空燃比検出タイミング判定ルーチンは、クランク角センサ３３の出力パルスに同期して所定クランク角毎（例えば３０ＣＡ毎）に起動される。本ルーチンが起動されると、まず、ステップ４０１で、気筒別空燃比制御中であるか否かを判定し、気筒別空燃比制御中でなければ、以降の処理を行うことなく、本ルーチンを終了する。
【００６４】
これに対して、気筒別空燃比制御中であれば、ステップ４０２に進み、所定以上の燃料補正を実施中であるか否かを、例えば、下記の条件(A1)〜(A3)のいずれか１つ又は２つ以上によって判定する。
【００６５】
(A1)各気筒の燃料補正量のうちの最大の燃料補正量と最小の燃料補正量との偏差が所定値以上であるか否かで、所定以上の燃料補正を実施中であるか否かを判定する。
(A2)全気筒の燃料補正量の標準偏差が所定値以上であるか否かで、所定以上の燃料補正を実施中であるか否かを判定する。
(A3)燃料補正開始後の経過時間が所定時間以上であるか否かで、所定以上の燃料補正を実施中であるか否かを判定する。
【００６６】
このステップ４０２で、所定以上の燃料補正を実施していないと判定されれば、そのまま本ルーチンを終了する。
一方、上記ステップ４０２で、所定以上の燃料補正を実施中であると判定されれば、ステップ４０３に進み、気筒間の推定空燃比のばらつき度合いが大きいか否かを、例えば、下記の条件(B1)，(B2)のいずれか一方又は両方によって判定する。
【００６７】
(B1)各気筒の推定空燃比のうちの最大の推定空燃比と最小の推定空燃比との偏差が所定値以上であるか否かで、気筒間の推定空燃比のばらつき度合いが大きいか否かを判定する。
(B2)全気筒の推定空燃比の標準偏差が所定値以上であるか否かで、気筒間の推定空燃比のばらつき度合いが大きいか否かを判定する。
【００６８】
このステップ４０３で、気筒間の推定空燃比のばらつき度合いが小さいと判定されれば、空燃比検出タイミングが正しいと判断して、そのまま本ルーチンを終了する。
一方、上記ステップ４０３で、気筒間の推定空燃比のばらつき度合いが大きいと判定されれば、空燃比検出タイミングがずれている可能性があると判断して、ステップ４０４に進む。このステップ４０４で、各気筒の燃料補正量の増減方向と推定空燃比の増減方向とが反対の挙動になっているか否かを、例えば各気筒の燃料補正量の変化率と推定空燃比の変化率との偏差が所定値以上であるか否かによって判定する。
【００６９】
このステップ４０４で、各気筒の燃料補正量の増減方向と推定空燃比の増減方向とが同じ挙動になっていると判定されれば、空燃比検出タイミングが正しいと判断して、そのまま本ルーチンを終了する。
【００７０】
一方、上記ステップ４０４で、各気筒の燃料補正量の増減方向と推定空燃比の増減方向とが反対の挙動になっていると判定されれば、ステップ４０５に進み、空燃比検出タイミングがずれていると判定して、ずれ判定フラグを「１」にセットした後、本ルーチンを終了する。
【００７１】
［空燃比検出タイミングずれ学習補正ルーチン］
図８に示す空燃比検出タイミングずれ学習補正ルーチンは、クランク角センサ３３の出力パルスに同期して所定クランク角毎（例えば３０ＣＡ毎）に起動される。本ルーチンが起動されると、まず、ステップ５０１で、Ｌｏｃａｌ学習完了フラグが「１」にセットされているか否かを判定し、Ｌｏｃａｌ学習完了フラグが「１」にセットされていると判定されれば、ステップ５０２に進み、Ｌｏｃａｌ学習完了後カウンタをカウントアップする。
【００７２】
この後、ステップ５０３に進み、図７の空燃比検出タイミング判定ルーチンにより空燃比検出タイミングがずれていると判定されたか否かを、ずれ判定フラグが「１」にセットされているか否かによって判定する。
【００７３】
このステップ５０３で、空燃比検出タイミングがずれていると判定されていない場合（ずれ判定フラグ＝０の場合）には、ステップ５０４以降の処理を行うことなく、本ルーチンを終了する。
【００７４】
一方、上記ステップ５０３で、空燃比検出タイミングがずれていると判定されている場合（ずれ判定フラグ＝１の場合）には、ステップ５０４に進み、Ｌｏｃａｌ学習完了フラグが「０」であるか又はＬｏｃａｌ学習完了後カウンタのカウント値が所定値Ｔ1 以上であるか否かを判定する。
【００７５】
このステップ５０４で、Ｌｏｃａｌ学習完了フラグが「０」であると判定された場合、又は、Ｌｏｃａｌ学習完了後カウンタのカウント値が所定値Ｔ1 以上であると判定された場合には、ステップ５０５に進む。このステップ５０５で、Ｌｏｃａｌ学習完了後カウンタのカウント値を「０」にリセットすると共に、Ｌｏｃａｌ学習完了フラグを「０」にリセットして、Ｌｏｃａｌ学習実行カウンタをカウントアップする。
【００７６】
この後、ステップ５０６に進み、各気筒の気筒別補正値（燃料補正量）を前回値にホールドした後、ステップ５０７に進み、後述する図９のＬｏｃａｌ学習実行ルーチンを実行して、１サイクル内で空燃比センサ３６の検出値のばらつきが最大となるように空燃比検出タイミングを補正するＬｏｃａｌ学習を実行する。
【００７７】
一方、上記ステップ５０４で、Ｌｏｃａｌ学習完了フラグが「１」であると判定され、且つ、Ｌｏｃａｌ学習完了後カウンタのカウント値が所定値Ｔ1 に達していないと判定された場合には、ステップ５０８に進み、Ｌｏｃａｌ学習完了後カウンタのカウント値が所定値Ｔ2 以上であるか否かを判定する。ここで、所定値Ｔ2 は、所定値Ｔ1 よりも小さい値である（Ｔ2 ＜Ｔ1 ）。
【００７８】
このステップ５０８で、Ｌｏｃａｌ学習完了後カウンタのカウント値が所定値Ｔ2 に達していないと判定された場合には、Ｌｏｃａｌ学習が完了してから気筒別空燃比制御が安定するのに十分な時間が経過していないと判断して、本ルーチンを終了する。
【００７９】
その後、上記ステップ５０８で、Ｌｏｃａｌ学習完了後カウンタのカウント値が所定値Ｔ2 以上であると判定された場合には、Ｌｏｃａｌ学習が完了してから気筒別空燃比制御が安定するのに十分な時間が経過したと判断して、ステップ５０９に進み、Ｇｌｏｂａｌ学習実行カウンタをカウントアップする。
【００８０】
この後、ステップ５１０に進み、後述する図１１のＧｌｏｂａｌ学習実行ルーチンを実行して、各気筒の推定空燃比の変化と気筒別補正値（燃料補正量）の変化との関係に基づいて空燃比検出タイミングを補正するＧｌｏｂａｌ学習を実行する。
【００８１】
［Ｌｏｃａｌ学習実行ルーチン］
図９に示すＬｏｃａｌ学習実行ルーチンは、前記図８の空燃比検出タイミングずれ学習補正ルーチンのステップ５０７で実行されるサブルーチンである。
【００８２】
本ルーチンでは、１サイクル内で空燃比センサ３６の検出値のばらつきが最大となるように空燃比検出タイミングを補正するＬｏｃａｌ学習を実行する。このＬｏｃａｌ学習では、各気筒の空燃比検出タイミング毎に検出された空燃比センサ３６の検出値の分散に相当する値が最大となるように空燃比検出タイミングを補正する。
【００８３】
本ルーチンが起動されると、まず、ステップ６０１で、Ｌｏｃａｌ学習実行カウンタのカウント値が所定値（例えば３０サイクルに相当する値）以下であるか否かを判定する。
このステップ６０１で、Ｌｏｃａｌ学習実行カウンタのカウント値が所定値以下であると判定されれば、ステップ６０２に進み、図１０のＬｏｃａｌ学習指標算出ルーチンを実行して、Ｌｏｃａｌ学習指標を次のようにして算出する。第１気筒＃１の空燃比検出タイミングを下記の各タイミングＬ1 〜Ｌ6 ［ＣＡ］と仮定した場合について、それぞれ各気筒の空燃比検出タイミング毎に検出された空燃比センサ３６の検出値の分散に相当する値（以下「検出空燃比の分散」という）を算出し、この検出空燃比の分散をＬｏｃａｌ学習指標とする。
【００８４】
(1) 第１気筒＃１の空燃比検出タイミングを、第１のタイミングＬ1 ＝Ｄca1 −９０（第１気筒＃１の現在の空燃比検出タイミングＤca1 から９０ＣＡ進角したタイミング）と仮定した場合の検出空燃比の分散Ｖ(Dca1-90) は、次式により算出する。
【００８５】
【数１】
2016041922.tif 000003
【００８６】
ここで、Ｎは一つの空燃比センサ３６当りの気筒数（例えば４）、φ(k) はｋ［ＣＡ］での空燃比センサ３６の検出値である。また、Ｍean φ(k) は｛φ(k) 、φ(k+720/N*1) 、φ(k+720/N*2) 、φ(k+720/N*3) ｝の平均値である。尚、φ(k) は等量比（空気過剰率の逆数）で算出される。
【００８７】
(2) 第１気筒＃１の空燃比検出タイミングを、第２のタイミングＬ2 ＝Ｄca1 −６０（第１気筒＃１の現在の空燃比検出タイミングＤca1 から６０ＣＡ進角したタイミング）と仮定した場合の検出空燃比の分散Ｖ(Dca1-60) は、次式により算出する。
【００８８】
【数２】
2016041922.tif 000004
【００８９】
(3) 第１気筒＃１の空燃比検出タイミングを、第３のタイミングＬ3 ＝Ｄca1 −３０（第１気筒＃１の現在の空燃比検出タイミングＤca1 から３０ＣＡ進角したタイミング）と仮定した場合の検出空燃比の分散Ｖ(Dca1-30) は、次式により算出する。
【００９０】
【数３】
2016041922.tif 000005
【００９１】
(4) 第１気筒＃１の空燃比検出タイミングを、第４のタイミングＬ4 ＝Ｄca1 （第１気筒＃１の現在の空燃比検出タイミングＤca1 と同じタイミング）と仮定した場合の検出空燃比の分散Ｖ(Dca1)は、次式により算出する。
【００９２】
【数４】
2016041922.tif 000006
【００９３】
(5) 第１気筒＃１の空燃比検出タイミングを、第５のタイミングＬ5 ＝Ｄca1 ＋３０（第１気筒＃１の現在の空燃比検出タイミングＤca1 から３０ＣＡ遅角したタイミング）と仮定した場合の検出空燃比の分散Ｖ(Dca1+30) は、次式により算出する。
【００９４】
【数５】
2016041922.tif 000007
(6) 第１気筒＃１の空燃比検出タイミングを、第６のタイミングＬ6 ＝Ｄca1 ＋６０（第１気筒＃１の現在の空燃比検出タイミングＤca1 から６０ＣＡ遅角したタイミング）と仮定した場合の検出空燃比の分散Ｖ(Dca1+60) は、次式により算出する。
【００９５】
【数６】
2016041922.tif 000008
【００９６】
このようにして、第１気筒＃１の空燃比検出タイミングを各タイミングＬ1 〜Ｌ6 と仮定した場合について、それぞれ検出空燃比の分散Ｖ（Ｌｏｃａｌ学習指標）を算出した後、図９のステップ６０３に進む。このステップ６０３で、第１気筒＃１の空燃比検出タイミングを各タイミングＬ1 〜Ｌ6 と仮定した場合について、それぞれ検出空燃比の分散Ｖ（Ｌｏｃａｌ学習指標）を正規化する。
【００９７】
具体的には、第１気筒＃１の空燃比検出タイミングを各タイミングＬ1 〜Ｌ6 と仮定した場合の検出空燃比の分散Ｖ(Dca1-90) ，Ｖ(Dca1-60) ，Ｖ(Dca1-30) ，Ｖ(Dca1)，Ｖ(Dca1+30) ，Ｖ(Dca1+60) に対して、値が大きい方から順に高い得点（例えば５〜０点）を付加する。それらの得点Ｐoint(Dca1-90) ，Ｐoint(Dca1-60) ，Ｐoint(Dca1-30) ，Ｐoint(Dca1)，Ｐoint(Dca1+30) ，Ｐoint(Dca1+60) を、正規化指標（検出空燃比の分散Ｖを正規化したデータ）とする。
【００９８】
Ｖ(Dca1-90) →Ｐoint(Dca1-90)
Ｖ(Dca1-60) →Ｐoint(Dca1-60)
Ｖ(Dca1-30) →Ｐoint(Dca1-30)
Ｖ(Dca1)    →Ｐoint(Dca1)
Ｖ(Dca1+30) →Ｐoint(Dca1+30)
Ｖ(Dca1+60) →Ｐoint(Dca1+60)
【００９９】
この後、ステップ６０４に進み、第１気筒＃１の空燃比検出タイミングを各タイミングＬ1 〜Ｌ6 と仮定した場合について、それぞれ前回までの正規化指標（検出空燃比の分散Ｖを正規化したデータ）の積算値に今回の正規化指標を積算して正規化指標の積算値を更新する。
【０１００】
その後、上記ステップ６０１で、Ｌｏｃａｌ学習実行カウンタのカウント値が所定値を越えたと判定された時点で、正規化指標の所定期間の積算値を算出したと判断して、ステップ６０５に進み、各タイミングＬ1 〜Ｌ6 のうちの正規化指標の所定期間の積算値が最大となるタイミングを最適タイミングとして選択する。
【０１０１】
この後、ステップ６０６に進み、選択した最適タイミング（正規化指標の所定期間の積算値が最大となるタイミング）を第１気筒＃１の空燃比検出タイミングとして学習すると共に、その第１気筒＃１の空燃比検出タイミングを基準にして他の気筒（第２気筒＃２〜第４気筒＃４）の空燃比検出タイミングを学習する。それらの学習値をＥＣＵ３９のバックアップＲＡＭ等の書き換え可能な不揮発性メモリの学習値記憶領域に更新記憶する。
【０１０２】
この後、ステップ６０７に進み、Ｌｏｃａｌ学習実行カウンタのカウント値を「０」にリセットすると共に、ずれ判定フラグを「０」にリセットして、Ｌｏｃａｌ学習完了フラグを「１」にセットする。この後、ステップ６０８に進み、各気筒の気筒別補正値（燃料補正量）を所定値（例えば初期値又はずれ判定前の値）にリセットして、本ルーチンを終了する。
【０１０３】
［Ｇｌｏｂａｌ学習実行ルーチン］
図１１に示すＧｌｏｂａｌ学習実行ルーチンは、前記図８の空燃比検出タイミングずれ学習補正ルーチンのステップ５１０で実行されるサブルーチンである。
【０１０４】
本ルーチンでは、各気筒の推定空燃比の変化と気筒別補正値（燃料補正量）の変化との関係に基づいて空燃比検出タイミングを補正するＧｌｏｂａｌ学習を実行する。このＧｌｏｂａｌ学習では、各気筒の推定空燃比が想定している各気筒番号を仮想的に複数通り変更した場合の各々において各気筒の推定空燃比の変化とその推定空燃比の変更後の気筒番号の気筒別補正値（燃料補正量）の変化との相関値を算出し、その相関値が最大となるように空燃比検出タイミングを補正する。
【０１０５】
本ルーチンが起動されると、まず、ステップ７０１で、Ｇｌｏｂａｌ学習指標算出タイミング（例えば７２０ＣＡ毎）であるか否かを判定し、Ｇｌｏｂａｌ学習指標算出タイミングではないと判定されれば、ステップ７０２以降の処理を行うことなく、本ルーチンを終了する。
【０１０６】
一方、上記ステップ７０１で、Ｇｌｏｂａｌ学習指標算出タイミングであると判定されれば、ステップ７０２に進み、Ｇｌｏｂａｌ学習実行カウンタのカウント値が所定値（例えば３０サイクルに相当する値）以下であるか否かを判定する。
【０１０７】
このステップ７０２で、Ｇｌｏｂａｌ学習実行カウンタのカウント値が所定値以下であると判定されれば、ステップ７０３に進み、図１２のＧｌｏｂａｌ学習指標算出ルーチンを実行して、Ｇｌｏｂａｌ学習指標を次のようにして算出する。第１気筒＃１の空燃比検出タイミングを下記の各タイミングＧ1 〜Ｇ4 ［ＣＡ］と仮定した場合について、それぞれ各気筒の推定空燃比の変化と燃料補正量の変化との相関値を算出し、この相関値をＧｌｏｂａｌ学習指標とする。
【０１０８】
具体的には、ステップ７１１で、現在の空燃比検出タイミングでの各気筒の推定空燃比の変化量Δφと各気筒の燃料補正量の変化量ΔＣmpを次式により算出する。
Δφ＾#i(t) ＝φ＾#i(t) −φ＾#i(t-n)
ΔＣmp#i(t) ＝Ｃmp#i(t) −Ｃmp#i(t-n)
【０１０９】
ここで、φ＾#i(t) は第ｉ気筒＃ｉの推定空燃比の今回の算出値であり、φ＾#i(t-n) は第ｉ気筒＃ｉの推定空燃比のｎ回前の算出値である。また、Ｃmp#i(t) は第ｉ気筒＃ｉの燃料補正量の今回の算出値であり、Ｃmp#i(t-n) は第ｉ気筒＃ｉの燃料補正量のｎ回前の算出値である。尚、ｎは１以上の所定整数値である。
【０１１０】
この後、ステップ７１２に進み、第１気筒＃１の空燃比検出タイミングを下記の各タイミングＧ1 〜Ｇ4 ［ＣＡ］と仮定した場合について、それぞれ各気筒の推定空燃比の変化と燃料補正量の変化との相関値（推定空燃比の変化量Δφと燃料補正量の変化量ΔＣmpとの積の和）を算出する。
【０１１１】
(1) 第１気筒＃１の空燃比検出タイミングを、第１のタイミングＧ1 ＝Ｄca1 （第１気筒＃１の現在の空燃比検出タイミングＤca1 と同じタイミング）と仮定した場合には、図１３（ａ）に示すように、現在の空燃比検出タイミングでの第１気筒＃１の推定空燃比φ＾#1が第１気筒＃１の推定空燃比として算出される。また、現在の空燃比検出タイミングでの第３気筒＃３の推定空燃比φ＾#3が第３気筒＃３の推定空燃比として算出され、現在の空燃比検出タイミングでの第４気筒＃４の推定空燃比φ＾#4が第４気筒＃４の推定空燃比として算出され、現在の空燃比検出タイミングでの第２気筒＃２の推定空燃比φ＾#2が第２気筒＃２の推定空燃比として算出される。
【０１１２】
従って、第１気筒＃１の空燃比検出タイミングを第１のタイミングＧ1 ＝Ｄca1 と仮定した場合の相関値Ｃor(Dca1)は、次式により算出することができる。
Ｃor(Dca1)＝Δφ＾#1(t) ×ΔＣmp#1(t) ＋Δφ＾#3(t) ×ΔＣmp#3(t)
＋Δφ＾#4(t) ×ΔＣmp#4(t) ＋Δφ＾#2(t) ×ΔＣmp#2(t)
【０１１３】
(2) 第１気筒＃１の空燃比検出タイミングを、第２のタイミングＧ2 ＝Ｄca1 ＋１８０（第１気筒＃１の現在の空燃比検出タイミングＤca1 から１８０ＣＡ遅角したタイミング）と仮定した場合には、図１３（ｂ）に示すように、現在の空燃比検出タイミングでの第１気筒＃１の推定空燃比φ＾#1が第２気筒＃２の推定空燃比として算出される。また、現在の空燃比検出タイミングでの第３気筒＃３の推定空燃比φ＾#3が第１気筒＃１の推定空燃比として算出され、現在の空燃比検出タイミングでの第４気筒＃４の推定空燃比φ＾#4が第３気筒＃３の推定空燃比として算出され、現在の空燃比検出タイミングでの第２気筒＃２の推定空燃比φ＾#2が第４気筒＃４の推定空燃比として算出される。
【０１１４】
従って、第１気筒＃１の空燃比検出タイミングを第２のタイミングＧ2 ＝Ｄca1 ＋１８０と仮定した場合の相関値Ｃor(Dca1+180)は、次式により算出することができる。
Ｃor(Dca1+180)＝Δφ＾#3(t) ×ΔＣmp#1(t) ＋Δφ＾#4(t) ×ΔＣmp#3(t)
＋Δφ＾#2(t) ×ΔＣmp#4(t) ＋Δφ＾#1(t) ×ΔＣmp#2(t)
【０１１５】
(3) 第１気筒＃１の空燃比検出タイミングを、第３のタイミングＧ3 ＝Ｄca1 ＋３６０（第１気筒＃１の現在の空燃比検出タイミングＤca1 から３６０ＣＡ遅角したタイミング）と仮定した場合には、図１３（ｃ）に示すように、現在の空燃比検出タイミングでの第１気筒＃１の推定空燃比φ＾#1が第４気筒＃４の推定空燃比として算出される。また、現在の空燃比検出タイミングでの第３気筒＃３の推定空燃比φ＾#3が第２気筒＃２の推定空燃比として算出され、現在の空燃比検出タイミングでの第４気筒＃４の推定空燃比φ＾#4が第１気筒＃１の推定空燃比として算出され、現在の空燃比検出タイミングでの第２気筒＃２の推定空燃比φ＾#2が第３気筒＃３の推定空燃比として算出される。
【０１１６】
従って、第１気筒＃１の空燃比検出タイミングを第３のタイミングＧ3 ＝Ｄca1 ＋３６０と仮定した場合の相関値Ｃor(Dca1+360)は、次式により算出することができる。
Ｃor(Dca1+360)＝Δφ＾#4(t) ×ΔＣmp#1(t) ＋Δφ＾#2(t) ×ΔＣmp#3(t)
＋Δφ＾#1(t) ×ΔＣmp#4(t) ＋Δφ＾#3(t) ×ΔＣmp#2(t)
【０１１７】
(4) 第１気筒＃１の空燃比検出タイミングを、第４のタイミングＧ4 ＝Ｄca1 ＋５４０（第１気筒＃１の現在の空燃比検出タイミングＤca1 から５４０ＣＡ遅角したタイミング）と仮定した場合には、図１３（ｄ）に示すように、現在の空燃比検出タイミングでの第１気筒＃１の推定空燃比φ＾#1が第３気筒＃３の推定空燃比として算出される。また、現在の空燃比検出タイミングでの第３気筒＃３の推定空燃比φ＾#3が第４気筒＃４の推定空燃比として算出され、現在の空燃比検出タイミングでの第４気筒＃４の推定空燃比φ＾#4が第２気筒＃２の推定空燃比として算出され、現在の空燃比検出タイミングでの第２気筒＃２の推定空燃比φ＾#2が第１気筒＃１の推定空燃比として算出される。
【０１１８】
従って、第１気筒＃１の空燃比検出タイミングを第４のタイミングＧ4 ＝Ｄca1 ＋５４０と仮定した場合の相関値Ｃor(Dca1+540)は、次式により算出することができる。
Ｃor(Dca1+540)＝Δφ＾#2(t) ×ΔＣmp#1(t) ＋Δφ＾#1(t) ×ΔＣmp#3(t)
＋Δφ＾#3(t) ×ΔＣmp#4(t) ＋Δφ＾#4(t) ×ΔＣmp#2(t)
【０１１９】
このようにして、第１気筒＃１の空燃比検出タイミングを各タイミングＧ1 〜Ｇ4 と仮定した場合について、それぞれ各気筒の推定空燃比の変化と燃料補正量の変化との相関値Ｃor（Ｇｌｏｂａｌ学習指標）を算出した後、図１１のステップ７０４に進む。このステップ７０４で、第１気筒＃１の空燃比検出タイミングを各タイミングＧ1 〜Ｇ4 と仮定した場合について、それぞれ前回までの相関値Ｃorの積算値に今回の相関値Ｃorを積算して相関値Ｃorの積算値を更新する。この際、相関値Ｃorのうちのプラス値のみを積算するようにしたり、或は、相関値Ｃorのうちのマイナス値のみを積算するようにしても良い。
【０１２０】
その後、上記ステップ７０２で、Ｇｌｏｂａｌ学習実行カウンタのカウント値が所定値を越えたと判定された時点で、相関値Ｃorの所定期間の積算値を算出したと判断して、ステップ７０５に進み、各タイミングＧ1 〜Ｇ4 のうちの相関値Ｃorの所定期間の積算値が最大となるタイミングを最適タイミングとして選択する。
【０１２１】
この後、ステップ７０６に進み、選択した最適タイミング（相関値Ｃorの所定期間の積算値が最大となるタイミング）を第１気筒＃１の空燃比検出タイミングとして学習すると共に、その第１気筒＃１の空燃比検出タイミングを基準にして他の気筒（第２気筒＃２〜第４気筒＃４）の空燃比検出タイミングを学習する。それらの学習値をＥＣＵ３９のバックアップＲＡＭ等の書き換え可能な不揮発性メモリの学習値記憶領域に更新記憶する。
【０１２２】
この後、ステップ７０７に進み、Ｇｌｏｂａｌ学習実行カウンタのカウント値を「０」にリセットすると共に、ずれ判定フラグを「０」にリセットし、更に、Ｌｏｃａｌ学習完了フラグを「０」にリセットすると共に、Ｌｏｃａｌ学習完了後カウンタのカウント値を「０」にリセットして、本ルーチンを終了する。
【０１２３】
これらの図７乃至図１２のルーチンが特許請求の範囲でいう検出タイミング補正手段としての役割を果たす。
尚、Ｌｏｃａｌ学習が完了してからＧｌｏｂａｌ学習が完了するまでの期間、気筒別空燃比制御のＦ／Ｂゲインを大きくするようにしても良い。この場合、特定の気筒のＦ／Ｂゲインのみを大きくするようにして良いし、各気筒毎に異なるＦ／Ｂゲインを設定するようにしても良い。
【０１２４】
また、Ｌｏｃａｌ学習の実行後（つまりＬｏｃａｌ学習により空燃比検出タイミングが補正された後）、空燃比検出タイミングがずれていると判定される毎に該空燃比検出タイミングをエンジン１１の燃焼間隔（４気筒の場合には１８０ＣＡ）又はその複数倍ずつ補正するＧｌｏｂａｌ学習を実行することで、各気筒の空燃比検出タイミングを他の気筒の空燃比検出タイミングと入れ替えて、各気筒の空燃比検出タイミングを正しい空燃比検出タイミングに補正するようにしても良い。
【０１２５】
以上説明した本実施例１では、エンジン１１の失火有りと判定されたときに、気筒別空燃比推定と気筒別空燃比制御を停止するようにしたので、失火により各気筒の空燃比を正しく制御できない状態で気筒別空燃比制御が通常通りに継続されることを回避して排気エミッションの悪化を抑制することができる。
【０１２６】
また、本実施例１では、エンジン１１の失火有りと判定されたときに、気筒別空燃比推定と気筒別空燃比制御を停止すると共に、気筒別空燃比制御による気筒別補正値（燃料補正量）をリセットするようにしている。これにより、気筒別空燃比制御を再開する際に、気筒別補正値をリセットした状態（つまり失火の影響を排除した状態）で気筒別空燃比制御を開始することができる。
【０１２７】
尚、上記実施例１では、エンジン１１の失火有りと判定されたときに、気筒別空燃比推定と気筒別空燃比制御を両方とも停止するようにしたが、これに限定されず、気筒別空燃比推定と気筒別空燃比制御のうちの一方のみを停止するようにしても良い。
【０１２８】
気筒別空燃比推定を停止（各気筒の推定空燃比の算出を停止）することで、気筒別空燃比制御による各気筒の気筒別補正値の更新を停止することができるため、気筒別空燃比推定のみを停止しても、気筒別空燃比制御を停止（各気筒の気筒別補正値の算出を停止）するのとほぼ同様の状態にできる。従って、気筒別空燃比推定と気筒別空燃比制御のうちの一方のみを停止しても、失火により各気筒の空燃比を正しく制御できない状態で気筒別空燃比制御が通常通りに継続されることを回避して排気エミッションの悪化を抑制することができる。
【実施例２】
【０１２９】
次に、図１４乃至図１７を用いて本発明の実施例２を説明する。但し、前記実施例１と実質的に同一部分については説明を省略又は簡略化し、主として前記実施例１と異なる部分について説明する。
【０１３０】
エンジン１１が急加速した後に急減速すると、排気流速が大きく低下して、排気の流れが停滞することがある。気筒別空燃比制御中に、空燃比センサ３６付近の排気の流れが停滞すると、その影響で空燃比センサ３６出力の振幅が小さくなってしまい、各気筒の空燃比検出タイミング毎の空燃比センサ３６出力を正しく読み込むことが困難になることがある。このような場合、推定気筒間違え（各気筒と推定空燃比との対応関係の間違え）が発生して、各気筒の空燃比を正しく制御することができず、排気エミッションの悪化を招く可能性がある。このような状態で、空燃比検出タイミング補正を行うと、各気筒の空燃比の推定精度が更に悪化する可能性もある。
【０１３１】
この対策として、本実施例２では、ＥＣＵ３９により後述する図１４及び図１５の各ルーチンを実行することで、エンジン１１の排気の流れが停滞した状態（以下「排気流停滞状態」という）か否かを判定し、排気流停滞状態と判定されたときに、気筒別空燃比推定と気筒別空燃比制御と空燃比検出タイミング補正を停止するようにしている。
【０１３２】
その際、本実施例２では、エンジン１１の急加速後の急減速時に排気流停滞状態と判定するようにしている。エンジン１１が急加速した後に急減速すると、排気流速が大きく低下して、排気の流れが停滞するため、急加速後の急減速時には排気流停滞状態（排気流速が大きく低下した状態）と判定することができる。
以下、本実施例２でＥＣＵ３９が実行する図１４及び図１５の各ルーチンの処理内容を説明する。
【０１３３】
［急加減速判定ルーチン］
図１４に示す急加減速判定ルーチンは、クランク角センサ３３の出力パルスに同期して所定クランク角毎（例えば３０ＣＡ毎）に起動され、特許請求の範囲でいう排気流判定手段としての役割を果たす。
【０１３４】
本ルーチンが起動されると、まず、ステップ８０１で、所定タイミング毎（例えばＴＤＣ毎）にエアフローメータ１４や吸気管圧力センサ１８の出力信号に基づいて吸入空気量ＧＮ［ｇ／ｒｅｖ］及び吸入空気量ＧＡ［ｇ／ｓ］を算出する。
【０１３５】
この後、ステップ８０２に進み、今回の吸入空気量ＧＮ(i) と前回の吸入空気量ＧＮ(i-1) との差を算出することで吸入空気量ＧＮの所定期間（例えばＴＤＣ間）の変化量ｄＧＮを求め、今回の吸入空気量ＧＡ(i) と前回の吸入空気量ＧＡ(i-1) との差を算出することで吸入空気量ＧＡの所定期間（例えばＴＤＣ間）の変化量ｄＧＡを求める。
ｄＧＮ＝ＧＮ(i) −ＧＮ(i-1)
ｄＧＡ＝ＧＡ(i) −ＧＡ(i-1)
【０１３６】
この後、ステップ８０３に進み、急加速後の急減速時フラグが「１」にセットされているか否かを判定する。この急加速後の急減速時フラグは、後述するステップ８０８で、急加速後の急減速時であると判定されたときに「１」にセットされる。
【０１３７】
このステップ８０３で、急加速後の急減速時フラグ＝０と判定された場合には、ステップ８０４に進み、急加速時フラグが「１」にセットされているか否かを判定する。この急加速時フラグは、後述するステップ８０６で、急加速時であると判定されたときに「１」にセットされる。
【０１３８】
このステップ８０４で、急加速時フラグ＝０と判定された場合には、ステップ８０５に進み、変化量ｄＧＮが所定の増加判定値ＫＮ1 （＞０）よりも大きく且つ変化量ｄＧＡが所定の増加判定値ＫＡ1 （＞０）よりも大きい（ｄＧＮ＞ＫＮ1 且つｄＧＡ＞ＫＡ1 ）か否かを判定する。
【０１３９】
このステップ８０５で、ｄＧＮ≦ＫＮ1 又はｄＧＡ≦ＫＡ1 と判定された場合には、急加速時ではないと判断して、急加速時フラグを「０」に維持したまま、本ルーチンを終了する。
【０１４０】
その後、上記ステップ８０５で、ｄＧＮ＞ＫＮ1 且つｄＧＡ＞ＫＡ1 と判定された場合には、ステップ８０６に進み、急加速時であると判定して、急加速時フラグを「１」にセットした後、本ルーチンを終了する。
【０１４１】
この後、上記ステップ８０４で、急加速時フラグ＝１と判定された場合には、ステップ８０７に進み、変化量ｄＧＮが所定の減少判定値ＫＮ2 （＜０）よりも小さく且つ変化量ｄＧＡが所定の減少判定値ＫＡ2 （＜０）よりも小さい（ｄＧＮ＜ＫＮ2 且つｄＧＡ＜ＫＡ2 ）か否かを判定する。
【０１４２】
このステップ８０７で、ｄＧＮ≧ＫＮ2 又はｄＧＡ≧ＫＡ2 と判定された場合には、急加速後の急減速時ではないと判断して、急加速後の急減速時フラグを「０」に維持したまま、本ルーチンを終了する。
【０１４３】
その後、上記ステップ８０７で、ｄＧＮ＜ＫＮ2 且つｄＧＡ＜ＫＡ2 と判定された場合には、ステップ８０８に進み、急加速後の急減速時（つまり排気流停滞状態）であると判定して、急加速後の急減速時フラグを「１」にセットすると共に、急加速時フラグを「０」にリセットした後、本ルーチンを終了する。
【０１４４】
この後、上記ステップ８０３で、急加速後の急減速時フラグ＝１と判定された場合には、ステップ８０９に進み、急加速後の急減速時（急加速後の急減速時フラグ＝１）と判定してから所定時間が経過したか否かを判定する。
【０１４５】
このステップ８０９で、急加速後の急減速時（急加速後の急減速時フラグ＝１）と判定してから所定時間が経過していないと判定された場合には、ステップ８１０に進み、変化量ｄＧＮが所定値ＫＮ3 （＞０）よりも大きく且つ変化量ｄＧＡが所定値ＫＡ3 （＞０）よりも大きい（ｄＧＮ＞ＫＮ3 且つｄＧＡ＞ＫＡ3 ）か否かを判定する。ここで、所定値ＫＮ3 ，ＫＡ3 は、予め設定した固定値としても良いが、急加速後の急減速時と判定してからの経過時間に応じて設定するようにしても良い。
このステップ８１０で、ｄＧＮ≦ＫＮ3 又はｄＧＡ≦ＫＡ3 と判定された場合には、急加速後の急減速時フラグを「１」に維持したまま、本ルーチンを終了する。
【０１４６】
その後、上記ステップ８０９で急加速後の急減速時（急加速後の急減速時フラグ＝１）と判定してから所定時間が経過したと判定された場合、又は、上記ステップ８１０でｄＧＮ＞ＫＮ3 且つｄＧＡ＞ＫＡ3 と判定された場合には、ステップ８１１に進み、急加速後の急減速時（つまり排気流停滞状態）ではないと判定して、急加速後の急減速時フラグを「０」にリセットした後、本ルーチンを終了する。
【０１４７】
尚、図１４のルーチンでは、ステップ８０５，８０７，８１０で、変化量ｄＧＮと変化量ｄＧＡを両方とも用いるようにしたが、これに限定されず、変化量ｄＧＮと変化量ｄＧＡのうちの一方のみを用いるようにしても良い。
【０１４８】
具体的には、ステップ８０５で、ｄＧＮ＞ＫＮ1 か否かを判定し、ｄＧＮ＞ＫＮ1 と判定された場合に、ステップ８０６に進むようにしても良い。或は、ステップ８０５で、ｄＧＡ＞ＫＡ1 か否かを判定し、ｄＧＡ＞ＫＡ1 と判定された場合に、ステップ８０６に進むようにしても良い。
【０１４９】
また、ステップ８０７で、ｄＧＮ＜ＫＮ2 か否かを判定し、ｄＧＮ＜ＫＮ2 と判定された場合に、ステップ８０８に進むようにしても良い。或は、ステップ８０７で、ｄＧＡ＜ＫＡ2 か否かを判定し、ｄＧＡ＜ＫＡ2 と判定された場合に、ステップ８０８に進むようにしても良い。
【０１５０】
また、ステップ８１０で、ｄＧＮ＞ＫＮ3 か否かを判定し、ｄＧＮ＞ＫＮ3 と判定された場合に、ステップ８１１に進むようにしても良い。或は、ステップ８１０で、ｄＧＡ＞ＫＡ3 か否かを判定し、ｄＧＡ＞ＫＡ3 と判定された場合に、ステップ８１１に進むようにしても良い。
【０１５１】
［実行条件判定ルーチン］
本実施例２で実行する図１５の実行条件判定ルーチンは、前記実施例１で説明した図５のルーチンのステップ２０１の処理をステップ２０１ａの処理に変更すると共に、図５のルーチンのステップ２０５の処理を省略したものであり、それ以外の各ステップの処理は図５と同じである。
【０１５２】
図１５の実行条件判定ルーチンでは、まず、ステップ２０１ａで、急加速後の急減速時フラグ＝０であるか否かを判定する。このステップ２０１ａで、急加速後の急減速時フラグ＝０と判定された場合には、ステップ２０２に進み、空燃比センサ３６が使用可能であるか否かを判定し、空燃比センサ３６が使用可能であると判定された場合には、ステップ２０３に進み、エンジン運転状態が所定領域内であるか否かを判定する。
【０１５３】
上記ステップ２０１ａ〜２０３で全て「Ｙｅｓ」と判定された場合（つまり上記ステップ２０１ａ〜２０３の条件を全て満たした場合）には、ステップ２０４に進み、気筒別空燃比制御の実行条件が成立していると判定して、実行条件フラグを「１」にセットした後、本ルーチンを終了する。
【０１５４】
これに対して、上記ステップ２０１ａで、急加速後の急減速時フラグ＝１（急加速後の急減速時である）と判定された場合には、ステップ２０６に進み、気筒別空燃比制御の実行条件が不成立であると判定して、実行条件フラグを「０」にリセットした後、本ルーチンを終了する。これらの処理により、エンジン１１の急加速後の急減速時（つまり排気流停滞状態）と判定されたときに、気筒別空燃比制御の実行条件を不成立（実行条件フラグ＝０）にして、気筒別空燃比推定と気筒別空燃比制御を停止すると共に、気筒別空燃比制御の停止に伴って空燃比検出タイミング補正が停止される。従って、本実施例２では、図１５のルーチン等が特許請求の範囲でいう停止手段としての役割を果たす。
【０１５５】
以上説明した本実施例２の制御の実行例を図１６及び図１７のタイムチャートを用いて説明する。
図１６及び図１７に示すように、所定タイミング毎（例えばＴＤＣ毎）に吸入空気量ＧＮの変化量ｄＧＮ及び吸入空気量ＧＡの変化量ｄＧＡを算出する。
【０１５６】
そして、変化量ｄＧＮが増加判定値ＫＮ1 よりも大きく且つ変化量ｄＧＡが増加判定値ＫＡ1 よりも大きい（ｄＧＮ＞ＫＮ1 且つｄＧＡ＞ＫＡ1 ）と判定された時点ｔ1 で、急加速時であると判定して、急加速時フラグを「１」にセットする（図示せず）。
【０１５７】
この後、変化量ｄＧＮが減少判定値ＫＮ2 よりも小さく且つ変化量ｄＧＡが減少判定値ＫＡ2 よりも小さい（ｄＧＮ＜ＫＮ2 且つｄＧＡ＜ＫＡ2 ）と判定された時点ｔ2 で、急加速後の急減速時（つまり排気流停滞状態）であると判定して、急加速後の急減速時フラグを「１」にセットする。これにより、気筒別空燃比制御の実行条件が不成立であると判定して、実行条件フラグを「０」にリセットすることで、気筒別空燃比推定と気筒別空燃比制御と空燃比検出タイミング補正を停止する。
【０１５８】
この後、図１６に示すように、急加速後の急減速時（急加速後の急減速時フラグ＝１）と判定してから所定時間が経過した時点ｔ3 で、急加速後の急減速時（つまり排気流停滞状態）ではないと判定して、急加速後の急減速時フラグを「０」にリセットする。或は、図１７に示すように、変化量ｄＧＮが所定値ＫＮ3 よりも大きく且つ変化量ｄＧＡが所定値ＫＡ3 よりも大きい（ｄＧＮ＞ＫＮ3 且つｄＧＡ＞ＫＡ3 ）とされた時点ｔ3 で、急加速後の急減速時ではないと判定して、急加速後の急減速時フラグを「０」にリセットする。これにより、気筒別空燃比制御の実行条件が成立していると判定して、実行条件フラグを「１」にセットすることで、気筒別空燃比推定と気筒別空燃比制御と空燃比検出タイミング補正を再開する。
【０１５９】
以上説明した本実施例２では、エンジン１１の急加速後の急減速時か否かによって排気流停滞状態であるか否かを判定し、急加速後の急減速時（排気流停滞状態）と判定されたときに、気筒別空燃比推定と気筒別空燃比制御と空燃比検出タイミング補正を停止するようにしている。これにより、排気の流れの停滞により各気筒の空燃比を正しく制御できない状態で気筒別空燃比制御が通常通りに継続されることを回避して排気エミッションの悪化を抑制することができる。
【０１６０】
また、本実施例２では、吸入空気量の変化量が所定の増加判定値よりも大きい状態から所定の減少判定値よりも小さい状態に変化したときに、急加速後の急減速時（排気流停滞状態）と判定するようにしている。これにより、センサで検出可能な吸入空気量に基づいて急加速後の急減速時（排気流速低下状態）を精度良く判定することができる。
【０１６１】
更に、本実施例２では、急加速後の急減速時（排気流停滞状態）と判定してから所定時間が経過したとき又は吸入空気量の変化量が所定値よりも大きくなったときに、急加速後の急減速時（排気流停滞状態）ではないと判定するようにしている。このようにすれば、急加速後の急減速時（排気流速低下状態）と判定してから所定時間が経過するか又は吸入空気量の変化量が所定値よりも大きくなって、排気の流れの停滞が解消されて、空燃比センサ３６出力の振幅がある程度大きくなってから気筒別空燃比制御を再開することができる。
【０１６２】
尚、上記実施例２では、急加速後の急減速時（排気流停滞状態）と判定されたときに、気筒別空燃比推定と気筒別空燃比制御と空燃比検出タイミング補正を全て停止するようにしたが、これに限定されず、気筒別空燃比推定と気筒別空燃比制御と空燃比検出タイミング補正のうちの一つ又は二つを停止するようにしても良い。
【０１６３】
前述したように、気筒別空燃比推定を停止（各気筒の推定空燃比の算出を停止）することで、気筒別空燃比制御による各気筒の気筒別補正値の更新を停止することができるため、気筒別空燃比推定のみを停止しても、気筒別空燃比制御を停止（各気筒の気筒別補正値の算出を停止）するのとほぼ同様の状態にできる。また、空燃比検出タイミング補正のみを停止しても、各気筒の空燃比の推定精度の悪化を抑制して、気筒別空燃比制御の制御精度の悪化を抑制することができる。
【０１６４】
また、上記実施例２では、吸入空気量に基づいて急加速後の急減速時（排気流速低下状態）か否かを判定するようにしたが、これに限定されず、例えば、エンジン回転速度、アクセル開度、スロットル開度、吸気圧等に基づいて、急加速後の急減速時か否かを判定するようにしても良い。
【０１６５】
また、上記実施例２では、図１４のルーチンで、急加速後の急減速時と判定してから所定時間が経過したか否かを判定する処理（ステップ８０９）と、吸入空気量の変化量が所定値よりも大きくなったか否かを判定する処理（ステップ８１０）を両方とも行うようにしたが、いずれか一方の処理を省略するようにしても良い。
【０１６６】
また、上記実施例２では、急加速後の急減速時と判定されたときに、気筒別空燃比推定と気筒別空燃比制御と空燃比検出タイミング補正を停止するようにしたが、これに限定されず、急加速後の急減速時以外でも、排気流停滞状態と判定されたときに、気筒別空燃比推定や気筒別空燃比制御や空燃比検出タイミング補正を停止するようにしても良い。
【０１６７】
また、空燃比検出タイミングのずれ有りと判定されたときに、空燃比検出タイミングを補正する方法は、上記各実施例１，２で説明した方法に限定されず、適宜変更しても良い。
また、上記各実施例１，２では、本発明を４気筒エンジンに適用したが、これに限定されず、２気筒エンジンや３気筒エンジン或は５気筒以上のエンジンに本発明を適用しても良い。
【０１６８】
その他、本発明は、吸気ポート噴射式エンジンに限定されず、筒内噴射式エンジンや、吸気ポート噴射用の燃料噴射弁と筒内噴射用の燃料噴射弁の両方を備えたデュアル噴射式のエンジンにも適用して実施できる。
【符号の説明】
【０１６９】
１１…エンジン（内燃機関）、１２…吸気管、３４…排気管、３４ａ…排気集合部、３６…空燃比センサ、３９…ＥＣＵ（気筒別空燃比推定手段，気筒別空燃比制御手段，検出タイミング補正手段，失火判定手段，停止手段，排気流判定手段）
【図１】
2016041922.tif 000009
【図２】
2016041922.tif 000010
【図３】
2016041922.tif 000011
【図４】
2016041922.tif 000012
【図５】
2016041922.tif 000013
【図６】
2016041922.tif 000014
【図７】
2016041922.tif 000015
【図８】
2016041922.tif 000016
【図９】
2016041922.tif 000017
【図１０】
2016041922.tif 000018
【図１１】
2016041922.tif 000019
【図１２】
2016041922.tif 000020
【図１３】
2016041922.tif 000021
【図１４】
2016041922.tif 000022
【図１５】
2016041922.tif 000023
【図１６】
2016041922.tif 000024
【図１７】
2016041922.tif 000025