(57)【特許請求の範囲】
【請求項１】
所定のセンサから出力されるアナログ信号の値（以下、センサ値という）をデジタル値へとＡ／Ｄ変換するためのＡ／Ｄ変換手段を備えると共に、エンジンのクランク軸が所定角度回転する毎に特定方向のパルスエッジが生じるクランク角信号に基づいて、前記クランク軸の回転角度（以下、クランク角という）を把握するエンジン制御装置において、
クランク角が所定の指令角度になった時の前記センサ値を検出するための手段として、
クランク角が前記指令角度となる前に前記クランク角信号に前記特定方向のパルスエッジが生じるタイミング（以下、検出開始タイミングという）から、クランク角が前記指令角度を過ぎた後に前記クランク角信号に前記特定方向のパルスエッジが生じるタイミング（以下、検出終了タイミングという）までのサンプリング期間の間、前記Ａ／Ｄ変換手段に前記センサ値を一定時間毎にＡ／Ｄ変換させて、そのＡ／Ｄ変換で得られた各デジタル値を所定の記憶手段に記憶させるサンプリング手段と、
前記検出開始タイミングの時刻と前記検出終了タイミングの時刻とを夫々計測する計時手段と、
該計時手段により計測された両時刻と、前記検出開始タイミングでのクランク角から前記指令角度までの角度と、前記所定角度とから、前記サンプリング期間内にてクランク角が前記指令角度になった時刻（以下、指令角度時刻という）を算出して、前記記憶手段に記憶されている前記サンプリング期間分のデジタル値から、前記算出した指令角度時刻のセンサ値を求めるセンサ値算出手段と、
を備えていることを特徴とするエンジン制御装置。
【請求項２】
所定のセンサから出力されるアナログ信号の値（以下、センサ値という）をデジタル値へとＡ／Ｄ変換するためのＡ／Ｄ変換手段を備えると共に、エンジンのクランク軸が所定角度回転する毎に特定方向のパルスエッジが生じるクランク角信号に基づいて、前記クランク軸の回転角度（以下、クランク角という）を把握するエンジン制御装置において、
クランク角が第１の角度になって前記クランク角信号に前記特定方向のパルスエッジが生じるタイミング（以下、監視開始タイミングという）から、クランク角が第２の角度になって前記クランク角信号に前記特定方向のパルスエッジが生じるタイミング（以下、監視終了タイミングという）までの監視期間の中で、前記センサ値が特定の値となった時のクランク角を検出するための手段として、
前記監視期間の間、前記Ａ／Ｄ変換手段に前記センサ値を一定時間毎にＡ／Ｄ変換させるサンプリング手段と、
前記監視期間において、前記クランク角信号に前記特定方向のパルスエッジが生じた各タイミングであって、前記監視開始タイミングと前記監視終了タイミングとを含む各タイミングの時刻を夫々計測する計時手段と、
前記Ａ／Ｄ変換手段によりＡ／Ｄ変換された各デジタル値の中から、前記特定の値となったデジタル値を選択すると共に、その選択したデジタル値がＡ／Ｄ変換された時刻（以下、特定値発生時刻という）を検出する特定値発生時刻検出手段と、
前記監視期間における前記クランク角信号の各周期のうちで、前記特定値発生時刻を含んだ周期を特定して、該周期の開始時刻と終了時刻とを前記計時手段の計測結果から取得し、その開始時刻及び終了時刻と、前記特定値発生時刻と、前記開始時刻でのクランク角と、前記所定角度とから、前記特定値発生時刻でのクランク角を、前記センサ値が前記特定の値となった時のクランク角として算出するクランク角算出手段と、
を備えていることを特徴とするエンジン制御装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、エンジン制御装置に関するものである。
【０００２】
【従来の技術及び発明が解決しようとする課題】
従来より、車両用のエンジン制御装置では、エンジンに取り付けられたクランク角センサから、エンジンのクランク軸が所定角度回転する毎に特定方向のパルスエッジ（一般には、立ち上がりエッジ）が生じるクランク角信号を入力し、そのクランク角信号に基づいて、クランク軸の回転角度（以下、クランク角という）を把握するようにしている。そして更に、エンジンの状態を検出するための他のセンサから出力されるアナログ信号の値（以下、センサ値という）を、Ａ／Ｄコンバータによりデジタル値へとＡ／Ｄ変換して、エンジンの制御に使用している。
【０００３】
ここで、この種のエンジン制御装置において、アナログ信号を出力するセンサが、例えば気筒の燃焼圧力を検出するための圧力センサ（燃焼圧センサ）のように、クランク角に密接に関連した物理量を検出するためのセンサである場合には、クランク角が特定の角度（以下、指令角度という）となった時のセンサ値を、Ａ／Ｄ変換して検出する必要がある。
【０００４】
そして、従来のエンジン制御装置では、クランク角が指令角度となった時のセンサ値を、以下の手法で検出するようにしていた。
まず、この種のエンジン制御装置においては、クランク角信号に上記特定方向のパルスエッジ（以下の説明では、立ち上がりエッジとする）が生じた時間間隔を計測することにより、クランク軸の回転速度（エンジン回転数）を算出しているが、従来のエンジン制御装置では、その計測した時間間隔（即ち、クランク角信号の１周期時間）から、クランク軸が単位角度（例えば１°ＣＡ）だけ回転するのに要する時間（以下、単位角度相当の時間という）を算出する。尚、“ＣＡ”は、クランク角を意味する添え字である。
【０００５】
そして、クランク角信号に立ち上がりエッジが生じる各タイミングのうち、例えばクランク角が指令角度になる直前のタイミングにて、その時点で算出している最新の単位角度相当の時間から、クランク角が指令角度になると思われる時刻を算出すると共に、その算出した時刻にタイマ割り込み処理が起動されるように、内部タイマをセットする。
【０００６】
そして更に、そのタイマ割り込み処理により、Ａ／Ｄコンバータを起動して該Ａ／Ｄコンバータにセンサ値をＡ／Ｄ変換させ、そのＡ／Ｄ変換によるデジタル値を、クランク角が指令角度となった時のセンサ値として取得する。
つまり、従来のエンジン制御装置では、過去のクランク角信号の周期時間に基づき、クランク角が指令角度になると思われる時刻を算出して、その時刻にＡ／Ｄコンバータを起動し、その時にＡ／Ｄ変換されたデジタル値を、クランク角が指令角度となった時のセンサ値として取得するようにしている。
【０００７】
しかしながら、この手法では、エンジン特有の回転変動の影響により、実際にＡ／Ｄコンバータが起動される時のクランク角が、本当の指令角度からずれ易いため、クランク角が指令角度となった時のセンサ値を正確に検出することができない。つまり、各気筒での燃焼の度に発生する回転変動の影響を直接受けてしまい、本当に希望される指令角度とは異なったクランク角でのセンサ値を求めてしまう。
【０００８】
一方また、この種のエンジン制御装置において、アナログ信号を出力するセンサが、上記燃焼圧センサ等、クランク角に密接に関連した物理量を検出するためのセンサである場合には、クランク角が第１の角度になってから第２の角度になるまでの監視期間において、センサ値が特定の値（例えば最大値や最小値）となった時のクランク角を検出するように構成される場合もある。
【０００９】
そして、従来の技術により、監視期間においてセンサ値が特定の値となった時のクランク角を検出するには、以下の手法を採ることが考えられる。
まず、前述したように、この種のエンジン制御装置においては、クランク角信号の１周期時間を計測しているが、この場合も、その計測した１周期時間から、単位角度相当の時間（クランク軸が単位角度（例えば１°ＣＡ）だけ回転するのに要する時間）を算出する。
【００１０】
また、監視期間は、クランク角が第１の角度になってクランク角信号に立ち上がりエッジが生じたタイミング（以下、監視開始タイミングという）から、クランク角が第２の角度になってクランク角信号に立ち上がりエッジが生じたタイミング（以下、監視終了タイミングという）までの期間として設定する。
【００１１】
そして、クランク角信号に立ち上がりエッジが生じる各タイミングのうちの上記監視開始タイミングになると、その時点から上記監視終了タイミングが到来するまでの間、監視開始タイミングの時点で算出している最新の単位角度相当の時間毎に、Ａ／Ｄコンバータを起動して該Ａ／Ｄコンバータにセンサ値をＡ／Ｄ変換させる。
【００１２】
そして更に、上記各Ａ／Ｄ変換で得られるデジタル値の中から、特定の値（例えば最大値や最小値）となったデジタル値を選択し、その選択したデジタル値がＡ／Ｄ変換された順番から、センサ値が特定の値となった時のクランク角を求める。例えば、上記単位角度を「１°ＣＡ」とし、上記順番が「Ｎ」であったとすると、監視開始タイミングでのクランク角から「（Ｎ−１）×１°ＣＡ」だけ進んだ角度が、センサ値が特定の値となったクランク角として求められることとなる。
【００１３】
しかしながら、この手法においても、エンジン特有の回転変動の影響により、センサ値が特定の値となった時のクランク角を正確に検出することができない。つまり、監視期間においてＡ／Ｄ変換の実施周期として用いられる単位角度相当の時間は、過去のクランク角信号の周期時間に基づいて算出されるものであるため、実際の単位角度相当の時間とは異なった値となり易く（即ち、誤差を持ち易く）、その結果、目的のクランク角を正確に検出することが難しくなる。
【００１４】
本発明は、エンジン制御装置において、エンジンの回転変動の影響を受けずに検出対象値を正確に検出できるようにすることを目的としており、特に、クランク角が所定の指令角度となった時のセンサ値を正確に検出できるようにすることを第１の目的とし、センサ値が特定の値となった時のクランク角を正確に検出できるようにすることを第２の目的としている。
【００１５】
【課題を解決するための手段及び発明の効果】
上記目的を達成するためになされた請求項１に記載のエンジン制御装置は、従来の装置と同様に、所定のセンサから出力されるアナログ信号の値（以下、センサ値という）をデジタル値へとＡ／Ｄ変換するためのＡ／Ｄ変換手段を備えると共に、エンジンのクランク軸が所定角度回転する毎に特定方向のパルスエッジが生じるクランク角信号に基づいて、クランク軸の回転角度（以下、クランク角という）を把握するが、特に、クランク角が所定の指令角度になった時のセンサ値を検出するための手段として、サンプリング手段と、計時手段と、センサ値算出手段とを備えている。
【００１６】
そして、サンプリング手段は、クランク角が指令角度となる前にクランク角信号に前記特定方向のパルスエッジが生じるタイミング（以下、検出開始タイミングという）から、クランク角が指令角度を過ぎた後にクランク角信号に前記特定方向のパルスエッジが生じるタイミング（以下、検出終了タイミングという）までのサンプリング期間の間、Ａ／Ｄ変換手段にセンサ値を一定時間毎にＡ／Ｄ変換させて、そのＡ／Ｄ変換で得られた各デジタル値を所定の記憶手段に記憶させる。
【００１７】
また、計時手段は、前記検出開始タイミングの時刻と前記検出終了タイミングの時刻とを夫々計測する。
そして、センサ値算出手段は、計時手段によって計測された両時刻（即ち、サンプリング期間の開始時刻及び終了時刻）と、検出開始タイミングでのクランク角から指令角度までの角度と、前記所定角度（即ち、クランク角信号の１周期分のクランク角）とから、前記サンプリング期間内にてクランク角が指令角度になった時刻（以下、指令角度時刻という）を算出して、前記記憶手段に記憶されているサンプリング期間分デジタル値から、前記算出した指令角度時刻のセンサ値を求める。
【００１８】
尚、センサ値算出手段は、記憶手段に記憶されている各デジタル値の中から、前記算出した指令角度時刻に最も近いタイミングでＡ／Ｄ変換されたと見なされるデジタル値を１つ選択して、その選択したデジタル値を、指令角度時刻のセンサ値として求めるように構成することができる。また例えば、センサ値算出手段は、記憶手段に記憶されている各デジタル値の中から、前記算出した指令角度時刻の直前にＡ／Ｄ変換されたデジタル値と、前記算出した指令角度時刻の直後にＡ／Ｄ変換されたデジタル値とを選択して、その選択した２つのデジタル値から、補間処理によって、指令角度時刻でのセンサ値を算出するように構成することもできる。
【００１９】
この請求項１のエンジン制御装置では、クランク角信号の各周期（即ち、クランク角信号に特定方向のパルスエッジが生じてから次に同方向のパルスエッジが生じるまでの各期間）のうちで、クランク角が指令角度となる時点を含んだ周期を、サンプリング期間としているため、そのサンプリング期間の開始時及び終了時におけるクランク角は、エンジンの回転変動に拘わらず正確に把握され、また、そのサンプリング期間の開始と終了との各々の時刻は、計時手段によって正確に計測される。
【００２０】
このため、センサ値算出手段で算出される指令角度時刻は、エンジンの回転変動の影響を殆ど受けない正確な値となる。つまり、サンプリング期間の開始と終了との各時刻は計時手段によって正確に計測され、また、検出開始タイミング（サンプリング期間の開始時）でのクランク角は正確に把握される値であるため、そのクランク角から指令角度までの角度も正確な値であり、更に、クランク角信号の１周期分のクランク角である上記所定角度は既知の固定値であるため、それらの正確な情報から算出される指定角度時間は、エンジンの回転変動に殆ど影響されない正確な値となる。
【００２１】
そして、センサ値算出手段により、そのような正確な指令角度時刻に基づいて、サンプリング期間中の一定時間毎のＡ／Ｄ変換値（センサ値をＡ／Ｄ変換したデジタル値）から算出される目的のセンサ値も、エンジンの回転変動の影響を殆ど受けることなく、クランク角が実際に指令角度になった時のセンサ値により近い値となる。
【００２２】
よって、請求項１のエンジン制御装置によれば、クランク角が指令角度となった時のセンサ値を、従来よりも格段に高い精度で検出できるようになる。
一方、クランク角が第１の角度になってから第２の角度になるまでの監視期間において、センサからのセンサ値が特定の値となった時のクランク角を検出するためには、請求項２に記載の構成が適している。尚、特定の値としては、例えば、最大値，最小値，極大値，極小値や、予め定められた基準値、といった値が考えられる。
【００２３】
即ち、請求項２に記載のエンジン制御装置も、従来の装置と同様に、所定のセンサからのセンサ値をデジタル値へとＡ／Ｄ変換するためのＡ／Ｄ変換手段を備えると共に、エンジンのクランク軸が所定角度回転する毎に特定方向のパルスエッジが生じるクランク角信号に基づいてクランク角を把握するが、特に、クランク角が第１の角度になってクランク角信号に特定方向のパルスエッジが生じるタイミング（以下、監視開始タイミングという）から、クランク角が第２の角度になってクランク角信号に特定方向のパルスエッジが生じるタイミング（以下、監視終了タイミングという）までの監視期間の中で、センサ値が特定の値となった時のクランク角を検出するための手段として、サンプリング手段と、計時手段と、特定値発生時刻検出手段と、クランク角算出手段とを備えている。
【００２４】
そして、サンプリング手段は、前記監視期間の間、Ａ／Ｄ変換手段にセンサ値を一定時間毎にＡ／Ｄ変換させる。
また、計時手段は、前記監視期間において、クランク角信号に前記特定方向のパルスエッジが生じた各タイミングであって、前記監視開始タイミングと前記監視終了タイミングとを含む各タイミングの時刻を夫々計測する。
【００２５】
また更に、特定値発生時刻検出手段は、Ａ／Ｄ変換手段によってＡ／Ｄ変換された各デジタル値の中から、前記特定の値となったデジタル値を選択すると共に、その選択したデジタル値がＡ／Ｄ変換された時刻である特定値発生時刻を検出する。
【００２６】
そして、クランク角算出手段は、前記監視期間におけるクランク角信号の各周期のうちで、前記特定値発生時刻を含んだ周期を特定して、その特定した周期の開始時刻と終了時刻とを前記計時手段の計測結果から取得し、更に、その取得した開始時刻及び終了時刻と、前記特定値発生時刻と、前記開始時刻でのクランク角と、前記所定角度（即ち、クランク角信号の１周期分のクランク角）とから、前記特定値発生時刻でのクランク角を、センサ値が特定の値となった時のクランク角として算出する。
【００２７】
つまり、この請求項２のエンジン制御装置では、従来装置のように、過去のクランク角信号の周期時間を利用して目的のクランク角を求めるのではなく、センサ値を一定時間毎にＡ／Ｄ変換して得た各デジタル値の中から、特定の値となったものを選択して、その選択したデジタル値のＡ／Ｄ変換時刻である特定値発生時刻を求めると共に、監視期間において、その特定値発生時刻を含んだクランク角信号の周期を特定して、その特定した周期の開始時刻及び終了時刻と、特定値発生時刻と、上記開始時刻でのクランク角と、クランク角信号の１周期分のクランク角である上記所定角度とから、センサ値が特定の値となった時のクランク角を算出するようにしている。
【００２８】
このため、請求項２のエンジン制御装置によれば、センサ値が特定の値となった時のクランク角を、エンジンの回転変動の影響を殆ど受けずに、従来よりも格段に高い精度で検出できるようになる。
尚、監視期間が、クランク角信号の複数周期分ではなく１周期分だけである場合には、クランク角算出手段は、その監視期間自体を、特定値発生時刻を含んだクランク角信号の周期として特定することとなり、監視開始タイミングと監視終了タイミングとの各時刻を、特定値発生時刻を含んだクランク角信号の周期の開始時刻及び終了時刻として取得することとなる。
【００２９】
一方、請求項１，２のエンジン制御装置において、センサ値をＡ／Ｄ変換する周期としての上記一定時間（以下、サンプリング周期ともいう）は、短い時間に設定するほど、検出精度の面で有利であるが、サンプリング周期を極端に短い時間に設定すると、Ａ／Ｄ変換のための処理負荷やＡ／Ｄ変換値を記憶するための記憶手段の必要容量を大幅に増加させてしまうため、サンプリング周期は、処理負荷やハードウエア上の制約と、検出精度との兼ね合い応じて適宜設定すれば良い。このため、サンプリング周期は、エンジンが最高許容回転数で運転される場合でも、ある程度小さい値のクランク角（例えば１°ＣＡ）毎にＡ／Ｄ変換が行われるような値に設定することが好ましい。
【００３０】
【発明の実施の形態】
以下、本発明が適用された実施形態の車両用エンジン制御装置について、図面を用いて説明する。
まず図１は、本実施形態のエンジン制御装置（以下、ＥＣＵという）１の構成を制御対象のエンジン３と共に表すブロック図である。
【００３１】
図１に示すように、ＥＣＵ１には、エンジン３に取り付けられたクランク角センサ５と、エンジン３の各気筒７に１つずつ装備された燃焼圧センサ９と、上記各気筒７に燃料を噴射供給するためのインジェクタ１１とが接続されている。
尚、クランク角センサ５は、エンジン３のクランク軸と一緒に回転するパルサーと、そのパルサーの外周に所定角度間隔で設けられている多数の歯の通過を検出する毎に、クランク角信号としてのパルス信号を出力する検出部と、からなる周知のものである。そして、このクランク角センサ５（詳しくは、上記検出部）から出力されるクランク角信号は、クランク軸が所定角度（本実施形態では、１０°）回転する毎に立ち上がりエッジ（即ち、ローレベルからハイレベルへの方向のパルスエッジ）が生じるものとなる。また、以下の説明において、このようなクランク角信号の立ち上がりエッジを、特に「ＮＥパルス」ともいう。一方、燃焼圧センサ９は、各気筒７の燃焼圧力を表すアナログ信号（以下、燃焼圧信号ともいう）を出力するセンサである。
【００３２】
そして、ＥＣＵ１は、ＣＰＵ１３，ＲＯＭ１５，ＲＡＭ１７，Ａ／Ｄコンバータ１９，及びそれらを接続する内部バス２１等からなる周知のマイクロコンピュータ（以下、マイコンという）２３と、クランク角センサ５からのクランク角信号及び各燃焼圧センサ９からの燃焼圧信号をマイコン２３に入力させる入力回路２５と、マイコン２３からの制御信号に従って上記インジェクタ１１等の各種アクチュエータを動作させる出力回路２７とを備えている。
【００３３】
ここで、クランク角センサ５からのクランク角信号は、入力回路２５で波形整形されて、マイコン２３のＣＰＵ１３に入力されるようになっている。また、各燃焼圧センサ９からの燃焼圧信号は、入力回路２５を介してマイコン２３のＡ／Ｄコンバータ１９に入力されるようになっており、その燃焼圧信号の値（センサ値）は、Ａ／Ｄコンバータ１９によりデジタル値へとＡ／Ｄ変換される。
【００３４】
そして、ＣＰＵ１３は、ＲＯＭ１５に格納されたプログラムに従って、エンジン制御用の各種処理を行う。例えば、ＣＰＵ１３は、クランク角信号に基づいて、周知の手法により、現在のクランク角（クランク軸の回転角度）やエンジン回転数を把握する。具体的には、クランク角が基準位置となった時からのＮＥパルスの発生回数を計数することにより、現在のクランク角を検出し、ＮＥパルスの時間間隔を計測することにより、現在のエンジン回転数を検出する。また、ＣＰＵ１３は、Ａ／Ｄ変換手段としてのＡ／Ｄコンバータ１９を制御して、燃焼圧センサ９のセンサ値を検出する。そして更に、ＣＰＵ１３は、それらの検出結果に基づき出力回路２７へ制御信号を出力して、インジェクタ１１等を適切に動作させることにより、エンジン３の運転状態を制御する。
【００３５】
次に、このようなＥＣＵ１において、燃焼圧センサ９のセンサ値に関して行われる２種類の処理（処理１及び処理２）について説明する。尚、これらの処理は、各気筒７の燃焼圧センサ９について行われるものであるが、処理内容は共通であるため、１つの気筒（ここでは、複数の気筒７のうちの第１気筒＃１とする）の燃焼圧センサ９についてのみ説明する。また、以下に説明する処理は、マイコン２３のＣＰＵ１３が実行するものである。
［処理１：クランク角が指令角度となった時のセンサ値を検出する処理］
まず、図２〜図５を参照して、クランク角が所定の指令角度となった時のセンサ値を検出するための処理１について説明する。
【００３６】
尚、本実施形態においては、クランク角が第１気筒＃１の圧縮行程上死点（以下、ＴＤＣと記す）の角度位置になったタイミングを含む１０°ＣＡ毎の各タイミングで、クランク角信号に立ち上がりエッジ（ＮＥパルス）が生じるものとする。また、センサ値を検出したい希望の指令角度は、第１気筒＃１のＴＤＣから１５°ＣＡ進んだクランク角（ＡＴＤＣ１５°ＣＡ）であるものとする。
【００３７】
図２は、ＣＰＵ１３が処理１のために実行するＮＥ割り込み処理を表すフローチャートであり、このＮＥ割り込み処理は、クランク角信号に立ち上がりエッジが生じる毎（ＮＥパルスが発生する毎）に実行される。
図２に示すように、ＣＰＵ１３がＮＥ割り込み処理の実行を開始すると、まずステップ（以下、単に「Ｓ」と記す）１１０にて、今回のＮＥパルスの発生タイミングが、クランク角が指令角度となる直前のＮＥパルスの発生タイミングであって、燃焼圧信号に対するサンプリングを開始すべき検出開始タイミングとしてのＡＤ起動タイミングであるか否かを判定する。尚、この例において、ＡＤ起動タイミングは、第１気筒＃１のＴＤＣから１０°ＣＡ進んだクランク角（ＡＴＤＣ１０°ＣＡ）のタイミングである（図５参照）。
【００３８】
そして、上記Ｓ１１０にてＡＤ起動タイミングであると判定したならば、Ｓ１２０に進んで、Ａ／Ｄコンバータ１９を起動して該Ａ／Ｄコンバータ１９に燃焼圧信号の値であるセンサ値をＡ／Ｄ変換させ、次のＳ１３０にて、その時点から一定時間Ｔint 後にマイコン２３内でコンペア割り込み要求（いわゆるタイマ割り込み要求）が発生するように、コンペア割り込み要求発生時刻をセットし、続くＳ１４０にて、そのコンペア割り込み要求に対応する図３のコンペア割り込み処理が起動されるのを許可する。そして更に、続くＳ１５０にて、今回のＮＥ割り込み処理の起動時刻であって、今回のＡＤ起動タイミングの時刻（図５における時刻Ｔ１）を、ＲＡＭ１７に格納して、本ＮＥ割り込み処理を終了する。
【００３９】
尚、ＣＰＵ１３は、マイコン２３内で常時カウントアップされているフリーランニングカウンタの値を時刻として扱っている。このため、図５の時刻Ｔ１でＡＤ起動タイミングに該当するＮＥパルスが発生したとすると、ＣＰＵ１３は、上記Ｓ１５０にて、時刻Ｔ１でのフリーランニングカウンタの値を、時刻Ｔ１としてＲＡＭ１７に格納することとなる。
【００４０】
一方、ＣＰＵ１３は、上記Ｓ１１０にてＡＤ起動タイミングではないと判定したならば、Ｓ１６０に移行して、今回のＮＥパルスの発生タイミングが、クランク角が指令角度を過ぎた直後のＮＥパルスの発生タイミングであって、燃焼圧信号に対するサンプリングを終了すべき検出終了タイミングとしてのＡＤ終了タイミングであるか否かを判定する。尚、この例において、ＡＤ終了タイミングは、第１気筒＃１のＴＤＣから２０°ＣＡ進んだクランク角（ＡＴＤＣ２０°ＣＡ）のタイミングである（図５参照）。
【００４１】
そして、上記Ｓ１６０にてＡＤ終了タイミングであると判定したならば、Ｓ１７０に進んで、前述したＳ１５０の場合と同様に、今回のＮＥ割り込み処理の起動時刻であって、今回のＡＤ終了タイミングの時刻（図５における時刻Ｔ２）を、ＲＡＭ１７に格納する。そして更に、続くＳ１８０にて、後述する図３のコンペア割り込み処理に対するＡＤ終了要求をセットし、本ＮＥ割り込み処理を終了する。尚、ＡＤ終了要求は、実際には、図３のコンペア割り込み処理で参照されるフラグであり、Ｓ１８０では、そのＡＤ終了要求用のフラグをセットする。
【００４２】
また、ＣＰＵ１３は、上記Ｓ１６０にてＡＤ終了タイミングではないと判定したならば、Ｓ１９０に移行して、ＡＤ処理終了通知の有無を判定する。尚、このＡＤ処理終了通知は、後述する図３のコンペア割り込み処理のＳ３６０でセットされるフラグであり、Ｓ１９０では、このＡＤ処理終了通知用のフラグを参照して、そのフラグがセットされている場合に、ＡＤ処理終了通知が有ったと判定する。
【００４３】
そして、ＡＤ処理終了通知が有ったならば、Ｓ２００に進んで、そのＡＤ処理終了通知と上記Ｓ１８０でセットしたＡＤ終了要求との各フラグをクリアする。そして更に、続くＳ２１０にて、後述する図４のセンサ値算出処理に対するセンサ値算出処理要求をセットし、本ＮＥ割り込み処理を終了する。尚、センサ値算出処理要求も、実際には、図４のセンサ値算出処理で参照されるフラグであり、Ｓ２１０では、そのセンサ値算出処理要求用のフラグをセットする。
【００４４】
一方また、ＣＰＵ１３は、上記Ｓ１９０にてＡＤ処理終了通知が無い（ＡＤ処理終了通知用のフラグがセットされていない）と判定したならば、そのまま、本ＮＥ割り込み処理を終了する。
次に、図２のＮＥ割り込み処理におけるＳ１３０でコンペア割り込み要求発生時刻がセットされてから、一定時間Ｔint が経過すると、マイコン２３内でコンペア割り込み要求が発生し、ＣＰＵ１３は、図３のコンペア割り込み処理の実行を開始することとなる。
【００４５】
そして、図３に示すように、ＣＰＵ１３がコンペア割り込み処理の実行を開始すると、まずＳ３１０にて、Ａ／Ｄコンバータ１９から、その時にＡ／Ｄ変換されているデジタル値（燃焼圧信号のＡ／Ｄ変換値であり、以下、ＡＤ値ともいう）を読み出して、そのＡＤ値をＲＡＭ１７の所定領域に格納する。
【００４６】
尚、このＳ３１０では、図２のＳ１３０でコンペア割り込み要求発生時刻がセットされたことに伴い当該コンペア割り込み処理が起動された場合には、Ａ／Ｄコンバータ１９からのＡＤ値（この場合には、図２のＳ１２０で起動されたＡ／Ｄコンバータ１９のＡＤ値）を、０番目のＡＤ値（ＡＤ［０］）としてＲＡＭ１７に記憶する。そして、その後は、図２のＳ１８０でＡＤ終了要求がセットされるまで（即ち、ＡＤ終了タイミングが到来するまで）の間、当該Ｓ３１０の実行タイミング毎に、Ａ／Ｄコンバータ１９からのＡＤ値を、１番目のＡＤ値（ＡＤ［１］），２番目のＡＤ値（ＡＤ［２］），３番目のＡＤ値（ＡＤ［３］）…といった具合に、１ずつ増加する番号と対応させてＲＡＭ１７に記憶する。
【００４７】
そして、ＣＰＵ１３は、続くＳ３２０にて、前述のＡＤ終了要求がセットされているか否かを判定し、ＡＤ終了要求がセットされていなければ（Ｓ３２０：無し）、Ｓ３３０に進んで、Ａ／Ｄコンバータ１９を起動して該Ａ／Ｄコンバータ１９にセンサ値（燃焼圧信号の値）をＡ／Ｄ変換させる。そして更に、続くＳ３４０にて、今回のコンペア割り込み処理の起動時刻から一定時間Ｔint 後に再びコンペア割り込み要求が発生するように、コンペア割り込み要求発生時刻をセットし、本コンペア割り込み処理を終了する。このため、Ｓ３２０でＡＤ終了要求がセットされていないと判定された場合には、Ａ／Ｄコンバータ１９が再び起動されると共に、一定時間Ｔint 後に本コンペア割り込み処理が再度起動されることとなる。
【００４８】
尚、本実施形態において、上記一定時間Ｔint は、Ａ／Ｄコンバータ１９にセンサ値を繰り返しＡ／Ｄ変換させる周期（サンプリング周期）である。そして、この一定時間Ｔint は、エンジン３が最高許容回転数で運転される場合でも、例えば１°ＣＡといった程度の小さいクランク角毎に、Ａ／Ｄ変換が行われるような値に設定されている。例えば、本実施形態において、エンジン３の最高許容回転数は５０００ｒｐｍであり、一定時間Ｔint は３０μｓに設定されている。よって仮に、エンジン３が最高許容回転数よりも高い５６００ｒｐｍで運転されたとしても、約１°ＣＡ相当の時間毎にセンサ値のＡ／Ｄ変換が実施されることとなる。そして更に、このことは、後述する処理２についても同じである。
【００４９】
一方、上記Ｓ３２０でＡＤ終了要求がセットされていると判定した場合には（Ｓ３２０：有り）、Ｓ３５０に移行して、本コンペア割り込み処理が起動されるのを禁止し、続くＳ３６０にて、図２のＮＥ割り込み処理に対しＡＤ処理終了通知を行う。つまり、ＡＤ処理終了通知用のフラグをセットして、図２のＮＥ割り込み処理に対し、検出開始タイミングとしてのＡＤ起動タイミングから検出終了タイミングとしてのＡＤ終了タイミングまでのサンプリング期間におけるセンサ値のＡ／Ｄ変換を、全て終えたことを通知する。そして、その後、本コンペア割り込み処理を終了する。
【００５０】
以上のような図２のＮＥ割り込み処理と図３のコンペア割り込み処理とにより、本ＥＣＵ１では、図５に示すように、時刻Ｔ１で検出開始タイミングとしてのＡＤ起動タイミングが到来すると（ＡＤ起動タイミングに該当するＮＥパルスが発生すると）、その時点から、時刻Ｔ２で検出終了タイミングとしてのＡＤ終了タイミングが到来するまで（ＡＤ終了タイミングに該当するＮＥパルスが発生するまで）のサンプリング期間の間、Ａ／Ｄコンバータ１９が一定時間Ｔint 毎に起動されて、その一定時間Ｔint 毎のＡＤ値がＲＡＭ１７に順次記憶されることとなる。尚、図５において、Ａ／Ｄコンバータ１９の起動タイミングは、△印で示されている。
【００５１】
つまり、図５の時刻Ｔ１で検出開始タイミングとしてのＡＤ起動タイミングが到来すると、その時点で、図２のＳ１２０により、Ａ／Ｄコンバータ１９が最初に起動され、その際にＡ／Ｄ変換されたＡＤ値は、図２のＳ１３０から一定時間Ｔint 後に実行される最初のコンペア割り込み処理（図３）のＳ３１０で、ＲＡＭ１７に格納される。そして更に、その回のコンペア割り込み処理のＳ３３０で、Ａ／Ｄコンバータ１９が再び起動され、その際にＡ／Ｄ変換されたＡＤ値は、その回のコンペア割り込み処理から一定時間Ｔint 後に実行される次回のコンペア割り込み処理（図３）のＳ３１０で、ＲＡＭ１７に格納ることとなる。そして、以後は、図５の時刻Ｔ２で検出終了タイミングとしてのＡＤ終了タイミングが到来して、図２のＳ１８０でＡＤ終了要求がセットされるまで（即ち、図３のＳ３２０でＡＤ終了要求がセットされていると判定されるまで）、コンペア割り込み処理が一定時間Ｔint 毎に実行され、そのコンペア割り込み処理のＳ３３０とＳ３１０とにより、Ａ／Ｄコンバータ１９の起動とＡＤ値のＲＡＭ１７への格納とが繰り返し行われることとなる。
【００５２】
また、検出開始タイミングとしてのＡＤ起動タイミングの時刻Ｔ１と、検出終了タイミングとしてのＡＤ終了タイミングの時刻Ｔ２とが、図２のＳ１５０とＳ１７０との各々により、ＲＡＭ１７に格納される。
そして、本ＥＣＵ１においては、検出終了タイミングとしてのＡＤ終了タイミングが到来して、図２のＳ１８０によりＡＤ終了要求がセットされ、それに伴い、図３のＳ３６０でＡＤ処理終了通知用のフラグがセットされると、次のＮＥパルスが発生した時（即ち、図５における時刻Ｔ２の次にクランク角信号が立ち上がった時）のＮＥ割り込み処理にて、Ｓ１１０とＳ１６０との両方で否定判定され、Ｓ１９０でＡＤ処理終了通知が有ったと判定されることとなる。そして更に、その回のＮＥ割り込み処理のＳ２１０にて、センサ値算出処理要求がセットされることとなる。
【００５３】
すると、そのセンサ値算出処理要求に応じて、図４のセンサ値算出処理が実質的に実行され、目的のセンサ値（つまり、クランク角が指令角度となった時のセンサ値）が算出されることとなる。
即ち、図４のセンサ値算出処理は定期的に実行される処理であり、ＣＰＵ１３がこのセンサ値算出処理の実行を開始すると、まず最初のＳ４１０にて、センサ値算出処理要求（詳しくは、センサ値算出処理要求用のフラグ）がセットされているか否かを判定する。
【００５４】
そして、Ｓ４１０でセンサ値算出処理要求がセットされていないと判定した場合には、そのまま何もせずに本センサ値算出処理を終了するが、Ｓ４１０でセンサ値算出処理要求がセットされていると判定した場合には、Ｓ４２０に進む。
Ｓ４２０では、センサ値算出処理要求のフラグをクリアし、続くＳ４３０にて、図２のＳ１５０とＳ１７０とでＲＡＭ１７に格納されたＡＤ起動タイミングの時刻Ｔ１とＡＤ終了タイミングの時刻Ｔ２とを読み出し、下記の式１により、指令角度が含まれているＮＥパルス間の間隔時間（つまり、サンプリング期間の間隔時間）Ｔｋを求める。
【００５５】
Ｔｋ＝Ｔ２−Ｔ１  …式１
そして更に、続くＳ４４０にて、上記Ｓ４３０で求めた間隔時間Ｔｋと、検出開始タイミングとしてのＡＤ起動タイミングでのクランク角（即ち、図５の時刻Ｔ１でのクランク角であり、本実施形態ではＡＴＤＣ１０°ＣＡ）から指令角度（本実施形態ではＡＴＤＣ１５°ＣＡ）までの角度β（図５参照）と、クランク角信号の１周期分のクランク角である所定角度α（本実施形態では１０°ＣＡ）とから、下記の式２により、指令角度時刻（即ち、クランク角が指令角度になった時刻）Ｔtargetを算出する。
【００５６】
Ｔtarget＝（Ｔｋ÷α）×β  …式２
尚、ここで算出される指令角度時刻Ｔtargetの値は、検出開始タイミングとしてのＡＤ起動タイミング（図５の時刻Ｔ１）を基準にした値である。
そして、続くＳ４５０にて、まず、周期指標ｉを０に初期化する。
【００５７】
次に、Ｓ４６０にて、周期指標ｉと、サンプリング周期である一定時間Ｔint との積「ｉ×Ｔint 」が、Ｓ４４０で算出した指令角度時刻Ｔtargetよりも小さいか否かを判定し、肯定判定したならば、Ｓ４７０で周期指標ｉを１インクリメントしてから、再びＳ４６０の判定を行う。
【００５８】
そして、Ｓ４６０で、積「ｉ×Ｔint 」が指令角度時刻Ｔtargetよりも小さくないと否定判定したならば、Ｓ４８０に移行して、図２及び図３の処理でＲＡＭ１７に記憶した今回のサンプリング期間分のＡＤ値のうちで、その時の周期指標ｉによって特定されるｉ番目のＡＤ値（ＡＤ値［ｉ］）を、指令角度時刻Ｔtargetでのセンサ値（即ち、クランク角が指令角度となった時のセンサ値）ＡＮＳとして取得し、その後、本センサ値算出処理を終了する。
【００５９】
つまり、Ｓ４５０〜Ｓ４８０の処理により、記憶手段としてのＲＡＭ１７に記憶されている各ＡＤ値の中から、Ｓ４４０で算出した指令角度時刻Ｔtargetを越えた直後のタイミングでＡ／Ｄ変換されたＡＤ値（図５においては、「ＡＮＳ」なる符号を付した△印のタイミングでＡ／Ｄ変換されたＡＤ値）を、指令角度時刻Ｔtargetに最も近いタイミングでのＡＤ値と見なして選択し、その選択したＡＤ値を、クランク角が指令角度となった時の目的のセンサ値ＡＮＳとして扱うようにしている。
【００６０】
以上のような本実施形態のＥＣＵ１では、クランク角信号の各周期のうちで、クランク角が指令角度となる時点を含んだ周期を、サンプリング期間としているため、そのサンプリング期間の開始時及び終了時におけるクランク角は、エンジン３の回転変動に拘わらず正確に把握され、また、そのサンプリング期間の開始と終了との各々の時刻Ｔ１，Ｔ２は、図２のＮＥ割り込み処理のＳ１５０及びＳ１７０によって正確に計測される。
【００６１】
このため、図４のセンサ値算出処理で算出される指令角度時刻Ｔtargetは、エンジン３の回転変動の影響を殆ど受けない正確な値となる。つまり、サンプリング期間の開始と終了との各時刻Ｔ１，Ｔ２は正確に計測され、また、検出開始タイミング（サンプリング期間の開始時）Ｔ１でのクランク角は正確に把握される値であるため、そのクランク角から指令角度までの角度βも正確な値であり、更に、クランク角信号の１周期分のクランク角である所定角度αは既知の固定値であるため、それらの正確な情報から式１，２により算出される指定角度時間Ｔtargetは、エンジン３の回転変動に殆ど影響されない正確な値となる。
【００６２】
そして、図４のセンサ値算出処理により、そのような正確な指令角度時刻Ｔtargetに基づいて、サンプリング期間中の一定時間Ｔint 毎のＡＤ値から選択される目的のセンサ値ＡＮＳも、エンジン３の回転変動の影響を殆ど受けることなく、クランク角が実際に指令角度になった時のセンサ値により近い値となる。
【００６３】
よって、本実施形態のＥＣＵ１によれば、クランク角が指令角度となった時のセンサ値を、従来よりも格段に高い精度で検出できるようになる。
尚、本実施形態では、図２のＮＥ割り込み処理におけるＳ１１０〜Ｓ１４０，Ｓ１６０，及びＳ１８０〜Ｓ２１０と図３のコンペア割り込み処理とが、請求項１のサンプリング手段に相当し、図２のＮＥ割り込み処理におけるＳ１５０及びＳ１７０が、請求項１の計時手段に相当している。そして、図４のセンサ値算出処理が、センサ値算出手段に相当している。
【００６４】
一方、図４のＳ４５０〜Ｓ４８０では、例えば、ＲＡＭ１７に記憶されているサンプリング期間分のＡＤ値の中から、Ｓ４４０で算出した指令角度時刻Ｔtargetの直前のタイミングでＡ／Ｄ変換されたＡＤ値と、その指令角度時刻Ｔtargetの直後のタイミングでＡ／Ｄ変換されたＡＤ値とを選択して、その選択した２つのＡＤ値から、補間処理によって、指令角度時刻Ｔtargetでのセンサ値を算出するようにしても良い。このようにすれば、検出精度を一層向上させることができる。
［処理２：センサ値が最大値となった時のクランク角を検出する処理］
次に、図６〜図９を参照して、センサ値が最大値となった時のクランク角を検出するための処理２について説明する。
【００６５】
尚、以下の説明においては、ＮＥパルスが発生する各タイミングのうちで、第１気筒＃１のＡＴＤＣ１０°ＣＡのタイミングから第１気筒＃１のＡＴＤＣ３０°ＣＡのタイミングまでの２０°ＣＡ分の期間が、センサ値が最大値となった時のクランク角を検出すべき監視期間として設定されているものとする。つまり、ここでは、ＡＴＤＣ１０°ＣＡが監視開始タイミング（即ち、監視期間の開始タイミング）に対応する第１の角度であり、ＡＴＤＣ３０°ＣＡが監視終了タイミング（即ち、監視期間の終了タイミング）に対応する第２の角度であるものとする。
【００６６】
まず図６は、ＣＰＵ１３が処理２のために実行するＮＥ割り込み処理を表すフローチャートであり、このＮＥ割り込み処理は、クランク角信号の立ち上がりエッジであるＮＥパルスが発生する毎に実行される。
図６に示すように、ＣＰＵ１３がＮＥ割り込み処理の実行を開始すると、まずＳ５１０にて、今回のＮＥパルスの発生タイミングが、監視開始タイミング（監視期間の開始タイミング）としてのＡＤ起動タイミング（この例では、第１気筒＃１のＡＴＤＣ１０°ＣＡのタイミング）であるか否かを判定する。
【００６７】
そして、上記Ｓ５１０にてＡＤ起動タイミングであると判定したならば、Ｓ５２０に進んで、Ａ／Ｄコンバータ１９を起動して該Ａ／Ｄコンバータ１９に燃焼圧信号の値であるセンサ値をＡ／Ｄ変換させ、次のＳ５３０にて、その時点から一定時間Ｔint （本処理２においても３０μｓ）後にマイコン２３内でコンペア割り込み要求が発生するように、コンペア割り込み要求発生時刻をセットし、続くＳ５４０にて、そのコンペア割り込み要求に対応する図７のコンペア割り込み処理が起動されるのを許可する。そして更に、続くＳ５５０にて、今回のＮＥ割り込み処理の起動時刻であって、今回のＡＤ起動タイミングの時刻を、ＲＡＭ１７に格納して、本ＮＥ割り込み処理を終了する。
【００６８】
一方、ＣＰＵ１３は、上記Ｓ５１０にてＡＤ起動タイミングではないと判定したならば、Ｓ５６０に移行して、今回のＮＥパルスの発生タイミングが、監視終了タイミング（監視期間の終了タイミング）としてのＡＤ終了タイミング（この例では、第１気筒＃１のＡＴＤＣ３０°ＣＡのタイミング）であるか否かを判定する。
【００６９】
そして、上記Ｓ５６０にてＡＤ終了タイミングであると判定したならば、Ｓ５７０に進んで、今回のＮＥ割り込み処理の起動時刻であって、今回のＡＤ終了タイミングの時刻をＲＡＭ１７に格納する。そして更に、続くＳ５８０にて、後述する図７のコンペア割り込み処理に対するＡＤ終了要求をセットし、本ＮＥ割り込み処理を終了する。尚、ＡＤ終了要求は、実際には、図７のコンペア割り込み処理で参照されるフラグであり、Ｓ５８０では、そのＡＤ終了要求用のフラグをセットする。
【００７０】
また、ＣＰＵ１３は、上記Ｓ５６０にてＡＤ終了タイミングではないと判定したならば、Ｓ５９０に移行して、ＡＤ処理実施中（即ち、監視期間中）であるか否かを判定する。尚、このＳ５９０では、今回発生したＮＥパルスが、ＡＤ起動タイミングからＡＤ終了タイミングまでの間に発生するＮＥパルスであった場合に、ＡＤ処理実施中であると判定する。
【００７１】
そして、Ｓ５９０にてＡＤ処理実施中であると判定した場合には、Ｓ６００に進んで、今回のＮＥ割り込み処理の起動時刻であって、今回のＮＥパルスの発生時刻をＲＡＭ１７に格納し、本ＮＥ割り込み処理を終了する。
一方、ＣＰＵ１３は、上記Ｓ５９０にてＡＤ処理実施中ではないと判定したならば、Ｓ６１０に移行して、ＡＤ処理終了通知の有無を判定する。尚、このＡＤ処理終了通知は、後述する図７のコンペア割り込み処理のＳ７６０でセットされるフラグであり、Ｓ６１０では、このＡＤ処理終了通知用のフラグを参照して、そのフラグがセットされている場合に、ＡＤ処理終了通知が有ったと判定する。
【００７２】
そして、ＡＤ処理終了通知が有ったならば、Ｓ６２０に進んで、そのＡＤ処理終了通知と上記Ｓ５８０でセットしたＡＤ終了要求との各フラグをクリアする。そして更に、続くＳ６３０にて、後述する図８の最大値発生角度算出処理に対する最大値発生角度算出処理要求をセットし、本ＮＥ割り込み処理を終了する。尚、最大値発生角度算出処理要求も、実際には、図８の最大値発生角度算出処理で参照されるフラグであり、Ｓ６３０では、その最大値発生角度算出処理要求用のフラグをセットする。
【００７３】
また、ＣＰＵ１３は、上記Ｓ６１０にてＡＤ処理終了通知が無い（ＡＤ処理終了通知用のフラグがセットされていない）と判定したならば、そのまま、本ＮＥ割り込み処理を終了する。
尚、本処理２においても、ＣＰＵ１３は、マイコン２３内で常時カウントアップされているフリーランニングカウンタの値を時刻として扱っている。
【００７４】
そして、特にＳ５５０では、今回のＮＥ割り込み処理の起動時刻（ＡＤ起動タイミングの時刻）を、１番目の時刻Ｔ［１］としてＲＡＭ１７に格納する。このため、図９の時刻ＴａでＡＤ起動タイミングに該当するＡＴＤＣ１０°ＣＡのＮＥパルスが発生したとすると、ＣＰＵ１３は、上記Ｓ５５０にて、時刻Ｔａでのフリーランニングカウンタの値を、１番目の時刻Ｔ［１］としてＲＡＭ１７に格納することとなる。
【００７５】
また、Ｓ６００では、Ｓ５１０でＡＤ起動タイミングであると判定された次の回の実行時ならば、今回のＮＥパルスの発生時刻を２番目の時刻Ｔ［２］としてＲＡＭ１７に格納する。そして、その後は、Ｓ５６０でＡＤ終了タイミングであると判定されるまで、当該Ｓ６００の実行タイミング毎に、その回のＮＥパルスの発生時刻を、３番目の時刻Ｔ［３］，４番目の時刻Ｔ［４］，…といった具合に、１ずつ増加する番号と対応させてＲＡＭ１７に記憶する。
【００７６】
そして更に、Ｓ５７０では、今回のＮＥ割り込み処理の起動時刻（ＡＤ終了タイミングの時刻）を、上記Ｓ６００で最後に記憶された時刻の番号の次の番号の時刻として、ＲＡＭ１７に格納する。
但し、この例では、図９に示すように、ＡＤ起動タイミングが第１気筒＃１のＡＴＤＣ１０°ＣＡのタイミングであり、ＡＤ終了タイミングが第１気筒＃１のＡＴＤＣ３０°ＣＡのタイミングであるため、Ｓ６００の処理は、第１気筒＃１のＡＴＤＣ２０°ＣＡのタイミングでのみ実行されることなる。
【００７７】
よって、この例では、図９の時刻ＴｂでＡＴＤＣ２０°ＣＡのＮＥパルスが発生したとすると、ＣＰＵ１３は、Ｓ６００にて、時刻Ｔｂでのフリーランニングカウンタの値を、２番目の時刻Ｔ［２］としてＲＡＭ１７に格納することとなり、その後、図９の時刻ＴｃでＡＤ終了タイミングに該当するＡＴＤＣ３０°ＣＡのＮＥパルスが発生したとすると、ＣＰＵ１３は、上記Ｓ５７０にて、時刻Ｔｃでのフリーランニングカウンタの値を、３番目の時刻Ｔ［３］としてＲＡＭ１７に格納することとなる。
【００７８】
次に、図６のＮＥ割り込み処理におけるＳ５３０でコンペア割り込み要求発生時刻がセットされてから、一定時間Ｔint （＝３０μｓ）が経過すると、マイコン２３内でコンペア割り込み要求が発生し、ＣＰＵ１３は、図７のコンペア割り込み処理の実行を開始することとなる。
【００７９】
そして、図７に示すように、ＣＰＵ１３がコンペア割り込み処理の実行を開始すると、まずＳ７１０にて、Ａ／Ｄコンバータ１９から、その時にＡ／Ｄ変換されているデジタル値（ＡＤ値）を読み出して、そのＡＤ値をＲＡＭ１７の所定領域に格納する。
【００８０】
次に、ＣＰＵ１３は、続くＳ７１５にて、上記Ｓ７１０の処理でそれまでにＡ／Ｄコンバータ１９から取得したＡＤ値のうちの最大値と、その最大値がＡ／Ｄ変換された時刻（特定値発生時刻に相当し、以下、最大値発生時刻という）Ｔとを検出して、その検出した最大値及び最大値発生時刻ＴをＲＡＭ１７に格納する処理を行う。尚、最大値及び最大値発生時刻Ｔを求めるＳ７１５の処理は、図６のＳ５３０でコンペア割り込み要求発生時刻がセットされたことに伴い当該コンペア割り込み処理が実行された場合を起点として実施される。
【００８１】
そして、ＣＰＵ１３は、続くＳ７２０にて、前述のＡＤ終了要求がセットされているか否かを判定し、ＡＤ終了要求がセットされていなければ（Ｓ７２０：無し）、Ｓ７３０に進んで、Ａ／Ｄコンバータ１９を起動して該Ａ／Ｄコンバータ１９にセンサ値（燃焼圧信号の値）をＡ／Ｄ変換させる。そして更に、続くＳ７４０にて、今回のコンペア割り込み処理の起動時刻から一定時間Ｔint （＝３０μｓ）後に再びコンペア割り込み要求が発生するように、コンペア割り込み要求発生時刻をセットし、本コンペア割り込み処理を終了する。このため、Ｓ７２０でＡＤ終了要求がセットされていないと判定された場合には、Ａ／Ｄコンバータ１９が再び起動されると共に、上記一定時間Ｔint 後に本コンペア割り込み処理が再度起動されることとなる。
【００８２】
一方、上記Ｓ７２０でＡＤ終了要求がセットされていると判定した場合には（Ｓ７２０：有り）、Ｓ７５０に移行して、本コンペア割り込み処理が起動されるのを禁止し、続くＳ７６０にて、図６のＮＥ割り込み処理に対しＡＤ処理終了通知を行う。つまり、ＡＤ処理終了通知用のフラグをセットして、図６のＮＥ割り込み処理に対し、監視開始タイミングとしてのＡＤ起動タイミングから監視終了タイミングとしてのＡＤ終了タイミングまでの監視期間におけるセンサ値のＡ／Ｄ変換を、全て終えたことを通知する。そして、その後、本コンペア割り込み処理を終了する。
【００８３】
以上のような図６のＮＥ割り込み処理と図７のコンペア割り込み処理とにより、本ＥＣＵ１の処理２においては、図９に示すように、時刻Ｔａで監視開始タイミングとしてのＡＤ起動タイミングが到来すると（ＡＤ起動タイミングに該当するＮＥパルスが発生すると）、その時点から、時刻Ｔｃで監視終了タイミングとしてのＡＤ終了タイミングが到来するまで（ＡＤ終了タイミングに該当するＮＥパルスが発生するまで）の監視期間の間、Ａ／Ｄコンバータ１９が一定時間Ｔint 毎に起動され、ＣＰＵ１３は、その一定時間Ｔint 毎のＡＤ値を順次取得することとなる。尚、図９においても、図５と同様に、Ａ／Ｄコンバータ１９の起動タイミングは、△印で示されている。
【００８４】
つまり、図９の時刻Ｔａで監視開始タイミングとしてのＡＤ起動タイミングが到来すると、その時点で、図６のＳ５２０により、Ａ／Ｄコンバータ１９が最初に起動され、その際にＡ／Ｄ変換されたＡＤ値は、図６のＳ５３０から一定時間Ｔint 後に実行される最初のコンペア割り込み処理（図７）のＳ７１０で、Ａ／Ｄコンバータ１９からＣＰＵ１３へと読み込まれる。そして更に、その回のコンペア割り込み処理のＳ７３０で、Ａ／Ｄコンバータ１９が再び起動され、その際にＡ／Ｄ変換されたＡＤ値は、その回のコンペア割り込み処理から一定時間Ｔint 後に実行される次回のコンペア割り込み処理（図７）のＳ７１０で、Ａ／Ｄコンバータ１９からＣＰＵ１３へと読み込まれることとなる。そして、以後は、図９の時刻Ｔｃで監視終了タイミングとしてのＡＤ終了タイミングが到来して、図６のＳ５８０でＡＤ終了要求がセットされるまで（即ち、図７のＳ７２０でＡＤ終了要求がセットされていると判定されるまで）、コンペア割り込み処理が一定時間Ｔint 毎に実行され、そのコンペア割り込み処理のＳ７３０とＳ７１０とにより、Ａ／Ｄコンバータ１９の起動とＡ／Ｄコンバータ１９からのＡＤ値の読み込みとが繰り返し行われることとなる。
【００８５】
そして更に、ＣＰＵ１３は、図７のＳ７１５の処理により、上記監視期間分の多数のＡＤ値の中から、特定値としての最大値になったＡＤ値（以下、単に「最大値」ともいう）を選択すると共に、その最大値のＡ／Ｄ変換時刻である最大値発生時刻Ｔを検出することとなる。
【００８６】
具体的に説明すると、Ｓ７１５での最大値の選択は、Ｓ７１０で今回取得したＡＤ値と、それまでの最大値とを比較して、大きい方を最新の最大値として記憶する、といった手順で行われる。また、Ｓ７１５での最大値発生時刻Ｔの検出は、上記の選択で最大値としたＡＤ値をＡ／Ｄコンバータ１９から取得した回の当該コンペア割り込み処理の起動時刻よりも一定時間Ｔint だけ前の時刻を、最大値発生時刻Ｔとする、といった手順で行われる。
【００８７】
尚、Ｓ７１０で監視期間内に取得した多数のＡＤ値を全てＲＡＭ１７内に記憶しておいて、その監視期間の終了後に、それらＡＤ値の中から最大値を選択し、更に、その最大値がＡＤ起動タイミングから何番目のサンプリング周期でＡ／Ｄ変換されたかと、ＡＤ起動タイミングの時刻とから、最大値発生時刻Ｔを求めるようにしても良い。
【００８８】
また、本ＥＣＵ１の処理２においては、図６のＳ５５０とＳ５７０とＳ６００との各々により、監視期間におけるＮＥパルスの各発生タイミングであって、監視開始タイミングとしてのＡＤ起動タイミングと、監視終了タイミングとしてのＡＤ終了タイミングとを含む各タイミングの時刻が計測されると共に、その各時刻が、早いものから順に、Ｔ［１］，Ｔ［２］，…といった具合に番号付けされて、ＲＡＭ１７に格納される。
【００８９】
そして、本ＥＣＵ１の処理２においては、監視終了タイミングとしてのＡＤ終了タイミングが到来して、図６のＳ５８０によりＡＤ終了要求がセットされ、それに伴い、図７のＳ７６０でＡＤ処理終了通知用のフラグがセットされると、次のＮＥパルスが発生した時（即ち、図９における時刻Ｔｃの次にクランク角信号が立ち上がった時）のＮＥ割り込み処理にて、Ｓ５１０，Ｓ５６０，及びＳ５９０の全てで否定判定され、Ｓ６１０でＡＤ処理終了通知が有ったと判定されることとなる。そして更に、その回のＮＥ割り込み処理のＳ６３０にて、最大値発生角度算出処理要求がセットされることとなる。
【００９０】
すると、その最大値発生角度算出処理要求に応じて、図８の最大値発生角度算出処理が実質的に実行され、目的のクランク角（つまり、センサ値が最大値となった時のクランク角）が算出されることとなる。
即ち、図８の最大値発生角度算出処理は定期的に実行される処理であり、ＣＰＵ１３がこの処理の実行を開始すると、まず最初のＳ８１０にて、最大値発生角度算出処理要求（詳しくは、最大値発生角度算出処理要求用のフラグ）がセットされているか否かを判定する。
【００９１】
そして、Ｓ８１０で最大値発生角度算出処理要求がセットされていないと判定した場合には、そのまま何もせずに本処理を終了するが、Ｓ８１０で最大値発生角度算出処理要求がセットされていると判定した場合には、Ｓ８２０に進む。
Ｓ８２０では、最大値発生角度算出処理要求のフラグをクリアし、続くＳ８３０にて、まず、時刻指標ｍを０に初期化する。
【００９２】
次に、Ｓ８４０にて、図６のＳ５５０，Ｓ５７０，及びＳ６００によりＲＡＭ１７に格納された各番号の時刻のうちで、その時の時刻指標ｍに１を加えた番号（ｍ＋１）の時刻Ｔ［ｍ＋１］が、図７のＳ７１５で求められた最大値発生時刻Ｔよりも大きいか否か（つまり、最大値発生時刻Ｔが時刻Ｔ［ｍ］と時刻Ｔ［ｍ＋１］との間になっているか否か）を判定し、否定判定したならば、Ｓ８５０で時刻指標ｍを１インクリメントしてから、再びＳ８４０の判定を行う。
【００９３】
そして、Ｓ８４０で、時刻Ｔ［ｍ＋１］が最大値発生時刻Ｔよりも大きいと肯定判定したならば、Ｓ８６０に進む。つまり、Ｓ８３０〜Ｓ８５０の処理により、監視期間における各ＮＥパルス間（即ち、クランク角信号の各周期）のうちで、最大値発生時刻Ｔを含んだＮＥパルス間を特定するようにしており、上記Ｓ８４０で肯定判定された時点では、図６のＳ５５０，Ｓ５７０，及びＳ６００によりＲＡＭ１７に格納された各番号の時刻のうちで、その時の時刻指標ｍの番号の時刻Ｔ［ｍ］から、その時の時刻指標ｍに１を加えた番号の時刻Ｔ［ｍ＋１］までのＮＥパルス間が、最大値発生時刻Ｔを含んだＮＥパルス間であると特定されることとなる。
【００９４】
Ｓ８６０では、ＲＡＭ１７から、最大値発生時刻Ｔを含んだＮＥパルス間の開始時刻である時刻Ｔ［ｍ］と、そのＮＥパルス間の終了時刻Ｔ［ｍ＋１］とを読み出して、下記の式３により、最大値発生時刻Ｔを含んだＮＥパルス間の間隔時間と、そのＮＥパルス間の開始時刻から最大値発生時刻Ｔまでの時間との比Ｒを算出する。
【００９５】
Ｒ＝（Ｔ−Ｔ［ｍ］）÷（Ｔ［ｍ＋１］−Ｔ［ｍ］）  …式３
そして更に、続くＳ８７０にて、上記Ｓ８６０で求めた比Ｒと、時刻Ｔ［ｍ］でのクランク角ＣＡｍと、１ＮＥパルス間分（クランク角信号の１周期分）のクランク角である所定角度α（本実施形態では１０°ＣＡ）とから、下記の式４により、最大値発生時刻Ｔでのクランク角γを算出し、そのクランク角γを、センサ値が最大値となった時のクランク角としてＲＡＭ１７に記憶する。そして、その後、本最大値発生角度算出処理を終了する。
【００９６】
γ＝α×Ｒ＋ＣＡｍ  …式４
つまり、Ｓ８６０及びＳ８７０の処理では、最大値発生時刻Ｔを含んだＮＥパルス間の開始時刻及び終了時刻（Ｔ［ｍ］，Ｔ［ｍ＋１］）と、図７のＳ７１５で求めた最大値発生時刻Ｔと、上記開始時刻でのクランク角ＣＡｍと、１ＮＥパルス間分のクランク角αとから、最大値発生時刻Ｔでのクランク角γを、センサ値が最大値となった時のクランク角として算出するようにしている。
【００９７】
このような最大値発生角度算出処理により、図９に例示する如く、図７のＳ７１５で求められた最大値発生時刻Ｔが監視開始タイミングとしてのＡＤ起動タイミングから１つ目のＮＥパルス間に含まれていた場合には、ＲＡＭ１７に格納された時刻Ｔ［１］〜Ｔ［３］のうちのＴ［１］，Ｔ［２］と、最大値発生時刻Ｔと、ＡＤ起動タイミングでのクランク角（ＡＴＤＣ１０°ＣＡ）と、１ＮＥパルス間分のクランク角αとから、最大値発生時刻Ｔでのクランク角γが求められ、そのクランク角γが、センサ値が最大値となった時のクランク角としてＲＡＭ１７に格納されて、エンジン３の制御に用いられることとなる。
【００９８】
以上のように本実施形態のＥＣＵ１では、従来装置のように、過去のクランク角信号の周期時間を利用して目的のクランク角を求めるのではなく、センサ値を一定時間Ｔint 毎にＡ／Ｄ変換した各ＡＤ値の中から、最大値となったものを選択して、その選択したＡＤ値のＡ／Ｄ変換時刻である最大値発生時刻Ｔを求めると共に、監視期間において、その最大値発生時刻Ｔを含んだＮＥパルス間を特定して、その特定したＮＥパルス間の開始時刻及び終了時刻と、最大値発生時刻Ｔと、上記開始時刻でのクランク角と、クランク角信号の１周期分のクランク角αとから、センサ値が最大値となった時のクランク角を算出するようにしている。
【００９９】
このため、センサ値が最大値となった時のクランク角を、エンジン３の回転変動の影響を殆ど受けずに、従来よりも格段に高い精度で検出できるようになる。尚、本実施形態では、図６のＮＥ割り込み処理におけるＳ５１０〜Ｓ５４０，Ｓ５６０，Ｓ５８０，Ｓ５９０，及びＳ６１０〜Ｓ６３０と図７のコンペア割り込み処理におけるＳ７１０，及びＳ７２０〜Ｓ７６０とが、請求項２のサンプリング手段に相当し、図６のＮＥ割り込み処理におけるＳ５５０，Ｓ５７０，及びＳ６００が、請求項２の計時手段に相当している。そして、図７のコンペア割り込み処理におけるＳ７１５が、特定値発生時刻検出手段に相当し、図８の最大値発生角度算出処理が、クランク角算出手段に相当している。
【０１００】
一方、上記処理２の例では、センサ値が最大値となった時のクランク角を求めたが、例えば、センサ値が、最小値となった時、予め定められた基準値になった（超えた又は下回った）時、極大値になった時、極小値になった時など、他の特定の値になった時のクランク角も、同様の手順で求めることができる。
【０１０１】
以上、本発明の一実施形態について説明したが、本発明は、種々の形態を採り得ることは言うまでもない。
例えば、上記実施形態では、エンジン３の各気筒７に燃焼圧センサ９を配しているが、１つの気筒（例えば第１気筒＃１）の燃焼圧だけを測定する構成としても良い。
【０１０２】
また、上記実施形態では、燃焼圧センサ９からの燃焼圧信号を検出対象としたが、検出対象のアナログ信号は、他のセンサからの信号であっても良い。
一方、上記実施形態では、Ａ／Ｄ変換の周期（サンプリング周期）である一定時間Ｔint が、常に一定値（３０μｓ）であったが、例えば、その一定時間Ｔint は、エンジン回転数に応じて、エンジン回転数が低い場合には大きな値に設定し、エンジン回転数が高い場合には小さい値に設定するようにしても良い。このようにすれば、特に上記処理１において、エンジン回転数が低い場合にＡＤ値を格納するためのメモリ領域を小さくすることができる。
【図面の簡単な説明】
【図１】  実施形態のエンジン制御装置（ＥＣＵ）の構成を制御対象のエンジンと共に表すブロック図である。
【図２】  ＣＰＵが処理１のために実行するＮＥ割り込み処理を表すフローチャートである。
【図３】  ＣＰＵが処理１のために実行するコンペア割り込み処理を表すフローチャートである。
【図４】  ＣＰＵが処理１のために実行するセンサ値算出処理を表すフローチャートである。
【図５】  図２〜図４の処理の作用を表すタイムチャートである。
【図６】  ＣＰＵが処理２のために実行するＮＥ割り込み処理を表すフローチャートである。
【図７】  ＣＰＵが処理２のために実行するコンペア割り込み処理を表すフローチャートである。
【図８】  ＣＰＵが処理２のために実行する最大値発生角度算出処理を表すフローチャートである。
【図９】  図６〜図８の処理の作用を表すタイムチャートである。
【符号の説明】
１…エンジン制御装置（ＥＣＵ）、３…エンジン、５…クランク角センサ、７…気筒、９…燃焼圧センサ、１１…インジェクタ、１３…ＣＰＵ、１５…ＲＯＭ、１７…ＲＡＭ、１９…Ａ／Ｄコンバータ、２１…内部バス、２３…マイクロコンピュータ（マイコン）、２５…入力回路、２７…出力回路
【図１】
0003777963.tif 000002
【図２】
0003777963.tif 000003
【図３】
0003777963.tif 000004
【図４】
0003777963.tif 000005
【図５】
0003777963.tif 000006
【図６】
0003777963.tif 000007
【図７】
0003777963.tif 000008
【図８】
0003777963.tif 000009
【図９】
0003777963.tif 000010