2011年7月1日作成 2011年7月2日更新
純正ECUの動作を調べるためと、自作ECUの動作テストのためにエンジンシミュレータを作りました。回路図とソースコードを公開していますが、たまたま手元にあったジャンク品を流用して作った為、そのまま同じものを作るのは難しいかと思いますので、別のマイコンで作る場合の参考になるように動作の説明を書くことにします。 エンジンシミュレータ回路図、 クランクアングルセンサー波形、 純正ECU回路図といっしょに見てください。
この記事を読むには、マイコンのタイマー割り込みを使って、LEDを点滅させることができる程度の知識が必要です。それがわからない場合、マイコンのメーカーが無料で公開しているソフトウェアマニュアル、ハードウェアマニュアル、データシートや市販の書籍等で学習してください。
「べつに説明がなくてもソースコードを見れば十分じゃない、短いし。」とも思いますが…
一番大事な仕事である、クランクアングルセンサーの擬似信号の生成です。
マイコンのタイマーで、カムが5度回る時間ごとに割り込みを掛けて
というような感じで、カム1回転(クランク2回転)分の信号を出しています。割り込みの間隔を長くしたり短くしたりすれば、回転数が変化した事になります。
クランク一回転で発生する割り込みの回数 (360/5)/2
クランク一回転する時間 [分] = 1/回転数[RPM]
クランク一回転する時間 [秒] = 60/回転数[RPM]
割り込みの間隔 [秒] = (60/回転数[RPM])/((360/5)/2)
なので
となりますね。(計算間違ってないかな?)
マイコンのタイマー割り込みで、LEDを点滅させるプログラムの応用なので簡単ですね。
点火信号が出るクランク角で180度手前のNe立ち下がりから点火信号立ち下がりまでの時間を計測すれば、点火時期がわかります。
Neの立ち下がりでタイマーを起動し、点火信号の立ち上がりで割り込みを掛けて 時間1 を計測。そこから点火信号の立ち下がりで割り込みを掛けて 時間2 (ドエルタイム/イグナイタ通電時間)を計測しています。
時間から角度に変換するには
クランクが一回転する時間[秒] = 60/回転数[RPM]
クランクが1度回る時間[秒] = (60/回転数[RPM])/360
(時間1 + 時間2)[秒]間に回る角度 = (時間1 + 時間2)[秒] / ((60/回転数[RPM])/360)
なので
点火時期 BTDC(上死点前)[度] = 190 - ((時間1 + 時間2)[秒] / ((60/回転数[RPM])/360))
となりますね。
マイコンで作ったクランクアングルセンサーの擬似信号をECUに入れてやれば、点火信号は出てくるんですが噴射信号は出てくれません。(たぶん車両火災防止)
点火確認信号を入れてやれば噴射信号も出てきますので、点火確認信号を作ります。
ECUから出てきた点火信号の立ち下がりで割り込みを掛けて、1.5ミリ秒くらい点火確認信号を出します。
点火1,4 と 点火2,3 の両方の信号で点火確認信号を出す必要があるので、ダイオードでそれぞれの点火信号を合成しています。
点火確認信号端子はECU内でバッテリー電圧にプルアップされているので、マイコンで直接駆動することが出来ません。トランジスタを入れてオープンコレクタで駆動するようにしました。
(ベース抵抗はもっと大きく、10kΩくらいでいいはず。なんでこんなに小さい抵抗にしたんだったかな?)
噴射時間は単純に噴射信号の立ち下がりから立ち上がりまでの時間(インジェクタ通電時間)を計測すればよいだけですね。簡単です。
マイコンのタイマーにパルス幅を計測する機能があればそれを使えば良いですし、無ければ割り込みで計測すればよいでしょう。
自分が使用したマイコンには、ちょうどアナログ出力が2チャンネル付いていたので、それをエアフロメーターとO2センサーの信号出力に割り当てました。マイコンにアナログ出力が無い場合、PWMで代用するか、もっと単純に可変抵抗で電圧を変化させればよいでしょう。
エアフロメーターは吸気量大で電圧減少、吸気量小で電圧増加です。
吸気と水温のセンサーの信号は、センサーの代わりに可変抵抗を付けただけです。いちいち電圧計で設定温度を確認するのが面倒なので、マイコンのアナログ入力にも繋いで、電圧をモニターできるようにしました。
('A`)