(57)【特許請求の範囲】
【請求項１】
所定クランク角毎のエンジン回転状態量を検出するエンジン回転状態量検出手段と、
現在の燃焼行程気筒を判別する気筒判別手段と、
前回検出したエンジン回転状態量から今回検出したエンジン回転状態量を減算して上記燃焼行程気筒に対する回転状態量の差を算出する差回転状態量算出手段と、
所定期間における各気筒毎の上記差回転状態量を平均処理し各気筒毎の差回転状態量平均値を算出する差回転状態量平均値算出手段と、
上記各差回転状態量平均値のうちの最大値と各気筒毎の差回転状態量平均値との差をそれぞれ算出して、この最大値に対する各気筒毎の平均値差を失火判定レベルと比較し、該失火判定レベルよりも平均値差が大きい気筒を失火気筒と判別する第１の失火判別手段と、
空燃比センサの出力値に基づき失火を判別する第２の失火判別手段と、
空燃比センサの出力値に基づき失火を判別したとき、上記失火気筒の毎回失火と確定し、当該気筒の毎回失火と診断する失火診断手段とを備えたことを特徴とするエンジンの失火診断装置。
【請求項２】
上記各失火判別手段は、エンジン運転状態が燃料増量領域にあるとき、失火判別を行うことを特徴とする請求項１記載のエンジンの失火診断装置。
【請求項３】
所定周期毎に上記空燃比センサの出力電圧及び該出力電圧の変化量の絶対値を各々積算する積算手段を備え、上記第２の失火判別手段は、エンジン運転状態が燃料増量領域にあるとき、所定期間における空燃比センサ出力電圧平均値を算出し、該空燃比センサ出力電圧平均値が第１の判定値に達していないとき、或いは、所定期間における上記空燃比センサ出力電圧変化量の絶対値積算値が第２の判定値よりも大きいとき、失火と判別することを特徴とする請求項１記載のエンジンの失火診断装置。
【請求項４】
上記各平均値は、所定期間における単純平均によって算出することを特徴とする請求項１ないし請求項３の何れか１項に記載のエンジンの失火診断装置。
【請求項５】
上記所定期間は、点火回数が所定回数に達する毎の期間であることを特徴とする請求項１ないし請求項４の何れか１項に記載のエンジンの失火診断装置。
【請求項６】
上記エンジン回転状態量は、エンジン回転速度であることを特徴とする請求項１ないし請求項５の何れか1項に記載のエンジンの失火診断装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、所定クランク角毎のエンジン回転状態量の変化と空燃比センサの出力値とに基づいて失火を診断するエンジンの失火診断装置に関する。
【０００２】
【従来の技術】
従来から、エンジンの失火診断装置としては、所定クランク角毎のエンジン回転状態量の変化に基づいてエンジンの失火を診断するエンジンの失火診断装置が採用されている。
【０００３】
すなわち、燃焼行程中の気筒の筒内圧（燃焼圧）と、その燃焼行程と次の燃焼行程間のエンジン回転には強い相関があり、従って、所定クランク角毎のエンジン回転状態量の変化によって各気筒毎の失火を判断することができる。
【０００４】
しかし、エンジン回転状態量を得る際の基となるクランク角を検出するためのクランクロータやクランク角センサには、製造許容誤差、取付許容誤差等が存在するため、検出されるエンジン回転状態量にばらつきが生じ、特にエンジン高回転域では、この影響が大きくなり、正確に失火を検出することが困難となる。
【０００５】
これに対処するに、本出願人は、特開平６−４２３９７号公報による技術を提案した。
【０００６】
この先行例においては、エンジン回転状態量としてエンジン回転速度（エンジン回転数）を用い、気筒間における所定クランク角毎のエンジン回転速度の差、即ち差回転ＤＥＬＮＥを算出し、現在の燃焼行程気筒＃ｎの差回転ＤＥＬＮＥｎから加重平均による統計処理によって１サイクル（７２０°ＣＡ）前に算出した当該気筒＃ｎに対する差回転補正値ＡＶＥＤＮＸを減算して、当該気筒に対する補正差回転ＤＥＬＮＡｎを算出することで、クランク角を検出するためのクランクロータやクランク角センサの製造許容誤差、取付許容誤差等の影響を排除する。さらに、この補正差回転ＤＥＬＮＡｎから１燃焼行程前の失火診断対象気筒＃ｎ-1の補正差回転ＤＥＬＮＡn-1を減算して当該気筒＃ｎに対する補正差回転変化ＤＤＮＥＡｎを算出し、この補正差回転変化ＤＤＮＥＡｎをエンジン運転状態に基づいて設定した失火判定レベルＬＶＬＭＩＳと比較すると共に、前回ルーチン実行時に算出した１燃焼行程前の失火診断対象気筒＃ｎ-1に対する補正差回転変化ＤＤＮＥＡｎ-1をマイナスの失火判定レベル−ＬＶＬＭＩＳと比較する。そして、現在の燃焼行程気筒＃ｎの補正差回転変化ＤＤＮＥＡｎが失火判定レベルＬＶＬＭＩＳ以上で、且つ失火診断対象気筒＃ｎ-1の補正差回転変化ＤＤＮＥＡｎ-1がマイナス失火判定レベル以下のとき、失火診断対象気筒＃ｎ-1の失火と判断する。
【０００７】
しかしながら、クランクロータやクランク角センサの製造許容誤差、取付許容誤差等に起因するエンジン回転状態量（エンジン回転速度）のばらつきの他に、各気筒毎に燃焼圧のばらつきに起因するエンジン回転状態量のばらつきがある。
【０００８】
すなわち、吸入管形状の複雑化や気筒間の吸気干渉等による各気筒毎の吸気分配率の相違、冷却水による冷却順路によって生じる各気筒毎の燃焼温度の相違、各気筒の燃焼室容積やピストン形状の製造上のばらつき、インジェクタの製造誤差等による燃料噴射量の違いから生じる各気筒の空燃比の僅かなばらつき、これらの原因によって、各気筒毎に燃焼圧のばらつきが生じ、各気筒毎にエンジン回転のばらつきが生じる。そして、エンジン高回転域では慣性エネルギが大きいため失火時のエンジン回転変化量が小さく、失火判定が困難となる。
【０００９】
従って、判定値としての失火判定レベルを厳密に設定すると、上記要因によって実際には失火していないにも係わらず、失火と誤判定することがあった。また、これに対処するに、判定値としての上記失火判定レベルを緩く設定すると、失火時において失火を検出することができなくなってしまう。
【００１０】
このため、特開平４−３１８２５６号公報においては、エンジン低回転域のときには、エンジン回転速度に基づいて失火診断を行う一方、エンジンに失火が発生した場合に排気ガス中の酸素濃度が増大することに着目し、少なくともエンジン高回転域においては、排気ガス中の酸素濃度に基づいて失火診断を行う技術が開示されている。
【００１１】
【発明が解決しようとする課題】
しかしながら、上記先行例では、少なくともエンジン高回転域においては、排気ガス中の酸素濃度に基づいてのみ失火診断を行うので、失火が発生したことを検出することはできるものの、失火の生じている失火気筒を判別することができない不都合がある。
【００１２】
すなわち、失火の判別自体は、酸素センサ（Ｏ2センサ）が活性していて、ある程度のエンジン負荷がかかっていればエンジン回転数にあまり影響を受けずに失火を検出することが可能だが、ある気筒に失火が発生してから酸素濃度が変化するまでの時間は、酸素センサの取付位置、エンジン回転速度（排気ガスの流速）等により変化する。従って、失火発生から酸素センサ出力変化が起きるまでの時間が不均一であり、失火気筒を判別することができない。
【００１３】
本発明は、上記事情に鑑み、エンジン回転全域において、厳密な失火判定を行うと共に、失火気筒を確実に判別することが可能なエンジンの失火診断装置を提供することを目的とする。
【００１５】
【課題を解決するための手段】
上記目的を達成するため、請求項１記載の発明によるエンジンの失火診断装置は、図１の基本構成図に示すように、所定クランク角毎のエンジン回転状態量を検出するエンジン回転状態量検出手段と、現在の燃焼行程気筒を判別する気筒判別手段と、前回検出したエンジン回転状態量から今回検出したエンジン回転状態量を減算して上記燃焼行程気筒に対する回転状態量の差を算出する差回転状態量算出手段と、所定期間における各気筒毎の上記差回転状態量を平均処理し各気筒毎の差回転状態量平均値を算出する差回転状態量平均値算出手段と、上記各差回転状態量平均値のうちの最大値と各気筒毎の差回転状態量平均値との差をそれぞれ算出して、この最大値に対する各気筒毎の平均値差を失火判定レベルと比較し、該失火判定レベルよりも平均値差が大きい気筒を失火気筒と判別する第１の失火判別手段と、空燃比センサの出力値に基づき失火を判別する第２の失火判別手段と、空燃比センサの出力値に基づき失火を判別したとき、上記失火気筒の毎回失火と確定し、当該気筒の毎回失火と診断する失火診断手段とを備えたことを特徴とする。
【００１６】
請求項２記載の発明によるエンジンの失火診断装置は、請求項１記載の発明において、上記各失火判別手段は、エンジン運転状態が燃料増量領域にあるとき、失火判別を行うことを特徴とする。
【００１７】
請求項３記載の発明によるエンジンの失火診断装置は、請求項１記載の発明において、所定周期毎に上記空燃比センサの出力電圧及び該出力電圧の変化量の絶対値を各々積算する積算手段を備え、上記第２の失火判別手段は、エンジン運転状態が燃料増量領域にあるとき、所定期間における空燃比センサ出力電圧平均値を算出し、該空燃比センサ出力電圧平均値が第１の判定値に達していないとき、或いは、所定期間における上記空燃比センサ出力電圧変化量の絶対値積算値が第２の判定値よりも大きいとき、失火と判別することを特徴とする。
【００１８】
請求項４記載の発明によるエンジンの失火診断装置は、請求項１ないし請求項３記載の発明において、上記各平均値は、所定期間における単純平均によって算出することを特徴とする。
【００１９】
請求項５記載の発明によるエンジンの失火診断装置は、請求項１ないし請求項４記載の発明において、上記所定期間は、点火回数が所定回数に達する毎の期間であることを特徴とする。
【００２０】
請求項６記載の発明によるエンジンの失火診断装置は、請求項１ないし請求項５記載の発明において、上記エンジン回転状態量は、エンジン回転速度であることを特徴とする。
【００２３】
請求項１記載の発明では、気筒間における所定クランク角毎のエンジン回転状態量を検出すると共に、現在の燃焼行程気筒を判別し、前回検出したエンジン回転状態量から今回検出したエンジン回転状態量を減算して上記燃焼行程気筒に対する回転状態量の差を算出する。そして、所定期間における各気筒毎の上記差回転状態量を平均処理して各気筒毎の差回転状態量平均値を算出し、これら各差回転状態量平均値のうちの最大値と各気筒毎の差回転状態量平均値との差をそれぞれ算出する。そして、この最大値に対する各気筒毎の平均値差を失火判定レベルと比較し、該失火判定レベルよりも平均値差が大きい気筒を失火気筒と判別する。更に、空燃比センサの出力値に基づいて失火を判別し、失火を判別したとき、上記失火気筒の毎回失火と確定して当該気筒の毎回失火と診断する。
【００２４】
この際、請求項２記載の発明では、エンジン運転状態が触媒保護のための燃料増量領域にあるとき、エンジン回転状態量と空燃比センサ出力値とによる失火判別を行う。
【００２５】
また、請求項３記載の発明では、所定周期毎に上記空燃比センサの出力電圧及び該出力電圧の変化量の絶対値を各々積算する。そして、空燃比センサの出力値による失火診断に際し、エンジン運転状態が触媒保護のための燃料増量領域にあるとき、所定期間における上記空燃比センサ出力電圧の積算値に基づいて空燃比センサ出力電圧平均値を算出し、該空燃比センサ出力電圧平均値が第１の判定値に達していないとき、或いは、所定期間における上記空燃比センサ出力電圧変化量の絶対値積算値が第２の判定値よりも大きいとき、失火と判別する。
【００２６】
また、請求項４記載の発明では、上記各平均値を所定期間における単純平均によって算出する。
【００２７】
さらに、請求項５記載の発明では、上記所定期間を、点火回数が所定回数に達する毎の期間とし、請求項６記載では、上記回転状態量としてエンジン回転速度を採用する。
【００２８】
【発明の実施の形態】
以下、図２〜図１９を参照して本発明の実施の一形態を説明する。
【００２９】
先ず、図１６に基づいてエンジンの全体構成について説明する。同図において、符号１はエンジンであり、本形態においては水平対向型４気筒ガソリンエンジンである。このエンジン１のシリンダブロック１ａの左右両バンクには、シリンダヘッド２がそれぞれ設けられ、各シリンダヘッド２に吸気ポート２ａと排気ポート２ｂが形成されている。
【００３０】
このエンジン１の吸気系は、各吸気ポート２ａにインテークマニホルド３が連通され、このインテークマニホルド３に各気筒の吸気通路が集合するエアチャンバ４を介してスロットルチャンバ５が連通されている。そして、このスロットルチャンバ５の上流側に吸気管６を介してエアクリーナ７が取り付けられ、このエアクリーナ７がエアインテークチャンバ８に連通されている。
【００３１】
また、上記スロットルチャンバ５には、アクセルペダルに連動するスロットル弁５ａが設けられている。上記吸気管６には、スロットル弁５ａをバイパスするバイパス通路９が接続され、このバイパス通路９に、アイドル時にその弁開度によって該バイパス通路９を流れるバイパス空気量を調整することでアイドル回転数を制御するアイドル回転数制御弁（ＩＳＣ弁）１０が介装されている。
【００３２】
更に、上記インテークマニホルド３の各気筒の吸気ポート２ａの直上流側にインジェクタ１１が配設されている。上記インジェクタ１１は燃料供給路１２を介して燃料タンク１３に連通されており、この燃料タンク１３にはインタンク式の燃料ポンプ１４が設けられている。この燃料ポンプ１４からの燃料が、上記燃料供給路１２に介装された燃料フィルタ１５を経て上記インジェクタ１１及びプレッシャレギュレータ１６に圧送され、このプレッシャレギュレータ１６から上記燃料タンク１３にリターンされて、上記インジェクタ１１への燃料圧力が所定の圧力に調圧される。
【００３３】
一方、上記シリンダヘッド２の各気筒毎に、先端の放電電極を燃焼室に露呈する点火プラグ１７が取り付けられ、この点火プラグ１７に、各気筒毎に配設された点火コイル１８を介してイグナイタ１９が接続されている。
【００３４】
また、エンジン１の排気系としては、上記シリンダヘッド２の各排気ポート２ｂに連通するエキゾーストマニホルド２０の集合部に排気管２１が連通され、この排気管２１に触媒コンバータ２２が介装されてマフラ２３に連通されている。
【００３５】
次に、エンジン運転状態を検出するためのセンサ類について説明する。上記吸気管６のエアクリーナ７の直下流に、ホットワイヤ或いはホットフィルム等を用いた熱式の吸入空気量センサ２４が介装され、更に、上記スロットルチャンバ５に設けられたスロットル弁５ａに、スロットル開度センサ２５ａとスロットル弁５ａの全閉でＯＮするアイドルスイッチ２５ｂとを内蔵したスロットルセンサ２５が連設されている。
【００３６】
また、エンジン１のシリンダブロック１ａにノックセンサ２６が取り付けられていると共に、シリンダブロック１ａの左右バンクを連通する冷却水通路２７に冷却水温センサ２８が臨まされ、更に、上記触媒コンバータ２２の上流に空燃比センサの一例としてＯ2センサ２９が配設されている。
【００３７】
また、エンジン１のクランクシャフト３０に軸着するクランクロータ３１の外周に、クランク角センサ３２が対設され、更に、クランクシャフト３０に対して１／２回転するカムシャフト３３に連設するカムロータ３４に、気筒判別用のカム角センサ３５が対設されている。
【００３８】
上記クランクロータ３１は、図１７に示すように、その外周に突起３１ａ，３１ｂ，３１ｃが形成され、これらの各突起３１ａ，３１ｂ，３１ｃが、各気筒（＃１，＃２気筒と＃３，＃４気筒）の圧縮上死点前（ＢＴＤＣ）θ1，θ2，θ3の位置に形成されている。本実施の形態においては、θ1＝９７°ＣＡ，θ2＝６５°ＣＡ，θ3＝１０°ＣＡである。
【００３９】
また、図１８に示すように、上記カムロータ３４の外周には、気筒判別用の突起３４ａ，３４ｂ，３４ｃが形成され、突起３４ａが＃３，＃４気筒の圧縮上死点後（ＡＴＤＣ）θ4の位置に形成され、突起３４ｂが３個の突起で構成されて最初の突起が＃１気筒のＡＴＤＣθ5の位置に形成されている。更に、突起３４ｃが２個の突起で構成され、最初の突起が＃２気筒のＡＴＤＣθ6の位置に形成されている。本実施の形態においては、θ4＝２０°ＣＡ，θ5＝５°ＣＡ，θ6＝２０°ＣＡである。
【００４０】
そして、図８のタイムチャートに示すように、エンジン運転に伴いクランクシャフト３０及びカムシャフト３３の回転により上記クランクロータ３１及びカムロータ３４が回転して、クランクロータ３１の各突起が上記クランク角センサ３２によって検出され、クランク角センサ３２からθ1，θ2，θ3（ＢＴＤＣ９７°，６５°，１０°）の各クランクパルスがエンジン１／２回転（１８０°ＣＡ）毎に出力される。一方、θ3クランクパルスとθ1クランクパルスとの間で上記カムロータ３４の各突起が上記カム角センサ３５によって検出され、カム角センサ３５から所定数のカムパルスが出力される。
【００４１】
そして、後述する電子制御装置４０（図１９参照）において、上記クランク角センサ３２から出力されるクランクパルスの入力間隔時間Ｔθに基づいてエンジン回転速度（エンジン回転数）ＮEを算出し、また、各気筒の燃焼行程順（例えば、＃１気筒→＃３気筒→＃２気筒→＃４気筒）と、上記カム角センサ３５からのカムパルスをカウンタによって計数した値とのパターンに基づいて、現在の燃焼行程気筒、燃料噴射対象気筒や点火対象気筒等の気筒判別を行う。
【００４２】
上記インジェクタ１１、点火プラグ１７，ＩＳＣ弁１０等のアクチュエータ類に対する制御量の演算、制御信号の出力、すなわち燃料噴射制御、点火時期制御、アイドル回転数制御等のエンジン制御は、図１９に示す電子制御装置（ＥＣＵ）４０によって行われる。
【００４３】
上記ＥＣＵ４０は、ＣＰＵ４１、ＲＯＭ４２、ＲＡＭ４３、バックアップＲＡＭ４４、カウンタ・タイマ群４５、及びＩ／Ｏインターフェイス４６がバスラインを介して互いに接続されるマイクロコンピュータを中心として構成され、各部に安定化電源を供給する定電圧回路４７、上記Ｉ／Ｏインターフェイス４６に接続される駆動回路４８及びＡ／Ｄ変換器４９等の周辺回路が内蔵されている。
【００４４】
なお、上記カウンタ・タイマ群４５は、フリーランカウンタ、カム角センサ信号（カムパルス）の入力計数用カウンタ等の各種カウンタ、燃料噴射用タイマ、点火用タイマ、定期割り込みを発生させるための定期割り込み用タイマ、クランク角センサ信号（クランクパルス）の入力間隔計時用タイマ、及びシステム異常監視用のウオッチドッグタイマ等の各種タイマを便宜上総称するものであり、その他、各種のソフトウエアカウンタ・タイマが用いられる。
【００４５】
上記定電圧回路４７は、２回路のリレー接点を有する電源リレー５０の第１のリレー接点を介してバッテリ５１に接続され、バッテリ５１に、上記電源リレー５０のリレーコイルがイグニッションスイッチ５２を介して接続されている。また、上記定電圧回路４７は、直接、上記バッテリ５１に接続されており、イグニッションスイッチ５２がＯＮされて電源リレー５０の接点が閉となるとＥＣＵ４０内の各部へ電源を供給する一方、上記イグニッションスイッチ５２のＯＮ，ＯＦＦに拘らず、常時、上記バックアップＲＡＭ４４にバックアップ用の電源を供給する。更に、上記バッテリ５１には、燃料ポンプリレー５３のリレー接点を介して燃料ポンプ１４が接続されている。なお、上記電源リレー５０の第２のリレー接点には、上記バッテリ５１から各アクチュエータに電源を供給するための電源線が接続されている。
【００４６】
上記Ｉ／Ｏインターフェイス４６の入力ポートには、アイドルスイッチ２５ｂ、ノックセンサ２６、クランク角センサ３２、カム角センサ３５、車速を検出するための車速センサ３６、及び始動状態を検出するためにスタータスイッチ３７が接続されており、更に、上記Ａ／Ｄ変換器４９を介して、吸入空気量センサ２４、スロットル開度センサ２５ａ、冷却水温センサ２８、及びＯ２センサ２９が接続されると共に、バッテリ電圧ＶBが入力されてモニタされる。
【００４７】
一方、上記Ｉ／Ｏインターフェイス４６の出力ポートには、上記燃料ポンプリレー５３のリレーコイル、ＩＳＣ弁１０、インジェクタ１１、及び、図示しないインストルメントパネルに配設され各種警報を集中表示する警報ランプ３８が上記駆動回路４８を介して接続されると共に、イグナイタ１９が接続されている。
【００４８】
また、上記Ｉ／Ｏインターフェイス４６には、外部接続用コネクタ５５が接続されており、この外部接続用コネクタ５５にシリアルモニタ（携帯型故障診断装置）６０を接続することで、シリアルモニタ６０によってＥＣＵ４０における入出力データ及びＥＣＵ４０の自己診断機能により上記バックアップＲＡＭ４４にストアされた失火気筒を示す後述する気筒別失火判定ＮＧフラグＦNG#iを含む故障部位、故障内容を示すトラブルデータを読み出して診断可能としている。更に、上記シリアルモニタ６０によって、上記トラブルデータのイニシャルセット（クリア）が行えるようになっている。
【００４９】
なお、このシリアルモニタ６０によるトラブルデータの診断、及びイニシャルセットについては、本出願人による特公平７−７６７３０号公報に詳述されている。
【００５０】
上記ＣＰＵ４１では、ＲＯＭ４２に記憶されている制御プログラムに従って、Ｉ／０インターフェイス４６を介して入力されるセンサ・スイッチ類からの検出信号、及びバッテリ電圧等を処理し、ＲＡＭ４３に格納される各種データ、及びバックアップＲＡＭ４４に格納されている各種学習値データ，ＲＯＭ４２に記憶されている固定データ等に基づき、燃料噴射量、点火時期、ＩＳＣ弁１０に対する駆動信号のデューティ比等を演算し、燃料噴射制御、点火時期制御、アイドル回転数制御等のエンジン制御を行う。
【００５１】
このようなエンジン制御系において、ＥＣＵ４０では、エンジン回転状態量の変化とＯ2センサ２９の出力値（出力電圧）とに基づいて失火診断を行う。
【００５２】
すなわち、所定クランク角毎のエンジン回転状態量の変化を検出すると共に、気筒を判別する。そして、各気筒毎のエンジン回転状態量の変化をそれぞれ失火判定レベルと比較して、各気筒毎に失火を判別する。また、空燃比センサの出力値としてＯ2センサ２９の出力電圧Ｏ２Ｓに基づき失火を判別する。そして、上記エンジン回転状態量の変化により所定気筒の失火を判別し、且つ、Ｏ2センサ出力電圧Ｏ２Ｓに基づいて失火を判別したとき、当該気筒の失火と診断する。
【００５３】
すなわち、各気筒毎のエンジン回転状態量の変化をそれぞれ失火判定レベルと比較して各気筒毎に失火を判別し、所定気筒の失火を判別したとき、更に、排気ガス中の酸素濃度を示すＯ2センサ出力電圧Ｏ２Ｓに基づいて失火が生じているかを判断する。そして、これら各判別結果の整合性により該当気筒の失火と確定診断するので、エンジン高回転域において失火判定レベルを厳密（小さく）に設定することにより、例え、各気筒のエンジン回転のばらつきによって失火していないにも係わらず所定気筒の失火と判断されたとしても、これがＯ2センサ出力電圧Ｏ２Ｓに基づく失火診断によって検証されるため、確実に誤診断を防止することが可能となる。
【００５４】
また、真に失火を生じているときには、Ｏ2センサ出力電圧Ｏ２Ｓによる失火診断によっても失火と診断されるため、失火判定レベルの厳密設定との相乗により失火診断精度を向上することが可能となり、且つ、エンジン高回転域においても、失火気筒を判別することが可能となる。
【００５５】
より詳細には、本実施の形態においては、クランク角センサ３２、カム角センサ３５からそれぞれ出力されるクランクパルス、カムパルスに基づいて現在の燃焼行程気筒＃ｎを判別する。そして、所定クランク角毎のエンジン回転状態量として、各気筒間におけるＢＴＤＣθ2，θ3間、すなわちθ2，θ3クランクパルス入力間のエンジン回転速度（エンジン回転数）を採用し、今回算出したエンジン回転速度ＭＮＸｎから前回の同区間におけるエンジン回転速度ＭＮＸｎ-1を減算して上記燃焼行程気筒＃ｎの失火パラメータとなる回転速度の差、すなわち当該気筒＃ｎに対する差回転ＤＥＬＮＥ#nを算出する。そして、点火回数が設定回数に達するまでの所定期間における各気筒毎の差回転ＤＥＬＮＥ#i（ｉ＝１〜４）を平均処理して各気筒毎の差回転平均値ＤＮＡＶＥ#iを算出する。次に、これら各差回転平均値ＤＮＡＶＥ#iのうちの最大値ＤＮＡＶＥＭＡＸを判別して該最大値ＤＮＡＶＥＭＡＸと各気筒毎の差回転平均値ＤＮＡＶＥ#iとの差ＳＤＮＡＶＥ#iをそれぞれ算出する。そして、この最大値に対する各気筒毎の平均値差ＳＤＮＡＶＥ#iを失火判定レベルＬＶＬＭＩＳと比較し、該失火判定レベルＬＶＬＭＩＳよりも平均値差ＳＤＮＡＶＥ#iの大きい気筒を失火気筒と判別する。
【００５６】
また、このとき、更に、空燃比センサの出力値としてＯ2センサ２９の出力電圧Ｏ２Ｓに基づいて失火を判別し、失火を判別したとき、上記失火気筒の毎回失火と確定して、当該気筒の毎回失火と診断する。
【００５７】
このＯ2センサ出力電圧Ｏ2Ｓによる失火診断に際しては、所定周期としてＯ2センサ出力電圧Ｏ２ＳのＡ／Ｄ変換入力毎に該Ｏ2センサ出力電圧Ｏ２Ｓ及び該出力電圧Ｏ２Ｓの変化量の絶対値を各々積算する。そして、点火回数が設定回数に達する所定期間におけるＯ2センサ出力電圧Ｏ２Ｓの積算値に基づいてＯ2センサ出力電圧平均値Ｏ２ＡＶＥを算出し、該Ｏ2センサ出力電圧平均値Ｏ２ＡＶＥが第１の判定値に達していないとき、或いは、所定期間における上記Ｏ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓが第２の判定値よりも大きいとき、失火と判別する。
【００５８】
尚、この各気筒毎のエンジン回転速度変化とＯ2センサ出力電圧Ｏ２Ｓとによる失火診断は、エンジン運転状態が触媒保護のための燃料増量領域にあるときに行う。
【００５９】
すなわち、エンジン回転速度変化により失火を判定するための上記失火判定レベルＬＶＬＭＩＳをエンジン高回転域においても厳密に設定し、各気筒毎の回転速度変化により判別した失火気筒が真に失火を生じているのか否かをＯ2センサ出力電圧Ｏ２Ｓに基づいて検証するのであり、このエンジン高回転域は、触媒保護のための燃料増量領域いわゆるフル増量領域に適合する。
【００６０】
そして、このフル増量領域においては、失火が生じていない無失火時には、燃料増量により燃焼後の排気ガス空燃比がリッチとなりＯ2センサ２９の出力電圧Ｏ２Ｓは、ほぼ一定のリッチ出力となるが、失火時には、排気ガス中の酸素濃度が増大するため、略リーン出力となる。従って、この触媒保護のためのフル増量領域においては、無失火時と失火時とのＯ2センサ出力電圧Ｏ２Ｓの差が大きく、これによりＯ2センサ出力電圧Ｏ２Ｓに基づいて確実に失火を検証することが可能となる。
【００６１】
すなわち、ＥＣＵ４０は、本発明に係る回転状態量変化検出手段、気筒判別手段、第１の失火判別手段、第２の失火判別手段、失火診断手段の機能を有し、更に、差回転状態量算出手段、差回転状態量平均値算出手段、積算手段としての機能をも実現する。
【００６２】
以下、上記ＥＣＵ４０によって実行される本発明に係る失火診断処理について、図２〜図７に示すフローチャートに従って説明する。
【００６３】
先ず、イグニッションスイッチ５２がＯＮされ、ＥＣＵ４０に電源が投入されると、システムがイニシャライズされ、バックアップＲＡＭ４４に格納されているトラブルデータ及び各種学習値等のデータを除く、各フラグ、各カウンタ類が初期化される。そして、スタータスイッチ３７がＯＮされてエンジンが起動すると、クランク角センサ３２からのクランクパルス入力毎に、図２に示す気筒判別／エンジン回転速度算出ルーチンが実行される。
【００６４】
この気筒判別／エンジン回転速度算出ルーチンでは、エンジン運転に伴いクランクロータ３１が回転してクランク角センサ３２からのクランクパルスが入力されると、先ず、ステップS1で、今回入力されたクランクパルスがθ1，θ2，θ3の何れのクランク角に対応する信号かをカム角センサ３５からのカムパルスの入力パターンに基づいて識別し、ステップS2で、クランクパルスとカムパルスとの入力パターンから現在の燃焼行程気筒、点火対象気筒、及び燃料噴射対象気筒等の気筒判別を行う。
【００６５】
すなわち、図８のタイムチャートに示すように、例えば、前回クランクパルスが入力してから今回クランクパルスが入力されるまでの間にカムパルス入力が有れば、今回のクランクパルスはθ1クランクパルスであると識別でき、更に次回入力されるクランクパルスはθ2クランクパルスと識別できる。
【００６６】
また、前回と今回とのクランクパルス入力間にカムパルス入力が無く、前々回と前回のクランクパルス入力間にカムパルス入力が有ったときには、今回のクランクパルスはθ2クランクパルスと識別でき、次回入力されるクランクパルスはθ3クランクパルスと識別できる。また、前回と今回との間、及び前々回と前回とのクランクパルス入力間に、何れもカムパルス入力が無いときには、今回入力されたクランクパルスはθ3クランクパルスと識別でき、次回入力されるクランクパルスはθ1クランクパルスと識別できる。
【００６７】
さらに、前回と今回とのクランクパルス入力間にカムパルスが３個入力（突起３４ｂに対応するθ5カムパルス）したときには、次の圧縮上死点は＃３気筒であり、現在の燃焼行程気筒は＃１気筒、点火対象気筒は＃３気筒、燃料噴射対象気筒は、その２つ後の＃４気筒となることが判別できる。また、前回と今回のクランクパルス入力間にカムパルスが２個入力（突起３４ｃに対応するθ6カムパルス）したときには、次の圧縮上死点は＃４気筒であり、現在の燃焼行程気筒は＃２気筒、点火対象気筒は＃４気筒、燃料噴射対象気筒は＃３気筒と判別できる。
【００６８】
また、前回と今回とのクランクパルス入力間にカムパルスが１個入力（突起３４ａに対応するθ4カムパルス）し、前の圧縮上死点判別が＃４気筒であったときには、次の圧縮上死点は＃１気筒であり、現在の燃焼行程気筒は＃４気筒、点火対象気筒は＃１気筒、燃料噴射気筒は＃２気筒と判別できる。同様に、前回と今回とのクランクパルス入力間にカムパルスが１個入力し、前の圧縮上死点判別が＃３気筒であったときには次の圧縮上死点は＃２気筒であり、現在の燃焼行程気筒は＃３気筒、点火対象気筒は＃２気筒、燃料噴射対象気筒は＃１気筒と判別できる。
【００６９】
本形態の４サイクル４気筒エンジン１では、燃焼行程は＃１→＃３→＃２→＃４の気筒順であり、図８のタイムチャートに示すように、カムパルス出力時の今回（現在）の燃焼行程気筒＃ｎを＃１気筒とすると、点火対象気筒は圧縮上死点を迎える＃ｎ+1＝＃３気筒、このときの燃料噴射対象気筒はその２つ後の＃ｎ+3＝＃４気筒となる。そして、今回の燃焼行程気筒＃ｎの気筒判別結果が、θ3クランクパルス入力毎に実行される図３の差回転算出ルーチンにおいて参照され、該当燃料行程気筒＃ｎに対する差回転ＤＥＬＮＥ#nが算出されて積算される。
【００７０】
また、ここでは詳述しないが、点火対象気筒＃ｎ+1の判別結果に応じて該当気筒＃ｎ+1に対する点火時期が設定されて、気筒毎に点火時期制御が行われる。更に、燃料噴射対象気筒＃ｎ+3気筒の判別結果が、所定周期毎に実行される図示しない燃料噴射量設定ルーチンにおいて参照されて、気筒毎に燃料噴射量が設定される。
【００７１】
その後、ステップS2からステップS3へ進み、前記クランクパルス入力間隔計時用タイマによって計時された前回のクランクパルス入力から今回のクランクパルス入力までの時間、すなわちクランクパルス入力間隔時間（θ1クランクパルスとθ2クランクパルスの入力間隔時間Ｔθ12、θ2クランクパルスとθ3クランクパルスの入力間隔時間Ｔθ23、或いはθ3クランクパルスとθ1クランクパルスの入力間隔時間Ｔθ31）を読み出し、クランクパルス入力間隔時間Ｔθを検出する。
【００７２】
次いで、ステップS4へ進み、今回識別したクランクパルスに対応するクランクパルス間角度を読み出し、このクランクパルス間角度と上記クランクパルス入力間隔時間Ｔθとに基づいて現在のエンジン回転速度（エンジン回転数）ＮEを算出し、ＲＡＭ４３の所定アドレスにストアしてルーチンを抜ける。なお、上記クランクパルス間角度は既知であり、予めＲＯＭ４２に固定データとして記憶されているものであり、本実施の形態においては、θ1クランクパルスとθ2クランクパルス間の角度は３２°ＣＡであり、θ2クランクパルスとθ3クランクパルス間の角度は５５°ＣＡ、θ3クランクパルスとθ1クランクパルス間の角度は９３°ＣＡである。また、エンジン始動時を考慮し、エンジン回転数ＮEは、例えば、１５０rpm以上で算出される。
【００７３】
そして、θ3クランクパルス入力毎に実行される図３に示す差回転算出ルーチンにおいて、上記燃焼行程気筒＃ｎ、及びエンジン回転速度ＮEの各データが読み出され、該当気筒＃ｎに対する差回転ＤＥＬＮＥ#nを算出して、この差回転ＤＥＬＮＥ#nを積算する。
【００７４】
ここで、上記差回転算出ルーチンは、θ3クランクパルス入力に対応して実行され、このとき、上記気筒判別／エンジン回転数算出ルーチンによりθ2クランクパルスとθ3クランクパルス間の入力間隔時間Ｔθ23に基づきＢＴＤＣθ2，θ3間のエンジン回転速度ＮEが算出されており、上述のＢＴＤＣθ2，θ3間のエンジン回転速度ＮEに基づいて該当気筒＃ｎに対する失火パラメータを表す差回転ＤＥＬＮＥ#nが算出されることになる。
【００７５】
この差回転算出ルーチンにおいては、先ず、ステップS11で、上記気筒判別／エンジン回転速度算出ルーチンにおいて気筒判別された今回の燃焼行程気筒データ＃ｎを読み出して、現在の燃焼行程気筒＃ｎを特定する。
【００７６】
ステップS12では、現在のエンジン回転速度ＮE、すなわち最新のＢＴＤＣθ2，θ3間のエンジン回転速度ＮEを読み出して、現在の燃焼行程気筒＃ｎに対応するエンジン回転速度ＭＮＸｎとする（ＭＮＸｎ←ＮE）。
【００７７】
次にステップS13へ進み、上記ステップS12で設定された現在の気筒＃ｎに対応するエンジン回転数ＭＮＸｎから、前回ルーチン実行時に設定されワークエリアにストアされた１燃焼行程前の気筒＃ｎ-1に対応するエンジン回転速度ＭＮＸｎ-1を減算し、気筒間における所定クランク角毎のエンジン回転速度の変化、すなわち現在の燃焼行程気筒＃ｎに対する差回転ＤＥＬＮＥ#nを算出する（ＤＥＬＮＥ#n←ＭＮＸｎ−ＭＮＸｎ-1）。
【００７８】
そして、ステップS14で、上記差回転ＤＥＬＮＥ#nを積算して、当該気筒＃ｎの差回転積算値ΣＤＥＬＮＥ#nとする（ΣＤＥＬＮＥ#n←ΣＤＥＬＮＥ#n＋ＤＥＬＮＥ#n）。
【００７９】
次いでステップS15で、失火診断の実行期間を与える点火回数ＣIGNをカウントアップする（ＣIGN←ＣIGN＋１）。ここで、本ルーチンは、θ3クランクパルス入力毎すなわち１８０°ＣＡ毎に実行され、本実施の形態におけるエンジン１は４気筒エンジンであり、従って、本ルーチンの実行回数をカウントすることで、点火回数をカウントすることと実質的に同一となる。
【００８０】
そして、ステップS16で、次の燃焼行程気筒に対する差回転の算出に備え、今回の回転速度ＭＮＸｎを前回のエンジン回転速度ＭＮＸｎ-1としてワークエリアにストアし（ＭＮＸｎ-1←ＭＮＸｎ）、ルーチンを抜ける。
【００８１】
以上の差回転算出ルーチンにより、図９に示すように、各気筒毎に差回転ＤＥＬＮＥが算出され、各気筒＃ｉ（ｉ＝１〜４気筒）毎に対応して差回転積算値ΣＤＥＬＮＥ#iが算出される。
【００８２】
一方、図４はＯ2センサ出力電圧積算ルーチンであり、Ｏ2センサ２９の出力電圧Ｏ２ＳのＡ／Ｄ変換入力毎に実行され、Ｏ2センサ出力電圧Ｏ２Ｓ及び該出力電圧Ｏ２Ｓの変化量の絶対値を各々積算する。
【００８３】
次に、このＯ2センサ出力電圧積算ルーチンについて説明すると、先ず、ステップS21で、Ａ／Ｄ変換された最新のＯ2センサ出力電圧Ｏ２Ｓｎを読み込み、該Ｏ2センサ出力電圧Ｏ２Ｓを、Ｏ2センサ出力電圧積算値ΣＯ２Ｓに加算して積算する（ΣＯ２Ｓ←ΣＯ２Ｓ＋Ｏ２Ｓ）。
【００８４】
次いでステップS22で、上記Ｏ2センサ出力電圧Ｏ２Ｓｎから前回のルーチン実行時にワークエリアにストアされた１回前のＡ／Ｄ変換時のＯ2センサ出力電圧Ｏ２Ｓｎ-1を減算し、この減算値の絶対値を、Ｏ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓに加算して積算する（ＤＯ２Ｓ←ＤＯ２Ｓ＋｜Ｏ２Ｓｎ−Ｏ２Ｓｎ-1｜）。
【００８５】
その後、ステップS23で、Ｏ2センサ出力電圧サンプリング回数ＣO2Sをカウントアップし（ＣO2S←ＣO2S＋１）、続くステップS24で、次回ルーチン実行時の絶対値積算値ＤＯ２Ｓの算出に備え、上記Ｏ2センサ出力電圧Ｏ２Ｓｎを、前回（１回前）のＡ／Ｄ変換時のＯ2センサ出力電圧Ｏ２Ｓｎ-1としてワークエリアにストアし（Ｏ２Ｓｎ-1←Ｏ２Ｓｎ）、ルーチンを抜ける。
【００８６】
そして、図５に示す失火診断ルーチンにおいて、点火回数が失火診断の実行期間を定める設定回数に達し、且つエンジン運転状態が触媒保護のための燃料増量領域にあるとき、前述の差回転算出ルーチンによって算出された各気筒毎の差回転積算値ΣＤＥＬＮＥ#i、及び上記Ｏ2センサ出力電圧積算ルーチンによって積算されたＯ2センサ出力電圧積算値ΣＯ２Ｓ、Ｏ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓが読み出される。そして、点火回数が設定回数に達するまでの所定期間における各気筒毎の差回転ＤＥＬＮＥ#i（ｉ＝１〜４）を平均処理して各気筒毎の差回転平均値ＤＮＡＶＥ#iを算出し、これら各差回転平均値ＤＮＡＶＥ#iのうちの最大値ＤＮＡＶＥＭＡＸを判別して該最大値ＤＮＡＶＥＭＡＸと各気筒毎の差回転平均値ＤＮＡＶＥ#iとの差ＳＤＮＡＶＥ#iをそれぞれ算出する。そして、この最大値に対する各気筒毎の平均値差ＳＤＮＡＶＥ#iを失火判定レベルＬＶＬＭＩＳと比較し、該失火判定レベルＬＶＬＭＩＳよりも平均値差ＳＤＮＡＶＥ#iの大きい気筒を失火気筒と判別する。
【００８７】
そして、失火気筒が判別されたときには、更に、点火回数が設定回数に達するまでの所定期間における上記Ｏ2センサ出力電圧積算値ΣＯ２Ｓに基づいてＯ2センサ出力電圧平均値Ｏ２ＡＶＥを算出し、該Ｏ2センサ出力電圧平均値Ｏ２ＡＶＥが第１の判定値ＬＶＬO2AVEに達していないとき、或いは、所定期間における上記Ｏ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓが第２の判定値ＬＶＬDO2Sよりも大きいとき、失火と判別し、上記失火気筒の毎回失火と確定して、当該気筒の毎回失火と診断する。
【００８８】
次に、図５に示す失火診断ルーチンについて説明する。
【００８９】
この失火診断ルーチンは、所定クランク角毎（例えば、１８０°ＣＡ毎）或いは所定時間（例えば、５msec）毎に実行され、ステップS31で、上記点火回数カウント値ＣIGNを、設定回数ＩＧＮ（例えば、４００回）と比較する。
【００９０】
上記設定回数ＩＧＮは、失火診断の実行周期を定めるものであり、後述する各気筒毎の差回転ＤＥＬＮＥ#iに対する平均処理、Ｏ2センサ出力電圧積算値ΣＯ２Ｓに基づくＯ2センサ出力電圧平均値Ｏ２ＡＶＥの算出処理によって、及び、上記Ｏ2センサセンサ出力電圧変化量の絶対値積算値ＤＯ２Ｓに対し、スナッチや外乱等によるエンジン回転変動の影響を排除し、且つ、加速等による一時的な失火による影響を排除し得る期間を与えるに適切な点火回数値を、予めシミュレーション或いは実験等により求め、この点火回数値を設定回数ＩＧＮとして設定し、固定データとしてＲＯＭ４２にメモリされているものである。
【００９１】
すなわち、失火回数に直接依存する点火回数ＣIGNを採用し、この点火回数ＣIGNを上記設定回数ＩＧＮと比較して、失火診断の実行期間を定めることで、所定気筒の恒常的な失火すなわち毎回失火を確実に診断することが可能となる。
【００９２】
そして、ＣIGN＜ＩＧＮで、点火回数ＣIGNが設定回数ＩＧＮに達していないときには、そのままルーチンを抜け、一方、ＣIGN≧ＩＧＮで点火回数ＣIGNが設定回数ＩＧＮに達したとき、ステップS32へ進む。すなわち、点火回数ＣIGNが設定回数ＩＧＮに達する毎に、その設定回数ＩＧＮに相当する期間のデータに基づいて失火診断を行う。
【００９３】
ステップS32では、エンジン運転状態が触媒保護のための燃料増量領域いわゆるフル増量域にあるか否かをフル増量係数ＫFULLによって判断する。
【００９４】
周知のように、上記フル増量係数ＫFULLは、エンジン運転状態が高回転及び高負荷の少なくとも一方の状態のときに、燃料増量補正により触媒温度の異常上昇を防止して触媒を保護するためのものであり、燃料噴射量を定める燃料噴射パルス幅Ｔｉの演算式における各種増量係数ＣＯＥＦの補正項として与えられる。
【００９５】
上記燃料噴射パルス幅Ｔｉは、周知のように、上記基本燃料噴射パルス幅Ｔｐに、上記各種増量補正係数ＣＯＥＦ及び空燃比フィードバック補正係数αを乗算して空燃比補正すると共に、空燃比学習補正係数ＫBLRCを乗算して学習補正し、更にインジェクタの無効噴射時間を補償する電圧補正パルス幅Ｔｓを加算し、次式によって与えられる。
【００９６】
Ｔｉ←Ｔｐ×ＣＯＥＦ×α×ＫBLRC＋Ｔｓ
そして、上記フル増量係数は、各種増量係数ＣＯＥＦ中の補正項として与えられる。尚、上記各種増量係数ＣＯＥＦの演算式の一例を次式に示す。
【００９７】
ＣＯＥＦ←ＫST×（１＋ＫFULL＋ＫTW＋ＫAS＋ＫAI＋ＫACC）
ここで、ＫSTは始動増量係数であり、始動性確保のためスタータモータ作動中のクランキング時のみ燃料増量を行うためのものである。また、ＫTWはエンジン冷態時の運転性を確保するための燃料増量率を定める水温増量係数であり、ＫASはエンジン始動直後におけるエンジン回転の安定性を確保するための始動後増量係数であり、冷却水温センサ２８による冷却水温度ＴWに基づき初期値設定され、スタータスイッチ３７のＯＦＦによるエンジン始動後、ＫAS＝０になるまで漸次的に減少される。また、ＫAIは、アイドル解除時のもたつきを防止するためのアイドル後増量係数であり、アイドルスイッチ２５ｂがＯＮ（スロットル弁全閉）からＯＦＦ（スロットル弁開）に移行したとき初期値設定され、その後ＫAI＝０になるまで漸次的に減少される。更に、ＫACCは、スロットル弁５ａが急開される加速時において吸入空気量センサ２４の吸入空気量検出遅れに起因する空燃比のリーンスパイクを防止するための加速増量係数であり、スロットル開度変化速度によりスロットル弁急開の加速を検知したとき、初期値設定され、その後ＫACC＝０になるまで漸次的に減少される。
【００９８】
一方、触媒保護のための上記フル増量係数ＫFULLは、エンジン回転速度ＮEとエンジン負荷を表す基本燃料噴射パルス幅Ｔｐとに基づいてＲＯＭ４２に格納されているフル増量係数テーブルを参照することにより設定される。
【００９９】
上記フル増量係数テーブルは、エンジン負荷を表す基本燃料噴射パルス幅Ｔｐとエンジン回転速度ＮEとによる領域毎に、触媒温度の異常上昇を防止し得る燃料増量適正値を予めシミュレーション或いは実験等により求め、この燃料増量適正値をフル増量係数ＫFULLとして、基本燃料噴射パルス幅Ｔｐとエンジン回転速度ＮEとをパラメータとするテーブルとして設定し、ＲＯＭ４２の一連のアドレスにストアされているものである。
【０１００】
上記フル増量係数テーブルの一例を、図１０に示す。このフル増量係数テーブルにおいては、図１０に斜線で示すように、基本燃料噴射パルス幅Ｔｐが大きいエンジン高負荷領域およびエンジン高回転領域との少なくとも一方の領域にあるとき、フル増量係数ＫFULLがＫFULL＞０に設定される。そして、この領域がフル増量係数ＫFULLによる燃料増量補正が行われる、いわゆるフル増量領域となる。このフル増量領域外においては、フル増量係数ＫFULLがＫFULL＝０に設定され、フル増量係数ＫFULLによる燃料増量補正は行われない。また、フル増量係数テーブルには、基本燃料噴射パルス幅Ｔｐが大きくエンジン回転速度ＮEが高いほど、すなわちエンジン高負荷高回転であるほど、大きい値のフル増量係数ＫFULLがメモリされている。
【０１０１】
すなわち、本実施の形態においては、後述の処理によって、点火回数ＣIGNが設定回数ＩＧＮに達するまでの所定期間における各気筒毎の差回転ＤＥＬＮＥ#i（ｉ＝１〜４）を平均処理して各気筒毎の差回転平均値ＤＮＡＶＥ#iを算出し、これら各差回転平均値ＤＮＡＶＥ#iのうちの最大値ＤＮＡＶＥＭＡＸを判別して該最大値ＤＮＡＶＥＭＡＸと各気筒毎の差回転平均値ＤＮＡＶＥ#iとの差ＳＤＮＡＶＥ#iをそれぞれ算出する。そして、この最大値に対する各気筒毎の平均値差ＳＤＮＡＶＥ#iを失火判定レベルＬＶＬＭＩＳと比較することで、失火気筒を判別するのであり、失火を判定するための上記失火判定レベルＬＶＬＭＩＳをエンジン高回転域においても厳密に設定し、判別した失火気筒が真に失火を生じているのか否かをＯ2センサ出力電圧Ｏ２Ｓに基づいて検証する。
【０１０２】
ここで、このエンジン高回転域は、触媒保護のための上記フル増量係数ＫFULLによる燃料増量補正を行うフル増量領域に適合する。
【０１０３】
そして、このフル増量領域においては、失火が生じていない無失火時には、フル増量係数ＫFULLによる燃料増量補正によって燃焼後の排気ガス空燃比がリッチとなりＯ2センサ２９の出力電圧Ｏ２Ｓは、ほぼ一定のリッチ出力となる。これに対し、燃焼が行われない失火時には、排気ガス中の酸素濃度が増大するため、Ｏ2センサ出力電圧Ｏ２Ｓは、略リーン出力となる。
【０１０４】
従って、このフル増量係数ＫFULLによる触媒保護のためのフル増量領域においては、無失火時と失火時とのＯ2センサ出力電圧Ｏ２Ｓの差が大きく、Ｏ2センサ出力電圧Ｏ２Ｓに基づいて確実に失火を検証することが可能となる。
【０１０５】
上記ステップS32では、フル増量係数ＫFULLが０よりも大きいか否かによりエンジン運転領域が燃料増量領域にあるか否かを判断するが、これに代え、例えば、エンジン回転速度ＮEとエンジン負荷を表す基本燃料噴射パルス幅Ｔｐとによる領域テーブルを採用し、この領域テーブルを参照することで、燃料増量領域判定を行うようにしてもよく、適宜の手段が採用できる。
【０１０６】
そして、ＫFULL＝０の燃料増量領域外で条件非成立のときには、ステップS40へジャンプして、ステップS40〜S44で、各気筒の前記差回転積算値ΣＤＥＬＮＥ#i、点火回数ＣIGN、Ｏ2センサ出力電圧積算値ΣＯ２Ｓ、Ｏ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓ、Ｏ2センサ出力電圧サンプリング回数ＣO2Sをそれぞれクリアして（ΣＤＥＬＮＥ#i←０、ＣIGN←０、ΣＯ２Ｓ←０、ＤＯ２Ｓ←０、ＣO2S←０）、ルーチンを抜ける。
【０１０７】
一方、上記ステップS32においてＫFULL＞０の燃料増量領域による条件成立時には、ステップS33へ進み、図６に示す失火気筒検出サブルーチンを実行し、エンジン回転変動として各気筒毎の差回転ＤＥＬＮＥ#iに基づき失火気筒を判別する。
【０１０８】
図６の失火気筒検出サブルーチンについて説明すると、ステップS51で、上記差回転算出ルーチンにおいて積算された点火回数ＣIGNが設定回数ＩＧＮに達した所定期間における各気筒＃ｉ（ｉ＝１〜４気筒）毎の差回転積算値ΣＤＥＬＮＥ#iを読み出し、この気筒毎の差回転積算値ΣＤＥＬＮＥ#iに基づいて、次式により、所定期間における各気筒毎の差回転平均値ＤＮＡＶＥ#iをそれぞれ算出する。
【０１０９】
ＤＮＡＶＥ#i←ΣＤＥＬＮＥ#i／（ＩＧＮ／Ｎ）
ここで、Ｎは気筒数であり、点火回数ＣIGNが設定回数ＩＧＮに達するまでの間に、各気筒毎に（ＩＧＮ／Ｎ）回づつ差回転ＤＥＬＮＥがそれぞれ積算される。従って、点火回数ＣIGNが設定回数ＩＧＮに達した所定期間における各気筒毎の差回転積算値ΣＤＥＬＮＥ#iを（ＩＧＮ／Ｎ）によりそれぞれ除算することで、この所定期間における各気筒毎の差回転平均値ＤＮＡＶＥ#iを算出することが可能である。また、上記（ＩＧＮ／Ｎ）は、既知であり、予めＲＯＭ４２に固定データとしてメモリされる。
【０１１０】
そして、ステップS52で、これら各気筒毎の差回転平均値ＤＮＡＶＥ#iの大小関係を比較し、これら各差回転平均値ＤＮＡＶＥ#iのうち最大のものを、最大値ＤＮＡＶＥＭＡＸとする。
【０１１１】
すなわち、図１１に示すように、例えば、所定期間（４００点火）における各気筒毎の差回転平均値ＤＮＡＶＥ#1，ＤＮＡＶＥ#2，ＤＮＡＶＥ#3，ＤＮＡＶＥ#4のうち、＃１気筒の差回転平均値ＤＮＡＶＥ#1が最大であり、この＃１気筒の差回転平均値ＤＮＡＶＥ#1を最大値ＤＮＡＶＥＭＡＸとして設定する。
【０１１２】
次いでステップS53へ進み、上記最大値ＤＮＡＶＥＭＡＸから各気筒毎の差回転平均値ＤＮＡＶＥ#iをそれぞれ減算して、この最大値ＤＮＡＶＥＭＡＸに対する各気筒毎の平均値差ＳＤＮＡＶＥ#iを算出する（ＳＤＮＡＶＥ#i←ＤＮＡＶＥＭＡＸ−ＤＮＡＶＥ#i）。
【０１１３】
そして、ステップS54で、各気筒毎の上記平均値差ＳＤＮＡＶＥ#iを、それぞれ失火判定レベルＬＶＬＭＩＳと比較し、ＳＤＮＡＶＥ#i＞ＬＶＬＭＩＳで失火判定レベルＬＶＬＭＩＳよりも平均値差ＳＤＮＡＶＥ#iの大きい気筒を毎回連続失火中の失火気筒と判別し、ステップS55で、該当気筒の毎回連続失火を表す気筒別失火フラグＦMIS#iをセットする（ＦMIS#i←１）。
【０１１４】
また、ＳＤＮＡＶＥ#i≦ＬＶＬＭＩＳで、平均値差ＳＤＮＡＶＥ#iが上記失火判定レベルＬＶＬＭＩＳ以下の気筒については、少なくとも恒常的な毎回連続失火を生じていないと判断して、ステップS56で、該当気筒に対応する気筒別失火フラグＦMIS#iをクリアして（ＦMIS#i←０）、失火診断ルーチン（図５）のステップS34へ進む。
【０１１５】
すなわち、気筒毎の差回転ＤＥＬＮＥ#iを直接用いずに、点火回数ＣIGNが設定回数ＩＧＮに達するまでの各気筒毎の差回転平均値ＤＮＡＶＥ#iを採用することで、スナッチや外乱等による一時的なエンジン回転変動の影響を排除し、且つ、加速等による一時的な失火による影響を排除する。そして、各差回転平均値ＤＮＡＶＥ#iのうちの最大値ＤＮＡＶＥＭＡＸを判別して該最大値ＤＮＡＶＥＭＡＸと各気筒毎の差回転平均値ＤＮＡＶＥ#iとの差ＳＤＮＡＶＥ#iをそれぞれ算出することで、特定気筒の毎回連続失火を表す失火パラメータとして的確に反映させる。更に、この最大値ＤＮＡＶＥＭＡＸに対する各気筒毎の平均値差ＳＤＮＡＶＥ#iを失火判定レベルＬＶＬＭＩＳと比較して、気筒毎の毎回連続失火を判断するので、気筒毎の差回転平均値ＤＮＡＶＥ#iを判定値（失火判定レベル）と比較して失火診断を行うよりも、毎回連続失火を表す失火パラメータとしての気筒毎の上記平均値差ＳＤＮＡＶＥ#iは、毎回連続失火の有無に応じて大きく変化しダイナミックレンジが大きく、従って、より的確に気筒別に毎回連続失火を判断することが可能となる。
【０１１６】
また、所定期間における差回転の単純平均を採用するため、失火診断に係るＣＰＵ４１の演算負担を著しく低減することが可能となる。
【０１１７】
例えば、上述の図１１の例では、＃１気筒の差回転平均値ＤＮＡＶＥ#1が最大最大値ＤＮＡＶＥＭＡＸとなり、従って、＃１気筒の平均値差ＳＤＮＡＶＥ#1は、ＳＤＮＡＶＥ#1＝０rpmとなる。そして、この最大値ＤＮＡＶＥＭＡＸに対する＃２気筒の平均値差ＳＤＮＡＶＥ#2は約１８rpm、＃３気筒の平均値差ＳＤＮＡＶＥ#3は約２５rpm、＃４気筒の平均値差ＳＤＮＡＶＥ#4は約６５rpmとなり、この場合は、＃４気筒が毎回連続失火を生じていることが解る。
【０１１８】
しかし、エンジン高回転域（通常、５０００rpm以上）においては、前述のように、クランクロータやクランク角センサの製造許容誤差及び取付許容誤差、並びに各気筒毎に燃焼圧のばらつき等に起因するエンジン回転速度のばらつきの影響が大きくなり、且つ、高回転域では慣性エネルギが大きいため失火時のエンジン回転変化量が小さく、失火判定が困難となる。
【０１１９】
従って、エンジン高回転域においては、判定値としての失火判定レベルＬＶＬＭＩＳを厳密（小さく）に設定すると、各気筒の回転ばらつきによって実際には失火していないにも係わらず、失火と誤判定してしまう。また、これに対処するに、上記失火判定レベルＬＶＬＭＩＳを大きく設定すると、逆に、実際の失火を検出することができなくなってしまう。いずれにしても、エンジン回転変化による失火判定では、エンジン高回転域において各気筒毎の毎回連続失火を適切に判定することができない。
【０１２０】
従って、このときには、排気ガス中の酸素濃度を示すＯ2センサ出力電圧Ｏ２Ｓに基づく失火判定を併用し、後述の処理によりＯ2センサ出力電圧Ｏ２Ｓに基づいて真に失火が生じているか否かを検証する。すなわち、エンジン回転変化による失火判定とＯ2センサ出力電圧Ｏ２Ｓによる失火判定とを併用することによって、上記失火判定レベルＬＶＬＭＩＳを厳密設定することが可能となり、この失火判定レベルＬＶＬＭＩＳの厳密設定との相乗によりエンジン高回転域における失火診断精度を大幅に向上することが可能となり、且つ、エンジン高回転域においても、失火気筒を判別することが可能となる。
【０１２１】
そして、以上の失火気筒検出サブルーチンの終了により、失火診断ルーチンのステップS34へ進むと（図５参照）、各気筒の上記気筒別失火フラグＦMIS#iを参照し、ＦMIS#i＝０で、全ての気筒に対する気筒別失火フラグＦMIS#1，ＦMIS#2，ＦMIS#3，ＦMIS#4がクリアされており、全ての気筒＃１〜＃４について毎回連続失火が生じていないと判断されているときには、図７の失火検証サブルーチンのステップS65へジャンプして、バックアップＲＡＭ４４にストアされ気筒毎の毎回連続失火確定を示す全ての気筒別失火判定ＮＧフラグＦNG#1，ＦNG#2，ＦNG#3，ＦNG#4をクリアする。
【０１２２】
一方、上記ステップS34においてＦMIS#i＝１で、上記気筒別失火フラグＦMIS#1〜ＦMIS#4のうち何れか１つでもフラグがセットされており、少なくとも１つの気筒に毎回連続失火が生じていると判別されているときには、ステップS35へ進み、Ｏ2センサ２９が活性しているか否かを判断する。
【０１２３】
すなわち、Ｏ2センサ２９が非活性のときには、該Ｏ2センサ２９の出力電圧Ｏ２Ｓにより排気ガス中の酸素濃度を判断できず、Ｏ2センサ出力電圧Ｏ２Ｓに基づく失火診断を行うことができない。
【０１２４】
従って、Ｏ2センサ２９が非活性のときには、上記ステップS40へジャンプして、ステップS40〜S44で、各気筒の差回転積算値ΣＤＥＬＮＥ#i、点火回数ＣIGN、Ｏ2センサ出力電圧積算値ΣＯ２Ｓ、Ｏ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓ、Ｏ2センサ出力電圧サンプリング回数ＣO2Sをそれぞれクリアして、ルーチンを抜ける。
【０１２５】
尚、このＯ2センサ２９の活性判定は、例えば、Ｏ2センサ２９の出力電圧Ｏ２Ｓが設定値以上或いは所定範囲の状態が設定以上継続しているとき、該Ｏ2センサ２９の活性と判断することができる。
【０１２６】
一方、上記ステップS35においてＯ2センサ２９が活性のときには、ステップS36へ進み、図７に示す失火検証サブルーチンを実行し、排気ガス中の酸素濃度を示すＯ2センサ出力電圧Ｏ２Ｓに基づいて失火を検証する。
【０１２７】
図７の失火検証サブルーチンについて説明すると、ステップS61で、上記Ｏ2センサ出力電圧積算ルーチンにおいて積算されたＯ2センサ出力電圧積算値ΣＯ２Ｓ、及びＯ2センサ出力電圧サンプリング回数ＣO2Sを読み出し、上記Ｏ2センサ出力電圧積算値ΣＯ２ＳをＯ2センサ出力電圧サンプリング回数ＣO2Sにより除算して、点火回数ＣIGNが設定回数ＩＧＮに達した所定期間におけるＯ2センサ出力電圧平均値Ｏ２ＡＶＥを算出する（Ｏ２ＡＶＥ←ΣＯ２Ｓ／ＣO2S）。
【０１２８】
次いでステップS62へ進み、上記Ｏ2センサ出力電圧平均値Ｏ２ＡＶＥを、該Ｏ2センサ出力電圧平均値Ｏ２ＡＶＥにより失火を判定するための第１の判定値ＬＶＬO2AVEと比較する。
【０１２９】
そして、Ｏ２ＡＶＥ＜ＬＶＬO2AVEで、上記Ｏ2センサ出力電圧平均値Ｏ２ＡＶＥが第１の判定値ＬＶＬO2AVEに達していないときには、触媒保護のための燃料増量領域すなわちフル増量領域であるにも係わらず、Ｏ2センサ２９の出力電圧Ｏ２Ｓが継続的にリーン出力を示しており、所定気筒に毎回連続失火が発生していると判断して、ステップS64へ進み、上記気筒別失火フラグＦMIS#iにより特定される該当気筒の毎回連続失火と確定し、最終的な失火診断結果を表しバックアップＲＡＭ４４にストアされる該当気筒の毎回連続失火確定を示す気筒別失火判定ＮＧフラグＦNG#iをセットして（ＦNG#i←０）、失火診断ルーチン（図５）のステップS37へ進む。
【０１３０】
また、上記ステップS62においてＯ２ＡＶＥ≧ＬＶＬO2AVEのときには、ステップS63へ進み、上記Ｏ2センサ出力電圧積算ルーチンにおいて積算されたＯ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓを読み出し、この所定期間における上記Ｏ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓを、該絶対値積算値ＤＯ２Ｓにより失火を判定するための第２の判定値ＬＶＬDO2Sと比較する。
【０１３１】
そして、ＤＯ２Ｓ＞ＬＶＬDO2Sで、上記Ｏ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓが第２の判定値ＬＶＬDO2Sよりも大きいときには、所定気筒の毎回連続失火による空燃比変動によりＯ2センサ出力電圧Ｏ２Ｓが変動しており、従って、所定気筒に毎回連続失火が生じていると判断して、同様に、上記ステップS64へ進み、上記気筒別失火フラグＦMIS#iにより特定される該当気筒の毎回連続失火と確定し、バックアップＲＡＭ４４にストアされる該当気筒の毎回連続失火確定を示す気筒別失火判定ＮＧフラグＦNG#iをセットして、失火診断ルーチンのステップS37へ進む。
【０１３２】
すなわち、エンジン回転変化による失火判定によって、特定気筒の毎回連続失火が判別されたとき、更にＯ2センサ出力電圧Ｏ２Ｓに基づく失火判定を行って失火を検証し、このＯ2センサ出力電圧Ｏ２Ｓによる失火判定により失火を判別したとき、上記特定気筒の毎回連続失火と確定する。
【０１３３】
ここで、エンジン運転状態が触媒保護のための燃料増量領域すなわちフル増量領域にあっても、上述のように、前記フル増量係数ＫFULLは、エンジン高負荷高回転であるほど、大きい値に設定され、このフル増量係数ＫFULLによる燃料増量が大きく、エンジン低回転或いはエンジン低負荷側に移行するほどフル増量係数ＫFULLは小さい値に設定され、燃料増量が少なくなる。
【０１３４】
上記フル増量係数ＫFULLの値が小さく燃料増量が少ないときの、無失火時のＯ2センサ出力電圧Ｏ２Ｓと特定気筒に毎回連続失火が生じている時のＯ2センサ出力電圧Ｏ２Ｓとの関係を、点火回数ＣIGNを時間軸とした図１２のタイムチャートに示す。
【０１３５】
同図に示すように、無失火時は、上記フル増量係数ＫFULLによる燃料増量によりＯ2センサ出力電圧Ｏ２Ｓが略一定のリッチ出力となり、失火時は、排気ガス中の酸素濃度が増大しＯ2センサ出力電圧Ｏ２Ｓはリーン出力を継続する。
【０１３６】
従って、このＯ2センサ出力電圧Ｏ２Ｓを平均した上記Ｏ2センサ出力電圧平均値Ｏ２ＡＶＥは、無失火時には大きく、特定気筒の毎回連続失火時には、小さくなる。
【０１３７】
これに対し、上記Ｏ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓは、フル増量係数ＫFULLの値が小さく燃料増量が少ないときには、失火の有無に係わらずＯ2センサ出力電圧Ｏ２Ｓの変動が少ないため、図１３に示すように、無失火時および失火時共に、小さな値となる。従って、燃料増量が少ないときには、上記Ｏ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓによる失火判定は、困難である。
【０１３８】
すなわち、フル増量係数ＫFULLの値が小さく燃料増量が少ないときには、上記Ｏ2センサ出力電圧平均値Ｏ２ＡＶＥによって失火を判断することが可能であり、このとき、Ｏ2センサ出力電圧平均値Ｏ２ＡＶＥが上記第１の判定値ＬＶＬO2AVEを下回ることで所定気筒に毎回連続失火が生じていることを判断できる。
【０１３９】
尚、Ｏ2センサ出力電圧Ｏ２Ｓのみによる失火判別では、無失火と所定気筒の毎回連続失火しか判別できず毎回連続失火を生じている気筒を特定することはできないが、上述のエンジン回転変化による失火判定により失火気筒が特定されているため、このエンジン回転変化による失火判定とＯ2センサ出力電圧Ｏ２Ｓによる失火判定とを併用することで、エンジン高回転域においても、毎回連続失火を生じている失火気筒を確実に特定することができる。
【０１４０】
一方、上記フル増量係数ＫFULLの値が大きく燃料増量が大きいときの、無失火時のＯ2センサ出力電圧Ｏ２Ｓと特定気筒に毎回連続失火が生じている時のＯ2センサ出力電圧Ｏ２Ｓとの関係を、図１４のタイムチャートに示す。
【０１４１】
図１４に示すように、無失火時は、上記フル増量係数ＫFULLによる燃料増量によりＯ2センサ出力電圧Ｏ２Ｓが略一定のリッチ出力となる。また、所定気筒の毎回連続失火時は、失火により排気ガス中の酸素濃度が増大しても、燃料増量が大きいときにはベース空燃比のリッチの度合いが大きいため、Ｏ2センサ出力電圧Ｏ２Ｓは、なおもリッチ出力となる。しかし、失火による空燃比変動により、Ｏ2センサ出力電圧Ｏ２Ｓは変動する。
【０１４２】
従って、燃料増量が大きいときには、Ｏ2センサ出力電圧Ｏ２Ｓが失火の有無に係わらずリッチ出力となるため、このＯ2センサ出力電圧Ｏ２Ｓを平均したＯ2センサ出力電圧平均値Ｏ２ＡＶＥは、無失火時と失火時共にリッチとなり、且つ、その差が小さい。このため、燃料増量が大きいときには、上記Ｏ2センサ出力電圧平均値Ｏ２ＡＶＥによる失火判定は、困難である。
【０１４３】
これに対し、図１５に示すように、上記Ｏ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓは、無失火時には、Ｏ2センサ出力電圧Ｏ２Ｓが略一定のリッチ出力で変動が少ないため、小さい。また、毎回連続失火時には、Ｏ2センサ出力電圧Ｏ２Ｓの変動によりＯ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓは大きくなる。
【０１４４】
従って、フル増量係数ＫFULLの値が大きく燃料増量が大きいときには、上記Ｏ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓによって失火を判断することが可能であり、このとき、Ｏ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓが上記第２の判定値ＬＶＬDO2Sを超えることで所定気筒に毎回連続失火が生じていることを判断できる。
【０１４５】
すなわち、上記Ｏ2センサ出力電圧平均値Ｏ２ＡＶＥとＯ2センサ出力電圧変化量の絶対値積算値との双方を判断することで、フル増量係数ＫFULLによる燃料増量の相違に係わらず、適切に失火を判断することが可能となる。
【０１４６】
一方、上記ステップS63において、ＤＯ２Ｓ≦ＬＶＬDO2Sのとき、すなわち、Ｏ２ＡＶＥ≧ＬＶＬO2AVE且つＤＯ２Ｓ≦ＬＶＬDO2Sのときには、触媒保護のための燃料増量領域すなわちフル増量領域に対応して、Ｏ2センサ２９の出力電圧Ｏ２Ｓが継続的にリッチ出力を示しており、且つ、毎回連続失火による空燃比変動も生じておらず、何れの気筒にも毎回連続失火が発生していないと判断し、ステップS65へ進み、バックアップＲＡＭ４４にストアされ気筒毎の毎回連続失火確定を示す全ての気筒別失火判定ＮＧフラグＦNG#1，ＦNG#2，ＦNG#3，ＦNG#4をクリアして、失火診断ルーチンのステップS37へ進む。
【０１４７】
すなわち、上述のエンジン回転変化による失火判定により特定気筒の毎回連続失火と判断されたとしても、Ｏ2センサ出力電圧Ｏ２Ｓに基づく失火判定によって無失火と判断された場合には、このエンジン回転変化による失火判定結果は、クランクロータやクランク角センサの製造許容誤差及び取付許容誤差等、並びに各気筒毎に燃焼圧のばらつきに起因するエンジン回転速度のばらつきの影響によるものと判断する。そして、このときには、Ｏ2センサ出力電圧Ｏ２Ｓに基づく検証によって無失火と確定する。
【０１４８】
そして、以上の失火検証サブルーチンの終了により、失火診断ルーチンのステップS37へ進むと（図５参照）、バックアップＲＡＭ４４にストアされた各気筒毎の上記気筒別失火判定ＮＧフラグＦNG#iを参照し、各気筒の気筒別失火判定ＮＧフラグＦNG#1，ＦNG#2，ＦNG#3，ＦNG#4のうち、何れかのフラグがセットされているときには、ステップS38へ進み、点滅周期の長短、所定期間における点滅回数、或いはこれらの組合せによる所定の点滅コードで、警報ランプ３８を点滅させ、失火の発生を運転者に報知する。そして、次回の診断に備え、上記ステップS40〜S44を経て、各気筒の差回転積算値ΣＤＥＬＮＥ#i、点火回数ＣIGN、Ｏ2センサ出力電圧積算値ΣＯ２Ｓ、Ｏ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓ、Ｏ2センサ出力電圧サンプリング回数ＣO2Sをそれぞれクリアし、ルーチンを抜ける。
【０１４９】
一方、上記ステップS37においてＦNG#i＝０で、全ての気筒の気筒別失火判定ＮＧフラグＦNG#1，ＦNG#2，ＦNG#3，ＦNG#4がクリアされており、全ての気筒＃１〜＃４について毎回連続失火が生じていないときには、ステップS39へ進み、無失火により上記警報ランプ３８の所定点滅コードによる点滅を中止し、上記ステップS40〜S44を経て、ルーチンを抜ける。
【０１５０】
その結果、所定気筒に失火が生じているときには、警報ランプ３８の点滅によって報知され、運転者は容易に失火が生じていることを判断することができる。
【０１５１】
また、ディーラ等のサービス工場でのトラブルシューティングの際に、外部接続用コネクタ５５にシリアルモニタ６０を接続することで、シリアルモニタ６０によってＥＣＵ４０における各気筒毎の気筒別失火判定ＮＧフラグＦNG#iによるトラブルデータを読み出して、どの気筒が失火を生じているのかを簡単且つ的確に判断することができる。
【０１５２】
そして、該当個所を修理後、上記シリアルモニタ６０により上記気筒別失火判定ＮＧフラグＦNG#iをクリアする。尚、本実施の形態においては、該当箇所の修理後、シリアルモニタ６０によって上記気筒別失火判定ＮＧフラグＦNG#iをクリアしなくても、正常状態への復帰により無失火となれば、上記失火診断ルーチンにおいて、各気筒別失火判定ＮＧフラグＦNG#iはクリアされる。
【０１５３】
尚、本実施の形態においては、エンジン回転状態量としてエンジン回転速度（エンジン回転数）を用い、所定周期毎のエンジン回転変化量に基づいて失火を検出するようにしているが、本発明はこれに限定されず、エンジン回転速度に代えてエンジン回転周期、エンジン回転角速度、或いはエンジン回転角加速度を用いるようにしてもよい。
【０１５４】
また、本実施の形態においては、エンジン運転状態が触媒保護のための燃料増量領域にあるとき、エンジン回転変化量とＯ2センサ出力電圧Ｏ２Ｓとの併用により失火を診断しているが、燃料増量領域外のときには、エンジン回転変化量のみによって失火診断を行うようにしてもよい。すなわち、触媒保護のための燃料増量領域外のときには、エンジン高回転域外であり、エンジン高回転域に対して慣性エネルギが小さく失火時のエンジン回転変化量が大きく、また、各気筒毎の燃焼圧のばらつきによる各気筒毎のエンジン回転のばらつきの影響が小さい。従って、このときには、エンジン回転変化量のみによって失火診断を行っても、診断精度上、問題ない。
【０１５８】
【発明の効果】
以上説明したように請求項１記載の発明によれば、所定クランク角毎のエンジン回転状態量を検出すると共に、現在の燃焼行程気筒を判別し、前回検出したエンジン回転状態量から今回検出したエンジン回転状態量を減算して上記燃焼行程気筒に対する回転状態量の差を算出する。そして、所定期間における各気筒毎の上記差回転状態量を平均処理して各気筒毎の差回転状態量平均値を算出し、これら各差回転状態量平均値のうちの最大値と各気筒毎の差回転状態量平均値との差をそれぞれ算出する。そして、この最大値に対する各気筒毎の平均値差を失火判定レベルと比較し、該失火判定レベルよりも平均値差が大きい気筒を失火気筒と判別する。更に、空燃比センサの出力値に基づいて失火を判別し、失火を判別したとき、上記失火気筒の毎回失火と確定して当該気筒の毎回失火と診断するので、エンジン回転変化による失火判別に際し、エンジン回転状態量の変化として気筒毎の回転状態量の差を直接用いず、所定期間における各気筒毎の差回転状態量平均値を採用するため、スナッチや外乱等による一時的なエンジン回転変動の影響を排除し、且つ、加速等による一時的な失火による影響を排除することができる。また、各差回転状態量平均値のうちの最大値と各気筒毎の差回転状態量平均値との差をそれぞれ算出し、この最大値に対する各気筒毎の平均値差を最終的な失火パラメータとするため、特定気筒の毎回連続失火を的確に反映させることができる。
【０１５９】
更に、この最大値に対する各気筒毎の平均値差を失火判定レベルと比較して、気筒毎の毎回連続失火を判断するので、気筒毎の差回転状態量平均値を判定値（失火判定レベル）と比較して失火診断を行うよりも、毎回連続失火を表す失火パラメータとしての気筒毎の上記平均値差は、毎回連続失火の有無に応じて大きく変化しダイナミックレンジが大きく、従って、より的確に気筒別に毎回連続失火を判別することができる効果を有する。
【０１６０】
その際、請求項２記載の発明では、エンジン運転状態が触媒保護のための燃料増量領域にあるとき、エンジン回転状態量と空燃比センサ出力電圧とによる失火判別を行う。すなわち、触媒保護のための燃料増量領域はエンジン高回転域に適合し、この燃料増量領域下で無失火時には、燃料増量によって燃焼後の排気ガス空燃比がリッチとなり空燃比センサ出力値がほぼ一定のリッチ出力となり、また、燃焼が行われない失火時には、排気ガス中の酸素濃度が増大するため、空燃比センサ出力値が略リーン出力となる。従って、この触媒保護のための燃料増量領域においては、無失火時と失火時との空燃比センサ出力値の差が大きく、請求項２記載の発明によれば、上記請求項１記載の発明の効果に加え、エンジン回転変化による失火判別結果を、空燃比センサ出力値に基づいて確実に検証することができる効果を有する。
【０１６１】
請求項３記載の発明では、所定周期毎に上記空燃比センサの出力電圧及び該出力電圧の変化量の絶対値を各々積算する。そして、空燃比センサの出力値による失火診断に際し、エンジン運転状態が触媒保護のための燃料増量領域にあるとき、所定期間における上記空燃比センサ出力電圧の積算値に基づいて空燃比センサ出力電圧平均値を算出し、該空燃比センサ出力電圧平均値が第１の判定値に達していないとき、或いは、所定期間における上記空燃比センサ出力電圧変化量の絶対値積算値が第２の判定値よりも大きいとき、失火と判別するので、上記請求項１記載の発明の効果に加え、エンジン運転状態が触媒保護のための燃料増量領域にあって、燃料増量が少ないときには、失火の有無が所定期間における空燃比センサ出力電圧平均値に確実に反映されるため、この空燃比センサ出力電圧と第１の判定値との比較によって失火を的確に判断することができ、また、燃料増量が大きいときには、所定期間における空燃比センサ出力電圧変化量の絶対値積算値に失火の有無が確実に反映され、空燃比センサ出力電圧変化量の絶対値積算値と第２の判定値との比較によって失火を的確に判断することができ、従って、燃料増量の相違に係わらず、適切に失火を判断することができる効果を有する。
【０１６２】
また、請求項４記載の発明では、上記各平均値を所定期間における単純平均によって算出するため、上記請求項１ないし請求項３記載の発明の効果に加え、失火診断に係るＣＰＵの演算負担を著しく低減することができる効果を有する。
【０１６３】
請求項５記載の発明では、上記所定期間を、点火回数が所定回数に達する毎の期間とするので、上記請求項１ないし請求項４記載の発明の効果に加え、失火回数に直接依存する点火回数を採用し、この点火回数によって失火診断の実行期間周期が定められるため、スナッチや外乱等による影響、加速等による一時的な失火による影響を排除して、所定気筒の恒常的な失火すなわち所定気筒の毎回連続失火を確実に診断することができる効果を有する。
【０１６４】
その際、請求項６記載では、上記回転状態量としてエンジン回転速度を用いるので、上記請求項１ないし請求項５記載の発明を、従来のエンジンの失火診断装置に極めて容易に組み込むことができ、失火診断精度を向上することができる効果を有する。
【図面の簡単な説明】
【図１】本発明の基本構成図
【図２】気筒判別／エンジン回転速度算出ルーチンのフローチャート
【図３】差回転算出ルーチンのフローチャート
【図４】Ｏ2センサ出力電圧積算ルーチンのフローチャート
【図５】失火診断ルーチンのフローチャート
【図６】エンジン回転変化に基づく失火判別による失火気筒検出サブルーチンのフローチャート
【図７】Ｏ2センサ出力電圧に基づく失火検証サブルーチンのフローチャート
【図８】クランクパルス、カムパルス、燃焼行程気筒、点火タイミング、及び燃料噴射タイミングの関係を示すタイムチャート
【図９】各気筒毎の差回転の算出状態を示すタイミングチャート
【図１０】フル増量係数テーブルの説明図
【図１１】各気筒毎の差回転ＤＥＬＮＥ#i、差回転平均値ＤＮＡＶＥ#i、最大値ＤＮＡＶＥＭＡＸ、及び、最大値ＤＮＡＶＥＭＡＸに対する各気筒毎の平均値差ＳＤＮＡＶＥ#iの関係を示すタイムチャート
【図１２】燃料増量が少ないときの、無失火時のＯ2センサ出力電圧Ｏ２Ｓと特定気筒に毎回連続失火が生じている時のＯ2センサ出力電圧Ｏ２Ｓとの関係を示すタイムチャート
【図１３】燃料増量が少ないときの、無失火時のＯ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓと特定気筒に毎回連続失火が生じている時のＯ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓとの関係を示すタイムチャート
【図１４】燃料増量が大きいときの、無失火時のＯ2センサ出力電圧Ｏ２Ｓと特定気筒に毎回連続失火が生じている時のＯ2センサ出力電圧Ｏ２Ｓとの関係を示すタイムチャート
【図１５】燃料増量が大きいときの、無失火時のＯ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓと特定気筒に毎回連続失火が生じている時のＯ2センサ出力電圧変化量の絶対値積算値ＤＯ２Ｓとの関係を示すタイムチャート
【図１６】エンジンの全体概略図
【図１７】クランクロータとクランク角センサの正面図
【図１８】カムロータとカム角センサの正面図
【図１９】電子制御系の回路構成図
【符号の説明】
１  エンジン
２９  Ｏ2センサ（空燃比センサ）
３２  クランク角センサ
４０  電子制御装置（回転状態量変化検出手段、気筒判別手段、第１の失火判別手段、第２の失火判別手段、失火診断手段、差回転状態量算出手段、差回転状態量平均値算出手段、積算手段）
ＮE  エンジン回転速度（エンジン回転状態量）
ＤＥＬＮＥ  差回転（エンジン回転状態量の変化）
ＬＶＬＭＩＳ  失火レベル
Ｏ２Ｓ  Ｏ2センサ出力電圧（空燃比センサの出力値；空燃比センサの出力電圧）
＃ｎ  現在の燃焼行程気筒
ＭＮＸｎ  現在の燃焼行程気筒＃ｎに対応するエンジン回転速度（今回検出したエンジン回転状態量）
ＭＮＸｎ-1  １燃焼行程前の気筒＃ｎ-1に対応するエンジン回転速度（前回検出したエンジン回転状態量）
ＤＥＬＮＥ#n  現在の燃焼行程気筒＃ｎに対する差回転（燃焼行程気筒に対する回転状態量の差）
ＤＥＬＮＥ#i  各気筒毎の差回転（各気筒毎の差回転状態量）
ＤＮＡＶＥ#i  各気筒毎の差回転平均値（各気筒毎の差回転状態量平均値）
ＤＮＡＶＥＭＡＸ  最大値（各差回転状態量平均値のうちの最大値）
ＳＤＮＡＶＥ#i  最大値に対する各気筒毎の平均値差
Ｏ２ＡＶＥ  Ｏ2センサ出力電圧平均値（空燃比センサ出力電圧平均値）
ＬＶＬO2AVE  第１の判定値
ＤＯ２Ｓ  Ｏ2センサ出力電圧変化量の絶対値積算値（空燃比センサ出力電圧変化量の絶対値積算値）
ＬＶＬDO2S  第２の判定値
ＣIGN  点火回数
ＩＧＮ  設定回数（所定回数）
【図１】
0003859789.tif 000002
【図２】
0003859789.tif 000003
【図３】
0003859789.tif 000004
【図４】
0003859789.tif 000005
【図５】
0003859789.tif 000006
【図６】
0003859789.tif 000007
【図７】
0003859789.tif 000008
【図８】
0003859789.tif 000009
【図９】
0003859789.tif 000010
【図１０】
0003859789.tif 000011
【図１１】
0003859789.tif 000012
【図１２】
0003859789.tif 000013
【図１３】
0003859789.tif 000014
【図１４】
0003859789.tif 000015
【図１５】
0003859789.tif 000016
【図１６】
0003859789.tif 000017
【図１７】
0003859789.tif 000018
【図１８】
0003859789.tif 000019
【図１９】
0003859789.tif 000020