2011年7月6日作成 2011年10月23日更新
(ノックセンサーの処理はまだ実験中)
実際にノックセンサーの出力信号を観測してみると、ノックセンサーの信号を特定のクランク角の間だけ取り出すような処理はしなくてもよさそうです。
クランクが180度回転するたび(毎回の点火毎)にノックセンサーの入力処理を行っています。ついでに同じタイミングでエアフローメーターとO2センサーの AD変換も行います。
非共振型のノックセンサーは、セラミック等の圧電素子の働きで振動が加わると電圧を発生します。ちょうど音声を電気信号に変えるマイクロフォンと同じようなものです。センサーの出力は 1MΩで終端して測定すると、 1000RPM で 0.03Vp-p くらい、7000RPM で 6Vp-p くらいでした。
要するにノックセンサーから得られる信号はエンジンの「音」なのですが、この信号から吸排気音やバルブの動作音や混合気の爆発音を取り除いて、ノッキングの音だけを取り出さなければなりません。
マイコンがノックセンサーの処理にかかりっきりになっても良いのであれば、ノックセンサーの出力を(アンプを通して)22kHz とか 44kHz くらいで直接 AD変換してソフトウェアで信号処理をしてもいいのかもしれませんが、今回はほかにもやることがたくさんあるので、ハイパスフィルターで低周波をカットした後、ミュートとピークホールド回路で指定した期間の最大値を保存して、それをマイコンで AD変換して取り込みます。
とりあえず、ノッキングの発生しないであろう期間の信号はミュートして捨ててしまいます。暫定的に上死点後 0度から 90度の間以外の信号を捨てることにします。
クランクアングル Ne の立ち上がりで、上死点後 0度までの待ち時間をタイマーにセットしてタイマーをスタートすると、上死点後 0度でコンペアマッチ割り込みが発生します。
コンペアマッチ割り込みでミュートを解除して、ノックセンサー入力のピークホールド回路にノックセンサー出力の最大値を保存します。さらに、ここから上死点後 90度までの待ち時間をタイマーにセットしてタイマーをスタートします。
上死点後 90度でコンペアマッチ割り込みが発生するので、ここで AD変換を開始し、ノックセンサーの値を取り込みます。AD変換が終了したらミュートします。これをクランク 180度毎に行います。
同時にエアフローメーターと O2センサーの出力も取り込みます。(同時に取り込むとプログラムが簡単なので)
knock.c
void knock(void)
{
unsigned int temp;
// 今 上死点前80度
temp=(IOCLK/RPM*(80+0)/384); // ノックセンサーの計測開始時期 上死点後0度から
if(temp>0xFFFF) temp=0xFFFF; // 低速では桁あふれるかも
MTU2.TSTR.BIT.CST4=0; // タイマー停止
MTU24.TCNT=0;
MTU24.TGRA=temp;
MTU2.TSTR.BIT.CST4=1; // タイマースタート
}
knock.c
// コンペアマッチでAD変換起動
void interrupt_mtu24compare(void)
{
unsigned int temp;
MTU2.TSTR.BIT.CST4=0; // タイマー停止
if(MUTE==1)
{
// 1回目のコンペアマッチ
MUTE_OFF(); // ノックセンサーミュート解除
temp=(IOCLK/RPM*(90)/384); // ノックセンサーの計測期間 クランク 90度分
if(temp>0xFFFF) temp=0xFFFF; // 低速では桁あふれるかも
MTU24.TCNT=0;
MTU24.TGRA=temp;
MTU2.TSTR.BIT.CST4=1; // タイマースタート
}
else
{
// 2回目のコンペアマッチ
AD0_start(); // AD変換スタート
// ノックセンサー、O2センサー、エアフローメーターを同時に取り込みます
}
while(MTU24.TSR.BIT.TGFA==1) MTU24.TSR.BIT.TGFA=0; // 割り込みフラグクリア
}
knock.c
// AD変換終了割り込み
void interrupt_ad0(void)
{
unsigned char temp;
MUTE_ON(); // ノックセンサーミュート
// ノックセンサーの最大値を保存
temp=(KNOCK_REG>>8) & 0xFF;
if(temp > KNOCK) KNOCK=temp;
while(AD0.ADCSR.BIT.ADF==1) AD0.ADCSR.BIT.ADF=0; // 割り込みフラグクリア
}
O2センサーは排気中の酸素濃度を測定してくれるありがたいセンサーで、理論空燃比を境に
の出力が得られます。
O2センサー自体が十分温まっていれば、反応時間は 0.1秒程度となかなか高速です。
自作 ECU ではマイコンのアナログ入力に直接接続していて、0.5V よりも電圧が高ければ「リッチ」、低ければ「リーン」と判断しています。
エアフローメーターは吸気量を測定するセンサーです。NA6CE の場合は吸気経路のフラップで可変抵抗を動かすことで、出力電圧を変化させています。電圧は 0〜5Vの間で変化し、吸気量が増えると電圧は減少します。
自作 ECU ではマイコンのアナログ入力に直接接続しています。
('A`)