JP3555689B2 - 多気筒エンジンの燃料噴射制御方法 - Google Patents
多気筒エンジンの燃料噴射制御方法 Download PDFInfo
- Publication number
- JP3555689B2 JP3555689B2 JP16362893A JP16362893A JP3555689B2 JP 3555689 B2 JP3555689 B2 JP 3555689B2 JP 16362893 A JP16362893 A JP 16362893A JP 16362893 A JP16362893 A JP 16362893A JP 3555689 B2 JP3555689 B2 JP 3555689B2
- Authority
- JP
- Japan
- Prior art keywords
- injection
- job
- injection start
- section
- cylinder
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02T—CLIMATE CHANGE MITIGATION TECHNOLOGIES RELATED TO TRANSPORTATION
- Y02T10/00—Road transport of goods or passengers
- Y02T10/10—Internal combustion engine [ICE] based vehicles
- Y02T10/40—Engine management systems
Landscapes
- Combined Controls Of Internal Combustion Engines (AREA)
- Electrical Control Of Air Or Fuel Supplied To Internal-Combustion Engine (AREA)
Description
【0001】
【産業上の利用分野】
本発明は、噴射開始区間毎の有効噴射幅の噴射開始時期を適正に設定する多気筒エンジンの燃料噴射制御方法に関する。
【0002】
【従来の技術】
近年、自動車などの車輛にマイクロコンピュータが導入され、エンジン、パワートレイン等を高精度に制御することが可能になった。これにより、車輛制御システムの開発においては、マイクロコンピュータのソフトウエア開発が大きな比重を占めるようになり、制御アルゴリズム上の処理の効率化が重要な課題となっている。特に、最近のエンジン制御系では制御内容が複雑化しており、CPUの効率的な活用はエンジン制御性の向上を図る上でも重要である。
【0003】
従来、上記マイクロコンピュータによるエンジン制御システムにおける燃料の噴射開始時期は、例えば特開昭61−160545号公報に開示されているように、一定クランク角毎に入力するクランクパルスをカウントしてエンジンの回転角位置を検出し、その検出値に基づいて設定するもの(いわゆる角度制御)、あるいは所定クランク角度間で計時した間隔時間に基づき噴射開始時期を設定するもの(いわゆる時間制御)などがある。
【0004】
【発明が解決しようとする課題】
ところで、従来の多気筒エンジンにおけるシーケンシャル燃料噴射制御は各気筒1サイクル当り1回噴射が一般的で、各気筒1サイクル中に必要とする燃料噴射幅が設定されれば、例えば噴射エンド制御(噴射終了時期を一定にする制御)では、上記燃料噴射幅に基づき噴射エンドクランク角からどのくらい前のクランク角で燃料噴射を開始すれば良いかを一義的に求めることになる。
【0005】
しかし、例えば低負荷運転時等では、燃料噴射幅が短いため噴射エンド制御により1回噴射を実行すると、燃料が充分に気化されないまま燃焼室に供給されることになり、燃焼効率が悪くエンジン回転の不安定化を招く。
【0006】
本発明は上記事情に鑑みてなされたもので、各気筒1サイクル当りの噴射回数を1回あるいは複数回設定できるとともに、各噴射開始区間における有効噴射幅、噴射開始時期及び1サイクルにおける噴射エンド等を適正に設定することができて燃焼効率及び空燃比制御性の良い多気筒エンジンの燃料噴射制御定方法を提供することを目的としている。
【0007】
【課題を解決するための手段】
上記目的を達成するため本発明による多気筒エンジンの燃料噴射制御方法は、多気筒エンジンの各気筒毎の1サイクルを、吸気行程後半、吸気行程前半、排気行程後半、排気行程前半、燃焼行程後半、燃焼行程前半、圧縮行程後半、圧縮行程前半に区分し、噴射制御を行わない上記吸気行程後半を除く各区間を、噴射開始区間として定義し、「上記噴射開始区間の数+1」個のビットからなり、気筒数分の、各ビットが各噴射区間を表す噴射開始区間設定フラグを用い、噴射開始セット時間に基づき上記各噴射開始区間の中から少なくとも1つの噴射開始区間を上記噴射開始区間設定フラグにより指定し、複数の噴射開始区間を指定した場合、指定した最終の噴射開始区間より前の噴射開始区間での噴射すべき有効噴射幅を、1サイクル中の要求噴射幅を指定した噴射開始区間の数により分割した値で設定し、また最終の噴射開始区間での噴射すべき最終有効噴射幅を1サイクル中に必要とする要求噴射幅と上記最終より前の噴射開始区間で噴射した有効噴射幅の合計との差分に応じて設定し、上記最終より前の噴射開始区間での燃料噴射を当該噴射開始区間の始まりから開始し、また最終の噴射開始区間での燃料噴射開始時期を、上記噴射開始セット時間から噴射開始区間の間隔時間の正数倍を減算してゼロ或いは負の値を示したときの2の補数に基づき上記最終の噴射開始区間の始まりから起算して設定することを特徴とする。
【0008】
【作用】
本発明は、多気筒エンジンの各気筒毎の1サイクルを、吸気行程後半、吸気行程前半、排気行程後半、排気行程前半、燃焼行程後半、燃焼行程前半、圧縮行程後半、圧縮行程前半の各噴射開始区間に区分する。そして、噴射制御を行わない吸気行程後半を除く各区間を、噴射開始区間として定義し、「上記噴射開始区間の数+1」個のビットからなり、気筒数分の、各ビットが各噴射区間を表す噴射開始区間設定フラグを用い、噴射開始セット時間に基づき上記各噴射開始区間の中から少なくとも1つの噴射開始区間を上記噴射開始区間設定フラグにより指定する。
【0009】
そして、複数の噴射開始区間を指定した場合は、指定した最終の噴射開始区間より前の噴射開始区間での噴射すべき有効噴射幅を、1サイクル中の要求噴射幅を指定した噴射開始区間の数により分割した値で設定する。また最終の噴射開始区間での噴射すべき最終有効噴射幅を1サイクル中に必要とする要求噴射幅と上記最終より前の噴射開始区間で噴射した有効噴射幅の合計との差分に応じて設定する。
【0010】
そして、最終より前の噴射開始区間での燃料噴射を当該噴射開始区間の始まりから開始し、また最終の噴射開始区間における燃料噴射開始時期を、上記噴射開始セット時間から噴射開始区間の間隔時間の正数倍を減算してゼロ或いは負の値を示したときの2の補数に基づき上記最終の噴射開始区間の始まりから起算して設定する。
【0011】
【実施例】
以下、図面に基づいて本発明の実施例を説明する。
【0012】
図面は本発明の一実施例に係り、図1は0.5ms毎の定期割込み処理を示すフローチャート、図2はクラセン割込み処理を示すフローチャート、図3はジョブ優先処理を示すフローチャート、図4〜図7はジョブ実行サブルーチンを示すフローチャート、図8はクランク位置算出サブルーチンを示すフローチャート、図9はCCAS・RCAS判別サブルーチンを示すフローチャート、図10、図11は燃料噴射開始時期の算出ルーチンを示すフローチャート、図12は噴射タイマセットサブルーチンを示すフローチャート、図13、図14は噴射タイマセットマクロ1ルーチンを示すフローチャート、図15、図16は噴射タイマセットマクロ2ルーチンを示すフローチャート、図17はジョブの実行状態を示す説明図、図18はジョブフラグの説明図、図19はジョブ実行中フラグとオーバーラップカウンタの変化を示す説明図、図20はシステムシフトバッファの説明図、図21はクラセン間隔テーブルの説明図、図22は気筒・クランク位置状態マップの説明図、図23はクランク位置、カム位置とクランク位置変数、噴射開始区間テーブル及び気筒別行程順のタイムチャート、図24は噴射開始区間、及び噴射開始区間設定フラグの説明図、図25は噴射タイマコントロールを示すタイムチャート、図26はエンジン系の概略構成図、図27はクランクロータとクランク角センサの正面図、図28はカムロータとカム角センサの正面図、図29は電子制御系の回路構成図である。
【0013】
本実施例のエンジン制御システムでは、図29に示すマイクロコンピュータを中核とした電子制御装置(ECU)50によって図26に示すエンジン系が制御され、燃料噴射制御、点火時期制御などが行われる。このECU50のマイクロコンピュータには、新しい概念に基づくオペレーティングシステム(OS)が搭載されており、このOSの管理下で、各制御ストラテジーに基づく各ジョブが、それぞれの優先レベルに従って実行される。
【0014】
まず、エンジン系の機器構成について説明する。
【0015】
図26において符号1はエンジン(本実施例においては水平対向4気筒エンジン)であり、右バンクR側に#1,#3気筒を、左バンクL側に#2,#4気筒を備える。そして、シリンダブロック1aの左右両バンクに併設するシリンダヘッド2の吸気ポート2aにインテークマニホルド3が連通され、このインテークマニホルド3の上流にエアチャンバ4を介してスロットル通路5が連通されている。このスロットル通路5の上流側には、吸気管6を介してエアクリーナ7が取付けられ、このエアクリーナ7が吸入空気の取入れ口であるエアインテークチャンバ8に連通されている。
【0016】
また、上記排気ポート2bにエキゾーストマニホルド9を介して排気管10が連通され、この排気管10に触媒コンバータ11が介装されてマフラ12に連通されている。一方、上記スロットル通路5にスロットルバルブ5aが設けられ、このスロットル通路5の直上流の上記吸気管6にインタークーラ13が介装され、さらに、上記吸気管6の上記エアクリーナ7の下流側にレゾネータチャンバ14が介装されている。
【0017】
また、上記レゾネータチャンバ14と上記インテークマニホルド3とを連通して上記スロットルバルブ5aの上流側と下流側とをバイパスするバイパス通路15に、アイドルスピードコントロールバルブ(ISCV)16が介装されている。さらに、このISCV16の直下流側に、吸気圧が負圧のとき開弁し、またターボチャージャ18によって過給されて吸気圧が正圧になったとき閉弁するチェックバルブ17が介装されている。
【0018】
上記ターボチャージャ18は、上記吸気管6の上記レゾネータチャンバ14の下流側にコンプレッサが介装され、タービンが上記排気管10に介装されている。さらに、上記ターボチャージャ18のタービンハウジング流入口には、ウエストゲート弁19が介装され、このウエストゲート弁19には、ウエストゲート弁作動用アクチュエータ20が連設されている。
【0019】
上記ウエストゲート弁作動用アクチュエータ20は、ダイヤフラムにより2室に仕切られ、一方がウエストゲート弁制御用デューティソレノイド弁21に連通される圧力室を形成し、他方が上記ウエストゲート弁19を閉方向に付勢するスプリングを収納したスプリング室を形成している。
【0020】
上記ウエストゲート弁制御用デューティソレノイド弁21は、上記レゾネータチャンバ14と上記吸気管6の上記ターボチャージャ18のコンプレッサ下流とを連通する通路に介装されており、ECU50から出力される制御信号のデューティ比に応じて、上記レゾネータチャンバ14側の圧力と上記コンプレッサ下流側の圧力とを調圧し、上記ウエストゲート弁作動用アクチュエータ20の圧力室に供給する。
【0021】
すなわち、上記ECU50によって上記ウエストゲート弁制御用デューティソレノイド弁21を制御し、上記ウエストゲート弁作動用アクチュエータ20を作動させて上記ウエストゲート弁19による排気ガスリリーフを調整することにより、上記ターボチャージャ18による過給圧を制御するようになっている。
【0022】
また、上記インテークマニホルド3に絶対圧センサ22が通路23を介して連通され、この通路23に、上記絶対圧センサ22と上記インテークマニホルド3或は大気とを選択的に連通する吸気管圧力/大気圧切換ソレノイド弁24が介装されている。
【0023】
さらに、上記インテークマニホルド3の各気筒の各吸気ポート2aの直上流側にインジェクタ25が臨まされ、また、上記シリンダヘッド2の各気筒毎に、その先端を燃焼室に露呈する点火プラグ26aが取付けられ、この点火プラグ26aに連設された点火コイル26bにイグナイタ27が接続されている。
【0024】
上記インジェクタ25には、燃料タンク28内に設けたインタンク式の燃料ポンプ29から燃料フィルタ30を経て燃料が圧送され、プレッシャレギュレータ31にて調圧される。
【0025】
また、上記吸気管6の上記エアークリーナ7の直下流に吸入空気量センサ32が介装され、上記スロットルバルブ5aに、スロットル開度センサ33aとアイドルスイッチ33bとを内蔵したスロットルセンサ33が連設されている。
【0026】
さらに、上記エンジン1のシリンダブロック1aにノックセンサ34が取付けられるとともに、このシリンダブロック1aの左右両バンクを連通する冷却水通路35に冷却水温センサ36が臨まされ、上記排気管10の上記エキゾーストマニホルド9の集合部にO2 センサ37が臨まされている。
【0027】
また、上記シリンダブロック1aに支承されたクランクシャフト1bにクランクロータ38が軸着され、このクランクロータ38の外周に、電磁ピックアップなどからなるクランク角センサ39が対設されている。さらに、上記エンジン1のカムシャフト1cに連設するカムロータ40に、電磁ピックアップなどからなる気筒判別用のカム角センサ41が対設されている。尚、上記クランク角センサ39及び上記カム角センサ41は、電磁ピックアップなどの磁気センサに限らず、光センサなどでも良い。
【0028】
上記クランクロータ38は、図27に示すように、その外周に突起38a,38b,38cが形成され、これらの各突起38a,38b,38cが、各気筒(#1,#2と#3,#4)の圧縮上死点前(BTDC)θ1,θ2,θ3 の位置に形成されている。尚、本実施例においては、θ1 =97°CA、θ2 =65°CA、θ3 =10°CAである。
【0029】
上記クランクロータ38の各突起は、上記クランク角センサ39によって検出され、図23に示すようにBTDC97°,65°,10°CAのクランク角信号(クラセン信号)がエンジン1/2回転毎(180°CA毎)に出力される。そして、各信号の入力間隔時間がタイマによって計時され、エンジン回転数が算出される。上記突起38bは、点火時期設定の際の基準クランク角となり、また、突起38cは、始動時噴射開始時期の基準クランク角となるとともに始動時の固定点火時期を示すクランク角となる。
【0030】
また、図28に示すように、上記カムロータ40の外周には、気筒判別用の突起40a,40b,40cが形成され、突起40aが#3,#4気筒の圧縮上死点後(ATDC)θ4 の位置に形成され、突起40bが3個の突起で構成されて最初の突起が#1気筒のATDCθ5 の位置に形成されている。さらに、突起40cが2個の突起で形成され、最初の突起が#2気筒のATCDθ6 の位置に形成されている。尚、本実施例においては、θ4 =20°CA、θ5 =5°CA、θ6 =20°CAである。
【0031】
そして、上記カムロータ40の各突起が上記カム角センサ41によって検出され、各気筒の燃焼行程順を#1→#3→#2→#4とした場合、この燃焼行程順と、上記カム角センサ41の検出信号をカウンタによって計数した値とのパターン(図23のタイムチャート参照)に基づいて、気筒判別がなされる。
【0032】
一方、図29に示すように、ECU50は、燃料噴射制御、点火時期制御などを行なうメインコンピュータ51と、ノック検出処理を行なう専用のサブコンピュータ52との2つのコンピュータを中心として構成され、各部に所定の安定化電源を供給する定電圧回路53や各種の周辺回路が組込まれている。
【0033】
上記定電圧回路53は、ECUリレー54のリレー接点を介してバッテリ55に接続され、このバッテリ55に、上記ECUリレー54のリレーコイルがイグニッションスイッチ56を介して接続されている。また、上記バッテリ55には、上記定電圧回路53が直接接続され、さらに、燃料ポンプリレー57のリレー接点を介して燃料ポンプ29が接続されている。
【0034】
すなわち、上記定電圧回路53は、上記イグニッションスイッチ56がONされ、上記ECUリレー54のリレー接点が閉となったとき、制御用電源を供給し、また、上記イグニッションスイッチ56がOFFされたとき、バックアップ用の電源を供給する。
【0035】
上記メインコンピュータ51は、CPU58(以下、メインCPU58と称する)、ROM59、RAM60、上記イグニッションスイッチ56がOFFされたときにも上記定電圧回路53からバックアップ電源が供給されてデータを保持するバックアップRAM61、カウンタ・タイマ群62、シリアル通信インターフェースであるSCI63、及び、I/Oインターフェース64がバスライン65を介して接続されたマイクロコンピュータである。
【0036】
尚、上記カウンタ・タイマ群62は、フリーランニングカウンタ、カム角センサ(以下、適宜、カムセンと略記する)信号の入力計数用カムセンカウンタなどの各種カウンタ、噴射タイマ、点火タイマ、後述する0.5ms毎の定期割込みを発生させるための定期割込みタイマ、クランク角センサ(以下、適宜、クラセンと略記する)信号の入力間隔計時用クラセンタイマ、及び、システム異常監視用のウオッチドッグタイマなどの各種タイマを便宜上総称するものであり、上記メインコンピュータ51においては、その他、各種のソフトウエアカウンタ・タイマが用いられる。
【0037】
また、上記サブコンピュータ52も、上記メインコンピュータ51と同様、CPU71(以下、サブCPU71と称する)、ROM72、RAM73、カウンタ・タイマ群74、SCI75、及び、I/Oインターフェース76がバスライン77を介して接続されたマイクロコンピュータであり、上記メインコンピュータ51とサブコンピュータ52とは、上記SCI63,75を介してシリアル通信ラインにより互いに接続されている。
【0038】
上記メインコンピュータ51のI/Oインターフェース64には、入力ポートに、吸入空気量センサ32、スロットル開度センサ33a、水温センサ36、O2 センサ37、絶対圧センサ22、車速センサ42、及び、バッテリ55が、8チャンネル入力のA/D変換器66を介して接続されるとともに、アイドルスイッチ33b、クランク角センサ39、カム角センサ41が接続されており、さらに、始動状態を検出するためにスタータスイッチ43が接続されている。
【0039】
尚、本実施例においては、上記A/D変換器66は、7チャンネル分の入力が使用され、残りの1チャンネルは予備となっている。
【0040】
また、上記I/Oインターフェース64の出力ポートには、イグナイタ27が接続され、さらに、駆動回路67を介して、ISCV16、インジェクタ25、燃料ポンプリレー57のリレーコイル、および、ウエストゲート弁制御用デューティソレノイド弁21、吸気管圧力/大気圧切換ソレノイド弁24が接続されている。
【0041】
一方、上記サブコンピュータ52のI/Oインターフェース76は、入力ポートに、クランク角センサ39、カム角センサ41が接続されるとともに、A/D変換器78、周波数フィルタ79、アンプ80を介してノックセンサ34が接続されており、上記ノックセンサ34からのノック検出信号が上記アンプ80で所定のレベルに増幅された後に上記周波数フィルタ79により必要な周波数成分が抽出され、上記A/D変換器78にてデジタル信号に変換されて入力されるようになっている。
【0042】
上記メインコンピュータ51では、各センサ類からの検出信号を処理し、燃料噴射パルス幅、点火時期などを演算する。すなわち、吸入空気量センサ32の出力信号から吸入空気量を算出し、RAM60及びバックアップRAM61に記憶されている各種データに基づき、吸入空気量に見合った燃料噴射量を演算し、また、点火時期などを算出する。
【0043】
そして、上記燃料噴射量に相応する駆動パルス幅信号を、駆動回路67を介して所定のタイミングで該当気筒のインジェクタ25に出力して燃料を噴射し、また、所定のタイミングでイグナイタ27に点火信号を出力し、該当気筒の点火プラグ26aを点火する。
【0044】
その結果、該当気筒に供給された混合気が爆発燃焼し、エキゾーストマニホルド9の集合部に臨まされたO2 センサ37により排気ガス中の酸素濃度が検出され、この検出信号が波形整形された後、上記メインCPU58で基準値(スライスレベル)と比較され、エンジンの空燃比状態が目標空燃比に対し、リッチ側にあるか、リーン側にあるかが判別され、空燃比が目標空燃比となるようフィードバック制御される。
【0045】
一方、上記サブコンピュータ52では、エンジン回転数とエンジン負荷とに基づいてノックセンサ34からの信号のサンプル区間を設定し、このサンプル区間でノックセンサ34からの信号を高速にA/D変換して振動波形を忠実にデジタルデータに変換し、ノック発生の有無を判定する。
【0046】
上記サブコンピュータ52のI/Oインターフェース76の出力ポートは、上記メインコンピュータ51のI/Oインターフェース64の入力ポートに接続されており、上記サブコンピュータ52でのノック判定結果がI/Oインターフェース76に出力される。そして、上記メインコンピュータ51では、上記サブコンピュータ52からノック発生有りの判定結果が出力されると、SCI63を介してシリアル通信ラインよりノックデータを読込み、このノックデータに基づいて直ちに該当気筒の点火時期を遅らせ、ノックを回避する。
【0047】
このようなエンジン制御において、上記メインコンピュータ51では、各センサ類からの信号入力処理、エンジン回転数算出、吸入空気量算出、燃料噴射量算出、点火時期算出といった各項目毎の各種プログラムが、一つのOSの管理下で効率的に実行される。このOSは、車輌制御のための各種マネジメント機能、及び、このマネジメント機能に密着した内部ストラテジーを有し、各種ジョブを体系的に結合する。
【0048】
上記OSのマネジメント機能としては、
(1−1)ジョブの優先処理
(1ー2)セクション定義による各ジョブの分割ファイル対応
(1−3)スタックの使用状況モニタ機能
(1−4)異常割込み動作のモニタ機能
(1−5)ジョブ毎に固有の制約を作らない標準マップ・標準ワークメモリ設定
などの機能があり、制御ストラテジーの開発環境を向上させるとともに、限られたCPU能力を最大限に発揮させ、デジタル制御理論の基本である等時間間隔処理を可能な限り達成することができる。
【0049】
等時間間隔処理としては、0.5ms毎の定期割込みを基本として、2,4,10,50,250ms毎の5種類の等間隔割込みジョブが用意されており、また、エンジン回転に同期した処理として、クランク角信号入力により即割込み実行される高優先クラセンジョブ(以下、単にクラセンジョブと称する)と、より優先順位が高い他のジョブがないときにクランク角信号入力により割込み実行される比較的緊急度の低い低優先クラセンジョブとが用意されている。
【0050】
これらの各ジョブには、クラセンジョブ>2msジョブ>4msジョブ>10msジョブ>低優先クラセンジョブ>50msジョブ>250msジョブの順で、7〜1の優先レベルが高位側から低位側に向かって付けられており、図17に示すように、高速ジョブに対し低速ジョブが分割して処理されるとともに、各ジョブの多重待ち処理が行なわれる。
【0051】
また、上記OSの下で働く各プログラムは、機能別の領域毎に順番に配列されており、各機能毎にセクション宣言によって名前が付けられている。上記OS下で働く数々のストラテジーファイル(ユーザ側ファイル)は、各機能毎にOSと同じ名前のセクション宣言を用いることにより、開発段階において、例えば、初期値設定処理、10ms毎の処理、バックグランド処理等を別々のファイルに記述しても、各ファイルがリンクされたとき、同じ処理は連続した1つの領域に集められ、OSと融合し一体となって動作する。
【0052】
各ストラテジーファイル側で使用する主なセクション領域は、
○変数宣言領域
○自己ファイル名、ファイル制作時の自動記録領域
○セッティングデータ領域
○クラセンジョブ領域
○2msジョブ領域
○4msジョブ領域
○10msジョブ領域
○低優先クラセンジョブ領域
○50msジョブ領域
○250msジョブ領域
○リセット時初期化ジョブ領域
○エンスト時初期化ジョブ領域
○バックグランドジョブ領域
○プログラム本体の領域
であり、機能毎にファイルを分割してプログラム開発が可能になるとともに、プログラムの構造化記述を可能にする。
【0053】
また、上記OSには、以上のマネジメント機能に密着した内部ストラテジーとして、
(2−1)A/D変換処理
(2−2)クランク位置に係る各種情報の算出
(2−3)デバッグ用シミュレーション機能(エンジン回転及びA/D変換)
(2−4)点火タイマのセット
(2−5)噴射タイマのセット
などの機能を備えており、さらに、これらの機能に係る各種サービスルーチンが各ジョブ中に用意されている。
【0054】
従来、このような機能は各ジョブレベルで達成するようになっていたが、本システムにおいては、すべてOS側に用意され、OS側で処理したA/D変換結果、クランク位置情報、エンジン回転数などに基づいて、ユーザ側の各ジョブで、燃料噴射量、点火時期などを設定すると、これらの指示値がOSによって噴射タイマ、点火タイマにセットされるようになっている。
【0055】
次に、上記メインコンピュータ51における燃料噴射制御の機能を、ジョブ処理の説明を基本として図1〜図16に示すフローチャートに従って説明する。尚、サブコンピュータ52はノック検出処理専用のコンピュータであるため、その動作説明を省略する。
【0056】
まず、イグニッションスイッチ56がONされてシステムに電源が投入されると、リセットに伴うリセット割込みが起動し、各種イニシャライズが行なわれるとともに、0.5ms毎に定期割込みを起動するための定期割込みタイマが起動され、クランク角センサ39からの信号入力毎(BTDC97°,65°,10°CA毎のエンジン1回転に6回)に起動されるクラセン割込みが許可され、その後、バックグランドジョブの実行状態となる。
【0057】
そして、このバックグランドジョブの上で、0.5ms毎の定期割込みと、エンジン1回転に6回のクラセン割込みとにより、7レベルのジョブが優先処理される。この2つの割込みにおいては、各自の処理を実行後、共通のアドレスにジャンプし、ジョブ優先処理を実行する。
【0058】
尚、上記リセット割込みは、内部演算において0による除算を実行した場合や、無限ループが発生した場合など、正常時には発生しない要因によっても、起動される。
【0059】
まず、図1に示す0.5ms毎の定期割込みについて説明する。この定期割込みでは、ステップS100で、OS用ワークエリアを設定し、ステップS101で、ウオッチドッグタイマを初期化すると、ステップS102へ進んで、P−RUNフラグを20回に1回すなわち10ms毎に反転する。このP−RUNフラグは、図示しない保護回路によってシステムが自動的にリセットされないようにするためのフラグであり、システムが正常に動作して一定時間毎(10ms毎)に反転される限り、上記保護回路の作動が阻止される。
【0060】
次いで、ステップS103へ進み、スイッチ出力の転写を行なう。このスイッチ出力は、各ジョブ中でメモリに書き込んだビットのON,OFF値であり、各ジョブからは直接I/Oインターフェース64の出力ポートに出力せず、OS側で0.5ms毎にメモリの値を出力ポートに転写する。
【0061】
次に、ステップS104へ進むと、A/D変換サブルーチンを実行してA/D変換に係る各種設定を行ない、ステップS105で、ジョブフラグ作成サブルーチンを実行して、2,4,10,50,250ms毎の各ジョブ割込み要求を示すジョブフラグJB_FLGを作成した後、ステップS106で、A/D変換をスタートする。
【0062】
上記A/D変換は、基本的に、A/D変換器66の8チャンネル入力が0.5ms毎に所定の変換順番毎に処理され、4ms周期で全入力の変換が行なわれる。但し、特定の1つのチャンネルは、回転脈動が発生する吸入管圧力などをA/D変換するためクランク角90°毎に(0.5msの時間精度で)同期し、変換順番に対して割込んだ形で処理が行なわれ、その後の入力の順番を1つ遅れにする。
【0063】
尚、エンジン回転数3750rpm以上では、A/D変換の最後の順番の入力が完全に停止し、7500rpm以上では、最後から2番目の入力も停止するが、A/D変換の順番は、スロットル開度、吸入空気量など変化の速いものを先として、冷却水温、電圧など比較的変化の遅いものが後になるように設定してあり、且つ、最後のA/D変換順番をクランク同期入力に設定してあるため、特に支障は生じない。
【0064】
また、図18に示すように、上記ジョブフラグJB_FLGは、1バイト変数の各ビットを各ジョブに対応するフラグとして割当てたものであり、複数のジョブ要求が同時に可能なようになっている。この1バイト変数のビット1〜ビット7は優先レベル1〜7に対応し、それぞれ、250msジョブ、50msジョブ、低優先クラセンジョブ、10msジョブ、4msジョブ、2msジョブ、クラセンジョブのフラグに割当てられている。そして、所定のビットが立てられたとき、対応する優先レベルのジョブ割込み要求がなされる。尚、ビット0はバックグランドジョブのフラグに割当てられて通常は参照されない。
【0065】
そして、上記ステップS105でジョブフラグ作成サブルーチンによりジョブフラグJB_FLGを作成し、上記ステップS106でA/D変換をスタートした後は、ステップS107へ進み、ジョブフラグJB_FLGのいずれかのジョブに対応するビットが立っているか否かを調べる。
【0066】
その結果、ジョブフラグJB_FLGのビットが一つも立っていないときには、どのジョブからも要求がないため割込みを終了し、ジョブフラグJB_FLGのいずれかのビットが立っているときには、ステップS108へ進んで、現状レベル(この定期割込みが実行される時点で所定の優先レベルのジョブが実行されていた状態)以下のフラグがないか否かを調べる。
【0067】
上記ステップS108で、現状レベル以下のフラグがないときには、ラベルWAR_JBで示される図3のジョブ優先処理にジャンプし、現状レベル以下のフラグがあるときには、ステップS109で、現状レベル以下のレベルのオーバーラップカウンタOLCを1増加させる。
【0068】
上記オーバーラップカウンタOLCは、ジョブ要求を記憶するためのカウンタであり、各優先レベル毎に1バイト割当てられ、上記ジョブフラグJB_FLGによるジョブ要求時にインクリメント、ジョブ終了時にデクリメントされる。すなわち、カウンタによってジョブ要求を記憶することによりジョブの多重要求に対応することができるのである。
【0069】
次いで、上記ステップS109からステップS110へ進み、現状レベルより高いフラグがないか否かを調べ、現状レベルより高いフラグがないときには、ルーチンを抜けて割込みを終了し、現状レベルより高いフラグがあるときには、ラベルWAR_JBのジョブ優先処理へジャンプする。
【0070】
一方、この0.5ms毎の定期割込みに対し、図2のクラセンによる割込みでは、ステップS200で、OS用ワークエリアを設定すると、ステップS201で、後述するクランク位置算出のサブルーチンを実行し、現在のクランク位置を判別するためのクランク位置変数、及び、最新の3つのクラセン間隔の和であるエンジン半回転の経過時間すなわち半回転時間を算出する。
【0071】
上記クランク位置変数は、OS中で用意されるシステム変数であり、図23に示すように、#1〜#4気筒に対するクランク位置を、クランク角センサ39からの信号入力によるBTDC97°,65°,10°CAによって12の状態に区分し、現在のクランク位置を表わす。
【0072】
すなわち、各気筒毎に、0,1,2の数値でクラセン入力順を示すクランク位置情報変数S_CCAS、#1気筒を0、#3気筒を1、#2気筒を2、#4気筒を3として気筒の燃焼順を示す気筒情報変数S_RCAS、及び、0〜11の数値でクラセン順序及び気筒順序を総合的に表わす総合位置変数S_ACASの3変数によって現在のクランク位置を表わし、さらに、クランク位置が確証をもって正常に判別されたときを0、判別結果がつじつまが合わず不安の残る推定状態を1、不明な状態を2とするエラーレベルS_ECASにより、クランク位置の判別状況を表わすようになっている。尚、図23においては、システム変数であることを示すS_を省略している。
【0073】
次いで、上記ステップS201からステップS202へ進むと、クランク位置算出のサブルーチンにおいてクランク位置判定が正常に終了したか或は判定不能であったかを、アキュムレータAにストアされているコードを読み出すことにより調べる(エラーコード1、正常終了コード0)。
【0074】
そして、上記ステップS202で、アキュムレータAの値が1であり、クランク位置が判定不能であったときには、割込みを終了し、アキュムレータAの値が0であり、クランク位置が正常に判定されているときには、ステップS203へ進み、エンストフラグを解除する。
【0075】
尚、上記エンストフラグは、エンジンがエンスト状態であることを示すフラグであり、クラセン間隔が0.5sec以上の時間(約30rpm以下)のとき、50msジョブに用意されているエンスト処理ルーチンによりセットされ、このクラセン割込みによりクリアされてエンスト状態が解除される。
【0076】
次に、ステップS204へ進むと、点火タイマセットのサブルーチンを実行し、ユーザジョブ側で設定した点火時期の指示値に基づいて作成された点火スケジュールに従って点火タイマをセットする。この点火スケジュールは、ドエル開始時期、ドエルオン待ち時間、ドエルオフ待ち時間などをメンバーとする構造体変数であり、10msジョブ中に作成ルーチンが用意され、この点火スケジュールに従って点火シーケンスが決定される。
【0077】
次いで、ステップS205で、後述する噴射タイマセットサブルーチンを実行し、ユーザジョブ側で設定した気筒毎の要求燃料噴射幅に対応する噴射時間を、1回噴射或は複数回噴射に応じた1回当りの有効噴射幅として算出し、噴射タイマにセットしてステップS206へ進む。
【0078】
ステップS206では、このクラセンが実行された現状のジョブレベルが自身のジョブレベルであるか否かを判別し、現状がクラセンジョブ自身のレベルであるときには、ステップS207、ステップS208で、クラセンジョブ、低優先クラセンジョブのオーバーラップカウンタOLCを、それぞれ1増加させて割込みを終了し、現状のジョブレベルがクラセンジョブのレベルでないときには、ステップS209で、現状のジョブレベルが低優先クラセンジョブのレベル以上であるか否かを調べる。
【0079】
そして、現状のジョブレベルが低優先クラセンジョブ以上であるときには、上記ステップS209からステップS210へ進んで、低優先クラセンジョブのオーバーラップカウンタOLCを1増加させると、ステップS211で、クラセンジョブのジョブフラグをセットし、ラベルWAR_JBのジョブ優先処理へジャンプする。
【0080】
一方、上記ステップS209で、現状のジョブレベルが低優先クラセンジョブ以上でないときには、上記ステップS209からステップS212へ進み、クラセンジョブのジョブフラグをセットすると、ステップS213で、低優先クラセンジョブのジョブフラグをセットし、ラベルWAR_JBのジョブ優先処理へジャンプする。
【0081】
図3に示すジョブ優先処理では、ステップS300で、ジョブの優先レベルを示す1バイト変数であるジョブレベルJB_LEVを1つ上げると、ステップS301へ進んで、この優先レベルに対応するジョブフラグが立っていないか調べる。そして、ジョブフラグが立っていないときには、ステップS300へ戻ってさらにジョブレベルJB_LEVを1つ上げ、ジョブフラグが立っているときには、ステップS302へ進み、ジョブフラグの立っているジョブのオーバーラップカウンタOLCを初期値の0から1にし、ステップS303へ進む。
【0082】
ステップS303では、より上のジョブフラグがあるか否かを調べ、より上のジョブがあるときには、ステップS300へ戻って前述の処理を繰り返し、より上のジョブがないときには、ステップS304へ進んで、ジョブ実行中フラグJB_RUNをセットすると、ステップS305で、後述するジョブ実行サブルーチンにより最上位のジョブを実行する。
【0083】
上記ジョブ実行中フラグJB_RUNは、ジョブの実行開始時にセットされ、終了時にクリアされるフラグであり、このフラグにより、処理の途中で、より優先度の高いジョブによって割込まれたジョブを識別することができる。
【0084】
例えば、図19に示すように、JB_LEV=4の10msジョブを実行中、JB_LEV=6の2msジョブの割込み要求がなされると、10msジョブの処理が中断され、より優先度の高い2msジョブが、JB_RUN=1、OLC=1にセットされ、実行される。そして、この2msジョブの処理中に、JB_LEV=5の4msジョブの割込み要求が発生すると、この4msジョブは、JB_RUN=0、OLC=1とされて割込みが受付けられるが、実行はされず待機状態となる。
【0085】
その後、ジョブ実行サブルーチンによるジョブの実行が終了すると、上記ステップS305からステップS306へ進んでオーバーラップカウンタOLCを1減らし、ステップS307で、オーバーラップカウンタOLCがゼロになったか否かを調べる。その結果、オーバラップカウンタOLCがゼロになっておらず、同じ優先レベルでジョブ割込み要求が複数回あるときには、ステップS305へ戻ってジョブを繰返し実行し、オーバラップカウンタOLCがゼロになったとき、ステップS307からステップS308へ進んで、ジョブ実行中フラグJB_RUNをクリアする。
【0086】
次に、ステップS309へ進み、ジョブレベルJB_LEVを1つ下げて次のジョブレベルに移ると、ステップS310で、このジョブレベルJB_LEVがゼロになったか否かを調べる。そして、ジョブレベルJB_LEVがゼロのときには、この割込みを終了し、ジョブレベルJB_LEVがゼロでないときには、ステップS311へ進んで、オーバーラップカウンタOLCがゼロか否かを調べる。
【0087】
上記ステップS311で、オーバーラップカウンタOLCがゼロのときには、このレベルではジョブ要求はないため、上記ステップS311からステップS309へ戻って、ジョブレベルJB_LEVをさらに1つ下げて同様の処理を繰返し、オーバーラップカウンタOLCがゼロでないときには、ステップS312へ進んで、このジョブレベルにおいて、ジョブ実行中フラグJB_RUNがセットされているか否かを調べる。
【0088】
上記ステップS312で、ジョブ実行中フラグJB_RUNがセットされているときには、割込み前にジョブを実行中であったため、割込みを終了して割込み前のジョブへ戻り、ジョブ実行中フラグJB_RUNがセットされていなければ、ステップS304へ戻って、このレベルのジョブを実行し、同様の処理を繰返す。
【0089】
すなわち、図19において、JB_LEV=6の2msジョブが終了し、OLC=0、JB_RUN=0になると、ジョブレベルが1つ下げられ、JB_LEV=5の4msジョブが、JB_RUN=0、OLC=1の待機状態からJB_RUN=1にセットされ、実行される。さらに、4msジョブが終了すると、JB_LEV=4に移り、JB_RUN=1(ジョブ実行中)の状態から、2msジョブ及び4msジョブによって中断されていた10msジョブの処理が再開される。
【0090】
このように、0.5ms毎の定期割込み、クラセン割込みを基本タイミングとして、各ジョブの優先レベル及び実行タイミングを知らせるジョブフラグJB_FLGを作成するため、可能な限り正確に、等時間間隔処理、エンジン回転同期処理を実現し、各ジョブを効率良く処理することができる。さらに、基本タイミングとなる各割込み毎に更新されるジョブフラグJB_FLGによらず、オーバーラップカウンタOLCによってジョブの多重要求を記憶するため、あるジョブの処理時間が長引き、再度、同じジョブを実行すべきタイミングとなった場合においても、処理を途中で放棄することなく、可能な限り最後まで処理を継続することができる。
【0091】
次に、図4〜図7のジョブ実行サブルーチンについて説明する。
【0092】
まず、ステップS500で、ジョブフラグJB_FLGを参照して実行すべきジョブがクラセンジョブでないか否かを調べ、クラセンジョブでないときには、ラベルALJ10へ分岐し、クラセンジョブのときには、ステップS501へ進んで、気筒判別がついているか否かを調べる。
【0093】
そして、気筒判別がついていないときには、そのままルーチンを抜けてジョブを実行せず、気筒判別がついているとき、上記ステップS501からステップS502へ進んで、オーバーラップカウンタOLCの値を参照して多重待ち状態であるか否かを調べる。
【0094】
上記ステップS502では、多重待ち状態でないとき、ステップS503へ進んで、クラセン割込み毎に算出されるシステム変数S_ACAS(クランク総合位置変数)をユーザ変数ACASとし、一方、多重待ち状態のときには、ステップS504へ分岐し、ユーザ変数ACASを一つ増やして12で割った剰余をとって新たなユーザ変数ACASとし、このユーザ変数ACASを0,1,2,…11,0,1,…とソフトウエア的に更新してゆく。
【0095】
すなわち、クラセンジョブ及び低優先クラセンジョブは、自身または優先度の高いジョブに邪魔されて遅れることがあるが、クラセン割込みは正確にクランク角センサ信号に同期して実行され、システム変数S_ACASはジョブの遅れに関係なく更新される。
【0096】
従って、ジョブ中でシステム変数S_ACASを参照して気筒及びクランク位置に係る情報を知り、この情報に応じた仕事を行なおうとしても、自身が他のジョブに邪魔されて遅れた場合には、自身の仕事に対応した気筒及びクランク位置に係る情報を知ることができなくなる。このため、クラセンジョブ及び低優先クラセンジョブ中では、多重待ち状態でないときにOS用のシステム変数S_ACASをユーザ用変数ACASとして取込み、このユーザ変数ACASをジョブ実行毎に更新して多重要求の場合にも、自身に対応した気筒及びクランク位置に係る情報を得て適正な処理がなされるようにするのである。
【0097】
その後、上記ステップS503或は上記ステップS504からステップS505へ進み、ジョブのワークエリアを設定すると、ステップS506で、レベルゼロの割込みを許可し、ステップS507で、クラセンジョブのセクションに移る。そして、このクラセンジョブセクションにリンクされた処理を実行し、ステップS508で、割込みを禁止してルーチンを抜ける。
【0098】
次に、ステップS500で、これから実行すべきジョブがクラセンジョブでないときには、ラベルALJ10のステップS510で、2msジョブでないか否か調べ、2msジョブのとき、ステップS511で、ジョブのワークエリアを設定すると、ステップS512で、レベルゼロの割込みを許可し、ステップS513で、2msジョブのセクションに移る。そして、このセクションにリンクされているジョブ本体(ユーザ側の制御ストラテジーに基づくルーチン、或は、OS側で用意したサービスルーチン)を実行し、ステップS514で、割込みを禁止してルーチンを抜ける。
【0099】
一方、上記ステップS510で、実行すべきジョブが2msジョブでないときには、ステップS510からステップS520へ分岐し、実行すべきジョブが4msジョブか否かを調べる。そして、4msジョブでないときには、ラベルALJ30へ分岐し、4msジョブのときには、ステップS521で、ジョブのワークエリアを設定すると、ステップS522へ進む。尚、この4msジョブは、A/D変換利用ジョブであり、後述するシステムシフトバッファSSHBを介してA/D変換データを利用する。
【0100】
ステップS522では、レベルゼロの割込みを許可し、次いで、ステップS523へ進むと、スイッチ入力を読込み、ステップS524で、4msジョブのセクションに移って、リンクされているジョブ本体を実行する。その後、4msジョブのセクションから抜けると、ステップS525で、割込みを禁止し、ステップS526へ進んで、システムシフトバッファSSHBをシフトしてルーチンを抜ける。
【0101】
上記システムシフトバッファSSHBは、図20に示すように、8チャンネルの各A/D変換結果がストアされる先頭オフセットアドレス0,+8,+16,+24,+32,+34,+36,+38番の各メモリ、及び、4ms毎のクランク同期のA/D変換結果がストアされる先頭オフセットアドレス−2番地の1ワードのメモリからなり、0.5ms毎に実行される1回のA/D変換結果が1ワード(2バイト)でストアされる。
【0102】
先頭オフセットアドレス0番地からは、4段のシフトメモリとなっており、90°CA毎のA/D変換結果がストアされ、最新4データ(1回転分)をジョブから参照することができる。また、先頭オフセットアドレス+32,+34,+36,+38番地は、各1ワードのメモリであり、なまし処理機能が選択されたとき、A/D変換結果を加重平均した値がストアされてノイズ除去と精度向上を図ることができるようになっており、これらのメモリのデータは、低速ジョブで利用できる。
【0103】
また、各先頭オフセットアドレス+8,+16,+24番地からは、各4ワードのメモリであり、4msジョブで利用するようになっている。これらの各メモリは、最新のA/D変換結果が先頭から数えて、4msジョブのオーバーラップカウンタOLCの値だけ後のワードにストアされ、4msジョブ実行に際し、先頭方向からデータが読出され、ジョブの終了に伴って、後の各ワードのデータが順に先頭方向にシフトされるので、先にストアしたデータから読出されるFIFOバッファとなっている。
【0104】
すなわち、A/D変換は、0.5ms毎の定期割込みにより4ms周期で正確に行なわれるが、4msジョブは優先度の高いジョブに邪魔されて遅れることがある。従って、A/D変換の受渡しにFIFOバッファを用い、4msジョブで+8〜,+16〜,+24〜番地の各FIFOバッファのデータを参照後、上記ステップS526で、各FIFOバッファのデータを順にシフトするのである。
【0105】
一方、上記ステップS520で、実行すべきジョブが4msジョブでなく、ラベルALJ30へ分岐したときには、ステップS530で、実行すべきジョブが10msジョブか否かを調べ、10msジョブのとき、ステップS531で、ジョブのワークエリアを設定し、ステップS532で、レベルゼロの割込みを許可すると、ステップS533で、10msジョブのセクションに移って、ジョブ本体を実行し、ステップS534で割込みを禁止してルーチンを抜ける。
【0106】
尚、上記10msジョブのセクションには、半回転時間からエンジン回転数を算出するサービスルーチン、前述した点火スケジュールを作成するサービスルーチンなどがOS側で用意されている。
【0107】
また、上記ステップS530で、実行すべきジョブが10msジョブでないときにはステップS540へ分岐し、実行すべきジョブが低優先クラセンジョブであるか否かを調べる。そして、低優先クラセンジョブでないときには、上記ステップS540からラベルALJ50へ分岐し、実行すべきジョブが低優先クラセンジョブのときは、上記ステップS540からステップS541へ進んで、現在の状態が多重待ち状態であるか否かを調べる。
【0108】
そして、現在の状態が多重待ち状態でないときには、上記ステップS541からステップS542へ進んで、システム変数S_ACAS(クランク総合位置変数)をユーザ変数ACASとしてステップS544へ進み、多重待ち状態のときには、上記ステップS541からステップS543へ分岐し、ユーザ変数ACASを一つ増やして12で割った剰余をとった後、ステップS544へ進む。
【0109】
ステップS544では、ジョブのワークエリアを設定し、ステップS545で、レベルゼロの割込みを許可すると、ステップS546で、低優先クラセンジョブのセクションに移り、ジョブ本体を実行した後、ステップS547で割込みを禁止し、ルーチンを抜ける。
【0110】
さらに、ラベルALJ50では、ステップS550で、実行すべきジョブが50msジョブであるか否かを調べ、50msジョブのときには、ステップS551へ進んでジョブのワークエリアを設定し、ステップS552へ進む。
【0111】
ステップS552では、レベルゼロの割込みを許可すると、ステップS553で、50msジョブのセクションに移り、OS側で用意したエンスト処理ルーチン、気筒別の点火時期リタードルーチン、燃料噴射開始時期算出ルーチンなどを実行し、また、ユーザ側の制御ストラテジーに基づくルーチンを実行する。そして、ジョブの終了後、ステップS554で割込みを禁止し、ルーチンを抜ける。
【0112】
一方、上記ステップS550で実行すべきジョブが50msジョブではないときにはステップS560へ分岐し、ジョブのワークエリアを設定し、ステップS561でレベルゼロの割込みを許可し、ステップS562へ進んで、250msジョブのセクション領域へ移行し、ジョブ本体を実行後、ステップS563で割込みを禁止してルーチンを抜ける。
【0113】
以上のジョブ優先処理においては、クランク位置を常に的確に把握しておく必要があり、クラセン割込み毎に、図8に示すクランク位置算出サブルーチンが実行されて前述したクランク位置変数S_CCAS,S_RCAS,S_ACAS,S_ECASが算出される。尚、以下の説明においては、システム変数であることを示すS_をクランク位置変数から省略する。
【0114】
このクランク位置算出サブルーチンでは、まず、ステップS600で、クラセンタイマの下2バイトをソフトタイマの下2バイトにストアする。このクラセンタイマはECU50に備えられたハードウエアタイマであり、本実施例においては、16ビットタイマで最大255msまで計数が可能であるが、メモリ上に3バイトの連続した領域を確保して下2バイトにクラセンタイマの2バイトを転写し、クラセンタイマのオーバーフローにより発生する割込みで3バイト目をカウントアップすることによりソフトタイマとして使用する。これにより、クランク角センサ39からの信号入力間隔時間(以下、「クラセン間隔」と略記する)を最大64sec(255ms×256)まで計数することが可能となり、16ビット以上の特別なハードウエアタイマを使用することなく、クランキング時などクラセン間隔が極めて長い場合にも容易に対応することができる。
【0115】
次いで、ステップS601へ進むと、クラセン間隔が設定時間以下か否かを調べる。この設定時間は、最大エンジン回転数に対応するクラセン間隔としての時間、例えば0.3msであり、上記ステップS601でクラセン間隔が設定時間以下のときには、ノイズの混入などによるクラセンタイマの計数エラーとしてステップS602でアキュムレータAにエラーコード1を格納してルーチンを抜け、また、上記ステップS601で、クラセン間隔が設定時間より長いときには、クラセンタイマの計数が正常であるとしてステップS603へ進む。
【0116】
ステップS603では、後述するCCAS・RCAS判別サブルーチンを実行してクランク位置を判別し、ステップS604で、エラーレベルECASが2であるか否か、すなわち、クランキング時などのように気筒判別がなされていない状態であるか否かを調べ、ECAS=2のときには、ステップS605へ分岐してアキュムレータAにエラーコード1を格納し、ルーチンを抜ける。
【0117】
一方、上記ステップS604で、ECAS≠2のときには、ステップS606へ進み、ソフトタイマの3バイト目を0とする。そしてステップS607へ進み、クランク位置情報変数CCASが1であるか否か、すなわち、現在のクランク位置がBTDC65°CA〜10°CAの間(図23参照)であるか否かを調べ、CCAS=1のときには、ステップS607からステップS609へジャンプし、CCAS≠1のときには、ステップS607からステップS608へ進んで、A/D変換リクエストを1増加させ、ステップS609へ進む。
【0118】
このA/D変換リクエストは、クランク角90°CA毎にクランク同期A/D変換を指示するためのフラグ的な変数であり、0、1の値をとり、値が1のときクランク同期A/D変換を指示する。すなわち、前述したように、8チャンネルのA/D変換のうち1チャンネルのA/D変換はクランク角90°CA毎に行なわれるが、CCASが0になったとき(BTDC97°CA)と、CCASが2になったとき(BTDC10°CA)、クランク同期のA/D変換リクエストをセットし、0.5ms毎のA/D変換順番に対してクランク角90°毎(正確には87゜,93゜毎)のA/D変換を割込ませるのである。
【0119】
その後、ステップS609では、気筒情報変数RCASを3倍してクランク位置情報変数CCASを加算することにより総合位置変数ACASを算出すると(ACAS=RCAS×3+CCAS)、ステップS610で、ソフトタイマを2バイトでリミットし、クラセンタイマがオーバーフローしている場合には下2バイトをFFFF(255ms)としてステップS611へ進む。
【0120】
ステップS611では、総合位置変数ACAS=0,1,2,…11を添字とする配列TCAS[ACAS](配列の要素)にクラセン間隔データをストアし、ステップS612で、クランク位置情報変数CCAS=0,1,2を添字とする配列MTCSX[CCAS](配列の要素)にクラセン間隔データをストアする。
【0121】
配列TCASは、図21(a)に示すように、ACAS=0,1,2,…11に対応するエンジン2回転分のクラセン間隔データがストアされた12ワードのクラセン間隔テーブルであり、配列MTCSXは、同図(b)に示すように、CCAS=0,1,2に対応する3ヶのクラセン間隔データがストアされた3ワードのクラセン間隔テーブルである。
【0122】
すなわち、上記ステップS603のCCAS・RCAS判別サブルーチン(詳細は後述する)、及びステップS609により各情報変数CCAS,RCAS,ACASが更新され、例えば、CCAS=1、RCAS=1、ACAS=4に更新されて、現在、クランク位置が#3気筒のBTDC65゜〜10゜CAのとき、クラセンタイマによって計時された#3気筒のBTDC97゜CAにおけるクラセン信号入力から#3気筒のBTDC65゜CAにおけるクラセン信号入力までの時間(クラセン間隔データ)を、ステップS611で総合位置変数ACASをパラメータとして配列TCASのACAS=3のアドレスにストアすると共に、ステップS612でクランク位置情報変数CCASをパラメータとして配列MTCSXのCCAS=0のアドレスにストアする。
【0123】
従って、クラセン入力によるクラセン割込み毎に総合位置変数ACAS、クランク位置情報変数CCASが更新される都度、配列TCAS,MTCSX内のデータが順次更新されるので、配列TCASを参照することにより、各気筒の各クランク位置におけるクラセン間隔の変化(回転速度の変化)を知ることができ、各気筒の失火の有無、燃焼状態などを判断することができ、全気筒の運転状況を把握することができる。また、配列MTCSXを参照することにより、常に最新のクラセン間隔を得ることができ、現在の運転状況を迅速に把握することができる。
【0124】
次いで、ステップS613へ進むと、再び、エラーレベルECASの値を調べる。ここでは、前述のステップS604においてECAS≠2であることを既に確認してあるため、エラーレベルECASが1か否か、すなわち、クランク位置の判別が不安の残る推定状態であるか否かを調べる。
【0125】
上記ステップS613でECAS≠1(すなわちECAS=0)であり、クランク位置が確証をもって判別されているときには、上記ステップS613からステップS614へ進んで、最新3ヶのクラセン間隔データの和(配列MTCSXにストアされているクラセン間隔データの和)を、3バイトの半回転時間MTCS18として算出する(MTCS18=ΣMTCSX)。すなわち、半回転時間MTCS18は、クラセン割込み毎にクランク位置情報変数CCASが更新されて配列MTCSX内のデータが更新される毎に算出され、BTDC97°,65°,10°CAの各位置毎にクラセン間隔の移動和を取ることにより常に最新のデータが得られるようになっている。
【0126】
一方、上記ステップS613で、ECAS=1であり、クランク位置の判別が不安の残る推定状態であるときには、配列MTCSXから半回転時間MTCS18を算出せず、ステップS615で半回転時間推定のサブルーチンを実行して半回転時間MTCS18を推定する。
【0127】
この半回転時間MTCS18の推定は、前回のクラセン間隔時間から今回の半回転時間を推定するものである。すなわち、図23に示すように、現在のクランク位置情報変数CCASが1であれば、前回のクランク角間角度は32゜CA(BTDC97゜〜65゜CA間の角度)であり、このクランク角間角度と前回のクラセン間隔データとから、次式に基づき半回転時間MTCS18を算出する。
MTCS18=前回のクラセン間隔×180/32
また、CCAS=2のときには、BTDC65゜〜10゜CA間の角度55゜CAと前回のクラセン間隔データから、前回のクラセン間隔×180/55により半回転時間MTCS18を算出し、さらに、CCAS=0のときには、BTDC10゜CA〜ATDC83゜CA(次の気筒のBTDC97゜CA)間の角度93゜CAと前回のクラセン間隔データとから、前回のクラセン間隔×180/93により半回転時間MTCS18を算出する。
【0128】
そして、上記ステップS614で半回転時間MTCS18を算出した後、或は、上記ステップS615で半回転時間MTCS18を推定した後は、ステップS616へ進み、3バイトの半回転時間MTCS18を2バイトにリミットして所定の変数MTCSKにストアすると、ステップS617で、この変数MTCSKを2倍して変数MTCSK4にストアし、ステップS618で、正常終了コード0をアキュムレータAに格納してルーチンを抜ける。
【0129】
そして、前述のジョブ実行サブルーチンにおいて10ms毎にエンジン回転数が算出され、このエンジン回転数は、3バイトの半回転時間MTCS18を2バイトにリミットした変数MTCSKの逆数から算出される。
【0130】
詳述すると、毎分回転数rpmの単位時間(1min)の半分の時間30secを半回転時間MTCSKで割算することにより、1rpmを単位とする2バイト単位の変数NRPM、すなわち、エンジン回転数が算出され(NRPM=30sec/MTCSK)、このエンジン回転数が基本パラメータの1つとして各種の制御量演算処理に用いられるのである。
【0131】
次に、図9に示すフローチャートに従って、上記クランク位置算出サブルーチンのステップS603で実行されるCCAS・RCAS判別サブルーチンについて説明する。
【0132】
このサブルーチンでは、まず最初に、ステップS800で、カムセンカウンタを0〜4にリミットする。このカムセンカウンタで計数されるカム角センサ41からのカムパルスの数(クラセン信号入力間のカムパルス数)は、図23に示すように、正常状態の場合0〜3であるが、ノイズなどの影響により4以上の異常な計数値となるおそれがあるため、カムセンカウンタを0〜4にリミットして異常な状態を4で代表するのである。
【0133】
次に、ステップS801へ進み、カムセンカウンタ(の計数値)、気筒情報変数RCAS、クランク位置情報変数CCASから、5×4×2の組合わせ(カムセンカウンタが0〜4の5種類、気筒情報変数RCASが0〜3の4種類、クランク位置情報変数CCASが0,1と2の場合の2種類)に対する状態データがストアされている気筒・クランク位置状態マップCCHMAPを読む。
【0134】
この気筒・クランク位置状態マップCCHMAPは、図22(a)及び(b)に示すように、クランク位置情報変数CCASが0或は1の場合と、気筒情報変数RCASの変化点であるクランク位置情報変数CCASが2の場合とに分け、カムセンカウンタと気筒情報変数RCASとの各組合わせの起こり得る全ての状態に対し、正常か異常か、確定して良いか推定すべきかを示す状態データがストアされており、現在の状態を評価し、次にとるべき状態を知ることができる。
【0135】
この状態データは2ビットのデータであり、ビット0の値により確定か推定かを表わし、ビット1の値により正常か異常かを表わす。ビット0の値は、0のとき確定、1のとき推定を示し、図22からわかるように、カムセンカウンタが2,3の場合にのみ確定であって(図23に示すカムセン信号パターン参照)、それ以外は推定せざるを得ない状態である。また、ビット1の値は、0のとき正常、1のとき異常を示し、カムセンカウンタが3以下で、且つ、図23によるクランク位置変数の組合せに合致する場合のみ正常であって、それ以外は異常な状態である。
【0136】
例えば、CCAS=0或は1、すなわち、ある気筒のBTDC97°〜10°CAに対し、カムセンカウンタが0で気筒情報変数RCASが0となる組合せは、図23からもわかるように、クランク位置を正常に推定すれば良い状態であるため、図22に示す気筒・クランク位置状態マップCCHMAPの該当領域に2進数で01(正常推定)の状態データがストアされており、さらに、カムセンカウンタが1で気筒情報変数RCASが0となる組合せは、明らかに異常であって推定するしかない状態であるため、気筒・クランク位置状態マップCCHMAPの該当領域に2進数で11(異常推定)の状態データがストアされている。
【0137】
また、CCAS=2、すなわち、ある気筒のBTDC10°CA〜ATDC83°CAに対し、カムセンカウンタが3で気筒情報変数RCASが0となる組合せは、#1気筒のTDCを挟んだクランク位置と正常に確定できるため、気筒・クランク位置状態マップCCHMAPの該当領域に2進数で00(正常確定)の状態データがストアされており、さらに、カムセンカウンタが2で気筒情報変数RCASが0となる組合せは、明らかに異常ではあるがカムセン入力が2ヶある以上確定せざるを得ない状態であるため、気筒・クランク位置状態マップCCHMAPの該当領域に2進数で10(異常確定)の状態データがストアされている。
【0138】
そして、上記ステップS801で気筒・クランク位置状態マップCCHMAPから状態データを読込むと、ステップS802へ進み、エラーレベルECASが2でないか否か、すなわち、現在の状態が気筒判別のなされていない不明な状態であるか否かを調べ、ECAS=2のときには、ステップS803で気筒・クランク位置状態マップCCHMAPから読込んだ状態データのビット0が0か否か、すなわち確定状態か否かを調べ、確定状態のときにはステップS804へ進み、確定状態でなく推定状態であるときにはルーチンを抜けて確定状態となるまで待つ。
【0139】
一方、上記ステップS802でECAS≠2のときにはステップS804へ進んで、推定状態か否かを調べ、確定状態、推定状態に応じてステップS805以降の処理或はステップS812以降の処理へ進む。また、上記ステップS803において確定状態でステップS804へ進んだときには、ステップS805以降の処理へ進む。
【0140】
まず、ステップS805以降の処理について説明すると、このステップS805へ進んだときには、正常、異常に拘らず気筒判別がなされた確定状態であるため、図23のタイムチャートからもわかるように、今回のクラセン割込みはカムパルスが3ヶ或は2ヶ入力された後のBTDC97°CAの割込みであるため、クランク位置情報変数CCASを0にする。
【0141】
次いで、ステップS806へ進んでカムセンカウンタが3でないか否かを調べ、カムセンカウンタが3でないとき、すなわちカムセンカウンタが2のときには、#2気筒の点火後であるため、ステップS807で気筒情報変数RCASを3にしてステップS809へ進み、カムセンカウンタが3のときには、#1気筒の点火後であるため、ステップS808で気筒情報変数RCASを1にしてステップS809へ進む。
【0142】
ステップS809では、更新したクランク位置情報変数CCAS、気筒情報変数RCAS、及び、カムセンカウンタをパラメータとして再び気筒・クランク位置状態マップCCHMAPから状態データを読込み、この状態データのビット1が1であるか、すなわち異常状態であるか否かを調べる。
【0143】
その結果、上記ステップS809において、状態データのビット1が1で異常状態と判定されるときには、クランク位置情報変数CCAS、気筒情報変数RCASの更新結果は不安の残る推定であるとしてステップS810でエラーレベルECASを1にしてルーチンを抜け、状態データのビット1が0であり正常状態であるときには、ステップS811でエラーレベルECASを0としてルーチンを抜ける。
【0144】
一方、ステップS812以降の処理では、ステップS812で、現在のクランク位置情報変数CCAS(前回のクラセン割込みで算出されたクランク位置情報変数CCAS)が2、すなわち、気筒情報変数RCASの変化点であるか否かを調べ、CCAS=2のときには、ステップS812からステップS813へ進んで、気筒情報変数RCASを1増加させ、ステップS814でクランク位置情報変数CCASを0にしてステップS817へ進む。
【0145】
一方、上記ステップS812で、CCAS≠2のときには、上記ステップS812からステップS815へ進んでカムセンカウンタが0でないか否かを調べ、カムセンカウンタが0でないときには、前述のステップS813へ分岐し、カムセンカウンタが0のときには、ステップS816でクランク位置情報変数CCASを1増加させ、ステップS817へ進む。
【0146】
ステップS817では、更新したクランク位置情報変数CCAS、気筒情報変数RCAS、及び、カムセンカウンタをパラメータとして再び気筒・クランク位置状態マップCCHMAPから状態データを読込んで異常状態であるか否かを調べ、状態データのビット1が0であり、正常状態であるときには、そのまま(現在のエラーレベルECAS=0のまま)ルーチンを抜ける。また、上記ステップS817で、状態データのビット1が1で異常状態のときには、ステップS818へ進み、クランク位置情報変数CCAS、気筒情報変数RCASの更新結果は不安の残る推定であるとしてエラーレベルECASを1にし、ルーチンを抜ける。
【0147】
以上のように、クランク位置変数CCAS,RCAS,ACAS,ECASにより刻々と変化するクランク位置の状態を把握し、さらに、気筒・クランク位置状態マップCCHMAPを用いて、現在の状態を評価し、次にとるべき状態を知ることができるため、通常の条件判断による処理に比較して大幅にプログラムを簡略化することができ、メモリ容量の節約、処理速度の向上を図ることができるとともに、プログラムの可撓性を向上して仕様変更に対しても柔軟に対処することができる。
【0148】
次に、図10、図11に示す燃料噴射開始時期算出ルーチンについて説明する。この燃料噴射開始時期算出ルーチンは、前述したジョブ実行サブルーチンのステップS553で実行される50msジョブのうちの一つで、噴射開始区間、噴射回数、及び1回当りの噴射幅を全気筒について設定する。すなわち、噴射エンドを固定した場合の連続噴射の開始時期が遅い場合、噴射回数を2回に設定し、一方連続噴射の開始時期が早い場合には噴射回数を1回にするものである。
【0149】
まず、ステップS1000で始動時かを判断し、始動時の場合にはステップS1001へ進み、噴射開始遅れ時間IJDELYを0とし、ステップS1002で1回当りの噴射すべき有効噴射幅を1サイクル当りの総噴射量である要求噴射幅IJSEIn(n=#1,#2,#3,#4)の1/2に設定し、ステップS1003で噴射開始区間設定フラグIJTMGFを例えば128+2の複数回噴射にセットしてルーチンを抜ける。
【0150】
上記噴射開始遅れ時間IJDELYは後述する噴射タイマセットマクロ2で設定するタイマ待ち時間に組込まれるもので、噴射開始区間の始り(BTDC97°CAクラセン信号入力(以下、「97゜CAクラセン」と略記する)、或はBTDC10°CAクラセン信号入力(以下、「10゜CAクラセン」と略記する)から何ms後に、1回噴射であれば最初の噴射を、2回噴射であれば2回目の噴射を開始するのかを決定する。
【0151】
また、上記噴射開始区間設定フラグIJTMGFにより、#1〜#4気筒の噴射開始区間が特定される。すなわち、この噴射開始区間は、#1〜#4気筒毎の噴射開始区間テーブルIJnTBL(n=#1,#2,#3,#4)に予め格納されている。
【0152】
図23に示すように、この各噴射開始区間テーブルIJnTBL(n=#1,#2,#3,#4)では、#1〜#4気筒の1サイクルを前述のクランク総合位置変数ACASに対応して97°CAクラセンと10°CAクラセンとで8区間に区分し、各区間をビット7〜ビット0に対応させた1バイトの変数として上記噴射開始区間設定フラグIJTMGFにて噴射開始区間を設定する。すなわち、本実施例では、噴射開始区間テーブルIJnTBLの各噴射開始区間を、吸気行程の後半を0、前半を1、排気行程の後半を2、前半を3、燃焼行程の後半を4、前半を5、さらに、圧縮行程の後半を6、前半すなわち吸気行程終了直後を7と定義している。但し、噴射開始区間0では噴射処理を行わない。
【0153】
従って、上記ステップS1003において、IJTMGF=128+2は、8ビットの変数で表せば10000010であり、まず、1回目の噴射が噴射開始区間7(10°CAのクラセン)から開始され、次いで2回目の噴射が噴射開始区間1(10°CAのクラセン)から待ち時間無しで開始される。
【0154】
一方、上記ステップS1000で始動時ではないと判断されてステップS1004へ分岐すると、噴射開始セット時間IJTIMEがゼロかを判断し、IJTIME=0の場合、上記ステップS1001へ戻りステップS1001,ステップS1002,ステップS1003を経てルーチンを抜ける。
【0155】
この噴射開始セット時間IJTIMEはユーザ側の制御ストラテジーで設定するもので、例えば、この噴射開始セット時間IJTIMEに要求噴射幅IJSEIn(n=#1,#2,#3,#4)を代入すれば、噴射エンドを吸気行程直前のBTDC10°CAにほぼ固定することができる。また、この噴射開始セット時間IJTIMEを任意に設定することで噴射エンド制御を行うことができる。従って、ユーザ側の制御ストラテジーにおいてIJTIME=0と設定することも考えられ、この場合には上記ステップS1004から、上記ステップS1001へ戻り、上述したステップS1002で要求噴射幅に対する1回当りの噴射幅を設定し、ステップS1003で複数の噴射開始区間を設定してルーチンを抜ける。
【0156】
また、ステップS1004でIJTIME≠0と判断されてステップS1005へ進むと、このステップS1005以下において、噴射開始セット時間IJTIMEに基づく噴射開始区間及び噴射開始遅れ時間IJDELYを算出する。
【0157】
すなわち、上記噴射開始セット時間IJTIMEを噴射開始区間毎のクラセン間隔(BTDC97°〜10°CA或はBTDC10°〜ATDC83°CA間の間隔時間)で順次、ゼロ或は負になるまで減算して複数回噴射の各噴射開始区間を特定するとともに、最後の噴射開始区間の始め(97°CAクラセン或は10°CAクラセン)から何ms後に燃料噴射を開始すれば良いかを噴射開始遅れ時間IJDELYにより設定する。
【0158】
まず、ステップS1005では、上記噴射開始セット時間IJTIMEからクラセン間隔を減算し、その値をアキュムレータAに格納し、ステップS1006でこのアキュムレータAの値が正か、ゼロあるいは負かを判断し、A≦0場合、ステップS1007へ進み、噴射開始遅れ時間IJDELYを上記アキュムレータAに格納した値の2の補数で設定し(IJDELY=−A)、ステップS1008で1回当りの噴射すべき有効噴射幅を要求噴射幅IJSEIn(n=#1,#2,#3,#4)の1/2に設定し、ステップS1009で噴射開始区間設定フラグIJTMGFを例えば128+4の複数回噴射にセットしてルーチンを抜ける。IJTMGF=128+4を8ビットの変数で表せば、10000100であり、従って、噴射開始区間は7と2であり、1回目の噴射が噴射開始区間7から待ち時間無しで開始され、後の噴射が噴射開始区間2の97°CAクラセンから噴射開始遅れ時間IJDELY後に開始される。
【0159】
一方、上記ステップS1006で、A>0と判断されると、ステップS1010へ分岐し、上記アキュムレータAの値を、このアキュムレータAに格納した値からクラセン間隔を減算した値とし(A=A−クラセン間隔)、ステップS1011でこのアキュムレータAの値を参照し、A≦0の場合、ステップS1012へ進み、噴射開始遅れ時間IJDELYを上記アキュムレータAに格納した値の2の補数で設定し(IJDELY=−A)、ステップS1013で1回当りの噴射すべき有効噴射幅を要求噴射幅IJSEInの1/2に設定し、ステップS1014で噴射開始区間設定フラグIJTMGFを例えば128+8の複数回噴射にセットしてルーチンを抜ける。IJTMGF=128+8を8ビットの変数で表せば、10001000であり、従って、噴射開始区間は7と3であり、1回目の噴射が噴射開始区間7から待ち時間無しで開始され、後の噴射が噴射開始区間3の10°CAクラセンから噴射開始遅れ時間IJDELY後に開始される。
【0160】
一方、ステップS1011で、A>0と判断されると、ステップS1015へ分岐し、上記アキュムレータAの値を、このアキュムレータAに格納した値からクラセン間隔を減算した値とし(A=A−クラセン間隔)、ステップS1016でこのアキュムレータAの値を参照し、A≦0の場合、ステップS1017へ進み、噴射開始遅れ時間IJDELYを上記アキュムレータAの値の2の補数で設定し(IJDELY=−A)、ステップS1018で1回当りの噴射すべき有効噴射幅を要求噴射幅IJSEInの1/2に設定し、ステップS1019で噴射開始区間設定フラグIJTMGFを例えば128+16の複数回噴射にセットしてルーチンを抜ける。IJTMGF=128+16を8ビットの変数で表せば、10010000であり、従って、噴射開始区間は7と4であり、1回目の噴射が噴射開始区間7から待ち時間無しで開始され、後の噴射が噴射開始区間4の97°CAクラセンから噴射開始遅れ時間IJDELY後に開始される。
【0161】
一方、ステップS1016で、A>0と判断されると、ステップS1020へ分岐し、上記アキュムレータAの値を、このアキュムレータAに格納した値からクラセン間隔を減算した値とし(A=A−クラセン間隔)、ステップS1021でこのアキュムレータAに格納した値を参照し、A≦0の場合、ステップS1022へ進み、噴射開始遅れ時間IJDELYを上記アキュムレータAの値の2の補数で設定し(IJDELY=−A)、ステップS1023で1回当りの噴射すべき有効噴射幅を要求噴射幅IJSEInの1/2に設定し、ステップS1024で噴射開始区間設定フラグIJTMGFを例えば128+32の複数回噴射にセットしてルーチンを抜ける。IJTMGF=128+32を8ビットの変数で表せば、10100000であり、従って、噴射開始区間は7と5であり、1回目の噴射が噴射開始区間7から待ち時間無しで開始され、後の噴射が噴射開始区間5の10°CAクラセンから噴射開始遅れ時間IJDELY後に開始される。
【0162】
一方、ステップS1021で、A>0と判断されると、ステップS1025へ分岐し、上記アキュムレータAの値を、このアキュムレータAに格納した値からクラセン間隔を減算した値とし(A=A−クラセン間隔)、ステップS1026でこのアキュムレータAに格納した値を参照し、A≦0の場合、ステップS1027へ進み、噴射開始遅れ時間IJDELYを上記アキュムレータAの値の2の補数で設定し(IJDELY=−A)、ステップS1028で1回に全部噴射することを設定し、ステップS1029で噴射開始区間設定フラグIJTMGFを例えば64の1回噴射にセットしてルーチンを抜ける。IJTMGF=64を8ビットの変数で表せば、01000000であり、噴射開始区間6の97°CAクラセンから噴射開始遅れ時間IJDELY後に燃料噴射が開始される。
一方、ステップS1026で、A>0と判断されると、ステップS1030へ分岐し、上記アキュムレータAの値を、このアキュムレータAに格納した値からクラセン間隔を減算した値とし(A=A−クラセン間隔)、ステップS1031でこのアキュムレータAに格納した値を参照し、A≦0の場合、ステップS1032へ進み、噴射開始遅れ時間IJDELYを上記アキュムレータAに格納した値の2の補数で設定し(IJDELY=−A)、ステップS1033で1回で全部噴射することを設定し、噴射開始区間設定フラグIJTMGFを128としてルーチンを抜ける。IJTMGF=128を8ビットの変数で表せば、10000000であり、噴射開始区間7の10°CAクラセンから噴射開始遅れ時間IJDELY後に燃料噴射が開始される。
【0163】
一方、ステップS1031で、A>0と判断されると、ステップS1035へ分岐し、噴射開始遅れ時間IJDELYを0とし、ステップS1036 で1回で全部噴射することを設定し、ステップS1037で噴射開始区間設定フラグIJTMGFを128としてルーチンを抜ける。IJTMGF=128を8ビットの変数で表せば、10000000であり、噴射開始区間7の10°CAクラセンから待ち時間無しで燃料噴射が開始される。従って、このステップでの噴射が1サイクル中の最大噴射量となる。
【0164】
図24に上記フローチャートに基づく燃料噴射開始時期の設定例のタイムチャートを示す。
【0165】
同図(a)に示すように、連続噴射の場合に噴射開始時期を遅くしても1サイクル中で噴射を完了させることが出来る場合には2回噴射とし、最初の噴射で燃料の気化の促進を図り、後の噴射で空燃比をトータル的に調整する。例えば、噴射開始区間設定フラグIJTMGFが128+8に設定され、噴射開始遅れ時間IJDELYが時間tに設定された場合、まず、噴射開始区間7の10°CAクラセンから待ち時間無しで、総噴射量の1/2を噴射し、次いで噴射開始区間3の10°CAクラセンから時間t後に残りの1/2が噴射される。
【0166】
また同図(b)に示すように、連続噴射の場合に噴射を早く開始しなければ1サイクル中で噴射を完了させることが出来ない場合には1回噴射とする。例えば、噴射開始区間設定フラグIJTMGFが64に設定され、噴射開始遅れ時間IJDELYが時間tに設定された場合、まず、噴射開始区間6の97°CAクラセンから時間t後に全部噴射する。
【0167】
尚、上記フローチャートでは噴射開始区間設定フラグIJTMGFのビット指定を1気筒当り1カ所あるいは2カ所としているが、噴射開始区間設定フラグIJTMGFで3カ所以上のビットを指定するようにしても良い。複数回噴射とすることで、最後の噴射で空燃比をトータル的に調整し、結果として加速増量等の過渡時の空燃比変動に対しても後の噴射量を調整することで柔軟に対応することができる。
【0168】
また、本フローチャートでは、噴射開始区間を50msec毎に設定しているため、エンジン回転数が9000〜10000rpm等の高回転数に達してもメインCPU58の負担が増加することはなく、高回転数域でも噴射エンド制御が可能になる。
【0169】
図12は噴射タイマセットサブルーチンで、図2に示すクラセンによる割込み処理ルーチンのステップS205で実行されるもので、噴射開始区間毎に噴射タイマをセットする。
【0170】
まず、ステップS1100でエラーレベルECASが2かを判断し、ECAS=2の場合、クランク位置の判別が不明な状態であるため、以降の処理をせずサブルーチンを抜け、また、ECAS≠2の場合ステップS1101へ進み、クランク位置情報変数CCASが1かを判断し、CCAS=1の場合、演算不要と判断してルーチンを抜ける。図23に示すように、CCAS=1の場合は65°CAクラセンの割込みであり、既に現噴射開始区間における噴射タイマのセットが終了しているため直ちにサブルーチンを抜け、処理負担を軽減する。一方、CCAS≠1の場合は、97°CAクラセンの割込みか、10°CAクラセンの割込みの何れかであり、噴射開始区間の始りであるため、ステップS1102以下において現噴射開始区間での噴射幅及び噴射開始時期を設定する。
【0171】
まず、ステップS1102〜ステップS1105では、後述する噴射タイマセットマクロ1を全気筒について実行し、現噴射開始区間における噴射幅(以下「有効噴射幅」とする)TEIJAn(n=#1,#2,#3,#4)を全気筒について設定する。
【0172】
そして、ステップS1106で、上記各ステップS1102〜ステップS1105で各々設定した有効噴射幅TEIJAnが全てゼロかを判断し、全てゼロの場合、噴射タイマを再セットする必要がないためサブルーチンを抜ける。また、少なくとも一つの気筒がTEIJAn≠0の場合には、ステップS1107へ進み、全ての噴射タイマを停止状態とし、その間、以下のステップS1108〜ステップS1111の処理を行う。
【0173】
このステップS1108〜ステップS1111では、後述する噴射タイマセットマクロ2を全気筒について実行し、上記噴射タイマセットマクロ1で設定した有効噴射幅TEIJAnに基づく噴射時間を全気筒分設定する。
【0174】
そして、ステップS1112で全ての噴射タイマを再スタートさせてサブルーチンを抜ける。
【0175】
なお、上記ステップS1107で、全ての噴射タイマが停止されると、噴射時間が計時されないため燃料噴射中の気筒では燃料噴射が続行され、また噴射停止中の気筒では噴射停止状態が続行される。また、上記ステップS1108〜ステップS1112で設定した噴射時間には噴射タイマを停止した時間に相当する処理時間が考慮されている。
【0176】
上記噴射タイマセットサブルーチンにおけるステップS1102〜ステップS1105で実行される気筒毎の噴射タイマセットマクロ1は図13,図14に示す噴射タイマセットマクロ1を示すフローチャートにて実行される。尚、この噴射タイマセットマクロ1のプログラムは#1気筒の噴射タイマセットルーチンを基本プログラムとし、これを#2〜#4気筒にも応用できるようにマクロ化したものである。
【0177】
まず、ステップS1200で当該#n(n=1,2,3或は4)気筒の現在の噴射開始区間番号を、クランク総合位置変数ACASに基づき当該#n気筒の噴射開始区間テーブルIJnTBL(図23)を参照して調査し、ステップS1201で噴射開始区間番号がゼロかを判断する。そして、噴射開始区間がゼロの場合、ステップS1202へ進み、噴射開始区間がゼロでない場合ステップS1210へ進む。
【0178】
噴射開始区間0の時は 吸気行程後半であり噴射処理を行わない為、ステップS1202ないしステップS1209で次回の燃料噴射に備え燃料噴射の初期化処理を実行する。まず、ステップS1202では、当該#n気筒の累積噴射幅TEIJBnをゼロとし、ステップS1203でユーザ側ジョブから燃料カット要求があるかを判断し、燃料カット要求がない場合ステップS1204へ進み、燃料カット要求がある場合にはステップS1208へ進む。
【0179】
燃料カット要求なしと判断してステップS1204へ進むと、燃料カット状態フラグPRCUTの値を参照して当該#n気筒が燃料カット状態かを判断し、燃料カット状態ではない場合ステップS1205へ進み、また燃料カット状態の場合ステップS1206へ進む。
【0180】
この燃料カット状態フラグPRCUTは#1〜#4気筒をビット0〜ビット3の4ビットに対応させて表したもので、ユーザ側ジョブにおいて燃料カットが要求された時の最初のルーチンでセットされ、また燃料カット要求解除後の最初のルーチンでクリアされる。
【0181】
上述したように、この燃料カット状態フラグPRCUTは、噴射開始区間0において当該#n気筒に対応するビットがセットされているかを判断し、ユーザ側ジョブから燃料カット要求がなく、しかも、この燃料カット状態フラグPRCUTがセットされている気筒は次のサイクルで燃料が噴射されない。
【0182】
そして、燃料カット状態ではないと判断されてステップS1205へ進むと、噴射開始区間0では噴射処理を行わないため当該#n気筒の有効噴射幅TEIJAnをゼロにして当該#n気筒の噴射タイマセットマクロ1を終了する。
【0183】
また、上記ステップS1204から燃料カット状態と判断されてステップS1206へ進むと、ユーザ側ジョブから燃料カット要求がなく、燃料カット状態フラグPRCUTはセットされているので、復帰後、第1回目のルーチンであり、次のサイクルにおける燃料カットリカバリに備え当該#n気筒の噴射開始区間ゼロで付着補正量分に相当する燃料を1回噴射する為、ユーザ側ジョブで設定した燃料付着補正量TEFUCHで当該#n気筒の有効噴射幅TEIJAnを更新し、ステップS1207で燃料カット状態フラグPRCUTの当該#n気筒に対応するビットをクリアした後、当該#n気筒の噴射タイマセットマクロ1を終了する。
【0184】
その結果、燃料カット及び燃料カットリカバリに備える付着補正を気筒毎に設定することができる。
【0185】
また、上記ステップS1203で、ユーザ側ジョブから燃料カット要求ありと判断した場合には、噴射処理を行わない噴射開始区間0で、しかも燃料カットが要求されているため、ステップS1208で有効噴射幅TEIJAnをクリアし、ステップS1209で燃料カット状態フラグPRCUTの当該#n気筒に対応するビットをセットして、当該#n気筒の噴射タイマセットマクロ1を終了する。
【0186】
また、上記ステップS1201で現在の噴射開始区間がゼロ以外、すなわち、噴射処理領域の区間であると判断された場合には、ステップS1210以下で通常の噴射処理を行う。まず、ステップS1210では、燃料カット状態フラグPRCUTの当該#n気筒のビットの値を参照し、当該#n気筒が燃料カット状態かを判断し、燃料カット状態の場合ステップS1211へ進み、有効噴射幅TEIJAnをゼロにして当該#n気筒の噴射タイマセットマクロ1を終了する。
【0187】
一方、上記ステップS1210で燃料カット状態ではないと判断されるとステップS1212で今より後の区間では噴射しないかを、噴射開始区間設定フラグIJTMGFの値を参照して判断し、今より後の区間においても噴射すると判断した場合、ステップS1213へ進み、また、今より後の区間では噴射しないと判断した場合、ステップS1218へ進む。
【0188】
上記ステップS1212は1サイクル中における複数回噴射に対応したステップで、上記噴射開始区間設定フラグIJTMGFのビット0〜ビット7で指定した区間が2箇所以上ある場合、例えば、図24(a)に示すように、IJTMGF=128+8であれば、区間7と3が噴射開始区間であり、噴射開始区間7においては今より後の区間で噴射されるためステップS1213へ進み、一方、噴射開始区間3では今より後の区間で噴射を開始しないためステップS1218へ進む。
【0189】
そして、ステップS1213へ進むと、現在の区間で噴射するかを、上記噴射開始区間設定フラグIJTMGFの値を参照してその指示値が前記ステップS1200で検索した現在の区間番号と一致するかにより判断し、現在の区間で噴射しない場合、ステップS1214へ進み有効噴射幅TEIJAnをゼロにして当該#n気筒の噴射タイマセットマクロ1を終了する。
【0190】
一方、上記ステップS1213で現在の区間で噴射すると判断された場合には、ステップS1215へ進み、ユーザ側ジョブで10ms毎に設定される気筒別要求噴射幅IJSEInを2のn乗で除算して1回当りの噴射量を求め、その値をアキュムレータAに格納し、ステップS1216でこのアキュムレータAに格納した値で当該#n気筒の有効噴射幅TEIJAnを設定し、ステップS1217で、上記アキュムレータAの値に累積噴射幅TEIJBnを足し込み、噴射タイマセットマクロ1を終了する。
【0191】
上記次数nは、前述した燃料噴射開始時期の算出ルーチンのステップS1002,S1008,S1013,S1018,S1023,S1028,S1033あるいはS1036で設定した噴射回数に基づいて設定されるもので、1/2噴射に設定されている場合には n=1、全部噴射に設定されている場合には n=0に設定される。その結果、2回噴射では、最後の噴射開始区間において、最新の気筒別要求噴射幅IJSEInの1/2に相当する有効噴射幅が設定される。
【0192】
また、上記ステップS1212からステップS1218へ進むと、現在の区間で噴射するかを上記ステップS1213と同様、上記噴射開始区間設定フラグIJTMGFの値を参照して判断し、現在の区間で噴射する場合、ステップS1219へ進み、また現在の区間で噴射しない場合、ステップS1223へ進む。
【0193】
そして、ステップS1219では、気筒別要求噴射幅IJSEInから上記累積噴射幅TEIJBnを減算した値をアキュムレータAに格納し、ステップS1220で、このアキュムレータAの値で有効噴射幅TEIJAnを設定する。
【0194】
次いで、ステップS1221で累積噴射幅TEIJBnを要求噴射幅IJSEInとして、ステップS1222へ進む。すなわち、現在の区間が噴射終了区間であり、これより後の区間では噴射しないため、このルーチンにおいては累積噴射幅TEIJBnを要求噴射幅IJSEInと同一の値にする。その結果、例えば、1サイクル中1回噴射の場合には,TEIJBn=0であるためTEIJAn=IJSEInとなる。そして、次回の噴射開始区間でのルーチン実行時には、TEIJBn=IJSEIn=0となる。
【0195】
そして、ステップS1222で噴射待ち設定フラグFLG_IJをセットして噴射タイマセットマクロ1を終了する。すなわち、このルーチンでは当該#n気筒の1サイクル中における最後の噴射であり、噴射待ち設定フラグFLG_IJをセットすることで、後述する噴射タイマセットマクロ2で設定される噴射終了時期を例えば吸気行程直前の10°CAクラセンに合わせることができる。
【0196】
一方、上記ステップS1218からステップS1223へ進むと、気筒別要求噴射幅IJSEInから上記ステップS1221で設定した累積噴射幅TEIJBnを減算した値をアキュムレータAに格納する。
【0197】
そして、ステップS1224で上記アキュムレータAの値を参照し、A<0、すなわち、運転条件が変化して要求噴射量IJSEInが減少した場合、ステップS1226へ進み、また、A≧0、すなわち、要求噴射量IJSEInが増加したか或は変化していない場合、ステップS1225へ進む。燃料噴射幅がユーザ側ジョブにおいて10ms毎に設定されるため、次のルーチン実行時に読込む要求噴射幅IJSEInが前回のルーチン実行時において読込んだ要求噴射幅IJSEInと相違している場合、その差分を増量、或は減量することで、常に最新の値で有効噴射幅TEIJAnを設定することができるため運転条件の変化に対する追従性が良くなる。
【0198】
その後、上記ステップS1224からステップS1225へ進むと、上記アキュムレータAの値と噴射幅の許容変動値、例えば0.5msとを比較し、A>0.5msの場合ステップS1226へ進み、A≦0.5msの場合には前記ステップS1214へ進み、有効噴射幅TEIJAnをゼロとして当該#n気筒の噴射タイマセットマクロ1を終了する。
【0199】
また、ステップS1224或はステップS1225からステップS1226へ進むと、有効噴射幅TEIJAnを上記アキュムレータAの値(ステップS1224からの場合は負の値)で設定し、ステップS1227で累積噴射幅TEIJBnを上記要求噴射幅IJSEInとして、噴射タイマセットマクロ1を終了する。
【0200】
上記噴射タイマセットサブルーチンにおけるステップS1108〜ステップS1111での噴射タイマセットマクロ2は図15,図16に示す噴射タイマセットマクロ2を示すフローチャートにて実行される。尚、この噴射タイマセットマクロ2のプログラムは上記噴射タイマセットマクロ1を示すフローチャートと同様に#1気筒のタイマセットルーチンを基本プログラムとし、これを#2〜#4気筒にも応用できるようにマクロ化したものである。
【0201】
まず、ステップS1300で噴射タイマの状態から前回の噴射開始区間で設定した燃料の噴射状況を判断し、今回の噴射開始区間においても継続して噴射中の場合ステップS1301へ進み、噴射待ち状態が継続されている場合ステップS1307へ進み、また、噴射が終了されている場合ステップS1312へ進む。
【0202】
継続して噴射中と判断されてステップS1301へ進むと、停止中の噴射タイマの現状のタイマ値に、当該#n気筒の前記噴射タイマセットマクロ1で設定した正或は負の値の有効噴射幅TEIJAn(ms)を加算し、その値をアキュムレータAに格納する。従って、前回のルーチンで一旦設定した噴射タイマの値がその後の運転条件の変化に基づいて設定した最新の有効噴射幅TEIJAnで修正されることになる。
【0203】
次いで、ステップS1302で、上記キュムレータAの値から処理時間(噴射タイマ停止から再セットするまでの時間)を減算し、この減算した値をステップS1303で、ゼロから1サイクルの最大噴射量である2回転時間の間にリミットし(0≦A<2回転時間、従って、Aが負の場合にはA=0となる)、ステップS1304で、現在噴射中であるためタイマ待ち時間を0とし、ステップS1305で噴射タイマのリロード値を上記アキュムレータAの値で設定し、ステップS1306で上記リロード値に対応する噴射パルスの出力パターンをタイマにセットして当該#n気筒の噴射タイマセットマクロ2を終了する。
【0204】
その結果、1回噴射ではその噴射区間が過ぎた後の区間で、複数回噴射では最後の噴射区間を過ぎた後の区間で、今回の区間で設定した有効噴射幅TEIJAnが前回の区間で設定した値に比し、0.5ms以上増加している場合には噴射タイマが延長され、また有効噴射幅TEIJAnが減少している場合には、最後の噴射区間の噴射タイマが短縮されて、1吸気行程中の気筒に供給する噴射量の合計が調整される。
【0205】
一方、上記ステップS1300で噴射待ち状態が継続されていると判断されてステップS1307へ進むと、噴射タイマにセットされているタイマリロード値に、今回の区間で設定した正或は負の値の有効噴射幅TEIJAnを加算して、その値をアキュムレータAに格納し、ステップS1308で、上記アキュムレータAの値を、ゼロから1サイクルの最大噴射量である2回転時間にリミットし(0≦A<2回転時間)、ステップS1309で直ちに噴射を行うべくタイマ待ち時間を0として、ステップS1310でタイマリロード値を上記アキュムレータAに格納されている値で設定し、ステップS1311で上記タイマリロード値に対応する噴射パルスの出力パターンをタイマにセットして当該#n気筒の噴射タイマセットマクロ2を終了する。
【0206】
上記タイマ待ち時間は、噴射終了時期を調整するために、後述するステップS1325で設定されるものであるが、前回の噴射開始区間で設定された待ち時間が今回の噴射開始区間においても依然と計時されている場合には、タイマ待ち時間が異常に長いので、上記ステップS1309でゼロにし、今回の噴射開始区間で直ちに噴射を開始し、1吸気行程中に供給する噴射量を調整する。
【0207】
また、上記ステップS1300で前回の噴射開始区間での噴射が既に終了していると判断して、ステップS1312へ進むとアキュムレータAに有効噴射幅TEIJAnを格納し、ステップS1313で、このアキュムレータAの値が正か負あるいはゼロかを判断し、A≦0場合ステップS1314へ進み、また、A>0の場合ステップS1318へ分岐する。
【0208】
ステップS1314では、有効噴射幅TEIJAnが増加してしないので1サイクル中の噴射を終了させるため、噴射待ち設定フラグFLG_IJをクリアし、ステップS1315でタイマ待ち時間をゼロとし、ステップS1316で噴射タイマのリロード値をゼロとし、ステップS1317で出力パターンをゼロとして当該#n気筒の噴射タイマセットマクロ2を終了する。
【0209】
また、上記ステップS1313で有効噴射幅TEIJAnが正の場合には、噴射量の増加分を補償するためステップS1318で、上記アキュムレータAに、他の制御ストラテジーで設定した気筒別の無駄時間TSINJn(n=#1,#2,#3,#4)を加算し、ステップS1319で上記アキュムレータAに格納されている値が1サイクルの最大噴射量である2回転時間を越えている場合、2回転時間にリミットし(A<2回転時間)、ステップS1320で噴射待ち設定フラグFLG_IJの値を参照して噴射待ち状態ではないかを判断し、噴射待ち状態ではない場合、すなわち、噴射待ち設定フラグFLG_IJがクリアされている場合には、ステップS1321へ進み、増量分を直ちに噴射させるべくタイマ待ち時間を0として、ステップS1322でタイマリロード値を上記アキュムレータAの値(TEIJAn+TSINJn)で設定し、ステップS1323で上記タイマリロード値に対応する噴射パルスの出力パターンを噴射タイマにセットして当該#n気筒の噴射タイマセットマクロ2を終了する。
【0210】
一方、上記ステップS1320で噴射待ち状態と判断されてステップS1324へ進むと、噴射待ち設定フラグFLG_IJをクリアした後、ステップS1325で、上記噴射開始時期算出ルーチンで設定した噴射開始遅れ時間IJDELYでタイマ待ち時間を設定し、ステップS1326でタイマリロード値を上記アキュムレータAの値で設定し、 ステップS1327で上記タイマリロード値に対応する噴射パルスの出力パターンを噴射タイマにセットして当該#n気筒の噴射タイマセットマクロ2を終了する。その結果、この噴射開始区間の始りから所定タイマ待ち時間(IJDELY)後に燃料噴射が開始される。
【0211】
以上の結果、図25に示すように、燃料噴射開始時期の算出ルーチンで設定した噴射開始区間設定フラグIJTMGFによるビット指定で、1サイクル中の噴射回数を4回、3回、2回等、複数回に設定することができる。また、複数回噴射において最終回以外の有効噴射幅を、次数nの指定にて要求噴射幅の1/4,1/1等、任意に設定することができ、最終回噴射において1サイクル中の噴射幅の合計が最新の要求噴射幅になるように調整することができる。さらに、最終回噴射の噴射開始区間内で噴射が終了しない場合には、噴射タイマを延長し、また有効噴射幅が減少した場合には、噴射タイマを短縮して加速増量等過渡時の追従性を良くする。
【0212】
なお、図25(b)は、4回噴射(IJTMGF=128+32+8+2)で、1噴射当りの有効噴射幅が要求噴射幅の1/4、同図(c)は、3回噴射(IJTMGF=32+8+2に設定)で、1噴射当りの有効噴射幅が要求噴射幅の1/4、同図(d)は、2回噴射(IJTMGF=16+2に設定)で、1噴射当りの有効噴射幅が要求噴射幅の1/1、同図(e)は、2回噴射(IJTMGF=4+2に設定)で、1噴射当りの有効噴射幅が要求噴射幅の1/1にそれぞれ設定した場合の例を示したものである。
【0213】
以上、本発明の一実施例について説明したが、これに限定されず、多気筒エンジンであればよく、また、水平対向エンジン以外のエンジンにも適用することができる。
【0214】
【発明の効果】
以上説明したように本発明によれば、多気筒エンジンの各気筒毎の1サイクルを、吸気行程後半、吸気行程前半、排気行程後半、排気行程前半、燃焼行程後半、燃焼行程前半、圧縮行程後半、圧縮行程前半の各噴射開始区間に区分する。そして、噴射制御を行わない吸気行程後半を除く各区間を、噴射開始区間として定義し、「上記噴射開始区間の数+1」個のビットからなり、気筒数分の、各ビットが各噴射区間を表す噴射開始区間設定フラグを用い、噴射開始セット時間に基づき上記各噴射開始区間の中から少なくとも1つの噴射開始区間を上記噴射開始区間設定フラグにより指定する。そして、複数の噴射開始区間を指定した場合は、指定した最終の噴射開始区間より前の噴射開始区間での噴射すべき有効噴射幅を、1サイクル中の要求噴射幅を指定した噴射開始区間の数により分割した値で設定する。また最終の噴射開始区間での噴射すべき最終有効噴射幅を1サイクル中に必要とする要求噴射幅と上記最終より前の噴射開始区間で噴射した有効噴射幅の合計との差分に応じて設定するので、指定された噴射開始区間が2つの場合は勿論のこと、噴射開始区間が3以上指定された場合であっても、指定された各噴射開始区間における有効噴射幅を適正に設定することができて、空燃比性御性が向上する。
【0215】
また、最終の噴射開始区間での噴射すべき最終有効噴射幅を、1サイクル中に必要とする要求噴射幅と上記最終より前の噴射開始区間で噴射した有効噴射幅の合計との差分に応じて設定するので、1サイクル中で要求噴射幅が変動した場合でも、最終の噴射開始区間において対処することが可能となり、柔軟に対応することができ、空燃比制御性を一層向上できる。
【0216】
さらに、最終より前の噴射開始区間での燃料噴射を当該噴射開始区間の始まりから開始し、最終の噴射開始区間における燃料噴射開始時期を、上記噴射開始セット時間から噴射開始区間の間隔時間の正数倍を減算してゼロ或いは負の値を示したときの2の補数に基づき上記最終の噴射開始区間の始まりから起算して設定するので、複数回噴射を噴射開始セット時間および噴射開始区間により指定するのみで、噴射開始時期及び噴射エンドを適正に設定することができ、エンジンの燃焼効率の向上、及びエンジン回転の安定化を図ることができる。
【図面の簡単な説明】
【図1】0.5ms毎の定期割込み処理を示すフローチャート
【図2】クラセン割込み処理を示すフローチャート
【図3】ジョブ優先処理を示すフローチャート
【図4】ジョブ実行サブルーチンを示すフローチャート
【図5】同上
【図6】同上
【図7】同上
【図8】クランク位置算出サブルーチンを示すフローチャート
【図9】CCAS・RCAS判別サブルーチンを示すフローチャート
【図10】燃料噴射開始時期算出ルーチンを示すフローチャート
【図11】同上
【図12】噴射タイマセットサブルーチンを示すフローチャート
【図13】噴射タイマセットマクロ1ルーチンを示すフローチャート
【図14】同上
【図15】噴射タイマセットマクロ2ルーチンを示すフローチャート
【図16】同上
【図17】ジョブの実行状態を示す説明図
【図18】ジョブフラグの説明図
【図19】ジョブ実行中フラグとオーバーラップカウンタの変化を示す説明図
【図20】システムシフトバッファの説明図
【図21】クラセン間隔テーブルの説明図
【図22】気筒・クランク位置状態マップの説明図
【図23】クランク位置、カム位置とクランク位置変数、噴射開始区間テーブル及び気筒別行程順のタイムチャート
【図24】噴射開始区間、及び噴射開始区間設定フラグの説明図
【図25】噴射タイマコントロールを示すタイムチャート
【図26】エンジン系の概略構成図
【図27】クランクロータとクランク角センサの正面図
【図28】カムロータとカム角センサの正面図
【図29】電子制御系の回路構成図
【符号の説明】
1…エンジン
25…インジェクタ
39…クランク角センサ
41…カム角センサ
50…電子制御装置
IJnTBL…噴射開始区間テーブル
IJTMGF…噴射開始区間設定フラグ
IJTIME…噴射開始セット時間
IJSEIn…要求噴射幅
TEIJAn…有効噴射幅
【産業上の利用分野】
本発明は、噴射開始区間毎の有効噴射幅の噴射開始時期を適正に設定する多気筒エンジンの燃料噴射制御方法に関する。
【0002】
【従来の技術】
近年、自動車などの車輛にマイクロコンピュータが導入され、エンジン、パワートレイン等を高精度に制御することが可能になった。これにより、車輛制御システムの開発においては、マイクロコンピュータのソフトウエア開発が大きな比重を占めるようになり、制御アルゴリズム上の処理の効率化が重要な課題となっている。特に、最近のエンジン制御系では制御内容が複雑化しており、CPUの効率的な活用はエンジン制御性の向上を図る上でも重要である。
【0003】
従来、上記マイクロコンピュータによるエンジン制御システムにおける燃料の噴射開始時期は、例えば特開昭61−160545号公報に開示されているように、一定クランク角毎に入力するクランクパルスをカウントしてエンジンの回転角位置を検出し、その検出値に基づいて設定するもの(いわゆる角度制御)、あるいは所定クランク角度間で計時した間隔時間に基づき噴射開始時期を設定するもの(いわゆる時間制御)などがある。
【0004】
【発明が解決しようとする課題】
ところで、従来の多気筒エンジンにおけるシーケンシャル燃料噴射制御は各気筒1サイクル当り1回噴射が一般的で、各気筒1サイクル中に必要とする燃料噴射幅が設定されれば、例えば噴射エンド制御(噴射終了時期を一定にする制御)では、上記燃料噴射幅に基づき噴射エンドクランク角からどのくらい前のクランク角で燃料噴射を開始すれば良いかを一義的に求めることになる。
【0005】
しかし、例えば低負荷運転時等では、燃料噴射幅が短いため噴射エンド制御により1回噴射を実行すると、燃料が充分に気化されないまま燃焼室に供給されることになり、燃焼効率が悪くエンジン回転の不安定化を招く。
【0006】
本発明は上記事情に鑑みてなされたもので、各気筒1サイクル当りの噴射回数を1回あるいは複数回設定できるとともに、各噴射開始区間における有効噴射幅、噴射開始時期及び1サイクルにおける噴射エンド等を適正に設定することができて燃焼効率及び空燃比制御性の良い多気筒エンジンの燃料噴射制御定方法を提供することを目的としている。
【0007】
【課題を解決するための手段】
上記目的を達成するため本発明による多気筒エンジンの燃料噴射制御方法は、多気筒エンジンの各気筒毎の1サイクルを、吸気行程後半、吸気行程前半、排気行程後半、排気行程前半、燃焼行程後半、燃焼行程前半、圧縮行程後半、圧縮行程前半に区分し、噴射制御を行わない上記吸気行程後半を除く各区間を、噴射開始区間として定義し、「上記噴射開始区間の数+1」個のビットからなり、気筒数分の、各ビットが各噴射区間を表す噴射開始区間設定フラグを用い、噴射開始セット時間に基づき上記各噴射開始区間の中から少なくとも1つの噴射開始区間を上記噴射開始区間設定フラグにより指定し、複数の噴射開始区間を指定した場合、指定した最終の噴射開始区間より前の噴射開始区間での噴射すべき有効噴射幅を、1サイクル中の要求噴射幅を指定した噴射開始区間の数により分割した値で設定し、また最終の噴射開始区間での噴射すべき最終有効噴射幅を1サイクル中に必要とする要求噴射幅と上記最終より前の噴射開始区間で噴射した有効噴射幅の合計との差分に応じて設定し、上記最終より前の噴射開始区間での燃料噴射を当該噴射開始区間の始まりから開始し、また最終の噴射開始区間での燃料噴射開始時期を、上記噴射開始セット時間から噴射開始区間の間隔時間の正数倍を減算してゼロ或いは負の値を示したときの2の補数に基づき上記最終の噴射開始区間の始まりから起算して設定することを特徴とする。
【0008】
【作用】
本発明は、多気筒エンジンの各気筒毎の1サイクルを、吸気行程後半、吸気行程前半、排気行程後半、排気行程前半、燃焼行程後半、燃焼行程前半、圧縮行程後半、圧縮行程前半の各噴射開始区間に区分する。そして、噴射制御を行わない吸気行程後半を除く各区間を、噴射開始区間として定義し、「上記噴射開始区間の数+1」個のビットからなり、気筒数分の、各ビットが各噴射区間を表す噴射開始区間設定フラグを用い、噴射開始セット時間に基づき上記各噴射開始区間の中から少なくとも1つの噴射開始区間を上記噴射開始区間設定フラグにより指定する。
【0009】
そして、複数の噴射開始区間を指定した場合は、指定した最終の噴射開始区間より前の噴射開始区間での噴射すべき有効噴射幅を、1サイクル中の要求噴射幅を指定した噴射開始区間の数により分割した値で設定する。また最終の噴射開始区間での噴射すべき最終有効噴射幅を1サイクル中に必要とする要求噴射幅と上記最終より前の噴射開始区間で噴射した有効噴射幅の合計との差分に応じて設定する。
【0010】
そして、最終より前の噴射開始区間での燃料噴射を当該噴射開始区間の始まりから開始し、また最終の噴射開始区間における燃料噴射開始時期を、上記噴射開始セット時間から噴射開始区間の間隔時間の正数倍を減算してゼロ或いは負の値を示したときの2の補数に基づき上記最終の噴射開始区間の始まりから起算して設定する。
【0011】
【実施例】
以下、図面に基づいて本発明の実施例を説明する。
【0012】
図面は本発明の一実施例に係り、図1は0.5ms毎の定期割込み処理を示すフローチャート、図2はクラセン割込み処理を示すフローチャート、図3はジョブ優先処理を示すフローチャート、図4〜図7はジョブ実行サブルーチンを示すフローチャート、図8はクランク位置算出サブルーチンを示すフローチャート、図9はCCAS・RCAS判別サブルーチンを示すフローチャート、図10、図11は燃料噴射開始時期の算出ルーチンを示すフローチャート、図12は噴射タイマセットサブルーチンを示すフローチャート、図13、図14は噴射タイマセットマクロ1ルーチンを示すフローチャート、図15、図16は噴射タイマセットマクロ2ルーチンを示すフローチャート、図17はジョブの実行状態を示す説明図、図18はジョブフラグの説明図、図19はジョブ実行中フラグとオーバーラップカウンタの変化を示す説明図、図20はシステムシフトバッファの説明図、図21はクラセン間隔テーブルの説明図、図22は気筒・クランク位置状態マップの説明図、図23はクランク位置、カム位置とクランク位置変数、噴射開始区間テーブル及び気筒別行程順のタイムチャート、図24は噴射開始区間、及び噴射開始区間設定フラグの説明図、図25は噴射タイマコントロールを示すタイムチャート、図26はエンジン系の概略構成図、図27はクランクロータとクランク角センサの正面図、図28はカムロータとカム角センサの正面図、図29は電子制御系の回路構成図である。
【0013】
本実施例のエンジン制御システムでは、図29に示すマイクロコンピュータを中核とした電子制御装置(ECU)50によって図26に示すエンジン系が制御され、燃料噴射制御、点火時期制御などが行われる。このECU50のマイクロコンピュータには、新しい概念に基づくオペレーティングシステム(OS)が搭載されており、このOSの管理下で、各制御ストラテジーに基づく各ジョブが、それぞれの優先レベルに従って実行される。
【0014】
まず、エンジン系の機器構成について説明する。
【0015】
図26において符号1はエンジン(本実施例においては水平対向4気筒エンジン)であり、右バンクR側に#1,#3気筒を、左バンクL側に#2,#4気筒を備える。そして、シリンダブロック1aの左右両バンクに併設するシリンダヘッド2の吸気ポート2aにインテークマニホルド3が連通され、このインテークマニホルド3の上流にエアチャンバ4を介してスロットル通路5が連通されている。このスロットル通路5の上流側には、吸気管6を介してエアクリーナ7が取付けられ、このエアクリーナ7が吸入空気の取入れ口であるエアインテークチャンバ8に連通されている。
【0016】
また、上記排気ポート2bにエキゾーストマニホルド9を介して排気管10が連通され、この排気管10に触媒コンバータ11が介装されてマフラ12に連通されている。一方、上記スロットル通路5にスロットルバルブ5aが設けられ、このスロットル通路5の直上流の上記吸気管6にインタークーラ13が介装され、さらに、上記吸気管6の上記エアクリーナ7の下流側にレゾネータチャンバ14が介装されている。
【0017】
また、上記レゾネータチャンバ14と上記インテークマニホルド3とを連通して上記スロットルバルブ5aの上流側と下流側とをバイパスするバイパス通路15に、アイドルスピードコントロールバルブ(ISCV)16が介装されている。さらに、このISCV16の直下流側に、吸気圧が負圧のとき開弁し、またターボチャージャ18によって過給されて吸気圧が正圧になったとき閉弁するチェックバルブ17が介装されている。
【0018】
上記ターボチャージャ18は、上記吸気管6の上記レゾネータチャンバ14の下流側にコンプレッサが介装され、タービンが上記排気管10に介装されている。さらに、上記ターボチャージャ18のタービンハウジング流入口には、ウエストゲート弁19が介装され、このウエストゲート弁19には、ウエストゲート弁作動用アクチュエータ20が連設されている。
【0019】
上記ウエストゲート弁作動用アクチュエータ20は、ダイヤフラムにより2室に仕切られ、一方がウエストゲート弁制御用デューティソレノイド弁21に連通される圧力室を形成し、他方が上記ウエストゲート弁19を閉方向に付勢するスプリングを収納したスプリング室を形成している。
【0020】
上記ウエストゲート弁制御用デューティソレノイド弁21は、上記レゾネータチャンバ14と上記吸気管6の上記ターボチャージャ18のコンプレッサ下流とを連通する通路に介装されており、ECU50から出力される制御信号のデューティ比に応じて、上記レゾネータチャンバ14側の圧力と上記コンプレッサ下流側の圧力とを調圧し、上記ウエストゲート弁作動用アクチュエータ20の圧力室に供給する。
【0021】
すなわち、上記ECU50によって上記ウエストゲート弁制御用デューティソレノイド弁21を制御し、上記ウエストゲート弁作動用アクチュエータ20を作動させて上記ウエストゲート弁19による排気ガスリリーフを調整することにより、上記ターボチャージャ18による過給圧を制御するようになっている。
【0022】
また、上記インテークマニホルド3に絶対圧センサ22が通路23を介して連通され、この通路23に、上記絶対圧センサ22と上記インテークマニホルド3或は大気とを選択的に連通する吸気管圧力/大気圧切換ソレノイド弁24が介装されている。
【0023】
さらに、上記インテークマニホルド3の各気筒の各吸気ポート2aの直上流側にインジェクタ25が臨まされ、また、上記シリンダヘッド2の各気筒毎に、その先端を燃焼室に露呈する点火プラグ26aが取付けられ、この点火プラグ26aに連設された点火コイル26bにイグナイタ27が接続されている。
【0024】
上記インジェクタ25には、燃料タンク28内に設けたインタンク式の燃料ポンプ29から燃料フィルタ30を経て燃料が圧送され、プレッシャレギュレータ31にて調圧される。
【0025】
また、上記吸気管6の上記エアークリーナ7の直下流に吸入空気量センサ32が介装され、上記スロットルバルブ5aに、スロットル開度センサ33aとアイドルスイッチ33bとを内蔵したスロットルセンサ33が連設されている。
【0026】
さらに、上記エンジン1のシリンダブロック1aにノックセンサ34が取付けられるとともに、このシリンダブロック1aの左右両バンクを連通する冷却水通路35に冷却水温センサ36が臨まされ、上記排気管10の上記エキゾーストマニホルド9の集合部にO2 センサ37が臨まされている。
【0027】
また、上記シリンダブロック1aに支承されたクランクシャフト1bにクランクロータ38が軸着され、このクランクロータ38の外周に、電磁ピックアップなどからなるクランク角センサ39が対設されている。さらに、上記エンジン1のカムシャフト1cに連設するカムロータ40に、電磁ピックアップなどからなる気筒判別用のカム角センサ41が対設されている。尚、上記クランク角センサ39及び上記カム角センサ41は、電磁ピックアップなどの磁気センサに限らず、光センサなどでも良い。
【0028】
上記クランクロータ38は、図27に示すように、その外周に突起38a,38b,38cが形成され、これらの各突起38a,38b,38cが、各気筒(#1,#2と#3,#4)の圧縮上死点前(BTDC)θ1,θ2,θ3 の位置に形成されている。尚、本実施例においては、θ1 =97°CA、θ2 =65°CA、θ3 =10°CAである。
【0029】
上記クランクロータ38の各突起は、上記クランク角センサ39によって検出され、図23に示すようにBTDC97°,65°,10°CAのクランク角信号(クラセン信号)がエンジン1/2回転毎(180°CA毎)に出力される。そして、各信号の入力間隔時間がタイマによって計時され、エンジン回転数が算出される。上記突起38bは、点火時期設定の際の基準クランク角となり、また、突起38cは、始動時噴射開始時期の基準クランク角となるとともに始動時の固定点火時期を示すクランク角となる。
【0030】
また、図28に示すように、上記カムロータ40の外周には、気筒判別用の突起40a,40b,40cが形成され、突起40aが#3,#4気筒の圧縮上死点後(ATDC)θ4 の位置に形成され、突起40bが3個の突起で構成されて最初の突起が#1気筒のATDCθ5 の位置に形成されている。さらに、突起40cが2個の突起で形成され、最初の突起が#2気筒のATCDθ6 の位置に形成されている。尚、本実施例においては、θ4 =20°CA、θ5 =5°CA、θ6 =20°CAである。
【0031】
そして、上記カムロータ40の各突起が上記カム角センサ41によって検出され、各気筒の燃焼行程順を#1→#3→#2→#4とした場合、この燃焼行程順と、上記カム角センサ41の検出信号をカウンタによって計数した値とのパターン(図23のタイムチャート参照)に基づいて、気筒判別がなされる。
【0032】
一方、図29に示すように、ECU50は、燃料噴射制御、点火時期制御などを行なうメインコンピュータ51と、ノック検出処理を行なう専用のサブコンピュータ52との2つのコンピュータを中心として構成され、各部に所定の安定化電源を供給する定電圧回路53や各種の周辺回路が組込まれている。
【0033】
上記定電圧回路53は、ECUリレー54のリレー接点を介してバッテリ55に接続され、このバッテリ55に、上記ECUリレー54のリレーコイルがイグニッションスイッチ56を介して接続されている。また、上記バッテリ55には、上記定電圧回路53が直接接続され、さらに、燃料ポンプリレー57のリレー接点を介して燃料ポンプ29が接続されている。
【0034】
すなわち、上記定電圧回路53は、上記イグニッションスイッチ56がONされ、上記ECUリレー54のリレー接点が閉となったとき、制御用電源を供給し、また、上記イグニッションスイッチ56がOFFされたとき、バックアップ用の電源を供給する。
【0035】
上記メインコンピュータ51は、CPU58(以下、メインCPU58と称する)、ROM59、RAM60、上記イグニッションスイッチ56がOFFされたときにも上記定電圧回路53からバックアップ電源が供給されてデータを保持するバックアップRAM61、カウンタ・タイマ群62、シリアル通信インターフェースであるSCI63、及び、I/Oインターフェース64がバスライン65を介して接続されたマイクロコンピュータである。
【0036】
尚、上記カウンタ・タイマ群62は、フリーランニングカウンタ、カム角センサ(以下、適宜、カムセンと略記する)信号の入力計数用カムセンカウンタなどの各種カウンタ、噴射タイマ、点火タイマ、後述する0.5ms毎の定期割込みを発生させるための定期割込みタイマ、クランク角センサ(以下、適宜、クラセンと略記する)信号の入力間隔計時用クラセンタイマ、及び、システム異常監視用のウオッチドッグタイマなどの各種タイマを便宜上総称するものであり、上記メインコンピュータ51においては、その他、各種のソフトウエアカウンタ・タイマが用いられる。
【0037】
また、上記サブコンピュータ52も、上記メインコンピュータ51と同様、CPU71(以下、サブCPU71と称する)、ROM72、RAM73、カウンタ・タイマ群74、SCI75、及び、I/Oインターフェース76がバスライン77を介して接続されたマイクロコンピュータであり、上記メインコンピュータ51とサブコンピュータ52とは、上記SCI63,75を介してシリアル通信ラインにより互いに接続されている。
【0038】
上記メインコンピュータ51のI/Oインターフェース64には、入力ポートに、吸入空気量センサ32、スロットル開度センサ33a、水温センサ36、O2 センサ37、絶対圧センサ22、車速センサ42、及び、バッテリ55が、8チャンネル入力のA/D変換器66を介して接続されるとともに、アイドルスイッチ33b、クランク角センサ39、カム角センサ41が接続されており、さらに、始動状態を検出するためにスタータスイッチ43が接続されている。
【0039】
尚、本実施例においては、上記A/D変換器66は、7チャンネル分の入力が使用され、残りの1チャンネルは予備となっている。
【0040】
また、上記I/Oインターフェース64の出力ポートには、イグナイタ27が接続され、さらに、駆動回路67を介して、ISCV16、インジェクタ25、燃料ポンプリレー57のリレーコイル、および、ウエストゲート弁制御用デューティソレノイド弁21、吸気管圧力/大気圧切換ソレノイド弁24が接続されている。
【0041】
一方、上記サブコンピュータ52のI/Oインターフェース76は、入力ポートに、クランク角センサ39、カム角センサ41が接続されるとともに、A/D変換器78、周波数フィルタ79、アンプ80を介してノックセンサ34が接続されており、上記ノックセンサ34からのノック検出信号が上記アンプ80で所定のレベルに増幅された後に上記周波数フィルタ79により必要な周波数成分が抽出され、上記A/D変換器78にてデジタル信号に変換されて入力されるようになっている。
【0042】
上記メインコンピュータ51では、各センサ類からの検出信号を処理し、燃料噴射パルス幅、点火時期などを演算する。すなわち、吸入空気量センサ32の出力信号から吸入空気量を算出し、RAM60及びバックアップRAM61に記憶されている各種データに基づき、吸入空気量に見合った燃料噴射量を演算し、また、点火時期などを算出する。
【0043】
そして、上記燃料噴射量に相応する駆動パルス幅信号を、駆動回路67を介して所定のタイミングで該当気筒のインジェクタ25に出力して燃料を噴射し、また、所定のタイミングでイグナイタ27に点火信号を出力し、該当気筒の点火プラグ26aを点火する。
【0044】
その結果、該当気筒に供給された混合気が爆発燃焼し、エキゾーストマニホルド9の集合部に臨まされたO2 センサ37により排気ガス中の酸素濃度が検出され、この検出信号が波形整形された後、上記メインCPU58で基準値(スライスレベル)と比較され、エンジンの空燃比状態が目標空燃比に対し、リッチ側にあるか、リーン側にあるかが判別され、空燃比が目標空燃比となるようフィードバック制御される。
【0045】
一方、上記サブコンピュータ52では、エンジン回転数とエンジン負荷とに基づいてノックセンサ34からの信号のサンプル区間を設定し、このサンプル区間でノックセンサ34からの信号を高速にA/D変換して振動波形を忠実にデジタルデータに変換し、ノック発生の有無を判定する。
【0046】
上記サブコンピュータ52のI/Oインターフェース76の出力ポートは、上記メインコンピュータ51のI/Oインターフェース64の入力ポートに接続されており、上記サブコンピュータ52でのノック判定結果がI/Oインターフェース76に出力される。そして、上記メインコンピュータ51では、上記サブコンピュータ52からノック発生有りの判定結果が出力されると、SCI63を介してシリアル通信ラインよりノックデータを読込み、このノックデータに基づいて直ちに該当気筒の点火時期を遅らせ、ノックを回避する。
【0047】
このようなエンジン制御において、上記メインコンピュータ51では、各センサ類からの信号入力処理、エンジン回転数算出、吸入空気量算出、燃料噴射量算出、点火時期算出といった各項目毎の各種プログラムが、一つのOSの管理下で効率的に実行される。このOSは、車輌制御のための各種マネジメント機能、及び、このマネジメント機能に密着した内部ストラテジーを有し、各種ジョブを体系的に結合する。
【0048】
上記OSのマネジメント機能としては、
(1−1)ジョブの優先処理
(1ー2)セクション定義による各ジョブの分割ファイル対応
(1−3)スタックの使用状況モニタ機能
(1−4)異常割込み動作のモニタ機能
(1−5)ジョブ毎に固有の制約を作らない標準マップ・標準ワークメモリ設定
などの機能があり、制御ストラテジーの開発環境を向上させるとともに、限られたCPU能力を最大限に発揮させ、デジタル制御理論の基本である等時間間隔処理を可能な限り達成することができる。
【0049】
等時間間隔処理としては、0.5ms毎の定期割込みを基本として、2,4,10,50,250ms毎の5種類の等間隔割込みジョブが用意されており、また、エンジン回転に同期した処理として、クランク角信号入力により即割込み実行される高優先クラセンジョブ(以下、単にクラセンジョブと称する)と、より優先順位が高い他のジョブがないときにクランク角信号入力により割込み実行される比較的緊急度の低い低優先クラセンジョブとが用意されている。
【0050】
これらの各ジョブには、クラセンジョブ>2msジョブ>4msジョブ>10msジョブ>低優先クラセンジョブ>50msジョブ>250msジョブの順で、7〜1の優先レベルが高位側から低位側に向かって付けられており、図17に示すように、高速ジョブに対し低速ジョブが分割して処理されるとともに、各ジョブの多重待ち処理が行なわれる。
【0051】
また、上記OSの下で働く各プログラムは、機能別の領域毎に順番に配列されており、各機能毎にセクション宣言によって名前が付けられている。上記OS下で働く数々のストラテジーファイル(ユーザ側ファイル)は、各機能毎にOSと同じ名前のセクション宣言を用いることにより、開発段階において、例えば、初期値設定処理、10ms毎の処理、バックグランド処理等を別々のファイルに記述しても、各ファイルがリンクされたとき、同じ処理は連続した1つの領域に集められ、OSと融合し一体となって動作する。
【0052】
各ストラテジーファイル側で使用する主なセクション領域は、
○変数宣言領域
○自己ファイル名、ファイル制作時の自動記録領域
○セッティングデータ領域
○クラセンジョブ領域
○2msジョブ領域
○4msジョブ領域
○10msジョブ領域
○低優先クラセンジョブ領域
○50msジョブ領域
○250msジョブ領域
○リセット時初期化ジョブ領域
○エンスト時初期化ジョブ領域
○バックグランドジョブ領域
○プログラム本体の領域
であり、機能毎にファイルを分割してプログラム開発が可能になるとともに、プログラムの構造化記述を可能にする。
【0053】
また、上記OSには、以上のマネジメント機能に密着した内部ストラテジーとして、
(2−1)A/D変換処理
(2−2)クランク位置に係る各種情報の算出
(2−3)デバッグ用シミュレーション機能(エンジン回転及びA/D変換)
(2−4)点火タイマのセット
(2−5)噴射タイマのセット
などの機能を備えており、さらに、これらの機能に係る各種サービスルーチンが各ジョブ中に用意されている。
【0054】
従来、このような機能は各ジョブレベルで達成するようになっていたが、本システムにおいては、すべてOS側に用意され、OS側で処理したA/D変換結果、クランク位置情報、エンジン回転数などに基づいて、ユーザ側の各ジョブで、燃料噴射量、点火時期などを設定すると、これらの指示値がOSによって噴射タイマ、点火タイマにセットされるようになっている。
【0055】
次に、上記メインコンピュータ51における燃料噴射制御の機能を、ジョブ処理の説明を基本として図1〜図16に示すフローチャートに従って説明する。尚、サブコンピュータ52はノック検出処理専用のコンピュータであるため、その動作説明を省略する。
【0056】
まず、イグニッションスイッチ56がONされてシステムに電源が投入されると、リセットに伴うリセット割込みが起動し、各種イニシャライズが行なわれるとともに、0.5ms毎に定期割込みを起動するための定期割込みタイマが起動され、クランク角センサ39からの信号入力毎(BTDC97°,65°,10°CA毎のエンジン1回転に6回)に起動されるクラセン割込みが許可され、その後、バックグランドジョブの実行状態となる。
【0057】
そして、このバックグランドジョブの上で、0.5ms毎の定期割込みと、エンジン1回転に6回のクラセン割込みとにより、7レベルのジョブが優先処理される。この2つの割込みにおいては、各自の処理を実行後、共通のアドレスにジャンプし、ジョブ優先処理を実行する。
【0058】
尚、上記リセット割込みは、内部演算において0による除算を実行した場合や、無限ループが発生した場合など、正常時には発生しない要因によっても、起動される。
【0059】
まず、図1に示す0.5ms毎の定期割込みについて説明する。この定期割込みでは、ステップS100で、OS用ワークエリアを設定し、ステップS101で、ウオッチドッグタイマを初期化すると、ステップS102へ進んで、P−RUNフラグを20回に1回すなわち10ms毎に反転する。このP−RUNフラグは、図示しない保護回路によってシステムが自動的にリセットされないようにするためのフラグであり、システムが正常に動作して一定時間毎(10ms毎)に反転される限り、上記保護回路の作動が阻止される。
【0060】
次いで、ステップS103へ進み、スイッチ出力の転写を行なう。このスイッチ出力は、各ジョブ中でメモリに書き込んだビットのON,OFF値であり、各ジョブからは直接I/Oインターフェース64の出力ポートに出力せず、OS側で0.5ms毎にメモリの値を出力ポートに転写する。
【0061】
次に、ステップS104へ進むと、A/D変換サブルーチンを実行してA/D変換に係る各種設定を行ない、ステップS105で、ジョブフラグ作成サブルーチンを実行して、2,4,10,50,250ms毎の各ジョブ割込み要求を示すジョブフラグJB_FLGを作成した後、ステップS106で、A/D変換をスタートする。
【0062】
上記A/D変換は、基本的に、A/D変換器66の8チャンネル入力が0.5ms毎に所定の変換順番毎に処理され、4ms周期で全入力の変換が行なわれる。但し、特定の1つのチャンネルは、回転脈動が発生する吸入管圧力などをA/D変換するためクランク角90°毎に(0.5msの時間精度で)同期し、変換順番に対して割込んだ形で処理が行なわれ、その後の入力の順番を1つ遅れにする。
【0063】
尚、エンジン回転数3750rpm以上では、A/D変換の最後の順番の入力が完全に停止し、7500rpm以上では、最後から2番目の入力も停止するが、A/D変換の順番は、スロットル開度、吸入空気量など変化の速いものを先として、冷却水温、電圧など比較的変化の遅いものが後になるように設定してあり、且つ、最後のA/D変換順番をクランク同期入力に設定してあるため、特に支障は生じない。
【0064】
また、図18に示すように、上記ジョブフラグJB_FLGは、1バイト変数の各ビットを各ジョブに対応するフラグとして割当てたものであり、複数のジョブ要求が同時に可能なようになっている。この1バイト変数のビット1〜ビット7は優先レベル1〜7に対応し、それぞれ、250msジョブ、50msジョブ、低優先クラセンジョブ、10msジョブ、4msジョブ、2msジョブ、クラセンジョブのフラグに割当てられている。そして、所定のビットが立てられたとき、対応する優先レベルのジョブ割込み要求がなされる。尚、ビット0はバックグランドジョブのフラグに割当てられて通常は参照されない。
【0065】
そして、上記ステップS105でジョブフラグ作成サブルーチンによりジョブフラグJB_FLGを作成し、上記ステップS106でA/D変換をスタートした後は、ステップS107へ進み、ジョブフラグJB_FLGのいずれかのジョブに対応するビットが立っているか否かを調べる。
【0066】
その結果、ジョブフラグJB_FLGのビットが一つも立っていないときには、どのジョブからも要求がないため割込みを終了し、ジョブフラグJB_FLGのいずれかのビットが立っているときには、ステップS108へ進んで、現状レベル(この定期割込みが実行される時点で所定の優先レベルのジョブが実行されていた状態)以下のフラグがないか否かを調べる。
【0067】
上記ステップS108で、現状レベル以下のフラグがないときには、ラベルWAR_JBで示される図3のジョブ優先処理にジャンプし、現状レベル以下のフラグがあるときには、ステップS109で、現状レベル以下のレベルのオーバーラップカウンタOLCを1増加させる。
【0068】
上記オーバーラップカウンタOLCは、ジョブ要求を記憶するためのカウンタであり、各優先レベル毎に1バイト割当てられ、上記ジョブフラグJB_FLGによるジョブ要求時にインクリメント、ジョブ終了時にデクリメントされる。すなわち、カウンタによってジョブ要求を記憶することによりジョブの多重要求に対応することができるのである。
【0069】
次いで、上記ステップS109からステップS110へ進み、現状レベルより高いフラグがないか否かを調べ、現状レベルより高いフラグがないときには、ルーチンを抜けて割込みを終了し、現状レベルより高いフラグがあるときには、ラベルWAR_JBのジョブ優先処理へジャンプする。
【0070】
一方、この0.5ms毎の定期割込みに対し、図2のクラセンによる割込みでは、ステップS200で、OS用ワークエリアを設定すると、ステップS201で、後述するクランク位置算出のサブルーチンを実行し、現在のクランク位置を判別するためのクランク位置変数、及び、最新の3つのクラセン間隔の和であるエンジン半回転の経過時間すなわち半回転時間を算出する。
【0071】
上記クランク位置変数は、OS中で用意されるシステム変数であり、図23に示すように、#1〜#4気筒に対するクランク位置を、クランク角センサ39からの信号入力によるBTDC97°,65°,10°CAによって12の状態に区分し、現在のクランク位置を表わす。
【0072】
すなわち、各気筒毎に、0,1,2の数値でクラセン入力順を示すクランク位置情報変数S_CCAS、#1気筒を0、#3気筒を1、#2気筒を2、#4気筒を3として気筒の燃焼順を示す気筒情報変数S_RCAS、及び、0〜11の数値でクラセン順序及び気筒順序を総合的に表わす総合位置変数S_ACASの3変数によって現在のクランク位置を表わし、さらに、クランク位置が確証をもって正常に判別されたときを0、判別結果がつじつまが合わず不安の残る推定状態を1、不明な状態を2とするエラーレベルS_ECASにより、クランク位置の判別状況を表わすようになっている。尚、図23においては、システム変数であることを示すS_を省略している。
【0073】
次いで、上記ステップS201からステップS202へ進むと、クランク位置算出のサブルーチンにおいてクランク位置判定が正常に終了したか或は判定不能であったかを、アキュムレータAにストアされているコードを読み出すことにより調べる(エラーコード1、正常終了コード0)。
【0074】
そして、上記ステップS202で、アキュムレータAの値が1であり、クランク位置が判定不能であったときには、割込みを終了し、アキュムレータAの値が0であり、クランク位置が正常に判定されているときには、ステップS203へ進み、エンストフラグを解除する。
【0075】
尚、上記エンストフラグは、エンジンがエンスト状態であることを示すフラグであり、クラセン間隔が0.5sec以上の時間(約30rpm以下)のとき、50msジョブに用意されているエンスト処理ルーチンによりセットされ、このクラセン割込みによりクリアされてエンスト状態が解除される。
【0076】
次に、ステップS204へ進むと、点火タイマセットのサブルーチンを実行し、ユーザジョブ側で設定した点火時期の指示値に基づいて作成された点火スケジュールに従って点火タイマをセットする。この点火スケジュールは、ドエル開始時期、ドエルオン待ち時間、ドエルオフ待ち時間などをメンバーとする構造体変数であり、10msジョブ中に作成ルーチンが用意され、この点火スケジュールに従って点火シーケンスが決定される。
【0077】
次いで、ステップS205で、後述する噴射タイマセットサブルーチンを実行し、ユーザジョブ側で設定した気筒毎の要求燃料噴射幅に対応する噴射時間を、1回噴射或は複数回噴射に応じた1回当りの有効噴射幅として算出し、噴射タイマにセットしてステップS206へ進む。
【0078】
ステップS206では、このクラセンが実行された現状のジョブレベルが自身のジョブレベルであるか否かを判別し、現状がクラセンジョブ自身のレベルであるときには、ステップS207、ステップS208で、クラセンジョブ、低優先クラセンジョブのオーバーラップカウンタOLCを、それぞれ1増加させて割込みを終了し、現状のジョブレベルがクラセンジョブのレベルでないときには、ステップS209で、現状のジョブレベルが低優先クラセンジョブのレベル以上であるか否かを調べる。
【0079】
そして、現状のジョブレベルが低優先クラセンジョブ以上であるときには、上記ステップS209からステップS210へ進んで、低優先クラセンジョブのオーバーラップカウンタOLCを1増加させると、ステップS211で、クラセンジョブのジョブフラグをセットし、ラベルWAR_JBのジョブ優先処理へジャンプする。
【0080】
一方、上記ステップS209で、現状のジョブレベルが低優先クラセンジョブ以上でないときには、上記ステップS209からステップS212へ進み、クラセンジョブのジョブフラグをセットすると、ステップS213で、低優先クラセンジョブのジョブフラグをセットし、ラベルWAR_JBのジョブ優先処理へジャンプする。
【0081】
図3に示すジョブ優先処理では、ステップS300で、ジョブの優先レベルを示す1バイト変数であるジョブレベルJB_LEVを1つ上げると、ステップS301へ進んで、この優先レベルに対応するジョブフラグが立っていないか調べる。そして、ジョブフラグが立っていないときには、ステップS300へ戻ってさらにジョブレベルJB_LEVを1つ上げ、ジョブフラグが立っているときには、ステップS302へ進み、ジョブフラグの立っているジョブのオーバーラップカウンタOLCを初期値の0から1にし、ステップS303へ進む。
【0082】
ステップS303では、より上のジョブフラグがあるか否かを調べ、より上のジョブがあるときには、ステップS300へ戻って前述の処理を繰り返し、より上のジョブがないときには、ステップS304へ進んで、ジョブ実行中フラグJB_RUNをセットすると、ステップS305で、後述するジョブ実行サブルーチンにより最上位のジョブを実行する。
【0083】
上記ジョブ実行中フラグJB_RUNは、ジョブの実行開始時にセットされ、終了時にクリアされるフラグであり、このフラグにより、処理の途中で、より優先度の高いジョブによって割込まれたジョブを識別することができる。
【0084】
例えば、図19に示すように、JB_LEV=4の10msジョブを実行中、JB_LEV=6の2msジョブの割込み要求がなされると、10msジョブの処理が中断され、より優先度の高い2msジョブが、JB_RUN=1、OLC=1にセットされ、実行される。そして、この2msジョブの処理中に、JB_LEV=5の4msジョブの割込み要求が発生すると、この4msジョブは、JB_RUN=0、OLC=1とされて割込みが受付けられるが、実行はされず待機状態となる。
【0085】
その後、ジョブ実行サブルーチンによるジョブの実行が終了すると、上記ステップS305からステップS306へ進んでオーバーラップカウンタOLCを1減らし、ステップS307で、オーバーラップカウンタOLCがゼロになったか否かを調べる。その結果、オーバラップカウンタOLCがゼロになっておらず、同じ優先レベルでジョブ割込み要求が複数回あるときには、ステップS305へ戻ってジョブを繰返し実行し、オーバラップカウンタOLCがゼロになったとき、ステップS307からステップS308へ進んで、ジョブ実行中フラグJB_RUNをクリアする。
【0086】
次に、ステップS309へ進み、ジョブレベルJB_LEVを1つ下げて次のジョブレベルに移ると、ステップS310で、このジョブレベルJB_LEVがゼロになったか否かを調べる。そして、ジョブレベルJB_LEVがゼロのときには、この割込みを終了し、ジョブレベルJB_LEVがゼロでないときには、ステップS311へ進んで、オーバーラップカウンタOLCがゼロか否かを調べる。
【0087】
上記ステップS311で、オーバーラップカウンタOLCがゼロのときには、このレベルではジョブ要求はないため、上記ステップS311からステップS309へ戻って、ジョブレベルJB_LEVをさらに1つ下げて同様の処理を繰返し、オーバーラップカウンタOLCがゼロでないときには、ステップS312へ進んで、このジョブレベルにおいて、ジョブ実行中フラグJB_RUNがセットされているか否かを調べる。
【0088】
上記ステップS312で、ジョブ実行中フラグJB_RUNがセットされているときには、割込み前にジョブを実行中であったため、割込みを終了して割込み前のジョブへ戻り、ジョブ実行中フラグJB_RUNがセットされていなければ、ステップS304へ戻って、このレベルのジョブを実行し、同様の処理を繰返す。
【0089】
すなわち、図19において、JB_LEV=6の2msジョブが終了し、OLC=0、JB_RUN=0になると、ジョブレベルが1つ下げられ、JB_LEV=5の4msジョブが、JB_RUN=0、OLC=1の待機状態からJB_RUN=1にセットされ、実行される。さらに、4msジョブが終了すると、JB_LEV=4に移り、JB_RUN=1(ジョブ実行中)の状態から、2msジョブ及び4msジョブによって中断されていた10msジョブの処理が再開される。
【0090】
このように、0.5ms毎の定期割込み、クラセン割込みを基本タイミングとして、各ジョブの優先レベル及び実行タイミングを知らせるジョブフラグJB_FLGを作成するため、可能な限り正確に、等時間間隔処理、エンジン回転同期処理を実現し、各ジョブを効率良く処理することができる。さらに、基本タイミングとなる各割込み毎に更新されるジョブフラグJB_FLGによらず、オーバーラップカウンタOLCによってジョブの多重要求を記憶するため、あるジョブの処理時間が長引き、再度、同じジョブを実行すべきタイミングとなった場合においても、処理を途中で放棄することなく、可能な限り最後まで処理を継続することができる。
【0091】
次に、図4〜図7のジョブ実行サブルーチンについて説明する。
【0092】
まず、ステップS500で、ジョブフラグJB_FLGを参照して実行すべきジョブがクラセンジョブでないか否かを調べ、クラセンジョブでないときには、ラベルALJ10へ分岐し、クラセンジョブのときには、ステップS501へ進んで、気筒判別がついているか否かを調べる。
【0093】
そして、気筒判別がついていないときには、そのままルーチンを抜けてジョブを実行せず、気筒判別がついているとき、上記ステップS501からステップS502へ進んで、オーバーラップカウンタOLCの値を参照して多重待ち状態であるか否かを調べる。
【0094】
上記ステップS502では、多重待ち状態でないとき、ステップS503へ進んで、クラセン割込み毎に算出されるシステム変数S_ACAS(クランク総合位置変数)をユーザ変数ACASとし、一方、多重待ち状態のときには、ステップS504へ分岐し、ユーザ変数ACASを一つ増やして12で割った剰余をとって新たなユーザ変数ACASとし、このユーザ変数ACASを0,1,2,…11,0,1,…とソフトウエア的に更新してゆく。
【0095】
すなわち、クラセンジョブ及び低優先クラセンジョブは、自身または優先度の高いジョブに邪魔されて遅れることがあるが、クラセン割込みは正確にクランク角センサ信号に同期して実行され、システム変数S_ACASはジョブの遅れに関係なく更新される。
【0096】
従って、ジョブ中でシステム変数S_ACASを参照して気筒及びクランク位置に係る情報を知り、この情報に応じた仕事を行なおうとしても、自身が他のジョブに邪魔されて遅れた場合には、自身の仕事に対応した気筒及びクランク位置に係る情報を知ることができなくなる。このため、クラセンジョブ及び低優先クラセンジョブ中では、多重待ち状態でないときにOS用のシステム変数S_ACASをユーザ用変数ACASとして取込み、このユーザ変数ACASをジョブ実行毎に更新して多重要求の場合にも、自身に対応した気筒及びクランク位置に係る情報を得て適正な処理がなされるようにするのである。
【0097】
その後、上記ステップS503或は上記ステップS504からステップS505へ進み、ジョブのワークエリアを設定すると、ステップS506で、レベルゼロの割込みを許可し、ステップS507で、クラセンジョブのセクションに移る。そして、このクラセンジョブセクションにリンクされた処理を実行し、ステップS508で、割込みを禁止してルーチンを抜ける。
【0098】
次に、ステップS500で、これから実行すべきジョブがクラセンジョブでないときには、ラベルALJ10のステップS510で、2msジョブでないか否か調べ、2msジョブのとき、ステップS511で、ジョブのワークエリアを設定すると、ステップS512で、レベルゼロの割込みを許可し、ステップS513で、2msジョブのセクションに移る。そして、このセクションにリンクされているジョブ本体(ユーザ側の制御ストラテジーに基づくルーチン、或は、OS側で用意したサービスルーチン)を実行し、ステップS514で、割込みを禁止してルーチンを抜ける。
【0099】
一方、上記ステップS510で、実行すべきジョブが2msジョブでないときには、ステップS510からステップS520へ分岐し、実行すべきジョブが4msジョブか否かを調べる。そして、4msジョブでないときには、ラベルALJ30へ分岐し、4msジョブのときには、ステップS521で、ジョブのワークエリアを設定すると、ステップS522へ進む。尚、この4msジョブは、A/D変換利用ジョブであり、後述するシステムシフトバッファSSHBを介してA/D変換データを利用する。
【0100】
ステップS522では、レベルゼロの割込みを許可し、次いで、ステップS523へ進むと、スイッチ入力を読込み、ステップS524で、4msジョブのセクションに移って、リンクされているジョブ本体を実行する。その後、4msジョブのセクションから抜けると、ステップS525で、割込みを禁止し、ステップS526へ進んで、システムシフトバッファSSHBをシフトしてルーチンを抜ける。
【0101】
上記システムシフトバッファSSHBは、図20に示すように、8チャンネルの各A/D変換結果がストアされる先頭オフセットアドレス0,+8,+16,+24,+32,+34,+36,+38番の各メモリ、及び、4ms毎のクランク同期のA/D変換結果がストアされる先頭オフセットアドレス−2番地の1ワードのメモリからなり、0.5ms毎に実行される1回のA/D変換結果が1ワード(2バイト)でストアされる。
【0102】
先頭オフセットアドレス0番地からは、4段のシフトメモリとなっており、90°CA毎のA/D変換結果がストアされ、最新4データ(1回転分)をジョブから参照することができる。また、先頭オフセットアドレス+32,+34,+36,+38番地は、各1ワードのメモリであり、なまし処理機能が選択されたとき、A/D変換結果を加重平均した値がストアされてノイズ除去と精度向上を図ることができるようになっており、これらのメモリのデータは、低速ジョブで利用できる。
【0103】
また、各先頭オフセットアドレス+8,+16,+24番地からは、各4ワードのメモリであり、4msジョブで利用するようになっている。これらの各メモリは、最新のA/D変換結果が先頭から数えて、4msジョブのオーバーラップカウンタOLCの値だけ後のワードにストアされ、4msジョブ実行に際し、先頭方向からデータが読出され、ジョブの終了に伴って、後の各ワードのデータが順に先頭方向にシフトされるので、先にストアしたデータから読出されるFIFOバッファとなっている。
【0104】
すなわち、A/D変換は、0.5ms毎の定期割込みにより4ms周期で正確に行なわれるが、4msジョブは優先度の高いジョブに邪魔されて遅れることがある。従って、A/D変換の受渡しにFIFOバッファを用い、4msジョブで+8〜,+16〜,+24〜番地の各FIFOバッファのデータを参照後、上記ステップS526で、各FIFOバッファのデータを順にシフトするのである。
【0105】
一方、上記ステップS520で、実行すべきジョブが4msジョブでなく、ラベルALJ30へ分岐したときには、ステップS530で、実行すべきジョブが10msジョブか否かを調べ、10msジョブのとき、ステップS531で、ジョブのワークエリアを設定し、ステップS532で、レベルゼロの割込みを許可すると、ステップS533で、10msジョブのセクションに移って、ジョブ本体を実行し、ステップS534で割込みを禁止してルーチンを抜ける。
【0106】
尚、上記10msジョブのセクションには、半回転時間からエンジン回転数を算出するサービスルーチン、前述した点火スケジュールを作成するサービスルーチンなどがOS側で用意されている。
【0107】
また、上記ステップS530で、実行すべきジョブが10msジョブでないときにはステップS540へ分岐し、実行すべきジョブが低優先クラセンジョブであるか否かを調べる。そして、低優先クラセンジョブでないときには、上記ステップS540からラベルALJ50へ分岐し、実行すべきジョブが低優先クラセンジョブのときは、上記ステップS540からステップS541へ進んで、現在の状態が多重待ち状態であるか否かを調べる。
【0108】
そして、現在の状態が多重待ち状態でないときには、上記ステップS541からステップS542へ進んで、システム変数S_ACAS(クランク総合位置変数)をユーザ変数ACASとしてステップS544へ進み、多重待ち状態のときには、上記ステップS541からステップS543へ分岐し、ユーザ変数ACASを一つ増やして12で割った剰余をとった後、ステップS544へ進む。
【0109】
ステップS544では、ジョブのワークエリアを設定し、ステップS545で、レベルゼロの割込みを許可すると、ステップS546で、低優先クラセンジョブのセクションに移り、ジョブ本体を実行した後、ステップS547で割込みを禁止し、ルーチンを抜ける。
【0110】
さらに、ラベルALJ50では、ステップS550で、実行すべきジョブが50msジョブであるか否かを調べ、50msジョブのときには、ステップS551へ進んでジョブのワークエリアを設定し、ステップS552へ進む。
【0111】
ステップS552では、レベルゼロの割込みを許可すると、ステップS553で、50msジョブのセクションに移り、OS側で用意したエンスト処理ルーチン、気筒別の点火時期リタードルーチン、燃料噴射開始時期算出ルーチンなどを実行し、また、ユーザ側の制御ストラテジーに基づくルーチンを実行する。そして、ジョブの終了後、ステップS554で割込みを禁止し、ルーチンを抜ける。
【0112】
一方、上記ステップS550で実行すべきジョブが50msジョブではないときにはステップS560へ分岐し、ジョブのワークエリアを設定し、ステップS561でレベルゼロの割込みを許可し、ステップS562へ進んで、250msジョブのセクション領域へ移行し、ジョブ本体を実行後、ステップS563で割込みを禁止してルーチンを抜ける。
【0113】
以上のジョブ優先処理においては、クランク位置を常に的確に把握しておく必要があり、クラセン割込み毎に、図8に示すクランク位置算出サブルーチンが実行されて前述したクランク位置変数S_CCAS,S_RCAS,S_ACAS,S_ECASが算出される。尚、以下の説明においては、システム変数であることを示すS_をクランク位置変数から省略する。
【0114】
このクランク位置算出サブルーチンでは、まず、ステップS600で、クラセンタイマの下2バイトをソフトタイマの下2バイトにストアする。このクラセンタイマはECU50に備えられたハードウエアタイマであり、本実施例においては、16ビットタイマで最大255msまで計数が可能であるが、メモリ上に3バイトの連続した領域を確保して下2バイトにクラセンタイマの2バイトを転写し、クラセンタイマのオーバーフローにより発生する割込みで3バイト目をカウントアップすることによりソフトタイマとして使用する。これにより、クランク角センサ39からの信号入力間隔時間(以下、「クラセン間隔」と略記する)を最大64sec(255ms×256)まで計数することが可能となり、16ビット以上の特別なハードウエアタイマを使用することなく、クランキング時などクラセン間隔が極めて長い場合にも容易に対応することができる。
【0115】
次いで、ステップS601へ進むと、クラセン間隔が設定時間以下か否かを調べる。この設定時間は、最大エンジン回転数に対応するクラセン間隔としての時間、例えば0.3msであり、上記ステップS601でクラセン間隔が設定時間以下のときには、ノイズの混入などによるクラセンタイマの計数エラーとしてステップS602でアキュムレータAにエラーコード1を格納してルーチンを抜け、また、上記ステップS601で、クラセン間隔が設定時間より長いときには、クラセンタイマの計数が正常であるとしてステップS603へ進む。
【0116】
ステップS603では、後述するCCAS・RCAS判別サブルーチンを実行してクランク位置を判別し、ステップS604で、エラーレベルECASが2であるか否か、すなわち、クランキング時などのように気筒判別がなされていない状態であるか否かを調べ、ECAS=2のときには、ステップS605へ分岐してアキュムレータAにエラーコード1を格納し、ルーチンを抜ける。
【0117】
一方、上記ステップS604で、ECAS≠2のときには、ステップS606へ進み、ソフトタイマの3バイト目を0とする。そしてステップS607へ進み、クランク位置情報変数CCASが1であるか否か、すなわち、現在のクランク位置がBTDC65°CA〜10°CAの間(図23参照)であるか否かを調べ、CCAS=1のときには、ステップS607からステップS609へジャンプし、CCAS≠1のときには、ステップS607からステップS608へ進んで、A/D変換リクエストを1増加させ、ステップS609へ進む。
【0118】
このA/D変換リクエストは、クランク角90°CA毎にクランク同期A/D変換を指示するためのフラグ的な変数であり、0、1の値をとり、値が1のときクランク同期A/D変換を指示する。すなわち、前述したように、8チャンネルのA/D変換のうち1チャンネルのA/D変換はクランク角90°CA毎に行なわれるが、CCASが0になったとき(BTDC97°CA)と、CCASが2になったとき(BTDC10°CA)、クランク同期のA/D変換リクエストをセットし、0.5ms毎のA/D変換順番に対してクランク角90°毎(正確には87゜,93゜毎)のA/D変換を割込ませるのである。
【0119】
その後、ステップS609では、気筒情報変数RCASを3倍してクランク位置情報変数CCASを加算することにより総合位置変数ACASを算出すると(ACAS=RCAS×3+CCAS)、ステップS610で、ソフトタイマを2バイトでリミットし、クラセンタイマがオーバーフローしている場合には下2バイトをFFFF(255ms)としてステップS611へ進む。
【0120】
ステップS611では、総合位置変数ACAS=0,1,2,…11を添字とする配列TCAS[ACAS](配列の要素)にクラセン間隔データをストアし、ステップS612で、クランク位置情報変数CCAS=0,1,2を添字とする配列MTCSX[CCAS](配列の要素)にクラセン間隔データをストアする。
【0121】
配列TCASは、図21(a)に示すように、ACAS=0,1,2,…11に対応するエンジン2回転分のクラセン間隔データがストアされた12ワードのクラセン間隔テーブルであり、配列MTCSXは、同図(b)に示すように、CCAS=0,1,2に対応する3ヶのクラセン間隔データがストアされた3ワードのクラセン間隔テーブルである。
【0122】
すなわち、上記ステップS603のCCAS・RCAS判別サブルーチン(詳細は後述する)、及びステップS609により各情報変数CCAS,RCAS,ACASが更新され、例えば、CCAS=1、RCAS=1、ACAS=4に更新されて、現在、クランク位置が#3気筒のBTDC65゜〜10゜CAのとき、クラセンタイマによって計時された#3気筒のBTDC97゜CAにおけるクラセン信号入力から#3気筒のBTDC65゜CAにおけるクラセン信号入力までの時間(クラセン間隔データ)を、ステップS611で総合位置変数ACASをパラメータとして配列TCASのACAS=3のアドレスにストアすると共に、ステップS612でクランク位置情報変数CCASをパラメータとして配列MTCSXのCCAS=0のアドレスにストアする。
【0123】
従って、クラセン入力によるクラセン割込み毎に総合位置変数ACAS、クランク位置情報変数CCASが更新される都度、配列TCAS,MTCSX内のデータが順次更新されるので、配列TCASを参照することにより、各気筒の各クランク位置におけるクラセン間隔の変化(回転速度の変化)を知ることができ、各気筒の失火の有無、燃焼状態などを判断することができ、全気筒の運転状況を把握することができる。また、配列MTCSXを参照することにより、常に最新のクラセン間隔を得ることができ、現在の運転状況を迅速に把握することができる。
【0124】
次いで、ステップS613へ進むと、再び、エラーレベルECASの値を調べる。ここでは、前述のステップS604においてECAS≠2であることを既に確認してあるため、エラーレベルECASが1か否か、すなわち、クランク位置の判別が不安の残る推定状態であるか否かを調べる。
【0125】
上記ステップS613でECAS≠1(すなわちECAS=0)であり、クランク位置が確証をもって判別されているときには、上記ステップS613からステップS614へ進んで、最新3ヶのクラセン間隔データの和(配列MTCSXにストアされているクラセン間隔データの和)を、3バイトの半回転時間MTCS18として算出する(MTCS18=ΣMTCSX)。すなわち、半回転時間MTCS18は、クラセン割込み毎にクランク位置情報変数CCASが更新されて配列MTCSX内のデータが更新される毎に算出され、BTDC97°,65°,10°CAの各位置毎にクラセン間隔の移動和を取ることにより常に最新のデータが得られるようになっている。
【0126】
一方、上記ステップS613で、ECAS=1であり、クランク位置の判別が不安の残る推定状態であるときには、配列MTCSXから半回転時間MTCS18を算出せず、ステップS615で半回転時間推定のサブルーチンを実行して半回転時間MTCS18を推定する。
【0127】
この半回転時間MTCS18の推定は、前回のクラセン間隔時間から今回の半回転時間を推定するものである。すなわち、図23に示すように、現在のクランク位置情報変数CCASが1であれば、前回のクランク角間角度は32゜CA(BTDC97゜〜65゜CA間の角度)であり、このクランク角間角度と前回のクラセン間隔データとから、次式に基づき半回転時間MTCS18を算出する。
MTCS18=前回のクラセン間隔×180/32
また、CCAS=2のときには、BTDC65゜〜10゜CA間の角度55゜CAと前回のクラセン間隔データから、前回のクラセン間隔×180/55により半回転時間MTCS18を算出し、さらに、CCAS=0のときには、BTDC10゜CA〜ATDC83゜CA(次の気筒のBTDC97゜CA)間の角度93゜CAと前回のクラセン間隔データとから、前回のクラセン間隔×180/93により半回転時間MTCS18を算出する。
【0128】
そして、上記ステップS614で半回転時間MTCS18を算出した後、或は、上記ステップS615で半回転時間MTCS18を推定した後は、ステップS616へ進み、3バイトの半回転時間MTCS18を2バイトにリミットして所定の変数MTCSKにストアすると、ステップS617で、この変数MTCSKを2倍して変数MTCSK4にストアし、ステップS618で、正常終了コード0をアキュムレータAに格納してルーチンを抜ける。
【0129】
そして、前述のジョブ実行サブルーチンにおいて10ms毎にエンジン回転数が算出され、このエンジン回転数は、3バイトの半回転時間MTCS18を2バイトにリミットした変数MTCSKの逆数から算出される。
【0130】
詳述すると、毎分回転数rpmの単位時間(1min)の半分の時間30secを半回転時間MTCSKで割算することにより、1rpmを単位とする2バイト単位の変数NRPM、すなわち、エンジン回転数が算出され(NRPM=30sec/MTCSK)、このエンジン回転数が基本パラメータの1つとして各種の制御量演算処理に用いられるのである。
【0131】
次に、図9に示すフローチャートに従って、上記クランク位置算出サブルーチンのステップS603で実行されるCCAS・RCAS判別サブルーチンについて説明する。
【0132】
このサブルーチンでは、まず最初に、ステップS800で、カムセンカウンタを0〜4にリミットする。このカムセンカウンタで計数されるカム角センサ41からのカムパルスの数(クラセン信号入力間のカムパルス数)は、図23に示すように、正常状態の場合0〜3であるが、ノイズなどの影響により4以上の異常な計数値となるおそれがあるため、カムセンカウンタを0〜4にリミットして異常な状態を4で代表するのである。
【0133】
次に、ステップS801へ進み、カムセンカウンタ(の計数値)、気筒情報変数RCAS、クランク位置情報変数CCASから、5×4×2の組合わせ(カムセンカウンタが0〜4の5種類、気筒情報変数RCASが0〜3の4種類、クランク位置情報変数CCASが0,1と2の場合の2種類)に対する状態データがストアされている気筒・クランク位置状態マップCCHMAPを読む。
【0134】
この気筒・クランク位置状態マップCCHMAPは、図22(a)及び(b)に示すように、クランク位置情報変数CCASが0或は1の場合と、気筒情報変数RCASの変化点であるクランク位置情報変数CCASが2の場合とに分け、カムセンカウンタと気筒情報変数RCASとの各組合わせの起こり得る全ての状態に対し、正常か異常か、確定して良いか推定すべきかを示す状態データがストアされており、現在の状態を評価し、次にとるべき状態を知ることができる。
【0135】
この状態データは2ビットのデータであり、ビット0の値により確定か推定かを表わし、ビット1の値により正常か異常かを表わす。ビット0の値は、0のとき確定、1のとき推定を示し、図22からわかるように、カムセンカウンタが2,3の場合にのみ確定であって(図23に示すカムセン信号パターン参照)、それ以外は推定せざるを得ない状態である。また、ビット1の値は、0のとき正常、1のとき異常を示し、カムセンカウンタが3以下で、且つ、図23によるクランク位置変数の組合せに合致する場合のみ正常であって、それ以外は異常な状態である。
【0136】
例えば、CCAS=0或は1、すなわち、ある気筒のBTDC97°〜10°CAに対し、カムセンカウンタが0で気筒情報変数RCASが0となる組合せは、図23からもわかるように、クランク位置を正常に推定すれば良い状態であるため、図22に示す気筒・クランク位置状態マップCCHMAPの該当領域に2進数で01(正常推定)の状態データがストアされており、さらに、カムセンカウンタが1で気筒情報変数RCASが0となる組合せは、明らかに異常であって推定するしかない状態であるため、気筒・クランク位置状態マップCCHMAPの該当領域に2進数で11(異常推定)の状態データがストアされている。
【0137】
また、CCAS=2、すなわち、ある気筒のBTDC10°CA〜ATDC83°CAに対し、カムセンカウンタが3で気筒情報変数RCASが0となる組合せは、#1気筒のTDCを挟んだクランク位置と正常に確定できるため、気筒・クランク位置状態マップCCHMAPの該当領域に2進数で00(正常確定)の状態データがストアされており、さらに、カムセンカウンタが2で気筒情報変数RCASが0となる組合せは、明らかに異常ではあるがカムセン入力が2ヶある以上確定せざるを得ない状態であるため、気筒・クランク位置状態マップCCHMAPの該当領域に2進数で10(異常確定)の状態データがストアされている。
【0138】
そして、上記ステップS801で気筒・クランク位置状態マップCCHMAPから状態データを読込むと、ステップS802へ進み、エラーレベルECASが2でないか否か、すなわち、現在の状態が気筒判別のなされていない不明な状態であるか否かを調べ、ECAS=2のときには、ステップS803で気筒・クランク位置状態マップCCHMAPから読込んだ状態データのビット0が0か否か、すなわち確定状態か否かを調べ、確定状態のときにはステップS804へ進み、確定状態でなく推定状態であるときにはルーチンを抜けて確定状態となるまで待つ。
【0139】
一方、上記ステップS802でECAS≠2のときにはステップS804へ進んで、推定状態か否かを調べ、確定状態、推定状態に応じてステップS805以降の処理或はステップS812以降の処理へ進む。また、上記ステップS803において確定状態でステップS804へ進んだときには、ステップS805以降の処理へ進む。
【0140】
まず、ステップS805以降の処理について説明すると、このステップS805へ進んだときには、正常、異常に拘らず気筒判別がなされた確定状態であるため、図23のタイムチャートからもわかるように、今回のクラセン割込みはカムパルスが3ヶ或は2ヶ入力された後のBTDC97°CAの割込みであるため、クランク位置情報変数CCASを0にする。
【0141】
次いで、ステップS806へ進んでカムセンカウンタが3でないか否かを調べ、カムセンカウンタが3でないとき、すなわちカムセンカウンタが2のときには、#2気筒の点火後であるため、ステップS807で気筒情報変数RCASを3にしてステップS809へ進み、カムセンカウンタが3のときには、#1気筒の点火後であるため、ステップS808で気筒情報変数RCASを1にしてステップS809へ進む。
【0142】
ステップS809では、更新したクランク位置情報変数CCAS、気筒情報変数RCAS、及び、カムセンカウンタをパラメータとして再び気筒・クランク位置状態マップCCHMAPから状態データを読込み、この状態データのビット1が1であるか、すなわち異常状態であるか否かを調べる。
【0143】
その結果、上記ステップS809において、状態データのビット1が1で異常状態と判定されるときには、クランク位置情報変数CCAS、気筒情報変数RCASの更新結果は不安の残る推定であるとしてステップS810でエラーレベルECASを1にしてルーチンを抜け、状態データのビット1が0であり正常状態であるときには、ステップS811でエラーレベルECASを0としてルーチンを抜ける。
【0144】
一方、ステップS812以降の処理では、ステップS812で、現在のクランク位置情報変数CCAS(前回のクラセン割込みで算出されたクランク位置情報変数CCAS)が2、すなわち、気筒情報変数RCASの変化点であるか否かを調べ、CCAS=2のときには、ステップS812からステップS813へ進んで、気筒情報変数RCASを1増加させ、ステップS814でクランク位置情報変数CCASを0にしてステップS817へ進む。
【0145】
一方、上記ステップS812で、CCAS≠2のときには、上記ステップS812からステップS815へ進んでカムセンカウンタが0でないか否かを調べ、カムセンカウンタが0でないときには、前述のステップS813へ分岐し、カムセンカウンタが0のときには、ステップS816でクランク位置情報変数CCASを1増加させ、ステップS817へ進む。
【0146】
ステップS817では、更新したクランク位置情報変数CCAS、気筒情報変数RCAS、及び、カムセンカウンタをパラメータとして再び気筒・クランク位置状態マップCCHMAPから状態データを読込んで異常状態であるか否かを調べ、状態データのビット1が0であり、正常状態であるときには、そのまま(現在のエラーレベルECAS=0のまま)ルーチンを抜ける。また、上記ステップS817で、状態データのビット1が1で異常状態のときには、ステップS818へ進み、クランク位置情報変数CCAS、気筒情報変数RCASの更新結果は不安の残る推定であるとしてエラーレベルECASを1にし、ルーチンを抜ける。
【0147】
以上のように、クランク位置変数CCAS,RCAS,ACAS,ECASにより刻々と変化するクランク位置の状態を把握し、さらに、気筒・クランク位置状態マップCCHMAPを用いて、現在の状態を評価し、次にとるべき状態を知ることができるため、通常の条件判断による処理に比較して大幅にプログラムを簡略化することができ、メモリ容量の節約、処理速度の向上を図ることができるとともに、プログラムの可撓性を向上して仕様変更に対しても柔軟に対処することができる。
【0148】
次に、図10、図11に示す燃料噴射開始時期算出ルーチンについて説明する。この燃料噴射開始時期算出ルーチンは、前述したジョブ実行サブルーチンのステップS553で実行される50msジョブのうちの一つで、噴射開始区間、噴射回数、及び1回当りの噴射幅を全気筒について設定する。すなわち、噴射エンドを固定した場合の連続噴射の開始時期が遅い場合、噴射回数を2回に設定し、一方連続噴射の開始時期が早い場合には噴射回数を1回にするものである。
【0149】
まず、ステップS1000で始動時かを判断し、始動時の場合にはステップS1001へ進み、噴射開始遅れ時間IJDELYを0とし、ステップS1002で1回当りの噴射すべき有効噴射幅を1サイクル当りの総噴射量である要求噴射幅IJSEIn(n=#1,#2,#3,#4)の1/2に設定し、ステップS1003で噴射開始区間設定フラグIJTMGFを例えば128+2の複数回噴射にセットしてルーチンを抜ける。
【0150】
上記噴射開始遅れ時間IJDELYは後述する噴射タイマセットマクロ2で設定するタイマ待ち時間に組込まれるもので、噴射開始区間の始り(BTDC97°CAクラセン信号入力(以下、「97゜CAクラセン」と略記する)、或はBTDC10°CAクラセン信号入力(以下、「10゜CAクラセン」と略記する)から何ms後に、1回噴射であれば最初の噴射を、2回噴射であれば2回目の噴射を開始するのかを決定する。
【0151】
また、上記噴射開始区間設定フラグIJTMGFにより、#1〜#4気筒の噴射開始区間が特定される。すなわち、この噴射開始区間は、#1〜#4気筒毎の噴射開始区間テーブルIJnTBL(n=#1,#2,#3,#4)に予め格納されている。
【0152】
図23に示すように、この各噴射開始区間テーブルIJnTBL(n=#1,#2,#3,#4)では、#1〜#4気筒の1サイクルを前述のクランク総合位置変数ACASに対応して97°CAクラセンと10°CAクラセンとで8区間に区分し、各区間をビット7〜ビット0に対応させた1バイトの変数として上記噴射開始区間設定フラグIJTMGFにて噴射開始区間を設定する。すなわち、本実施例では、噴射開始区間テーブルIJnTBLの各噴射開始区間を、吸気行程の後半を0、前半を1、排気行程の後半を2、前半を3、燃焼行程の後半を4、前半を5、さらに、圧縮行程の後半を6、前半すなわち吸気行程終了直後を7と定義している。但し、噴射開始区間0では噴射処理を行わない。
【0153】
従って、上記ステップS1003において、IJTMGF=128+2は、8ビットの変数で表せば10000010であり、まず、1回目の噴射が噴射開始区間7(10°CAのクラセン)から開始され、次いで2回目の噴射が噴射開始区間1(10°CAのクラセン)から待ち時間無しで開始される。
【0154】
一方、上記ステップS1000で始動時ではないと判断されてステップS1004へ分岐すると、噴射開始セット時間IJTIMEがゼロかを判断し、IJTIME=0の場合、上記ステップS1001へ戻りステップS1001,ステップS1002,ステップS1003を経てルーチンを抜ける。
【0155】
この噴射開始セット時間IJTIMEはユーザ側の制御ストラテジーで設定するもので、例えば、この噴射開始セット時間IJTIMEに要求噴射幅IJSEIn(n=#1,#2,#3,#4)を代入すれば、噴射エンドを吸気行程直前のBTDC10°CAにほぼ固定することができる。また、この噴射開始セット時間IJTIMEを任意に設定することで噴射エンド制御を行うことができる。従って、ユーザ側の制御ストラテジーにおいてIJTIME=0と設定することも考えられ、この場合には上記ステップS1004から、上記ステップS1001へ戻り、上述したステップS1002で要求噴射幅に対する1回当りの噴射幅を設定し、ステップS1003で複数の噴射開始区間を設定してルーチンを抜ける。
【0156】
また、ステップS1004でIJTIME≠0と判断されてステップS1005へ進むと、このステップS1005以下において、噴射開始セット時間IJTIMEに基づく噴射開始区間及び噴射開始遅れ時間IJDELYを算出する。
【0157】
すなわち、上記噴射開始セット時間IJTIMEを噴射開始区間毎のクラセン間隔(BTDC97°〜10°CA或はBTDC10°〜ATDC83°CA間の間隔時間)で順次、ゼロ或は負になるまで減算して複数回噴射の各噴射開始区間を特定するとともに、最後の噴射開始区間の始め(97°CAクラセン或は10°CAクラセン)から何ms後に燃料噴射を開始すれば良いかを噴射開始遅れ時間IJDELYにより設定する。
【0158】
まず、ステップS1005では、上記噴射開始セット時間IJTIMEからクラセン間隔を減算し、その値をアキュムレータAに格納し、ステップS1006でこのアキュムレータAの値が正か、ゼロあるいは負かを判断し、A≦0場合、ステップS1007へ進み、噴射開始遅れ時間IJDELYを上記アキュムレータAに格納した値の2の補数で設定し(IJDELY=−A)、ステップS1008で1回当りの噴射すべき有効噴射幅を要求噴射幅IJSEIn(n=#1,#2,#3,#4)の1/2に設定し、ステップS1009で噴射開始区間設定フラグIJTMGFを例えば128+4の複数回噴射にセットしてルーチンを抜ける。IJTMGF=128+4を8ビットの変数で表せば、10000100であり、従って、噴射開始区間は7と2であり、1回目の噴射が噴射開始区間7から待ち時間無しで開始され、後の噴射が噴射開始区間2の97°CAクラセンから噴射開始遅れ時間IJDELY後に開始される。
【0159】
一方、上記ステップS1006で、A>0と判断されると、ステップS1010へ分岐し、上記アキュムレータAの値を、このアキュムレータAに格納した値からクラセン間隔を減算した値とし(A=A−クラセン間隔)、ステップS1011でこのアキュムレータAの値を参照し、A≦0の場合、ステップS1012へ進み、噴射開始遅れ時間IJDELYを上記アキュムレータAに格納した値の2の補数で設定し(IJDELY=−A)、ステップS1013で1回当りの噴射すべき有効噴射幅を要求噴射幅IJSEInの1/2に設定し、ステップS1014で噴射開始区間設定フラグIJTMGFを例えば128+8の複数回噴射にセットしてルーチンを抜ける。IJTMGF=128+8を8ビットの変数で表せば、10001000であり、従って、噴射開始区間は7と3であり、1回目の噴射が噴射開始区間7から待ち時間無しで開始され、後の噴射が噴射開始区間3の10°CAクラセンから噴射開始遅れ時間IJDELY後に開始される。
【0160】
一方、ステップS1011で、A>0と判断されると、ステップS1015へ分岐し、上記アキュムレータAの値を、このアキュムレータAに格納した値からクラセン間隔を減算した値とし(A=A−クラセン間隔)、ステップS1016でこのアキュムレータAの値を参照し、A≦0の場合、ステップS1017へ進み、噴射開始遅れ時間IJDELYを上記アキュムレータAの値の2の補数で設定し(IJDELY=−A)、ステップS1018で1回当りの噴射すべき有効噴射幅を要求噴射幅IJSEInの1/2に設定し、ステップS1019で噴射開始区間設定フラグIJTMGFを例えば128+16の複数回噴射にセットしてルーチンを抜ける。IJTMGF=128+16を8ビットの変数で表せば、10010000であり、従って、噴射開始区間は7と4であり、1回目の噴射が噴射開始区間7から待ち時間無しで開始され、後の噴射が噴射開始区間4の97°CAクラセンから噴射開始遅れ時間IJDELY後に開始される。
【0161】
一方、ステップS1016で、A>0と判断されると、ステップS1020へ分岐し、上記アキュムレータAの値を、このアキュムレータAに格納した値からクラセン間隔を減算した値とし(A=A−クラセン間隔)、ステップS1021でこのアキュムレータAに格納した値を参照し、A≦0の場合、ステップS1022へ進み、噴射開始遅れ時間IJDELYを上記アキュムレータAの値の2の補数で設定し(IJDELY=−A)、ステップS1023で1回当りの噴射すべき有効噴射幅を要求噴射幅IJSEInの1/2に設定し、ステップS1024で噴射開始区間設定フラグIJTMGFを例えば128+32の複数回噴射にセットしてルーチンを抜ける。IJTMGF=128+32を8ビットの変数で表せば、10100000であり、従って、噴射開始区間は7と5であり、1回目の噴射が噴射開始区間7から待ち時間無しで開始され、後の噴射が噴射開始区間5の10°CAクラセンから噴射開始遅れ時間IJDELY後に開始される。
【0162】
一方、ステップS1021で、A>0と判断されると、ステップS1025へ分岐し、上記アキュムレータAの値を、このアキュムレータAに格納した値からクラセン間隔を減算した値とし(A=A−クラセン間隔)、ステップS1026でこのアキュムレータAに格納した値を参照し、A≦0の場合、ステップS1027へ進み、噴射開始遅れ時間IJDELYを上記アキュムレータAの値の2の補数で設定し(IJDELY=−A)、ステップS1028で1回に全部噴射することを設定し、ステップS1029で噴射開始区間設定フラグIJTMGFを例えば64の1回噴射にセットしてルーチンを抜ける。IJTMGF=64を8ビットの変数で表せば、01000000であり、噴射開始区間6の97°CAクラセンから噴射開始遅れ時間IJDELY後に燃料噴射が開始される。
一方、ステップS1026で、A>0と判断されると、ステップS1030へ分岐し、上記アキュムレータAの値を、このアキュムレータAに格納した値からクラセン間隔を減算した値とし(A=A−クラセン間隔)、ステップS1031でこのアキュムレータAに格納した値を参照し、A≦0の場合、ステップS1032へ進み、噴射開始遅れ時間IJDELYを上記アキュムレータAに格納した値の2の補数で設定し(IJDELY=−A)、ステップS1033で1回で全部噴射することを設定し、噴射開始区間設定フラグIJTMGFを128としてルーチンを抜ける。IJTMGF=128を8ビットの変数で表せば、10000000であり、噴射開始区間7の10°CAクラセンから噴射開始遅れ時間IJDELY後に燃料噴射が開始される。
【0163】
一方、ステップS1031で、A>0と判断されると、ステップS1035へ分岐し、噴射開始遅れ時間IJDELYを0とし、ステップS1036 で1回で全部噴射することを設定し、ステップS1037で噴射開始区間設定フラグIJTMGFを128としてルーチンを抜ける。IJTMGF=128を8ビットの変数で表せば、10000000であり、噴射開始区間7の10°CAクラセンから待ち時間無しで燃料噴射が開始される。従って、このステップでの噴射が1サイクル中の最大噴射量となる。
【0164】
図24に上記フローチャートに基づく燃料噴射開始時期の設定例のタイムチャートを示す。
【0165】
同図(a)に示すように、連続噴射の場合に噴射開始時期を遅くしても1サイクル中で噴射を完了させることが出来る場合には2回噴射とし、最初の噴射で燃料の気化の促進を図り、後の噴射で空燃比をトータル的に調整する。例えば、噴射開始区間設定フラグIJTMGFが128+8に設定され、噴射開始遅れ時間IJDELYが時間tに設定された場合、まず、噴射開始区間7の10°CAクラセンから待ち時間無しで、総噴射量の1/2を噴射し、次いで噴射開始区間3の10°CAクラセンから時間t後に残りの1/2が噴射される。
【0166】
また同図(b)に示すように、連続噴射の場合に噴射を早く開始しなければ1サイクル中で噴射を完了させることが出来ない場合には1回噴射とする。例えば、噴射開始区間設定フラグIJTMGFが64に設定され、噴射開始遅れ時間IJDELYが時間tに設定された場合、まず、噴射開始区間6の97°CAクラセンから時間t後に全部噴射する。
【0167】
尚、上記フローチャートでは噴射開始区間設定フラグIJTMGFのビット指定を1気筒当り1カ所あるいは2カ所としているが、噴射開始区間設定フラグIJTMGFで3カ所以上のビットを指定するようにしても良い。複数回噴射とすることで、最後の噴射で空燃比をトータル的に調整し、結果として加速増量等の過渡時の空燃比変動に対しても後の噴射量を調整することで柔軟に対応することができる。
【0168】
また、本フローチャートでは、噴射開始区間を50msec毎に設定しているため、エンジン回転数が9000〜10000rpm等の高回転数に達してもメインCPU58の負担が増加することはなく、高回転数域でも噴射エンド制御が可能になる。
【0169】
図12は噴射タイマセットサブルーチンで、図2に示すクラセンによる割込み処理ルーチンのステップS205で実行されるもので、噴射開始区間毎に噴射タイマをセットする。
【0170】
まず、ステップS1100でエラーレベルECASが2かを判断し、ECAS=2の場合、クランク位置の判別が不明な状態であるため、以降の処理をせずサブルーチンを抜け、また、ECAS≠2の場合ステップS1101へ進み、クランク位置情報変数CCASが1かを判断し、CCAS=1の場合、演算不要と判断してルーチンを抜ける。図23に示すように、CCAS=1の場合は65°CAクラセンの割込みであり、既に現噴射開始区間における噴射タイマのセットが終了しているため直ちにサブルーチンを抜け、処理負担を軽減する。一方、CCAS≠1の場合は、97°CAクラセンの割込みか、10°CAクラセンの割込みの何れかであり、噴射開始区間の始りであるため、ステップS1102以下において現噴射開始区間での噴射幅及び噴射開始時期を設定する。
【0171】
まず、ステップS1102〜ステップS1105では、後述する噴射タイマセットマクロ1を全気筒について実行し、現噴射開始区間における噴射幅(以下「有効噴射幅」とする)TEIJAn(n=#1,#2,#3,#4)を全気筒について設定する。
【0172】
そして、ステップS1106で、上記各ステップS1102〜ステップS1105で各々設定した有効噴射幅TEIJAnが全てゼロかを判断し、全てゼロの場合、噴射タイマを再セットする必要がないためサブルーチンを抜ける。また、少なくとも一つの気筒がTEIJAn≠0の場合には、ステップS1107へ進み、全ての噴射タイマを停止状態とし、その間、以下のステップS1108〜ステップS1111の処理を行う。
【0173】
このステップS1108〜ステップS1111では、後述する噴射タイマセットマクロ2を全気筒について実行し、上記噴射タイマセットマクロ1で設定した有効噴射幅TEIJAnに基づく噴射時間を全気筒分設定する。
【0174】
そして、ステップS1112で全ての噴射タイマを再スタートさせてサブルーチンを抜ける。
【0175】
なお、上記ステップS1107で、全ての噴射タイマが停止されると、噴射時間が計時されないため燃料噴射中の気筒では燃料噴射が続行され、また噴射停止中の気筒では噴射停止状態が続行される。また、上記ステップS1108〜ステップS1112で設定した噴射時間には噴射タイマを停止した時間に相当する処理時間が考慮されている。
【0176】
上記噴射タイマセットサブルーチンにおけるステップS1102〜ステップS1105で実行される気筒毎の噴射タイマセットマクロ1は図13,図14に示す噴射タイマセットマクロ1を示すフローチャートにて実行される。尚、この噴射タイマセットマクロ1のプログラムは#1気筒の噴射タイマセットルーチンを基本プログラムとし、これを#2〜#4気筒にも応用できるようにマクロ化したものである。
【0177】
まず、ステップS1200で当該#n(n=1,2,3或は4)気筒の現在の噴射開始区間番号を、クランク総合位置変数ACASに基づき当該#n気筒の噴射開始区間テーブルIJnTBL(図23)を参照して調査し、ステップS1201で噴射開始区間番号がゼロかを判断する。そして、噴射開始区間がゼロの場合、ステップS1202へ進み、噴射開始区間がゼロでない場合ステップS1210へ進む。
【0178】
噴射開始区間0の時は 吸気行程後半であり噴射処理を行わない為、ステップS1202ないしステップS1209で次回の燃料噴射に備え燃料噴射の初期化処理を実行する。まず、ステップS1202では、当該#n気筒の累積噴射幅TEIJBnをゼロとし、ステップS1203でユーザ側ジョブから燃料カット要求があるかを判断し、燃料カット要求がない場合ステップS1204へ進み、燃料カット要求がある場合にはステップS1208へ進む。
【0179】
燃料カット要求なしと判断してステップS1204へ進むと、燃料カット状態フラグPRCUTの値を参照して当該#n気筒が燃料カット状態かを判断し、燃料カット状態ではない場合ステップS1205へ進み、また燃料カット状態の場合ステップS1206へ進む。
【0180】
この燃料カット状態フラグPRCUTは#1〜#4気筒をビット0〜ビット3の4ビットに対応させて表したもので、ユーザ側ジョブにおいて燃料カットが要求された時の最初のルーチンでセットされ、また燃料カット要求解除後の最初のルーチンでクリアされる。
【0181】
上述したように、この燃料カット状態フラグPRCUTは、噴射開始区間0において当該#n気筒に対応するビットがセットされているかを判断し、ユーザ側ジョブから燃料カット要求がなく、しかも、この燃料カット状態フラグPRCUTがセットされている気筒は次のサイクルで燃料が噴射されない。
【0182】
そして、燃料カット状態ではないと判断されてステップS1205へ進むと、噴射開始区間0では噴射処理を行わないため当該#n気筒の有効噴射幅TEIJAnをゼロにして当該#n気筒の噴射タイマセットマクロ1を終了する。
【0183】
また、上記ステップS1204から燃料カット状態と判断されてステップS1206へ進むと、ユーザ側ジョブから燃料カット要求がなく、燃料カット状態フラグPRCUTはセットされているので、復帰後、第1回目のルーチンであり、次のサイクルにおける燃料カットリカバリに備え当該#n気筒の噴射開始区間ゼロで付着補正量分に相当する燃料を1回噴射する為、ユーザ側ジョブで設定した燃料付着補正量TEFUCHで当該#n気筒の有効噴射幅TEIJAnを更新し、ステップS1207で燃料カット状態フラグPRCUTの当該#n気筒に対応するビットをクリアした後、当該#n気筒の噴射タイマセットマクロ1を終了する。
【0184】
その結果、燃料カット及び燃料カットリカバリに備える付着補正を気筒毎に設定することができる。
【0185】
また、上記ステップS1203で、ユーザ側ジョブから燃料カット要求ありと判断した場合には、噴射処理を行わない噴射開始区間0で、しかも燃料カットが要求されているため、ステップS1208で有効噴射幅TEIJAnをクリアし、ステップS1209で燃料カット状態フラグPRCUTの当該#n気筒に対応するビットをセットして、当該#n気筒の噴射タイマセットマクロ1を終了する。
【0186】
また、上記ステップS1201で現在の噴射開始区間がゼロ以外、すなわち、噴射処理領域の区間であると判断された場合には、ステップS1210以下で通常の噴射処理を行う。まず、ステップS1210では、燃料カット状態フラグPRCUTの当該#n気筒のビットの値を参照し、当該#n気筒が燃料カット状態かを判断し、燃料カット状態の場合ステップS1211へ進み、有効噴射幅TEIJAnをゼロにして当該#n気筒の噴射タイマセットマクロ1を終了する。
【0187】
一方、上記ステップS1210で燃料カット状態ではないと判断されるとステップS1212で今より後の区間では噴射しないかを、噴射開始区間設定フラグIJTMGFの値を参照して判断し、今より後の区間においても噴射すると判断した場合、ステップS1213へ進み、また、今より後の区間では噴射しないと判断した場合、ステップS1218へ進む。
【0188】
上記ステップS1212は1サイクル中における複数回噴射に対応したステップで、上記噴射開始区間設定フラグIJTMGFのビット0〜ビット7で指定した区間が2箇所以上ある場合、例えば、図24(a)に示すように、IJTMGF=128+8であれば、区間7と3が噴射開始区間であり、噴射開始区間7においては今より後の区間で噴射されるためステップS1213へ進み、一方、噴射開始区間3では今より後の区間で噴射を開始しないためステップS1218へ進む。
【0189】
そして、ステップS1213へ進むと、現在の区間で噴射するかを、上記噴射開始区間設定フラグIJTMGFの値を参照してその指示値が前記ステップS1200で検索した現在の区間番号と一致するかにより判断し、現在の区間で噴射しない場合、ステップS1214へ進み有効噴射幅TEIJAnをゼロにして当該#n気筒の噴射タイマセットマクロ1を終了する。
【0190】
一方、上記ステップS1213で現在の区間で噴射すると判断された場合には、ステップS1215へ進み、ユーザ側ジョブで10ms毎に設定される気筒別要求噴射幅IJSEInを2のn乗で除算して1回当りの噴射量を求め、その値をアキュムレータAに格納し、ステップS1216でこのアキュムレータAに格納した値で当該#n気筒の有効噴射幅TEIJAnを設定し、ステップS1217で、上記アキュムレータAの値に累積噴射幅TEIJBnを足し込み、噴射タイマセットマクロ1を終了する。
【0191】
上記次数nは、前述した燃料噴射開始時期の算出ルーチンのステップS1002,S1008,S1013,S1018,S1023,S1028,S1033あるいはS1036で設定した噴射回数に基づいて設定されるもので、1/2噴射に設定されている場合には n=1、全部噴射に設定されている場合には n=0に設定される。その結果、2回噴射では、最後の噴射開始区間において、最新の気筒別要求噴射幅IJSEInの1/2に相当する有効噴射幅が設定される。
【0192】
また、上記ステップS1212からステップS1218へ進むと、現在の区間で噴射するかを上記ステップS1213と同様、上記噴射開始区間設定フラグIJTMGFの値を参照して判断し、現在の区間で噴射する場合、ステップS1219へ進み、また現在の区間で噴射しない場合、ステップS1223へ進む。
【0193】
そして、ステップS1219では、気筒別要求噴射幅IJSEInから上記累積噴射幅TEIJBnを減算した値をアキュムレータAに格納し、ステップS1220で、このアキュムレータAの値で有効噴射幅TEIJAnを設定する。
【0194】
次いで、ステップS1221で累積噴射幅TEIJBnを要求噴射幅IJSEInとして、ステップS1222へ進む。すなわち、現在の区間が噴射終了区間であり、これより後の区間では噴射しないため、このルーチンにおいては累積噴射幅TEIJBnを要求噴射幅IJSEInと同一の値にする。その結果、例えば、1サイクル中1回噴射の場合には,TEIJBn=0であるためTEIJAn=IJSEInとなる。そして、次回の噴射開始区間でのルーチン実行時には、TEIJBn=IJSEIn=0となる。
【0195】
そして、ステップS1222で噴射待ち設定フラグFLG_IJをセットして噴射タイマセットマクロ1を終了する。すなわち、このルーチンでは当該#n気筒の1サイクル中における最後の噴射であり、噴射待ち設定フラグFLG_IJをセットすることで、後述する噴射タイマセットマクロ2で設定される噴射終了時期を例えば吸気行程直前の10°CAクラセンに合わせることができる。
【0196】
一方、上記ステップS1218からステップS1223へ進むと、気筒別要求噴射幅IJSEInから上記ステップS1221で設定した累積噴射幅TEIJBnを減算した値をアキュムレータAに格納する。
【0197】
そして、ステップS1224で上記アキュムレータAの値を参照し、A<0、すなわち、運転条件が変化して要求噴射量IJSEInが減少した場合、ステップS1226へ進み、また、A≧0、すなわち、要求噴射量IJSEInが増加したか或は変化していない場合、ステップS1225へ進む。燃料噴射幅がユーザ側ジョブにおいて10ms毎に設定されるため、次のルーチン実行時に読込む要求噴射幅IJSEInが前回のルーチン実行時において読込んだ要求噴射幅IJSEInと相違している場合、その差分を増量、或は減量することで、常に最新の値で有効噴射幅TEIJAnを設定することができるため運転条件の変化に対する追従性が良くなる。
【0198】
その後、上記ステップS1224からステップS1225へ進むと、上記アキュムレータAの値と噴射幅の許容変動値、例えば0.5msとを比較し、A>0.5msの場合ステップS1226へ進み、A≦0.5msの場合には前記ステップS1214へ進み、有効噴射幅TEIJAnをゼロとして当該#n気筒の噴射タイマセットマクロ1を終了する。
【0199】
また、ステップS1224或はステップS1225からステップS1226へ進むと、有効噴射幅TEIJAnを上記アキュムレータAの値(ステップS1224からの場合は負の値)で設定し、ステップS1227で累積噴射幅TEIJBnを上記要求噴射幅IJSEInとして、噴射タイマセットマクロ1を終了する。
【0200】
上記噴射タイマセットサブルーチンにおけるステップS1108〜ステップS1111での噴射タイマセットマクロ2は図15,図16に示す噴射タイマセットマクロ2を示すフローチャートにて実行される。尚、この噴射タイマセットマクロ2のプログラムは上記噴射タイマセットマクロ1を示すフローチャートと同様に#1気筒のタイマセットルーチンを基本プログラムとし、これを#2〜#4気筒にも応用できるようにマクロ化したものである。
【0201】
まず、ステップS1300で噴射タイマの状態から前回の噴射開始区間で設定した燃料の噴射状況を判断し、今回の噴射開始区間においても継続して噴射中の場合ステップS1301へ進み、噴射待ち状態が継続されている場合ステップS1307へ進み、また、噴射が終了されている場合ステップS1312へ進む。
【0202】
継続して噴射中と判断されてステップS1301へ進むと、停止中の噴射タイマの現状のタイマ値に、当該#n気筒の前記噴射タイマセットマクロ1で設定した正或は負の値の有効噴射幅TEIJAn(ms)を加算し、その値をアキュムレータAに格納する。従って、前回のルーチンで一旦設定した噴射タイマの値がその後の運転条件の変化に基づいて設定した最新の有効噴射幅TEIJAnで修正されることになる。
【0203】
次いで、ステップS1302で、上記キュムレータAの値から処理時間(噴射タイマ停止から再セットするまでの時間)を減算し、この減算した値をステップS1303で、ゼロから1サイクルの最大噴射量である2回転時間の間にリミットし(0≦A<2回転時間、従って、Aが負の場合にはA=0となる)、ステップS1304で、現在噴射中であるためタイマ待ち時間を0とし、ステップS1305で噴射タイマのリロード値を上記アキュムレータAの値で設定し、ステップS1306で上記リロード値に対応する噴射パルスの出力パターンをタイマにセットして当該#n気筒の噴射タイマセットマクロ2を終了する。
【0204】
その結果、1回噴射ではその噴射区間が過ぎた後の区間で、複数回噴射では最後の噴射区間を過ぎた後の区間で、今回の区間で設定した有効噴射幅TEIJAnが前回の区間で設定した値に比し、0.5ms以上増加している場合には噴射タイマが延長され、また有効噴射幅TEIJAnが減少している場合には、最後の噴射区間の噴射タイマが短縮されて、1吸気行程中の気筒に供給する噴射量の合計が調整される。
【0205】
一方、上記ステップS1300で噴射待ち状態が継続されていると判断されてステップS1307へ進むと、噴射タイマにセットされているタイマリロード値に、今回の区間で設定した正或は負の値の有効噴射幅TEIJAnを加算して、その値をアキュムレータAに格納し、ステップS1308で、上記アキュムレータAの値を、ゼロから1サイクルの最大噴射量である2回転時間にリミットし(0≦A<2回転時間)、ステップS1309で直ちに噴射を行うべくタイマ待ち時間を0として、ステップS1310でタイマリロード値を上記アキュムレータAに格納されている値で設定し、ステップS1311で上記タイマリロード値に対応する噴射パルスの出力パターンをタイマにセットして当該#n気筒の噴射タイマセットマクロ2を終了する。
【0206】
上記タイマ待ち時間は、噴射終了時期を調整するために、後述するステップS1325で設定されるものであるが、前回の噴射開始区間で設定された待ち時間が今回の噴射開始区間においても依然と計時されている場合には、タイマ待ち時間が異常に長いので、上記ステップS1309でゼロにし、今回の噴射開始区間で直ちに噴射を開始し、1吸気行程中に供給する噴射量を調整する。
【0207】
また、上記ステップS1300で前回の噴射開始区間での噴射が既に終了していると判断して、ステップS1312へ進むとアキュムレータAに有効噴射幅TEIJAnを格納し、ステップS1313で、このアキュムレータAの値が正か負あるいはゼロかを判断し、A≦0場合ステップS1314へ進み、また、A>0の場合ステップS1318へ分岐する。
【0208】
ステップS1314では、有効噴射幅TEIJAnが増加してしないので1サイクル中の噴射を終了させるため、噴射待ち設定フラグFLG_IJをクリアし、ステップS1315でタイマ待ち時間をゼロとし、ステップS1316で噴射タイマのリロード値をゼロとし、ステップS1317で出力パターンをゼロとして当該#n気筒の噴射タイマセットマクロ2を終了する。
【0209】
また、上記ステップS1313で有効噴射幅TEIJAnが正の場合には、噴射量の増加分を補償するためステップS1318で、上記アキュムレータAに、他の制御ストラテジーで設定した気筒別の無駄時間TSINJn(n=#1,#2,#3,#4)を加算し、ステップS1319で上記アキュムレータAに格納されている値が1サイクルの最大噴射量である2回転時間を越えている場合、2回転時間にリミットし(A<2回転時間)、ステップS1320で噴射待ち設定フラグFLG_IJの値を参照して噴射待ち状態ではないかを判断し、噴射待ち状態ではない場合、すなわち、噴射待ち設定フラグFLG_IJがクリアされている場合には、ステップS1321へ進み、増量分を直ちに噴射させるべくタイマ待ち時間を0として、ステップS1322でタイマリロード値を上記アキュムレータAの値(TEIJAn+TSINJn)で設定し、ステップS1323で上記タイマリロード値に対応する噴射パルスの出力パターンを噴射タイマにセットして当該#n気筒の噴射タイマセットマクロ2を終了する。
【0210】
一方、上記ステップS1320で噴射待ち状態と判断されてステップS1324へ進むと、噴射待ち設定フラグFLG_IJをクリアした後、ステップS1325で、上記噴射開始時期算出ルーチンで設定した噴射開始遅れ時間IJDELYでタイマ待ち時間を設定し、ステップS1326でタイマリロード値を上記アキュムレータAの値で設定し、 ステップS1327で上記タイマリロード値に対応する噴射パルスの出力パターンを噴射タイマにセットして当該#n気筒の噴射タイマセットマクロ2を終了する。その結果、この噴射開始区間の始りから所定タイマ待ち時間(IJDELY)後に燃料噴射が開始される。
【0211】
以上の結果、図25に示すように、燃料噴射開始時期の算出ルーチンで設定した噴射開始区間設定フラグIJTMGFによるビット指定で、1サイクル中の噴射回数を4回、3回、2回等、複数回に設定することができる。また、複数回噴射において最終回以外の有効噴射幅を、次数nの指定にて要求噴射幅の1/4,1/1等、任意に設定することができ、最終回噴射において1サイクル中の噴射幅の合計が最新の要求噴射幅になるように調整することができる。さらに、最終回噴射の噴射開始区間内で噴射が終了しない場合には、噴射タイマを延長し、また有効噴射幅が減少した場合には、噴射タイマを短縮して加速増量等過渡時の追従性を良くする。
【0212】
なお、図25(b)は、4回噴射(IJTMGF=128+32+8+2)で、1噴射当りの有効噴射幅が要求噴射幅の1/4、同図(c)は、3回噴射(IJTMGF=32+8+2に設定)で、1噴射当りの有効噴射幅が要求噴射幅の1/4、同図(d)は、2回噴射(IJTMGF=16+2に設定)で、1噴射当りの有効噴射幅が要求噴射幅の1/1、同図(e)は、2回噴射(IJTMGF=4+2に設定)で、1噴射当りの有効噴射幅が要求噴射幅の1/1にそれぞれ設定した場合の例を示したものである。
【0213】
以上、本発明の一実施例について説明したが、これに限定されず、多気筒エンジンであればよく、また、水平対向エンジン以外のエンジンにも適用することができる。
【0214】
【発明の効果】
以上説明したように本発明によれば、多気筒エンジンの各気筒毎の1サイクルを、吸気行程後半、吸気行程前半、排気行程後半、排気行程前半、燃焼行程後半、燃焼行程前半、圧縮行程後半、圧縮行程前半の各噴射開始区間に区分する。そして、噴射制御を行わない吸気行程後半を除く各区間を、噴射開始区間として定義し、「上記噴射開始区間の数+1」個のビットからなり、気筒数分の、各ビットが各噴射区間を表す噴射開始区間設定フラグを用い、噴射開始セット時間に基づき上記各噴射開始区間の中から少なくとも1つの噴射開始区間を上記噴射開始区間設定フラグにより指定する。そして、複数の噴射開始区間を指定した場合は、指定した最終の噴射開始区間より前の噴射開始区間での噴射すべき有効噴射幅を、1サイクル中の要求噴射幅を指定した噴射開始区間の数により分割した値で設定する。また最終の噴射開始区間での噴射すべき最終有効噴射幅を1サイクル中に必要とする要求噴射幅と上記最終より前の噴射開始区間で噴射した有効噴射幅の合計との差分に応じて設定するので、指定された噴射開始区間が2つの場合は勿論のこと、噴射開始区間が3以上指定された場合であっても、指定された各噴射開始区間における有効噴射幅を適正に設定することができて、空燃比性御性が向上する。
【0215】
また、最終の噴射開始区間での噴射すべき最終有効噴射幅を、1サイクル中に必要とする要求噴射幅と上記最終より前の噴射開始区間で噴射した有効噴射幅の合計との差分に応じて設定するので、1サイクル中で要求噴射幅が変動した場合でも、最終の噴射開始区間において対処することが可能となり、柔軟に対応することができ、空燃比制御性を一層向上できる。
【0216】
さらに、最終より前の噴射開始区間での燃料噴射を当該噴射開始区間の始まりから開始し、最終の噴射開始区間における燃料噴射開始時期を、上記噴射開始セット時間から噴射開始区間の間隔時間の正数倍を減算してゼロ或いは負の値を示したときの2の補数に基づき上記最終の噴射開始区間の始まりから起算して設定するので、複数回噴射を噴射開始セット時間および噴射開始区間により指定するのみで、噴射開始時期及び噴射エンドを適正に設定することができ、エンジンの燃焼効率の向上、及びエンジン回転の安定化を図ることができる。
【図面の簡単な説明】
【図1】0.5ms毎の定期割込み処理を示すフローチャート
【図2】クラセン割込み処理を示すフローチャート
【図3】ジョブ優先処理を示すフローチャート
【図4】ジョブ実行サブルーチンを示すフローチャート
【図5】同上
【図6】同上
【図7】同上
【図8】クランク位置算出サブルーチンを示すフローチャート
【図9】CCAS・RCAS判別サブルーチンを示すフローチャート
【図10】燃料噴射開始時期算出ルーチンを示すフローチャート
【図11】同上
【図12】噴射タイマセットサブルーチンを示すフローチャート
【図13】噴射タイマセットマクロ1ルーチンを示すフローチャート
【図14】同上
【図15】噴射タイマセットマクロ2ルーチンを示すフローチャート
【図16】同上
【図17】ジョブの実行状態を示す説明図
【図18】ジョブフラグの説明図
【図19】ジョブ実行中フラグとオーバーラップカウンタの変化を示す説明図
【図20】システムシフトバッファの説明図
【図21】クラセン間隔テーブルの説明図
【図22】気筒・クランク位置状態マップの説明図
【図23】クランク位置、カム位置とクランク位置変数、噴射開始区間テーブル及び気筒別行程順のタイムチャート
【図24】噴射開始区間、及び噴射開始区間設定フラグの説明図
【図25】噴射タイマコントロールを示すタイムチャート
【図26】エンジン系の概略構成図
【図27】クランクロータとクランク角センサの正面図
【図28】カムロータとカム角センサの正面図
【図29】電子制御系の回路構成図
【符号の説明】
1…エンジン
25…インジェクタ
39…クランク角センサ
41…カム角センサ
50…電子制御装置
IJnTBL…噴射開始区間テーブル
IJTMGF…噴射開始区間設定フラグ
IJTIME…噴射開始セット時間
IJSEIn…要求噴射幅
TEIJAn…有効噴射幅
Claims (1)
- 多気筒エンジンの各気筒毎の1サイクルを、吸気行程後半、吸気行程前半、排気行程後半、排気行程前半、燃焼行程後半、燃焼行程前半、圧縮行程後半、圧縮行程前半に区分し、
噴射制御を行わない上記吸気行程後半を除く各区間を、噴射開始区間として定義し、
「上記噴射開始区間の数+1」個のビットからなり、気筒数分の、各ビットが各噴射区間を表す噴射開始区間設定フラグを用い、
噴射開始セット時間に基づき上記各噴射開始区間の中から少なくとも1つの噴射開始区間を上記噴射開始区間設定フラグにより指定し、
複数の噴射開始区間を指定した場合、指定した最終の噴射開始区間より前の噴射開始区間での噴射すべき有効噴射幅を、1サイクル中の要求噴射幅を指定した噴射開始区間の数により分割した値で設定し、また最終の噴射開始区間での噴射すべき最終有効噴射幅を1サイクル中に必要とする要求噴射幅と上記最終より前の噴射開始区間で噴射した有効噴射幅の合計との差分に応じて設定し、
上記最終より前の噴射開始区間での燃料噴射を当該噴射開始区間の始まりから開始し、また最終の噴射開始区間での燃料噴射開始時期を、上記噴射開始セット時間から噴射開始区間の間隔時間の正数倍を減算してゼロ或いは負の値を示したときの2の補数に基づき上記最終の噴射開始区間の始まりから起算して設定することを特徴とする多気筒エンジンの燃料噴射制御方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP16362893A JP3555689B2 (ja) | 1993-07-01 | 1993-07-01 | 多気筒エンジンの燃料噴射制御方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP16362893A JP3555689B2 (ja) | 1993-07-01 | 1993-07-01 | 多気筒エンジンの燃料噴射制御方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH0719098A JPH0719098A (ja) | 1995-01-20 |
JP3555689B2 true JP3555689B2 (ja) | 2004-08-18 |
Family
ID=15777549
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP16362893A Expired - Fee Related JP3555689B2 (ja) | 1993-07-01 | 1993-07-01 | 多気筒エンジンの燃料噴射制御方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP3555689B2 (ja) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP2653384B1 (en) | 2012-04-18 | 2019-10-02 | AIRBUS HELICOPTERS DEUTSCHLAND GmbH | Blade attachment for a bearingless rotor of a helicopter |
-
1993
- 1993-07-01 JP JP16362893A patent/JP3555689B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JPH0719098A (ja) | 1995-01-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3325067B2 (ja) | 内燃機関のノッキング検出装置 | |
JP3555689B2 (ja) | 多気筒エンジンの燃料噴射制御方法 | |
JP3331237B2 (ja) | 多気筒エンジンの気筒別噴射開始区間設定方法 | |
JP3530549B2 (ja) | 多気筒エンジンの燃料噴射制御方法 | |
JP3530551B2 (ja) | 多気筒エンジンの燃料噴射制御方法 | |
JPH07103052A (ja) | 多気筒エンジンの燃料噴射制御方法 | |
JP3645576B2 (ja) | エンジンの回転時間算出方法 | |
JP3337149B2 (ja) | エンジンのクランク位置判別方法 | |
JPH0719100A (ja) | 多気筒エンジンの気筒別噴射開始区間設定方法 | |
JP3530550B2 (ja) | 多気筒エンジンの燃料噴射制御方法 | |
JP3294366B2 (ja) | エンジンの点火制御における点火コイルの通電状態判別方法 | |
JP3324818B2 (ja) | エンジンのクランク位置情報利用方法 | |
JP3294365B2 (ja) | エンジンの点火制御方法 | |
JP3617847B2 (ja) | ジョブの統合方法 | |
JP3455243B2 (ja) | アナログ/デジタル変換結果の利用方法 | |
JPH06249053A (ja) | アナログ/デジタル変換方法 | |
JP3442806B2 (ja) | ジョブの優先処理方法 | |
JP3384498B2 (ja) | エンジンの点火制御における処理遅れ解消方法 | |
JPH06257500A (ja) | エンジン運転状態の把握方法 | |
JPH06257502A (ja) | エンジン回転数の算出方法 | |
JPH06257501A (ja) | エンジンの半回転時間推定方法 | |
JPH06272651A (ja) | エンジンの点火制御における通電シーケンスの設定方法 | |
JPH06249054A (ja) | 車輌制御用コンピュータにおけるスイッチ入力データの読込み方法 | |
JPH06200819A (ja) | マイクロコンピュータのワークエリアの設定方法 | |
JPH06231004A (ja) | アナログ/デジタル変換のシミュレーション方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20040217 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20040406 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20040427 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20040506 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
LAPS | Cancellation because of no payment of annual fees |