(57)【要約】【課題】データ収集期間における一定時間毎のエンジン制御用データを漏れなくメモリに記憶させることのできる処理装置の提供。【解決手段】気筒内圧センサからの信号を一定時間毎にＡ／Ｄ変換してディジタルフィルタ処理した後の一定時間毎のデータを、メモリに順次ＤＭＡ転送するＤＭＡチャンネルとして、並列に動作可能なｃｈＡ０とｃｈＡ１を有すると共に、その各ＤＭＡチャンネルには、起動してから連続して転送可能なデータ数に上限値（この例では２５５）が定められたマイコンでは、データ収集期間において、ｃｈＡ０とｃｈＡ１を、動作期間を重複させながら順次起動することで、一定時間毎のデータをメモリに記憶させる。そして、データ収集期間が終了した後、メモリに記憶されているデータの中から、２つのＤＭＡチャンネルによって同時に転送された同じデータの一方を探し出して、そのデータを削除する。【選択図】図３
2008063992.tif 000002
【特許請求の範囲】
【請求項１】
車両のエンジンを制御するために用いられる一定時間毎のエンジン制御用データを順次出力するデータ出力手段と、
前記データ出力手段からのデータを記憶するためのメモリと、
前記データ出力手段からのデータを前記メモリに順次転送して記憶させる機能を有すると共に、互いに並行して動作可能であり、更に、起動してから連続して転送可能なデータの数に上限値が定められた複数のデータ転送手段と、
前記データを収集すべき期間（以下、データ収集期間という）において、前記複数のデータ転送手段の全てがデータ転送動作をしていない期間が生じないように、前記複数のデータ転送手段を順次起動することにより、前記データ出力手段からのデータを前記メモリに記憶させる制御手段と、
を備えていることを特徴とするエンジン制御用データの処理装置。
【請求項２】
請求項１に記載のエンジン制御用データの処理装置において、
前記制御手段は、前記データ収集期間の開始タイミングが到来すると、前記複数のデータ転送手段のうちの何れかを起動し、その後、前記データ収集期間が終了するまでは、動作中のデータ転送手段が前記メモリに転送したデータの数が前記上限値に達する前に、他のデータ転送手段を起動することにより、前記複数のデータ転送手段のうちの１つが動作している単独動作期間と２つが同時に動作している重複動作期間とが生じるようにすると共に、順次起動した各データ転送手段により転送される各データ列が前記メモリの異なる記憶領域に記憶されるように、前記複数のデータ転送手段を制御すること、
を特徴とするエンジン制御用データの処理装置。
【請求項３】
請求項２に記載のエンジン制御用データの処理装置において、
前記データ収集期間が終了した後、前記メモリに記憶されているデータの中から、前記重複動作期間中に２つのデータ転送手段によって転送された互いに同じデータの一方を重複余剰データとして探し出し、その重複余剰データを削除する削除手段を備えていること、
を特徴とするエンジン制御用データの処理装置。
【請求項４】
請求項３に記載のエンジン制御用データの処理装置において、
前記制御手段は、前記他のデータ転送手段を起動した際に、先に起動されて既に動作中のデータ転送手段がその時に前記メモリに転送したデータの識別情報を、該識別情報が前記データ収集期間の開始タイミングから何番目に起動されたデータ転送手段により前記メモリに転送されたデータ列に関するものであるかを特定可能に記憶するようになっており、
前記削除手段は、順次起動された各データ転送手段により前記メモリに記憶された各データ列において、そのデータ列に関する前記識別情報が示すデータ以降のデータを、前記重複余剰データとして削除すること、
を特徴とするエンジン制御用データの処理装置。
【請求項５】
請求項３に記載のエンジン制御用データの処理装置において、
前記制御手段は、前記他のデータ転送手段を起動した際に、先に起動されて既に動作中のデータ転送手段がその時に前記メモリに転送したデータの識別情報を、該識別情報が前記データ収集期間の開始タイミングから何番目に起動されたデータ転送手段により前記メモリに転送されたデータ列に関するものであるかを特定可能に記憶するようになっており、
前記データ収集期間の開始タイミングからｎ番目（ｎは１以上の整数）に起動されたデータ転送手段により前記メモリに転送されたデータ列をｎ番目のデータ列と称することにすると、
前記削除手段は、ｎ番目のデータ列において該ｎ番目のデータ列に関する前記識別情報が示すデータ以降のデータと、「ｎ＋１」番目のデータ列における先頭以降のデータとを比較し、前記ｎ番目のデータ列における前記識別情報が示すデータ以降のデータのうちで、前記「ｎ＋１」番目のデータ列における先頭以降のデータと値が一致しているデータを、前記重複余剰データとして削除すること、
を特徴とするエンジン制御用データの処理装置。
【請求項６】
請求項５に記載のエンジン制御用データの処理装置において、
前記削除手段は、前記一致しているデータがなければ、異常と判断すること、
を特徴とするエンジン制御用データの処理装置。
【請求項７】
請求項３ないし請求項６の何れか１項に記載のエンジン制御用データの処理装置において、
前記データ出力手段は、前記一定時間毎のエンジン制御用データとして、前記エンジンの気筒内圧力を検出する気筒内圧センサからの信号を前記一定時間毎にＡ／Ｄ変換したデータ、又は、そのＡ／Ｄ変換したデータに対してディジタルフィルタ処理を行った後のデータを出力するようになっており、
前記一定時間は、前記エンジンのクランク軸が所定角度回転する毎にパルスエッジが発生する回転信号に前記所定角度毎のパルスエッジ（以下、特定エッジという）が発生してから該特定エッジが次に発生するまでの１パルス間隔時間の最小値よりも短い時間に設定されており、
前記データ収集期間において、前記回転信号に前記特定エッジが発生する毎に、その時の時刻を、該時刻がどのクランク角度での時刻であるかを識別可能に順次記憶していくエッジ発生時刻記憶処理手段と、
前記データ収集期間において、前記データ出力手段からデータが最初に出力された時刻を記憶する開始時刻記憶処理手段と、
前記エッジ発生時刻記憶処理手段により記憶された前記特定エッジ発生時の各時刻と、前記開始時刻記憶処理手段により記憶された時刻と、前記一定時間と、前記削除手段によって前記重複余剰データが削除された後の前記メモリ内のエンジン制御用データとから、前記クランク軸が前記所定角度よりも小さい一定角度回転したとき毎のエンジン制御用データを求める演算処理手段と、
を備えていることを特徴とするエンジン制御用データの処理装置。
【請求項８】
請求項１ないし請求項７の何れか１項に記載のエンジン制御用データの処理装置を備えたエンジン制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、エンジン制御用データを処理する技術に関する。
【背景技術】
【０００２】
従来より、エンジン制御の分野においては、エンジン側に気筒（シリンダ）内の圧力を検出するための気筒内圧センサ（Ｃｙｌｉｎｄｅｒ  Ｐｒｅｓｓｕｒｅ  Ｓｅｎｓｏｒ：燃焼室圧センサとも呼ばれる）を設け、そのセンサからの信号に基づき点火時期や空燃比を制御することが知られている（例えば、特許文献１参照）。
【０００３】
また例えば、ディーゼルエンジンにおいては、気筒内圧センサからの信号（以下、ＣＰＳ信号ともいう）に基づき燃焼時期や燃焼状態を予測して、燃料の噴射時期や噴射量をフィードバック制御することにより、高出力、低エミッションのエンジンが実現可能になると考えられている。更に、ＣＰＳ信号は、失火検出やノック検出など、色々な状態検出のために用いることができる。
【０００４】
ところで、ＣＰＳ信号をエンジンの制御に用いる場合には、そのＣＰＳ信号の波形をトレースするような細かいタイミングでＡ／Ｄ変換して信号値を得ることが望ましい。
そこで、例えば、１°ＣＡ毎（エンジンのクランク軸が１°回転する毎）程度の細かいタイミングでＣＰＳ信号の信号値を取り込むようにすることが考えられる。尚、「ＣＡ」とは、クランクアングルを意味している。
【０００５】
一方、エンジン制御装置では、エンジンのクランク軸の回転に同期して燃料噴射弁等のアクチュエータを作動させるが、例えば特許文献２に記載されているように、クランクセンサより出力されてクランク軸が所定角度回転する毎（一般には１０°ＣＡ毎）にパルスエッジが発生する回転信号（クランク信号やＮＥ信号とも呼ばれる）から、その回転信号を逓倍した逓倍クロック（詳しくは、周期が回転信号の周期の逓倍数分の１であるクロック）を生成すると共に、その逓倍クロックの時間間隔で、カウント値がクランク角度を表す角度カウンタをカウントアップさせ、その角度カウンタのカウント値に基づきエンジン回転に同期した制御を行うようにしたものがある。このようにすることで、元の回転信号よりも細かい「１／逓倍数」の分解能でクランク角度を把握できるようにしているのである。
【０００６】
また、上記逓倍クロックを生成するための手段は、回転信号に上記所定角度毎のパルスエッジ（以下、特定エッジという）が発生してから該特定エッジが次に発生するまでの１パルス間隔（つまり、所定角度間隔）毎に、その１パルス間隔を計測するエッジ時間計測カウンタと、回転信号に特定エッジが発生すると上記エッジ時間計測カウンタによる今回の計測値を逓倍数で除算した値がセットされるエッジ時間記憶レジスタと、そのエッジ時間記憶レジスタに記憶された時間毎に、逓倍クロックとしてのパルスを発生させる逓倍カウンタとから構成される。つまり、今回計測した回転信号の１パルス間隔に基づいて、回転信号に次の特定エッジが発生するまでの逓倍クロックの周期を決定している。
【０００７】
そして、エンジン制御装置において、ＣＰＳ信号を例えば１°ＣＡ毎といった細かいタイミングで取り込んでエンジンの制御に用いようとした場合、そのＣＰＳ信号の取り込みタイミングは、上記のように回転信号を逓倍した逓倍クロックでカウントアップされる角度カウンタのカウント値に基づいて発生させることが考えられる。例えば、角度カウンタの値が１°ＣＡに相当する値だけ進む毎に、ＣＰＳ信号をＡ／Ｄ変換してそのＡ／Ｄ変換値のデータ（以下単に、Ａ／Ｄ変換値ともいう）をメモリに記憶する、といった処理を行えば良い。
【０００８】
ところが、このような逓倍クロックを利用した手法では、エンジンの回転変動に弱くタイミングのばらつきが懸念される。つまり、逓倍クロックの周期は回転信号の前回の１パルス間隔時間から予測算出されるものであるため、エンジンの回転速度が急に変化した場合には、角度カウンタの値に誤差が生じることとなり、その結果、取り込まれるＣＰＳ信号の各Ａ／Ｄ変換値は、クランク軸が一定の微小角度回転したとき毎の本当のデータとはならない。
【０００９】
そこで、本出願人による特許文献３では、ＣＰＳ信号のＡ／Ｄ変換値を収集すべきデータ収集期間において、回転信号の１パルス間隔時間の最小値よりも短い一定時間毎にＣＰＳ信号をＡ／Ｄ変換して、その各Ａ／Ｄ変換値をメモリに順次記憶すると共に、Ａ／Ｄ変換が最初に行われた開始時刻と、回転信号に特定エッジが発生した各時刻とをそれぞれ記憶しておき、データ収集期間が終了した後、上記開始時刻と、特定エッジが発生した各時刻と、Ａ／Ｄ変換間隔である上記一定時間と、メモリに記憶された一定時間毎のＡ／Ｄ変換値とを用いて、クランク軸が上記所定角度よりも小さい一定角度回転したとき毎のＡ／Ｄ変換値を求める、といった構成を提案している。そして、この構成によれば、回転信号に特定エッジが発生する角度間隔よりも小さい一定クランク角度毎のＣＰＳ信号の各信号値が正確に得られ、そのような一定クランク角度毎のＣＰＳ信号値が必要なエンジン制御の精度を向上させることができる。
【００１０】
また更に、近年の自動車制御用マイコンには、ＣＰＵによるソフトウェア処理と並行して動作可能なモジュールであって、入力信号のＡ／Ｄ変換を一定時間毎に行うＡ／Ｄ変換器と、そのＡ／Ｄ変換器による一定時間毎のＡ／Ｄ変換値に対してディジタルフィルタ処理を行うフィルタ部と、そのフィルタ部から出力されるフィルタ後のＡ／Ｄ変換値をメモリに順次ＤＭＡ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）転送するＤＭＡ転送部（ＤＭＡコントローラ）とを有したモジュールを備えているものがある。
【００１１】
そして、このようなマイコンを用いて特許文献３の技術を実現すれば、ＣＰＳ信号の一定時間毎のＡ／Ｄ変換と、その各Ａ／Ｄ変換値のメモリへの転送とを、ＣＰＵの処理とは別に実施することができるため、ソフトウェアの処理負荷を低減することができる。
【００１２】
尚、この場合、もしディジタルフィルタ処理を行わないデータをメモリに記憶するのであれば、例えば、Ａ／Ｄ変換器から出力されるのと同じデータがそのままフィルタ部から出力されるように、そのフィルタ部のフィルタ係数を設定しておけば良い。また、フィルタ部とＤＭＡ転送部とを複数組（複数チャンネル分）有した構成のマイコンもあり、このようなマイコンによれば、複数のフィルタ部をそれぞれ通過した一定時間毎のデータからなる各データ列を、その各フィルタ部に対応するＤＭＡ転送部によって同時にメモリへ転送することができる。また、フィルタ部が内蔵されず、Ａ／Ｄ変換器からのデータが、そのままＤＭＡ転送部によってメモリへ転送される構成のマイコンも考えられる。
【特許文献１】特開平９−２７３４３７号公報
【特許文献２】特開２００１−２００７４７号公報
【特許文献３】特開２００５−２２０７９６号公報
【発明の開示】
【発明が解決しようとする課題】
【００１３】
ところで、マイコンに内蔵されるＤＭＡ転送部には、連続して転送可能なデータの数に上限値が定められている場合が多い。
そして、そのような制限のあるＤＭＡ転送部を備えたマイコンによって、例えば特許文献３の技術を実現しようとした場合に、もし、ＤＭＡ転送部が連続して転送可能なデータ数の上限値よりもデータ収集期間中に収集されるべきデータの総数の方が多ければ、必要な全てのデータをメモリに記憶させることができず、延いては、一定クランク角度毎のＣＰＳ信号の各値を必要な分だけ求めることができなくなってしまう。
【００１４】
そこで、本発明は、データ収集期間における一定時間毎のエンジン制御用データを漏れなくメモリに記憶させることのできる処理装置の提供を目的としている。
【課題を解決するための手段】
【００１５】
上記目的を達成するためになされた請求項１に記載のエンジン制御用データの処理装置は、車両のエンジンを制御するために用いられる一定時間毎のエンジン制御用データを順次出力するデータ出力手段と、そのデータ出力手段からのデータを記憶するためのメモリと、データ出力手段からのデータを前記メモリに順次転送して記憶させる機能を有すると共に、互いに並行して動作可能であり、更に、起動してから連続して転送可能なデータの数に上限値が定められた複数のデータ転送手段とを備えている。
【００１６】
そして、この処理装置では、制御手段が、データを収集すべき期間（以下、データ収集期間という）において、複数のデータ転送手段の全てがデータ転送動作をしていない期間が生じないように、その複数のデータ転送手段を順次起動することにより、データ出力手段からのデータを前記メモリに記憶させる。
【００１７】
つまり、請求項１の処理装置では、連続して転送可能なデータ数に上限値がある複数のデータ転送手段を、動作期間を重複させながら順次起動することで、データ収集期間中にデータ出力手段から出力される一定時間毎のデータをメモリに記憶させるようにしている。このため、データ収集期間においてデータ出力手段から出力される一定時間毎のデータを、漏れなくメモリに記憶させることができるようになる。尚、データ転送手段は少なくとも２つあれば良い。
【００１８】
ところで、制御手段は、具体的には請求項２に記載のように、データ収集期間の開始タイミングが到来すると、複数のデータ転送手段のうちの何れかを起動し、その後、データ収集期間が終了するまでは、動作中のデータ転送手段がメモリに転送したデータの数が上限値に達する前に、他のデータ転送手段を起動することにより、複数のデータ転送手段のうちの１つが動作している単独動作期間と２つが同時に動作している重複動作期間とが生じるようにすると共に、順次起動した各データ転送手段により転送される各データ列がメモリの異なる記憶領域に記憶されるように、複数のデータ転送手段を制御するのが好ましい。そして、この構成によれば、複数のデータ転送手段を確実に動作期間を重複させながら順次起動して、一定時間毎のデータを漏れなくメモリに記憶させることができる。
【００１９】
次に、請求項３の処理装置では、請求項２の処理装置において、削除手段を備えている。そして、その削除手段は、データ収集期間が終了した後、メモリに記憶されているデータの中から、前記重複動作期間中に２つのデータ転送手段によって転送された互いに同じデータの一方を重複余剰データとして探し出し、その重複余剰データを削除する。
【００２０】
このような請求項３の処理装置によれば、データ収集期間中にデータ出力手段から出力される一定時間毎のデータを、漏れなく且つ重複することなく取得することができる。
次に、請求項４の処理装置では、請求項３の処理装置において、制御手段は、前記他のデータ転送手段を起動した際に、先に起動されて既に動作中のデータ転送手段がその時にメモリに転送したデータの識別情報を、該識別情報がデータ収集期間の開始タイミングから何番目に起動されたデータ転送手段によりメモリに転送されたデータ列に関するものであるかを特定可能に記憶するようになっている。そして、削除手段は、順次起動された各データ転送手段によりメモリに記憶された各データ列において、そのデータ列に関する前記識別情報が示すデータ以降のデータを、重複余剰データとして削除する。
【００２１】
このような請求項４の構成によれば、重複余剰データを簡単に探し出して削除することができる。
一方、請求項５の処理装置では、請求項４の処理装置と比較すると、削除手段が異なっている。即ち、データ収集期間の開始タイミングからｎ番目（ｎは１以上の整数）に起動されたデータ転送手段によりメモリに転送されたデータ列をｎ番目のデータ列と称することにすると、削除手段は、ｎ番目のデータ列において該ｎ番目のデータ列に関する前記識別情報が示すデータ以降のデータと、「ｎ＋１」番目のデータ列における先頭以降のデータとを比較し、ｎ番目のデータ列における前記識別情報が示すデータ以降のデータのうちで、「ｎ＋１」番目のデータ列における先頭以降のデータと値が一致しているデータを、重複余剰データとして削除する。
【００２２】
そして、このような請求項５の構成によれば、重複余剰データを正確に探し出して削除することができる。
つまり、制御手段が何れかのデータ転送手段を起動してから、そのデータ転送手段が実際にメモリへのデータ転送を開始するまでには遅れ時間がある。このため、例えば「ｎ＋１」番目のデータ転送手段の起動時において、ｎ番目に起動されて既に動作中のデータ転送手段がその時にメモリに転送したデータをＤｎとすると、上記遅れ時間により、「ｎ＋１」番目に起動されたデータ転送手段がＤｎをメモリに転送することができなかった場合、請求項４の構成では、そのＤｎが本当は重複余剰データではないのに削除されてしまう。これに対して、請求項５の構成によれば、こうした懸念を解消することができる。
【００２３】
次に、請求項６の処理装置では、請求項５の処理装置において、削除手段は、前記一致しているデータがなければ、異常と判断するようになっている。
つまり、何らかの原因で上記遅れ時間が大きくなる等して、２つのデータ転送手段が同時に動作している重複動作期間が存在しなくなると、前記一致しているデータが存在しなくなる。そして、そのような場合には、データ抜け（データの取りこぼし）が発生した可能性があるため、異常と判断するのである。よって、この構成によれば、データ抜けのあるデータ群を用いてエンジンを制御してしまうことを未然に防止することができる。
【００２４】
次に、請求項７の処理装置では、請求項３〜６の処理装置において、データ出力手段は、一定時間毎のエンジン制御用データとして、エンジンの気筒内圧力を検出する気筒内圧センサからの信号（ＣＰＳ信号）を一定時間毎にＡ／Ｄ変換したデータ、又は、そのＡ／Ｄ変換したデータに対してディジタルフィルタ処理を行った後のデータを出力するようになっている。また、前記一定時間は、エンジンのクランク軸が所定角度回転する毎にパルスエッジが発生する回転信号に前記所定角度毎のパルスエッジ（以下、特定エッジという）が発生してから該特定エッジが次に発生するまでの１パルス間隔時間の最小値よりも短い時間に設定されている。
【００２５】
そして、請求項７の処理装置では、エッジ発生時刻記憶処理手段が、データ収集期間において、前記回転信号に特定エッジが発生する毎に、その時の時刻を、該時刻がどのクランク角度での時刻であるかを識別可能に順次記憶していく。また、開始時刻記憶処理手段が、データ収集期間において、データ出力手段からデータが最初に出力された時刻を記憶する。更に、演算処理手段が、エッジ発生時刻記憶処理手段により記憶された特定エッジ発生時の各時刻と、開始時刻記憶処理手段により記憶された時刻と、前記一定時間と、削除手段によって重複余剰データが削除された後のメモリ内のエンジン制御用データとから、クランク軸が前記所定角度よりも小さい一定角度回転したとき毎のエンジン制御用データを求める。
【００２６】
このような請求項７の処理装置によれば、ＣＰＳ信号をＡ／Ｄ変換したデータ（Ａ／Ｄ変換値）、又は、そのデータに対してディジタルフィルタ処理を行った後のデータに関して、回転信号に特定エッジが発生する角度間隔よりも小さい一定クランク角度毎のデータが正確に得られる。よって、そのような一定クランク角度毎のデータが必要なエンジン制御の精度を向上させることができる。
【００２７】
そして、請求項８に記載のように、請求項１〜７の処理装置を備えたエンジン制御装置によれば、データ収集期間における一定時間毎のエンジン制御用データを漏れなくメモリに記憶させ、そのメモリ内のデータを用いてエンジンを精度良く制御することができるようになる。
【発明を実施するための最良の形態】
【００２８】
本発明が適用された実施形態のエンジン制御装置（以下、ＥＣＵという）について説明する。
まず図１に示すように、本実施形態のＥＣＵ１が制御対象とするエンジン３は、例えばシリンダ５を４つ有した４気筒のディーゼルエンジンであり、そのエンジン３の吸気経路７には、上流側から順に、ターボチャージャーのコンプレッサ９、インタークーラー１１、スロットルバルブ１３、及びＭＡＰセンサ１５が設けられている。尚、ＭＡＰセンサ１５は、エンジン３の吸気量と吸気圧を検出するためのセンサである。
【００２９】
また、エンジン３の吸気経路７と排気経路１７との間には、ＥＧＲ（ＥＸＨＡＵＳＴ  ＧＡＳ  ＲＥＣＩＲＣＵＬＡＴＩＯＮ）用の配管１９が設けられており、その配管１９には、ＥＧＲクーラー２１と、ＥＧＲ量を制御するためのＥＧＲバルブ２３が設けられている。
【００３０】
更に、エンジン３には、気筒内圧センサ２５とクランクセンサ２７が設けられている。尚、気筒内圧センサ２５は各気筒毎に設けられるが、ここでは１つの気筒についてのみ図示して説明する。また、クランクセンサ２７は、外周に歯が形成されたシグナルロータと電磁ピックアップや磁気検知素子等を備えた周知のものであり、そのクランクセンサ２７からクランク軸の回転に応じて出力される回転信号（以下、ＮＥ信号という）は、エンジンのクランク軸が所定角度（本実施形態では１０°）回転する毎に有効エッジとしての立ち上がりエッジ（特定エッジに相当）が発生する信号である（図３の１段目参照）。
【００３１】
そして、上記ＭＡＰセンサ１５、気筒内圧センサ２５、及びクランクセンサ２７からの各信号は、ＥＣＵ１に入力される。
ＥＣＵ１は、上記各センサからの信号に基づいて、各気筒毎に設けられたインジェクタ２９やＥＧＲバルブ２３を駆動することにより、エンジン３に対する燃料噴射やＥＧＲ量を制御する。特に、気筒内圧センサ２５からのＣＰＳ信号に基づいて着火時期を検出し、その検出結果をＥＧＲ制御や燃料噴射制御に用いる。また、ＥＣＵ１は、図示しないアクセルペダル操作量センサからの信号等に基づいて、スロットルバルブ１３の開度を調節するためのアクチュエータを駆動する。
【００３２】
次に、ＥＣＵ１の内部構成のうち、ＣＰＳ信号の処理に関する部分について説明する。
図２に示すように、ＥＣＵ１は、気筒内圧センサ２５からのＣＰＳ信号が入力されるアナログのフィルタ回路３１と、そのフィルタ回路３１を通過したＣＰＳ信号が入力されるマイコン３３とを備えている。
【００３３】
尚、ＣＰＳ信号には共振ノイズが重畳し易いため、本実施形態では、マイコン３３にてＣＰＳ信号の一定時間毎のＡ／Ｄ変換（即ち、サンプリング）及び各Ａ／Ｄ変換値に対するディジタルフィルタ処理を行うようになっている。このため、アナログのフィルタ回路３１は、いわゆるアンチエイリアッシングフィルタである。
【００３４】
そして、マイコン３３は、ＣＰＵ３５と、そのＣＰＵ３５によるソフトウェア処理と並行して動作可能なＡＤＣ・ＤＭＡモジュール３７とを備えている。
ＡＤＣ・ＤＭＡモジュール３７には、フィルタ回路３１を通過したＣＰＳ信号を一定時間毎にＡ／Ｄ変換するＡ／Ｄ変換器（ＡＤＣ）３９と、メモリ４１と、Ａ／Ｄ変換器３９から出力される一定時間毎のデータ（Ａ／Ｄ変換値）がそれぞれ入力されて、その時系列のデータに対してディジタルフィルタ処理を行う複数（この例では２つ）のフィルタ部５０，５１と、フィルタ部５０，５１のそれぞれに対応して設けられ、自己に対応するフィルタ部５０，５１から出力される一定時間毎のデータ（フィルタ後のＡ／Ｄ変換値）をメモリ４１に順次ＤＭＡ転送するＤＭＡ転送部６０，６１とが設けられている。
【００３５】
尚、本実施形態では、フィルタ部５０，５１のフィルタ係数が両方共に同じ値に設定されるため、ＤＭＡ転送部６０，６１には同じデータが入力される。よって、例えば１つのフィルタ部からＤＭＡ転送部６０，６１にデータが入力される構成でも良い。また、フィルタ部とＤＭＡ転送部は、３組以上あっても良いが、本実施形態では２組を使用するため、その２組のみ図示している。また、複数のＤＭＡ転送部６０，６１のそれぞれは、１つのＤＭＡコントローラの各チャンネル（ＤＭＡチャンネル）であると見なすことができるため、以下では、ＤＭＡ転送部６０，６１を総称してＤＭＡチャンネルと言い、そのＤＭＡチャンネルのうち、ＤＭＡ転送部６０の方をチャンネルＡ０（以下、ｃｈＡ０と記す）と言い、ＤＭＡ転送部６１の方をチャンネルＡ１（以下、ｃｈＡ１と記す）と言う。
【００３６】
更に、マイコン３３には、ＡＤＣ・ＤＭＡモジュール３７のメモリ４１とは別に、メモリ４３が備えられており、ＣＰＵ３５は、その両方のメモリ４１，４３にアクセス可能となっている。そして、メモリ４３には、後述する角度再配置処理により、メモリ４１内のデータから求められた一定クランク角度毎（本実施形態では１°ＣＡ毎）のデータが記憶される。
【００３７】
尚、メモリ４１，４３はＲＡＭである。また、図示は省略しているが、マイコン３３には、プログラムが記憶されたＲＯＭや周知のフリーランタイマや、ＮＥ信号が立ち上がる毎にその時のフリーランタイマの値がセットされるインプットキャプチャレジスタ等も備えられている。一方、本実施形態では、ＣＰＳ信号のＡ／Ｄ変換間隔（上記一定時間であり、サンプリング周期）を、例えば２６．７μｓ（３７．５ｋＨｚ相当）としているが、エンジン３の適用回転域に合わせて高回転域までモニタが必要な場合には、そのＡ／Ｄ変換間隔を短く設定すれば良い。
【００３８】
次に、マイコン３３で実施される処理の内容について説明する。尚、以下の説明において、ＴＤＣとは、気筒の圧縮行程上死点のことであり、例えば、「ＢＴＤＣ５０°ＣＡ」とは、そのＴＤＣより５０°ＣＡ前のことである。また例えば、「ＡＴＤＣ５０°ＣＡ」とは、ＴＤＣより５０°ＣＡ後のことである。
【００３９】
まず、図３は、マイコン３３で実施される処理の概要を表すタイムチャートである。
図３に示すように、本実施形態では、ＢＴＤＣ４０°ＣＡからＡＴＤＣ４０°ＣＡまでの８０°ＣＡ分の期間におけるＣＰＳ信号のディジタルフィルタ結果に基づいて着火時期を検出するが、その８０°ＣＡ分の期間におけるディジタルフィルタ結果を安定させるために、その期間の前後１０°ＣＡ分のデータも収集するようにしている。尚、後ろ側も１０°ＣＡ分だけ多く収集するのは、例えば位相遅れ補償のため０次遅れフィルタを用いる場合に備えてである。このため、本実施形態では、ＢＴＤＣ５０°ＣＡからＡＴＤＣ５０°ＣＡまでの１００°ＣＡ分の期間が、ＣＰＳ信号のＡ／Ｄ変換値を収集すべきデータ収集期間となっている。
【００４０】
また、マイコン３３のＤＭＡチャンネルには、連続して転送可能なデータの数に上限値が定められており、本実施形態において、その上限値は２５５となっている。
具体的に説明すると、ＤＭＡチャンネル（ｃｈＡ０，ｃｈＡ１）のそれぞれには、起動してからメモリ４１に転送したデータの数をカウントするカウンタ（以下、ＤＭＡカウンタという）が設けられている。そして、例えばｃｈＡ０の方を例に挙げると、そのｃｈＡ０のＤＭＡカウンタは、ｃｈＡ０が起動して１つ目のデータが転送されると、値が初期値の０となり、以後は、データが１つ転送される毎に、値が１つずつカウントアップされる。そして、そのＤＭＡカウンタの値（以下、ＤＭＡカウンタ値という）が２５４になると（即ち、転送したデータ数が２５５になると）、ｃｈＡ０のデータ転送動作が自動的に停止するようになっている（図１０参照）。
【００４１】
そこで、本実施形態では、図３に示すように、ＮＥ信号が立ち上がる毎に起動されるＮＥ割り込み処理のうち、ＢＴＤＣ５０°ＣＡのタイミングで起動されるＮＥ割り込み処理（後述する図４のＡＤ起動処理）により、Ａ／Ｄ変換器３９とフィルタ部５０，５１を起動すると共に、まず、ｃｈＡ０を起動する。
【００４２】
そして、その後、ＡＴＤＣ５０°ＣＡのタイミングが到来するまでは、ｃｈＡ０がメモリ４１に転送したデータ数が２５５個に達する前に、ｃｈＡ１を起動し、そのｃｈＡ１がメモリ４１に転送したデータ数が２５５個に到達する前に、ｃｈＡ０を起動する、といった制御を繰り返すことにより、２つのＤＭＡチャンネルのうちの一方が動作している単独動作期間と、２つのＤＭＡチャンネルの両方が同時に動作している重複動作期間とが生じるようにする。
【００４３】
そして更に、このように順次起動した各ＤＭＡチャンネル（ｃｈＡ０又はｃｈＡ１）によって転送される各データ列は、メモリ４１の異なる記憶領域に記憶されるようにしている。具体的には、データ収集期間の開始タイミングからｎ番目（ｎは１以上の整数）に起動されたＤＭＡチャンネルによって転送されるデータ列をｎ番目のデータ列と称することにすると、図３に示すように、メモリ４１には、１番目のデータ列［１］の次に２番目のデータ列［２］が記憶され、その次に３番目のデータ列［３］が記憶される、といった具合に、各データ列がメモリ４１におけるＣＰＳデータ領域の連続したアドレスに順次記憶されるようにしている。尚、ＣＰＳデータ領域とは、メモリ４１においてＣＰＳ信号のＡ／Ｄ変換値を格納するためのデータ領域である。
【００４４】
このように本実施形態では、２つのＤＭＡチャンネルを、動作期間が一部重複するように順次起動することで、データ収集期間中にフィルタ部５０，５１から出力される一定時間毎のデータをメモリ４１に漏れなく（シームレスに）記憶させる。
【００４５】
そして、データ収集期間の終了タイミング（ＡＴＤＣ５０°ＣＡのタイミング）が到来すると、そのタイミングで起動されるＮＥ割り込みの処理（後述する図７のＡＤ停止処理）により、Ａ／Ｄ変換器３９、フィルタ部５０，５１、及びＤＭＡチャンネルの各動作を停止させる。
【００４６】
尚、データ収集期間の開始タイミングからＤＭＡチャンネルの２回目以降の起動は、タイマ割り込み処理（後述する図５の、のりしろ処理）によって行うようになっており、図３において「ＤＭＡ切替タイマ」と記載している時間は、そのタイマ割り込み処理の起動間隔である。
【００４７】
また、２つのＤＭＡチャンネルを、動作期間を重複させながら順次起動すると、メモリ４１に転送されるデータの中には、上記重複動作期間中において２つのＤＭＡチャンネルにより転送された互いに同じデータ（重複しているデータであり、本明細書では「のりしろ部」或いは単に「のりしろ」と称している）が存在することとなるため、その重複しているデータのうちの一方である重複余剰データを削除する必要が生じる。
【００４８】
そこで、本実施形態では、ＤＭＡチャンネルを起動するタイマ割り込み処理（後述する図５の、のりしろ処理）によって、重複余剰データを後で特定するための処理も行うと共に、データ収集期間が終了した後で、後述する図９の、のりしろ削除処理を実行することで、メモリ４１に記憶されたデータの中から重複余剰データを探し出して削除するようになっている。
【００４９】
また更に、本実施形態では、重複余剰データが削除された後のメモリ４１内のデータから、後述する図１２の角度再配置処理により、１°ＣＡ毎のデータを求めてメモリ４３に記憶するようになっている。そして、１°ＣＡ毎のデータを求めるための準備として、ＢＴＤＣ５０°ＣＡのタイミングで起動されるＮＥ割り込み処理（後述する図４のＡＤ起動処理）により、Ａ／Ｄ変換器３９を起動した時刻（換言すれば、Ａ／Ｄ変換器３９及びフィルタ部５０，５１からｃｈＡ０及びｃｈＡ１へデータが最初に出力された時刻）を記憶し、更に、データ収集期間中においてＮＥ信号に立ち上がりエッジが発生した各時刻を、ＮＥ割り込み処理（後述する図６のタイムスタンプ処理）により、その各時刻がどのクランク角度での時刻であるかを識別可能に順次記憶するようになっている。但し、本実施形態では、ＢＴＤＣ４０°ＣＡからＡＴＤＣ４０°ＣＡまでの８０°ＣＡ分の期間における１°ＣＡ毎のデータをエンジンの制御（着火時期の検出）に用いるため、ＮＥ信号に立ち上がりエッジが発生した各時刻としては、ＢＴＤＣ４０°ＣＡからＡＴＤＣ４０°ＣＡまでの９回の時刻を記憶する。また、本実施形態では、マイコン３３におけるフリーランタイマの値を時刻として扱っている。
【００５０】
次に図４は、マイコン３３のＣＰＵ３５がＢＴＤＣ５０°ＣＡのタイミングで実行するＡＤ起動処理を表すフローチャートである。尚、このＡＤ起動処理は、前述したようにＮＥ割り込み処理である。
【００５１】
図４に示すように、ＡＤ起動処理の実行が開始されると、まずＳ１１０にて、フィルタ部５０，５１のフィルタ係数を両方共に同じ値に設定する。
次にＳ１２０にて、ＤＭＡアドレスを設定する。尚、ＤＭＡチャンネル（ｃｈＡ０，ｃｈＡ１）は、メモリ４１のアドレスのうち、ＣＰＵ３５によって設定されたＤＭＡアドレスから順にデータを転送するようになっており、このＳ１２０では、後のＳ１４０で起動するｃｈＡ０についてのＤＭＡアドレスを設定する。また、ここで設定するＤＭＡアドレスは、メモリ４１におけるＣＰＳデータ領域の先頭アドレスである。
【００５２】
そして、続くＳ１３０にて、ａｄｔｉｍｅという変数に、現在のフリーランタイマ値を代入し、次のＳ１４０にて、Ａ／Ｄ変換器３９とフィルタ部５０，５１を起動すると共に、ＤＭＡチャンネルのうちのｃｈＡ０を起動する。このため、Ｓ１３０でａｄｔｉｍｅに記憶されるフリーランタイマ値は、Ａ／Ｄ変換器３９を起動した時刻（ＡＤ開始タイミング）を示すこととなる。
【００５３】
次にＳ１５０にて、ＤＭＡ切替タイマにタイマ時間をセットし、続くＳ１６０にて、ＤＭＡ切替回数を０にクリアする。そして、その後、当該ＡＤ起動処理を終了する。
尚、ＤＭＡ切替タイマは、今回起動したＤＭＡチャンネルとは別のＤＭＡチャンネルを起動するまでの時間を計時するタイマであり、そのＤＭＡ切替タイマにセットされたタイマ時間が経過すると、タイマ割り込み処理としての図５の、のりしろ処理が起動される。
【００５４】
また、そのタイマ時間は、先に起動したＤＭＡチャンネルが２５５個のデータを転送し終わる前に別のＤＭＡチャンネルが起動されるような時間に設定されている。本実施形態では、例えば、先に起動したＤＭＡチャンネルが２５１個のデータを転送し終えた頃に別のＤＭＡチャンネルが起動されるように、タイマ時間は６７０２μｓ（＝２６．７μｓ×２５１）に設定されている。
【００５５】
一方、ＤＭＡ切替回数は、ＤＭＡチャンネルを何回切り替えたか（別のＤＭＡチャンネルを何回起動したか）の回数である。そして、このＤＭＡ切替回数は、全てのデータ収集後にメモリ４１から前述の重複余剰データを探し出して削除するために、後述する図９の、のりしろ削除処理で用いられる。
【００５６】
次に図５は、マイコン３３のＣＰＵ３５が実行するのりしろ処理を表すフローチャートである。尚、のりしろ処理は、前述したようにタイマ割込み処理である。
図５に示すように、のりしろ処理の実行が開始されると、まずＳ２１０にて、現在動作中のＤＭＡチャンネルとは別のＤＭＡチャンネルを起動すると共に、その今回起動するＤＭＡチャンネルについてのＤＭＡアドレスを設定する。具体的には、メモリ４１におけるＣＰＳデータ領域のアドレスのうち、現在動作中のＤＭＡチャンネルが２５５個目のデータを転送する予定のアドレスの次のアドレスを、ＤＭＡアドレスとして設定する。
【００５７】
そして、次のＳ２２０にて、カウンタ値配列［］という変数に、現在動作中のＤＭＡチャンネルのＤＭＡカウンタ値を代入する。
尚、カウンタ値配列［］における［］内には、図８（Ｂ）に示すように、データ収集期間の開始時から当該のりしろ処理が最初に実行された場合には“０”が代入され、当該のりしろ処理が２回目に実行された場合には“１”が代入されるといった具合に、当該のりしろ処理が実行される毎に０から１ずつ増加する数字が代入される。このため、カウンタ値配列［］における［］内の数字により、そのカウンタ値配列［］に代入されたＤＭＡカウンタ値がデータ収集期間において何番目に起動されたＤＭＡチャンネルによりメモリ４１に転送されたデータ列に関するものであるかを特定することができる。そして、例えば、カウンタ値配列［０］に代入された値は、最初に起動されたｃｈＡ０によって転送されたデータ列（１番目のデータ列）において、「その値＋１」番目のデータを示すこととなり、また例えば、カウンタ値配列［１］に代入された値は、２番目に起動されたｃｈＡ１によって転送されたデータ列（２番目のデータ列）において、「その値＋１」番目のデータを示すこととなる。そして、こうしたＳ２２０の処理は、各ＤＭＡチャンネルによってメモリ４１に転送されたデータ列の各々において、重複余剰データがどこから始まるのかを記憶するために行っている。
【００５８】
次に、Ｓ２３０にて、ＤＭＡ切替タイマにタイマ時間をセットする。このため、そのタイマ時間が経過すると、再び当該のりしろ処理が起動されることとなる。
そして、続くＳ２４０にて、ＤＭＡ切替回数をインクリメント（＋１）し、その後、当該のりしろ処理を終了する。
【００５９】
次に図６は、マイコン３３のＣＰＵ３５が実行するタイムスタンプ処理を表すフローチャートである。尚、このタイムスタンプ処理は、ＢＴＤＣ４０°ＣＡからＡＴＤＣ４０°ＣＡまでの１０°ＣＡ毎のＮＥ割り込み処理である。
【００６０】
図６に示すように、タイムスタンプ処理の実行が開始されると、Ｓ３１０にて、前述したインプットキャプチャレジスタから、今回のＮＥ信号の立ち上がり時刻に該当するフリーランタイマ値を読み出し、そのフリーランタイマ値を、ｎｅｔｉｍｅ［］という変数に代入する。そして、その後、当該タイムスタンプ処理を終了する。
【００６１】
尚、図８（Ａ）に示すように、ｎｅｔｉｍｅ［］は、ＮＥ割り込み時刻配列を成すものであり、そのｎｅｔｉｍｅ［］における［］内には、ＢＴＤＣ４０°ＣＡ時のタイムスタンプ処理では“０”が代入され、次のＢＴＤＣ３０°ＣＡ時のタイムスタンプ処理では“１”が代入されるといった具合に、当該タイムスタンプ処理が実行される毎に０から１ずつ増加する数字が代入される（図１３参照）。このため、ｎｅｔｉｍｅ［］における［］内の数字により、そのｎｅｔｉｍｅ［］に代入された値がどのクランク角度での時刻であるかを識別することができる。
【００６２】
次に図７は、マイコン３３のＣＰＵ３５がＡＴＤＣ５０°ＣＡのタイミングで実行するＡＤ停止処理を表すフローチャートである。尚、このＡＤ停止処理は、前述したようにＮＥ割り込み処理である。
【００６３】
図７に示すように、ＡＤ停止処理の実行が開始されると、まずＳ４１０にて、Ａ／Ｄ変換器３９及びフィルタ部５０，５１の動作を停止させると共に、その時点で動作中のＤＭＡチャンネル（ｃｈＡ０又はｃｈＡ１）の動作（即ちＤＭＡ転送）も停止させる。
【００６４】
次にＳ４２０にて、カウンタ値配列［Ｎ］に、今回停止させたＤＭＡチャンネルのＤＭＡカウンタ値を代入する。尚、この時のカウンタ値配列［Ｎ］における［］内のＮは、前回実行されたのりしろ処理のＳ２２０で［］内に代入された値の次の値（＋１した値）であり、図８（Ｂ）に示すように、最終的なＤＭＡ切替回数と同じ値である。そして、このＳ４２０の処理により、最後に起動されたＤＭＡチャンネルによってメモリ４１に転送されたデータ列（最後のデータ列）のデータ数が記憶されることとなる。
【００６５】
そして、上記Ｓ４２０の処理を行った後、当該ＡＤ停止処理を終了する。
次に図９（Ａ）は、マイコン３３のＣＰＵ３５が実行するのりしろ削除処理を表すフローチャートであり、図９（Ｂ）は、のりしろ削除処理内で実行されるのりしろ部分判定処理を表すフローチャートである。尚、のりしろ削除処理は、ＡＴＤＣ５０°ＣＡのタイミングが過ぎた後に、割り込み処理ではないベース処理として実行される。
【００６６】
まず、前述した図４，５，７の処理により、順次起動された各ＤＭＡチャンネルによってメモリ４１へ転送される各データ列は、そのメモリ４１におけるＣＰＳデータ領域の先頭アドレスから順に記憶されるが、ここでは、そのＣＰＳデータ領域の各データを、図８（Ｃ）に示すように、データ配列［］という変数で表す。そして、データ配列［］における［］内の数字は、０を１番目とした場合の、そのデータの順番及び格納位置を示すポインタ値である。このため、ＡＴＤＣ５０°ＣＡのタイミングで図７のＡＤ停止処理が実行された時点において、メモリ４１のＣＰＳデータ領域には、それの先頭から、データ配列［０］〜データ配列［ｍ］までの合計（ｍ＋１）個のデータが格納されていることとなる。尚、ｍ＝「カウンタ値配列［Ｎ］＋２５５×Ｎ」であり、この式におけるＮは、図５のＳ２４０で計数された最終的なＤＭＡ切替回数である。また、本実施形態において、メモリ４１のＣＰＳデータ領域としては、２５５個のデータからなるデータ列を「ＤＭＡ切替回数＋１」個格納する分の領域が確保されるようになっており、そのＣＰＳデータ領域において、上記データ配列［ｍ］より後の領域は、データが入っておらず初期値となっている。
【００６７】
ここで、図９（Ａ）に示すように、のりしろ処理の実行が開始されると、まずＳ５１０にて、ｉという変数に、上記ｍの値（即ち、カウンタ値配列［Ｎ］＋２５５×Ｎ）をセットし、ｊという変数に、データ配列最大個数をセットする。
【００６８】
尚、本のりしろ削除処理において、Ｎの値は、後述のＳ５７０でデクリメントされるが、この時点でのＮの値は、図５のＳ２４０で計数された最終的なＤＭＡ切替回数である。そして、ｊにセットされるデータ配列最大個数は、ＣＰＳデータ領域の最後尾のポインタ値であり、「２５５×（Ｎ＋１）−１」である。
【００６９】
次にＳ５２０にて、終了フラグがオンされているか否かを判定し、終了フラグがオンされていなければ、Ｓ５３０に進む。尚、終了フラグは後述のＳ５８０でオンされる。
Ｓ５３０では、データ配列［ｊ］にデータ配列［ｉ］の値をコピーし、その後、ｉとｊをそれぞれデクリメント（−１）する。
【００７０】
次にＳ５４０にて、「ｉ＜２５５×Ｎ」か否かを判定し、「ｉ＜２５５×Ｎ」でなければ、Ｓ５２０へ戻る。
一方、上記Ｓ５４０にて、「ｉ＜２５５×Ｎ」であると判定した場合には、Ｓ５５０に進み、「Ｎ＞０」であるか否かを判定する。そして、「Ｎ＞０」ならば、Ｓ５６０に進んで、図９（Ｂ）に示すのりしろ部分判定処理を実行し、そののりしろ部分判定処理が終了したならば、Ｓ５７０にて、Ｎをデクリメントする。そして、その後、Ｓ５２０に戻る。
【００７１】
尚、後述するように、のりしろ部分判定処理は、戻り値としてｉの値を返すようになっている。このため、のりしろ部分判定処理が終了してＳ５７０からＳ５２０へ戻る場合、ｉの値は、のりしろ部分判定処理からの戻り値に設定される。
【００７２】
また、上記Ｓ５５０にて、「Ｎ＞０」ではないと判定した場合には、Ｓ５８０に移行して、終了フラグをオンし、その後、Ｓ５２０に戻る。すると、そのＳ５２０で終了フラグがオンされていると判定されて、当該のりしろ処理が終了する。
【００７３】
次に、図９（Ｂ）に示すように、図９（Ａ）のＳ５６０で実行されるのりしろ部分判定処理では、まずＳ６１０にて、ｋとｏとの各変数に「カウンタ値配列［Ｎ−１］＋２５５×（Ｎ−１）」をセットする。尚、このＳ６１０でｋとｏにセットされる値は、Ｎ番目のデータ列におけるのりしろ部分（即ち、「Ｎ＋１」番目のデータ列と重複しているデータ部分）の先頭データと思われるデータ配列［］のポインタ値（［］内の値）である。
【００７４】
そして、次のＳ６２０にて、ｌという変数に「２５５×Ｎ」をセットする。つまり、ｌには、「Ｎ＋１」番目のデータ列の先頭であるデータ配列［］のポインタ値をセットする。
【００７５】
次に、Ｓ６３０にて、「ｋ＝２５５×Ｎ」であるか否かを判定し、「ｋ＝２５５×Ｎ」でなければ、次のＳ６４０にて、「データ配列［ｋ］＝データ配列［ｌ］」であるか否かを判定する。そして、「データ配列［ｋ］＝データ配列［ｌ］」であれば、次のＳ６５０にて、ｋとｌをそれぞれインクリメントし、その後、Ｓ６３０へ戻る。
【００７６】
また、上記Ｓ６４０にて、「データ配列［ｋ］＝データ配列［ｌ］」ではないと判定した場合には、Ｓ６６０に移行し、ｌに「２５５×Ｎ」を再セットすると共に、ｏをインクリメントし、更にそのインクリメント後のｏの値をｋにセットする。そして、その後、Ｓ６３０へ戻る。
【００７７】
一方、Ｓ６３０にて、「ｋ＝２５５×Ｎ」であると判定した場合には、Ｓ６７０に移行して、「ｌ＝ｏ」であるか否かを判定し、「ｌ＝ｏ」でなければ、「ｏ−１」の値をｉの戻り値として設定し、当該のりしろ部分判定処理を終了する。
【００７８】
また、上記Ｓ６７０にて、「ｌ＝ｏ」であると判定した場合には、Ｎ番目のデータ列と「Ｎ＋１」番目のデータ列とで一致している（重複している）データが無かったということであり、データ抜け（データの取りこぼし）が発生したと考えられるため、この場合には、Ｓ６８０に進んで、異常フラグをオンする。そして、その後、当該のりしろ部分判定処理を終了する。尚、異常フラグがオンされた場合には、のりしろ削除処理が中止されると共に、例えば、メモリ４１のＣＰＳデータ領域に記憶されたデータが破棄されて、エンジン３の制御に用いられなくなる。
【００７９】
次に、図９の処理の作用について、図１０及び図１１の具体例を挙げて説明する。
尚、ここでは、例えば図１０に示すように、ＤＭＡチャンネルの切り替えが２回行われて（即ち、ＤＭＡ切替回数＝２で）、メモリ４１のＣＰＳデータ領域に１番目から３番目までのデータ列が記憶されると共に、図５のＳ２２０と図７のＳ４２０により、ＤＭＡカウンタ値として、１番目のデータ列に関するカウンタ値配列［０］に２５１が、２番目のデータ列に関するカウンタ値配列［１］に２５２が、３番目のデータ列に関するカウンタ値配列［２］に１３６が、それぞれ代入された場合を例に挙げて説明する。
【００８０】
この場合、のりしろ削除処理の実行が開始された時点では、Ｎ＝ＤＭＡ切替回数＝２であるため、Ｓ５１０において、ｉには６４６（＝「カウンタ配列［２］＋２５５×２」＝１３６＋２５５×２）がセットされる。つまり、Ｓ５１０でｉにセットされる値は、ＤＭＡチャンネルによってメモリ４１のＣＰＳデータ領域に記憶された最後のデータ配列［］のポインタ値である。また、Ｓ５１０において、ｊには、ｉよりも大きい７６４（＝２５５×３−１）がセットされる。このため、この時点で、ＣＰＳデータ領域におけるデータ配列［６４７］〜データ配列［７６４］には有効なデータが入っていない。
【００８１】
次に、この時点で終了フラグはオフであるため（Ｓ５２０：ＮＯ）、Ｓ５３０で、データ配列［ｊ］にデータ配列［ｉ］の値がコピーされると共に、ｉとｊがそれぞれデクリメントされる。そして、ｉの値が「５１０＝２５５×２」以上である間は（Ｓ５４０：ＮＯ）、Ｓ５３０の処理が繰り返されることとなる。
【００８２】
このようにＳ５３０の処理が繰り返されることにより、図１０の下から１，２段目に示すように、データ配列［６４６］の値がデータ配列［７６４］にコピーされ、データ配列［６４５］の値がデータ配列［７６３］にコピーされるといった具合に、ＤＭＡチャンネルによってＣＰＳデータ領域に記憶された各データが、最後のデータから順に、ＣＰＳデータ領域の最後尾（この例では、データ配列［７６４］の位置）から前方へ向けて後詰めされていくこととなる。
【００８３】
そして、デクリメント後のｉが５０９でｊが６２７になり、Ｓ５４０でＹＥＳと判定されると（即ち、３番目のデータ列を成すデータ配列［６４６］〜データ配列［５１０］の１３７個の各データが、データ配列［７６４］〜データ配列［６２８］にコピーされると）、この時点では「Ｎ＞０」であるため、Ｓ５５０でＹＥＳと判定され、Ｓ５６０で図９（Ｂ）ののりしろ部分判定処理が実行される。
【００８４】
この場合、のりしろ部分判定処理では、まずＳ６１０にて、ｋとｏに５０７（＝カウンタ値配列［１］＋２５５×（２−１）＝２５２＋２５５×１）がセットされる。この５０７という数字は、図１０に示すように、２番目のデータ列において、３番目のデータ列と重複しているのりしろ部分の先頭データと思われるデータ配列［］のポインタ値である。また、データ配列［５０７］のデータは、２番目のデータ列においてカウンタ値配列［１］が示すデータである。
【００８５】
次に、Ｓ６２０にて、ｌには５１０（＝２５５×２）がセットされる。この５１０という数字は、図１０に示すように、３番目のデータ列の先頭に該当するデータ配列［］のポインタ値であり、換言すれば、データ配列［５１０］の値は、３番目のデータ列における先頭データである。
【００８６】
そして、Ｓ６３０〜Ｓ６６０の処理により、データ配列［５０７］〜データ配列［５０９］の各値と、データ配列［５１０］以降の各値とが、一致しているか否かの確認が行われる。
【００８７】
ここで、図１０は、データ配列［５０７］〜データ配列［５０９］の各値と、データ配列［５１０］〜データ配列［５１２］の各値とが、それぞれ一致していた場合を示しており、その場合について具体的に説明する。
【００８８】
まず、最初はｋ＝５０７であるため、Ｓ６３０でＮＯと判定され、Ｓ６４０にて、データ配列［５０７］の値と、３番目のデータ列における先頭データであるデータ配列［５１０］の値とが一致しているか判定される。そして、データ配列［５０７］＝データ配列［５１０］であれば（Ｓ６４０：ＹＥＳ）、Ｓ６５０でｋとｌがインクリメントされてＳ６３０に戻るが、まだｋ＝５０８であるため、再びＳ６３０でＮＯと判定され、Ｓ６４０にて、データ配列［５０８］の値と、３番目のデータ列における２番目のデータであるデータ配列［５１１］の値とが一致しているか判定される。そして、両値が一致していれば（Ｓ６４０：ＹＥＳ）、再びＳ６５０でｋとｌがインクリメントされてＳ６３０に戻るが、まだｋ＝５０９であるため、再びＳ６３０でＮＯと判定され、Ｓ６４０にて、データ配列［５０９］の値と、３番目のデータ列における３番目のデータであるデータ配列［５１２］の値とが一致しているか判定される。そして、両値が一致していれば（Ｓ６４０：ＹＥＳ）、再びＳ６５０でｋとｌがインクリメントされてＳ６３０に戻るが、その時点でｋ＝５１０であるため、Ｓ６３０でＹＥＳと判定されて、Ｓ６７０へ進むこととなる。
【００８９】
そして、この時点でｌ＝５１３、ｏ＝５０７であるため、Ｓ６７０でＮＯと判定されて、のりしろ部分判定処理が終了する。また、このとき、５０６（＝ｏ−１）がｉの戻り値となる。
【００９０】
このため、のりしろ処理のＳ５６０からＳ５７０に進んで、Ｎがデクリメントされて１（＝２−１）となり、再びＳ５２０以降の処理が行われる場合には、ｉ＝５０６、ｊ＝６２７となっている。
【００９１】
そして、再びＳ５３０及びＳ５４０の処理が繰り返されることにより、図１０の下から１，２段目に示すように、２番目のデータ列のうち、３番目のデータ列と重複していたのりしろ部分（データ配列［５０７］〜データ配列［５０９］の各データであり、重複余剰データに相当）以外のデータ配列［５０６］〜データ配列［２５５］の各データが、データ配列［６２７］〜データ配列［３７６］にコピーされることとなる。換言すれば、ＤＭＡ転送されたデータ配列［５０７］〜データ配列［５０９］の各データがＣＰＳデータ領域から削除される。
【００９２】
そして、Ｓ５３０でデクリメントされた後のｉが２５４でｊが３７５になり、Ｓ５４０でＹＥＳと判定されると、この時点では未だ「Ｎ＞０」であるため、Ｓ５５０でＹＥＳと判定され、再びＳ５６０で図９（Ｂ）ののりしろ部分判定処理が実行される。
【００９３】
この２回目ののりしろ部分判定処理では、Ｎ＝１となっているため、まずＳ６１０にて、ｋとｏに２５１（＝カウンタ値配列［０］＋２５５×（１−１）＝２５１＋０）がセットされる。そして、この２５１という数字は、図１０に示すように、１番目のデータ列において、２番目のデータ列と重複しているのりしろ部分の先頭データと思われるデータ配列［］のポインタ値である。また、データ配列［２５１］のデータは、１番目のデータ列においてカウンタ値配列［０］が示すデータである。
【００９４】
次に、Ｓ６２０にて、ｌには２５５（＝２５５×１）がセットされる。この２５５という数字は、図１０に示すように、２番目のデータ列の先頭に該当するデータ配列［］のポインタ値であり、換言すれば、データ配列［２５５］の値は、２番目のデータ列における先頭データである。
【００９５】
そして、Ｓ６３０〜Ｓ６６０の処理により、データ配列［２５１］〜データ配列［２５４］の各値と、データ配列［２５５］以降の各値とが、一致しているか否かの確認が行われる。
【００９６】
ここで、図１０は、データ配列［２５１］〜データ配列［２５４］の各値と、データ配列［２５５］〜データ配列［２５８］の各値とが、それぞれ一致していた場合を示しており、その場合について具体的に説明する。
【００９７】
まず、最初はｋ＝２５１であるため、Ｓ６３０でＮＯと判定され、Ｓ６４０にて、データ配列［２５１］の値とデータ配列［２５５］の値とが一致しているか判定される。そして、データ配列［２５１］＝データ配列［２５５］であれば（Ｓ６４０：ＹＥＳ）、Ｓ６５０でｋとｌがインクリメントされてＳ６３０に戻る。そして、その後、Ｓ６３０でＹＥＳと判定されるまで、Ｓ６４０及びＳ６５０の処理が繰り返されることにより、データ配列［２５１］〜データ配列［２５４］の各値と、データ配列［２５５］〜データ配列［２５８］の各値とが、一致していることが確認される。
【００９８】
そして、Ｓ６３０でＹＥＳと判定されて、Ｓ６７０へ進むと、この時点でｌ＝２５９、ｏ＝２５１であるため、Ｓ６７０でＮＯと判定されて、のりしろ部分判定処理が終了する。また、このとき、２５０（＝ｏ−１）がｉの戻り値となる。
【００９９】
このため、のりしろ処理のＳ５６０からＳ５７０に進んで、Ｎがデクリメントされて０（＝１−１）となり、再びＳ５２０以降の処理を行う場合には、ｉ＝２５０、ｊ＝３７５となっている。
【０１００】
そして、再びＳ５３０及びＳ５４０の処理が繰り返されることにより、図１０の下から１，２段目に示すように、１番目のデータ列のうち、２番目のデータ列と重複していたのりしろ部分（データ配列［２５１］〜データ配列［２５４］の各データであり、重複余剰データに相当）以外のデータ配列［２５０］〜データ配列［０］の各データが、データ配列［３７５］〜データ配列［１２５］にコピーされることとなる。換言すれば、ＤＭＡ転送されたデータ配列［２５１］〜データ配列［２５４］の各データがＣＰＳデータ領域から削除される。
【０１０１】
そして、Ｓ５３０でデクリメントされた後のｉが−１になりＳ５４０でＹＥＳと判定されると、この時点でＮ＝０はであるため、Ｓ５５０でＮＯと判定され、Ｓ５８０で終了フラグがオンされて、その後、当該のりしろ処理が終了することとなる。
【０１０２】
また、例えば図１１に示すように、２番目のデータ列において、３番目のデータ列と重複しているのりしろ部分の先頭データと思われるデータ配列［５０７］の値（即ち、２番目のデータ列においてカウンタ値配列［１］が示すデータ）と、３番目のデータ列の先頭に該当するデータ配列［５１０］の値とが実際には一致しておらず、データ配列［５０７］よりも後のデータ配列［５０８］とデータ配列［５０９］の各値と、データ配列［５１０］とデータ配列［５１１］の各値とが、それぞれ一致していた場合には、２番目のデータ列のうち、データ配列［５０７］〜データ配列［２５５］の各データが、データ配列［６２７］〜データ配列［３７５］にコピーされることとなる。
【０１０３】
つまり、この場合、Ｎ＝２の状態で図９（Ｂ）ののりしろ部分判定処理が実行された際には、まず１回目のＳ６４０にて、データ配列［５０７］の値とデータ配列［５１０］の値とが不一致であると判定される（Ｓ６４０：ＮＯ）。このため、Ｓ６６０にて、ｌが５１０（＝２５５×２）に再設定されると共に、ｏがインクリメントされて、そのｏとｋの値が５０８になる。
【０１０４】
そして、Ｓ６３０に戻るが、ｋ＝５０８であるため、Ｓ６３０でＮＯと判定され、Ｓ６４０にて、データ配列［５０８］の値とデータ配列［５１０］の値とが一致しているか判定される。そして、両値が一致していれば（Ｓ６４０：ＹＥＳ）、Ｓ６５０でｋとｌがインクリメントされてＳ６３０に戻り、Ｓ６４０にて、データ配列［５０９］の値とデータ配列［５１１］の値とが一致しているか判定される。そして、両値が一致していれば（Ｓ６４０：ＹＥＳ）、再びＳ６５０でｋとｌがインクリメントされてＳ６３０に戻るが、その時点でｋ＝５１０であるため、Ｓ６３０でＹＥＳと判定されて、Ｓ６７０へ進むこととなる。
【０１０５】
そして、この時点でｌ＝５１２、ｏ＝５０８であるため、Ｓ６７０でＮＯと判定されて、のりしろ部分判定処理が終了する。また、このとき、５０７（＝ｏ−１）がｉの戻り値となる。
【０１０６】
このため、のりしろ処理のＳ５６０からＳ５７０に進んで、Ｎがデクリメントされて１（＝２−１）となり、再びＳ５２０以降の処理が行われる場合には、ｉ＝５０７、ｊ＝６２７となっている。
【０１０７】
そして、再びＳ５３０及びＳ５４０の処理が繰り返されることにより、図１１の下から１，２段目に示すように、２番目のデータ列のうち、３番目のデータ列と本当に重複していたのりしろ部分（データ配列［５０８］及びデータ配列［５０９］の各データ）以外のデータ配列［５０７］〜データ配列［２５５］の各データが、データ配列［６２７］〜データ配列［３７５］にコピーされることとなる。
【０１０８】
尚、図１１の場合には、図１０の場合と比較すると、上記データ配列［５０７］のデータが削除されず、のりしろ部分を削除した後のデータ数が１つ多くなるため、１番目のデータ列のうち、２番目のデータ列と重複していたのりしろ部分以外のデータ配列［２５０］〜データ配列［０］の各データは、データ配列［３７４］〜データ配列［１２４］にコピーされることとなる。
【０１０９】
つまり、ＤＭＡ切替回数をＮとし、１番目からＮ番目の各データ列をｎ番目のデータ列と言うことにすると、図９（Ｂ）ののりしろ部分判定処理では、ｎ番目のデータ列において該ｎ番目のデータ列に関するカウンタ値配列［ｎ−１］が示すデータ以降のデータと、「ｎ＋１」番目のデータ列における先頭以降のデータとを比較し、そのｎ番目のデータ列におけるカウンタ値配列［ｎ−１］が示すデータ以降のデータのうちで、「ｎ＋１」番目のデータ列における先頭以降のデータと値が続けて一致しているデータを、重複余剰データとして探し、その重複余剰データよりも１つ前のデータのポインタ値を、ｉの戻り値として返すようになっている。
【０１１０】
そして、図９（Ａ）ののりしろ削除処理では、「Ｎ＋１」番目の（最後の）データ列については、全てのデータをメモリ４１のＣＰＳデータ領域に後詰めするが、１番目からＮ番目の各データ列については、のりしろ部分判定処理からのｉの戻り値により示されるデータよりも後のデータは削除して、そのデータから先頭までのデータをＣＰＳデータ記憶領域に後詰めするようにしており、これにより、ＤＭＡチャンネルによってメモリ４１のＣＰＳデータ領域に順次記憶されたデータ列の中から重複余剰データを削除したデータ列（以下、のりしろ削除後のデータ列ともいう）をＣＰＳデータ領域に記憶し直すようにしている。
【０１１１】
一方、例えば、図１０の例において、２番目のデータ列におけるデータ配列［５０７］〜データ配列［５０９］の各値と、３番目のデータ列におけるデータ配列［５１０］〜データ配列［５１２］の各値とが、全て一致していなかった場合には、Ｎ＝２の状態で図９（Ｂ）ののりしろ部分判定処理が実行された際に、Ｓ６４０で常にＮＯと判定されることとなり、Ｓ６７０では「ｌ＝ｏ」と判定されることとなる。このため、Ｓ６８０で異常フラグがオンされる。
【０１１２】
つまり、のりしろ部分判定処理では、ｎ番目のデータ列におけるカウンタ値配列［ｎ−１］が示すデータ以降のデータのうちで、「ｎ＋１」番目のデータ列における先頭以降のデータと値が一致しているものが無ければ、何等かの原因でデータ抜け（データの取りこぼし）が発生した可能性があるため、異常フラグをオンして、メモリ４１のＣＰＳデータ領域に記憶されたデータがエンジン３の制御に用いられないようにしている。
【０１１３】
次に図１２（Ａ）は、マイコン３３のＣＰＵ３５が実行する角度再配置処理を表すフローチャートである。尚、この角度再配置処理は、前述したのりしろ処理の後に実行される。
【０１１４】
まず、図１２（Ｂ）に示すように、メモリ４１のＣＰＳデータ領域には、のりしろ削除後のデータ列として、データ配列［Ｍ］〜データ配列［Ｅ］のデータ列が記憶されているものとする。尚、Ｍは、のりしろ削除後のデータ列における先頭データのポインタ値であり、例えば図１１の例では「１２４」に該当する。また、Ｅの値は、のりしろ削除後のデータ列における最終データのポインタ値であり、図１１の例では「７６４」に該当する。
【０１１５】
そして、角度再配置処理は、メモリ４１に記憶されているのりしろ削除後のデータ列から、ＢＴＤＣ４０°ＣＡ〜ＡＴＤＣ４０°ＣＡまでの１°ＣＡ毎の各データを求め、図１２（Ｃ）に示すように、その１°ＣＡ毎の各データを角度同期配列［０］，角度同期配列［１］，角度同期配列［２］，…としてメモリ４３に順次記憶することで、１°ＣＡ毎のデータ列を生成するための処理である。
【０１１６】
図１２（Ａ）に示すように、角度再配置処理の実行が開始されると、まずＳ７１０及びＳ７２０にて、ｋとｉとの各変数に、初期値としての０をセットする。尚、この角度再配置処理において、ｋは、角度同期配列［］のポインタ値（［］内の値）として用いられ、ｉは、ＢＴＤＣ４０°ＣＡからＡＴＤＣ４０°ＣＡまでのＮＥ割り込み時刻配列（ｎｅｔｉｍｅ［］）のポインタ値として用いられる変数である。
【０１１７】
次にＳ７３０にて、データ配列のポインタ値に用いるｄａｔａｐｏｓに、「（ｎｅｔｉｍｅ［ｉ］−ａｄｔｉｍｅ）／ＡＤ周期」の値をセットする。つまり、１０°ＣＡ毎のＮＥ割り込み時刻（ｎｅｔｉｍｅ［ｉ］）から、Ａ／Ｄ変換器３９の起動時刻（ａｄｔｉｍｅ）を引いた値を、ＡＤ周期で割ることにより、そのＮＥ割込み時刻（ｎｅｔｉｍｅ［ｉ］）でのデータ配列が、先頭のデータ配列［Ｍ］から数えて何番目であるかを示す値を求め、その値をｄａｔａｐｏｓにセットする。尚、ＡＤ周期とは、ＣＰＳ信号のＡ／Ｄ変換間隔（サンプリング周期）である。また、桁落ちを無くすために、ｄａｔａｐｏｓの値は小数値を持つ。
【０１１８】
次にＳ７４０にて、１ｃａｔｉｍｅに、「（ｎｅｔｉｍｅ［ｉ＋１］−ｎｅｔｉｍｅ［ｉ］）／１０」の値をセットする。つまり、ｎｅｔｉｍｅ［ｉ］からｎｅｔｉｍｅ［ｉ＋１］までの１０°ＣＡ分の時間であるＮＥ割り込み間隔を１０で割ることにり、１°ＣＡ当たりの時間を求め、その値を１ｃａｔｉｍｅにセットする。
【０１１９】
そして、続くＳ７５０にて、ｒａｔｉｏｐｏｓに、「１ｃａｔｉｍｅ／ＡＤ周期」の値（即ち、１°ＣＡ分のデータ個数）をセットする。尚、桁落ちを無くすために、ｒａｔｉｏｐｏｓの値も小数値を持つ。
【０１２０】
次にＳ７６０にて、ｊに初期値としての０をセットする。
そして、次のＳ７７０にて、角度同期配列［ｋ］に、データ配列［Ｍ＋ｉｎｔ（ｄａｔａｐｏｓ）］の値をコピーする。尚、ｉｎｔ（ｄａｔａｐｏｓ）は、ｄａｔａｐｏｓの値を整数化した値という意味であり、本実施形態では、そのｄａｔａｐｏｓの値から小数点以下を切り捨てた整数部の値である。
【０１２１】
次に、Ｓ７８０にて、ｄａｔａｐｏｓに、「ｄａｔａｐｏｓ＋ｒａｔｉｏｐｏｓ」の値を再セットし、続くＳ７９０にて、ｊとｋとをインクリメントする。そして、次のＳ８００にて、「ｊ＜１０」か否かを判定し、「ｊ＜１０」ならばＳ７７０に戻る。
【０１２２】
また、Ｓ８００にて、「ｊ＜１０」ではないと判定した場合（即ち、インクリメント後のｊが１０になった場合）には、Ｓ８１０に進んで、ｉをインクリメントし、次のＳ８２０にて、「ｉ＜８」であるか否かを判定する。そして、「ｉ＜８」ならばＳ７３０に戻る。
【０１２３】
また、Ｓ８２０にて、「ｉ＜８」ではないと判定した場合（即ち、インクリメント後のｉが８になった場合）には、Ｓ８３０に進んで、Ｓ７３０と同様に、ｄａｔａｐｏｓに、「（ｎｅｔｉｍｅ［ｉ］−ａｄｔｉｍｅ）／ＡＤ周期」の値をセットする。そして、次のＳ８４０にて、Ｓ７７０と同様に、角度同期配列［ｋ］に、データ配列［Ｍ＋ｉｎｔ（ｄａｔａｐｏｓ）］の値をコピーする。そして、その後、当該角度再配置処理を終了する。
【０１２４】
次に、角度再配置処理の作用について、図１３の具体例を挙げて説明する。尚、この例では、Ｍ＝１２４であり、また、ＡＤ周期、「ｎｅｔｉｍｅ［０］−ａｄｔｉｍｅ」、「ｎｅｔｉｍｅ［１］−ｎｅｔｉｍｅ［０］」の各値は、図示している通りである。
【０１２５】
まず、角度再配置処理の実行が開始されてから１回目のＳ７３０では、Ａ／Ｄ変換器３９の起動時刻（ａｄｔｉｍｅ）からＢＴＤＣ４０°ＣＡの時刻（ｎｅｔｉｍｅ［０］）までの時間（ｎｅｔｉｍｅ［０］−ａｄｔｉｍｅ）をＡＤ周期で割ることにより、ｄａｔａｐｏｓ＝７７．３４と算出される。また、１回目のＳ７４０，Ｓ７５０では、ＢＴＤＣ４０°ＣＡからＢＴＤＣ３０°ＣＡまでの時間（ｎｅｔｉｍｅ［１］−ｎｅｔｉｍｅ［０］）を１０で割ることにより、１ｃａｔｉｍｅ＝２２５．３μｓと算出され、更に、その１ｃａｔｉｍｅをＡＤ周期で割ることにより、ｒａｔｉｏｐｏｓ＝８．４４と算出される。
【０１２６】
そして、１回目のＳ７７０により、ＢＴＤＣ４０°ＣＡのタイミングでのデータ配列が、データ配列［２０１］であると特定されて、そのデータ配列［２０１］の値が角度同期配列［０］にコピーされる。
【０１２７】
その次に、Ｓ７８０，Ｓ７９０の処理が行われることにより、ｄａｔａｐｏｓの値が１°ＣＡ分のデータ個数であるｒａｔｉｏｐｏｓだけ増加されると共に、ｊとｋがインクリメントされて１となり、再びＳ７７０の処理が行われる。
【０１２８】
すると、その２回目のＳ７７０では、ＢＴＤＣ４０°ＣＡから１°ＣＡ進んだタイミングでのデータ配列が、データ配列［２０９］であると特定されて、そのデータ配列［２０９］の値が角度同期配列［１］にコピーされる。
【０１２９】
以後は、Ｓ７９０でインクリメントされた後のｊが１０に達するまで、Ｓ７７０〜Ｓ７９０の処理が繰り返されることにより、ＢＴＤＣ４０°ＣＡから２°ＣＡ，３°ＣＡ，…，８°ＣＡ，９°ＣＡと１°ＣＡずつ進んだ各タイミングでのデータ配列が、角度同期配列［２］〜角度同期配列［９］のそれぞれにコピーされることとなる。
【０１３０】
つまり、ｉ＝０の時に、Ｓ７７０〜Ｓ７９０の処理が１０回行われることで、ＢＴＤＣ４０°ＣＡからＢＴＤＣ３０°ＣＡ直前までの１°ＣＡ毎のタイミングでのデータ配列が、角度同期配列［０］〜［９］にコピーされる。
【０１３１】
その後、Ｓ７９０でインクリメントされた後のｊが１０に達すると、Ｓ８１０でｉがインクリメントされて１となり、Ｓ７３０以降の処理が再び行われる。
すると２回目のＳ７３０では、Ａ／Ｄ変換器３９の起動時刻（ａｄｔｉｍｅ）からＢＴＤＣ３０°ＣＡの時刻（ｎｅｔｉｍｅ［１］）までの時間（ｎｅｔｉｍｅ［１］−ａｄｔｉｍｅ）をＡＤ周期で割ることにより、ｄａｔａｐｏｓの値が算出され、また、２回目のＳ７４０，Ｓ７５０では、ＢＴＤＣ３０°ＣＡからＢＴＤＣ２０°ＣＡまでの時間（ｎｅｔｉｍｅ［２］−ｎｅｔｉｍｅ［１］）を１０で割ることにより、１ｃａｔｉｍｅの値が算出され、更に、その１ｃａｔｉｍｅをＡＤ周期で割ることにより、ｒａｔｉｏｐｏｓの値が算出される。
【０１３２】
そして、再びＳ７７０〜Ｓ７９０の処理が１０回行われることで、ＢＴＤＣ３０°ＣＡからＢＴＤＣ２０°ＣＡ直前までの１°ＣＡ毎のタイミングでのデータ配列が、角度同期配列［１０］〜［１９］にコピーされることとなる。
【０１３３】
以後は、Ｓ８１０でインクリメントされた後のｉが８に達するまで、Ｓ７３０〜Ｓ８１０の処理が繰り返されることとなる。
そして、Ｓ７３０〜Ｓ８１０の処理が８回繰り返されることで、ＢＴＤＣ４０°ＣＡからＡＴＤＣ４０°ＣＡ直前までの１°ＣＡ毎のタイミングでのデータ配列が、角度同期配列［０］〜［７９］にコピーされることとなる。
【０１３４】
その後、ｉ＝８になると、Ｓ８３０及びＳ８４０の処理が行われることにより、ＡＴＤＣ４０°ＣＡのタイミングでのデータ配列が、角度同期配列［８０］にコピーされる。そして、この時点で、ＢＴＤＣ４０°ＣＡからＡＴＤＣ４０°ＣＡまでの１°ＣＡ毎のデータ列（８１個のデータ）がメモリ４３に全て格納され、角度再配置処理が終了する。
【０１３５】
尚、より高い精度を求めるのであれば、特許文献３のように、１°ＣＡ当たりの時間（１ｃａｔｉｍｅ）を用い、メモリ４１内のデータ（一定時間毎のデータ）に対し補間演算を行って、より正確な１°ＣＡ毎のデータを算出するようにしても良い。
【０１３６】
以上のような本実施形態のＥＣＵ１に備えられたマイコン３３では、２つのＤＭＡチャンネル（ｃｈＡ０とｃｈＡ１）を、動作期間を重複させながら順次起動することにより、データ収集期間中にフィルタ部５０，５１から出力される一定時間毎のデータをメモリ４１のＣＰＳデータ領域に記憶させるようにしている。このため、データ収集期間における一定時間毎のデータを、漏れなくメモリ４１に記憶させることができる。
【０１３７】
しかも、データ収集期間が終了した後、のりしろ削除処理（図９）により、メモリ４１内の一定時間毎のデータの中から、重複余剰データを探し出して削除するようになっている。
【０１３８】
このため、ＤＭＡチャンネルが連続して転送可能なデータ数に上限値が定められているにも拘わらず、データ収集期間中にフィルタ部５０，５１から出力される一定時間毎のデータを、漏れなく且つ重複することなくメモリ４１に格納することができる。
【０１３９】
そして、重複余剰データが削除された後の一定時間毎のデータから、角度再配置処理（図１２）によって、１°ＣＡ毎のデータを求めるようになっているため、その１°ＣＡ毎のデータが正確に得られる。よって、その１°ＣＡ毎のデータを用いてエンジン３を精度良く制御することができるようになる。
【０１４０】
また前述したように、本実施形態では、図９（Ｂ）ののりしろ部分判定処理により、ｎ番目のデータ列におけるカウンタ値配列［ｎ−１］が示すデータ以降のデータと、「ｎ＋１」番目のデータ列における先頭以降のデータとを実際に比較して、ｎ番目のデータ列におけるカウンタ値配列［ｎ−１］が示すデータ以降のデータのうちで、「ｎ＋１」番目のデータ列における先頭以降のデータと値が一致しているデータを、重複余剰データとして特定するようになっているため、その重複余剰データを正確に探し出して削除することができる。更に、ｎ番目のデータ列におけるカウンタ値配列［ｎ−１］が示すデータ以降のデータのうちで、「ｎ＋１」番目のデータ列における先頭以降のデータと値が一致しているデータがなければ、データ抜けが発生した可能性があると判断して、異常フラグをオンするようになっているため、データ抜けのあるデータ群を用いてエンジン３を制御してしまうことを未然に防止することができる。
【０１４１】
尚、本実施形態では、マイコン３３が処理装置に相当し、Ａ／Ｄ変換器３９及びフィルタ部５０，５１がデータ出力手段に相当し、ＤＭＡチャンネル（ＤＭＡ転送部６０（ｃｈＡ０），ＤＭＡ転送部６１（ｃｈＡ１））がデータ転送手段に相当している。そして、図４、図５及び図７の処理が制御手段に相当し、図９の処理が削除手段に相当している。また、カウンタ値配列［］にセットされるＤＭＡカウンタ値が識別情報に相当している。更に、図６の処理がエッジ発生時刻記憶処理手段に相当し、図４のＳ１３０が開始時刻記憶処理手段に相当し、図１２（Ａ）の処理が演算処理手段に相当している。
【０１４２】
以上、本発明の一実施形態について説明したが、本発明はこうした実施形態に何等限定されるものではなく、本発明の要旨を逸脱しない範囲において、種々なる態様で実施し得ることは勿論である。
【０１４３】
例えば、図９（Ａ）ののりしろ削除処理におけるＳ５６０で、図９（Ｂ）ののりしろ部分判定処理を実行せずに、ｉに「カウンタ値配列［Ｎ−１］＋２５５×（Ｎ−１）−１」の値をセットして、次のＳ５７０へ進むように構成しても良い。
【０１４４】
そして、このように構成すれば、各ＤＭＡチャンネルによりメモリ４１に記憶された各データ列において、そのｎ番目（ｎ＝１，２，…）のデータ列についてのカウンタ値配列［ｎ−１］が示すデータ以降のデータを、重複余剰データとして削除することとなる。
【０１４５】
但し、図９（Ｂ）ののりしろ部分判定処理を実行するように構成した方が、図１１に例示したような場合でもデータ配列［５０７］を削除してしまうことがなく、本当の重複余剰データを正確に探し出すことができ有利である。
【０１４６】
また、図１２（Ａ）の角度再配置処理では、１°ＣＡ毎のデータ列を、メモリ４３ではなく、メモリ４１におけるＣＰＳデータ領域とは別の領域に記憶するようにしても良い。
一方、マイコン３３の構成としては、フィルタ部５０，５１が別々ではなく、１つのフィルタ部から複数の各ＤＭＡチャンネルにデータが入力される構成でも良い。また、フィルタ部５０，５１が無い構成でも良い。
【図面の簡単な説明】
【０１４７】
【図１】実施形態のエンジン制御システムを表す構成図である。
【図２】ＥＣＵの内部構成を表す構成図である。
【図３】ＥＣＵのマイコンで実施される処理の概要を表すタイムチャートである。
【図４】ＡＤ起動処理を表すフローチャートである。
【図５】のりしろ処理を表すフローチャートである。
【図６】タイムスタンプ処理を表すフローチャートである。
【図７】ＡＤ停止処理を表すフローチャートである。
【図８】ＮＥ割り込み時刻配列と、カウンタ値配列と、データ配列とを説明する説明図である。
【図９】のりしろ削除処理及び該のりしろ削除処理内で実行されるのりしろ部分判定処理を表すフローチャートである。
【図１０】のりしろ削除処理の作用を説明する第１の説明図である。
【図１１】のりしろ削除処理の作用を説明する第２の説明図である。
【図１２】角度再配置処理と、のりしろ削除後のデータ配列と、１°ＣＡ毎のデータ配列とを説明する説明図である。
【図１３】角度再配置処理の作用を説明する説明図である。
【符号の説明】
【０１４８】
１…ＥＣＵ（エンジン制御装置）、３…エンジン、５…シリンダ、７…吸気経路、９…コンプレッサ、１１…インタークーラー、１３…スロットルバルブ、１５…ＭＡＰセンサ、１７…排気経路、１９…配管、２１…ＥＧＲクーラー、２３…ＥＧＲバルブ、２５…気筒内圧センサ、２７…クランクセンサ、２９…インジェクタ、３１…フィルタ回路、３３…マイコン、３７…ＡＤＣ・ＤＭＡモジュール、３９…Ａ／Ｄ変換器、４１，４３…メモリ、５０，５１…フィルタ部（ディジタルフィルタ）、６０，６１…ＤＭＡ転送部（ＤＭＡチャンネル：ｃｈＡ０，ｃｈＡ１）
【図１】
2008063992.tif 000003
【図２】
2008063992.tif 000004
【図４】
2008063992.tif 000005
【図５】
2008063992.tif 000006
【図６】
2008063992.tif 000007
【図７】
2008063992.tif 000008
【図８】
2008063992.tif 000009
【図９】
2008063992.tif 000010
【図１２】
2008063992.tif 000011
【図１３】
2008063992.tif 000012
【図３】
2008063992.tif 000013
【図１０】
2008063992.tif 000014
【図１１】
2008063992.tif 000015