line
ケントエンジンの自作ECU化
line

ケントエンジンのECU(インジェクション化)を紹介していきます。
その6


2009年
6月3日
秋月で購入した非接触回転速度センサです。 ガレージ で樹脂で固めてきましたので会社で実験を行います。32パルス、1パルスとも低速〜高速まで良好です。電源は12Vで電流出力のため2端子です。
周波数範囲は0〜25KHzとなっていて、ホールセンサを使用し磁石も載っているため停止状態でもHIGH/LOWの信号が持続し安定しています。 動作温度は上限が85℃と比較的低いのでエンジンルーム内では厳しいかもしれません。樹脂で固めましたが、さらに断熱 して使ってみようと思います。これを使うと信号線のレベルを5Vに上げるだけで、現在ECU基板に載っている通常のパルスセンサ用の可変スレッショルド回路がいらなくなります。


ECU基板エンジンエミュレータです。少しづつ作業を進めています。



6月25日
制御プログラムを少しづつ作っています。下のオシロ写真は気筒制御タスクでGPOで出力しているタコメータ用信号(クランク1回転で2パルス)です。気筒別点火なのでよく考えるとタコメータを駆動する適当な信号無いので追加しました(笑)。この信号ですが、エンジンの回転を上げていくと偶に波形が欠落 します。上がカム角基準パルス(クランク2回転で1パルス)で、下がタコメータ用信号です。CMT0をディゼーブルにすると波形は欠落しません。
原因はOSタイマのCMT0によるタスク起動/実行の遅延のようです。8000rpmでカム角が32パルスの場合にはパルス間隔は0.47mSecになり割込みの前後処理やタスク切替えのオーバヘッドを考えると28MHzのSH2ではかなり厳しいのかもしれません。


以下、タコメータ用の信号発生のみに限定した時の気筒制御タスクのログです。GPOに対して信号をHIGH/LOWの処理をしている108と112番以外は出てこないはずで、X印 のところはstate変数が+1されていて異常です。

    タスク番号
      state変数
                 処理番号 
[cyl] 2 24 108
[cyl] 2 28 112
[cyl] 3 0  108
[cyl] 3 4  112
[cyl] 0 8  108
[cyl] 0 12 112
[cyl] 1 16 108
[cyl] 1 20 112
[cyl] 2 25 109 <-X 24 108が正解
[cyl] 2 28 112
[cyl] 3 0  108
[cyl] 3 4  112
[cyl] 0 8  108
[cyl] 0 12 112
[cyl] 1 16 108
[cyl] 1 21 113 <-X 20 112が正解
[cyl] 2 24 108
[cyl] 2 28 112
[cyl] 3 1  109 <-X 0 108が正解
[cyl] 3 4  112
[cyl] 0 8  108
[cyl] 0 12 112
[cyl] 1 16 108
[cyl] 1 20 112
[cyl] 2 24 108
[cyl] 2 29 113 <-X 28 112が正解

現在のプログラムはカム角割込みハンドラが更新する広域変数stateを使って気筒制御とサブタスクが制御を決定しています。CMT0の割り込みとそれに起因する周期ハンドラの処理に時間が掛かると気筒タスクが実行された時には次ぎのカム角割り込みが既に入っていてstateが+1されていてしまうのが原因のようです。


そこで、広域変数を使わず、RTOSらしく(笑)データキュー を使ってカム角割り込みハンドラから各タスクにデータを送ると良さそうです。回転数が高い時にCMT0割込みが発生すると各処理が遅延されるのはそれはそれで問題なのですが、タイミングの厳しい 点火処理半ハードウェアで実現しているので、燃料噴射センサ入力な どの他の処理は多少遅れてもあまり問題にはなりません。以下はデータキューを使ったカム角割込みハンドラと気筒制御タスクの概要です。タスクの同期もiact_tsk()とext_tsk()を使っていましたが、タスク側を永久ループにしてデータキューの受け渡しで同時に同期も取れます。


早速プログラムを修正してテストを行います。タコメータ用の信号も綺麗に出るようになりました。点火タイミングの波形をオシロの上書きモードで測定してみました。左が低速の1000rpm程度の時、右が8000rpmの時です。上がカム角基準 、2番目が1番気筒の点火タイミング、一番下がカム角32パルス です。点火タイミング波形の立下り部にジッタがあります。8000rpm時では32パルスの1つ分越えているものもあり、タスクの実行が遅延していることが解かります。ただし立下りは点火コイルに電流流し始めるタイミングでドエル角を確保できれば問題なくジッタが発生しても問題ありません。立ち上がり時が点火タイミングで外部のフリップフロップと8253/54のハードウェアによって制御しているのできっちり立ち上がっています。ちなみにドエル角の制御も正常に動作していることが確認できます。1000rpmの時は5パルス前、8000rpmの高回転時には12パルス前(約4.8mSec)からコイルに通電しています。最低でも3mSec程度は必要です。



6月30日
インジェクタ開弁率 を考察してみます。空燃比は重量比なので、空気とガソリンの密度が必要です。

仮定/前提
 ・使用予定のインジェクタ容量:260cc/60Sec (以前の実験から)
 ・ケントエンジンの充填効率:80% (実際はもっと低い?)
 ・最高回転数:8000rpm
 ・排気量:1600cc
 ・理想空燃比:14.7
 ・気温:25℃
 ・気圧:1気圧


さて、ウィキペデアから25℃、1気圧の時の空気の密度は1.293*1/(1+0.00367*25)=1.18kg/1000Lとなり、1Lあたり1.18g です。一方、エンジンが最大限吸い込む空気はケントエンジンの排気量に充填効率を掛けて1.6L*0.8=1.28Lとなり、1気筒1インジェクタなので4で割って0.32L です。

この時の空気の重さは1.18g*0.32=0.378gで、空燃比が14.7なので、この時に必要なガソリンは0.378/14.7=0.0257gです。ガソリンの密度は0.75 くらいなので体積に換算すると0.0257/0.75=0.0343ccとなります。

エンジンは8000rpmで回っているのでカムは半分の4000回転となり、1秒間に66.67回転します。周期にすると15mSec です。
インジェクタの無効噴射時間を無視する と260cc/60Secの容量のイジェクタが15mSec間に噴射できるガソリンの容量は0.065cc です。この仮定でケントエンジンは0.0343ccが必要で、53% (7.95mSec)噴射すると目的の量を噴射できます。

燃料の噴射マップを作るためにMTUに設定する最大値を計算します。

インジェクタを開弁するMTUのクロックは447.6KHzで1クロック当りの待ち時間は2.2235uSecです。 7.95m Sec間インジェクタを開けるには7.95mSec/2.2235uSec=3575 となります。以前にもらったドカの851のマップを参考にして、上記の最大値から基本マップを作製することにします。


7月1日
インジェクタの駆動信号を作るためのSH2のMTU を使ったワンショット出力の考察です。

以前にインジェクタ用のワンショットの出力するためにここでコンペアステータスをクリアすると書きましたが、実際には少し処理が違いました。データシートのTSTR の説明のところに書いてあります。

以下、例としてMTU0のコンペアマッチ(TGRA)を使ったワンショット( LOWアクティブ)のレジスタ設定手順です。

<初期化時>
1.TSTRでMTU0のカウントを停止。
2.TIOR0で信号の初期値をHIGHに、コンペアマッチの時もHIGHに設定。
  (信号がHIGHになります)


<ワンショット出力設定>
1.TSTRでMTU0のカウントを停止。
2.TCNT0をクリア。
3.TGR0Aに所定の時間幅(インジェクタ開弁時間)を設定。
4.TIOR0で信号の初期値LOWに、コンペアマッチの時HIGHに設定。
  (ここで信号がLOWになります)
5.TSTRでMTU0のカウントを開始。(ここからカウンタが動作し、コンペアマッチが起こると信号がHIGHになりTGR0Aに設定した幅+αのLOWのワンショットが出力されます)

ワンショットを出力するだけなのに結構処理が多いです。
+α は4から5を実行する時間ですが、途中で割り込みまれるパルス幅が延びます。

これが8253/54 だと簡単です。モード0にして下位、上位でカウンタ値を書き込めばワンショット出力できます。下位側を書くと信号がLOWレベルになるので
途中で割り込みまれるパルス幅が延びるのは同じです。


7月2日
オークションで購入したuPD71054C です。NECのC−MOSの8254互換品チップです。ついでにuPD71055Cも買っておきました。8253/54はガレージのCNC制御基板やZ80を使ったステッピングモータのタコメータなどでも使っています。1個200円で安かったです。メーカでは大分前に製造中止ですが、サンハヤトで互換品を出しています。



7月8日
前にドエル角の確認をしましたが、肝心の進角 動作を確認しておきます。左は1000rpmの時です。右は7000rpmの時です。上の波形が基準パルス、2番目の波形はカム角32パルスでパルス間は22.5度です。時間幅から計算しなくても32パルスとの位置関係で何度進角しているか解かります。現在のマップは適当設定した値で1000rpm時に10 度、7000rpmの時には40 度の設定になっています。実際の値は別にして機能的には4点補完も含めて正常に動作しています。


続いてインジェクタ噴射系の確認です。以前に考察したワンショット出力非同期噴射の動作確認です。通常のワンショット出力は4点補完も含めて正常に動作しています。現在のマップは851のマップに以前に計算した開弁率 が53%になるように定数を掛けて作った暫定的なもです。続いて非同期噴射 の確認です。スロットル開度の加速度を検出してある一定以上であればカム角とは非同期に4気筒一度に噴射します。非同期といっても32パルスに同期しているので完全な非同期ではないですが(笑)。写真の黄色枠 の部分が非同期噴射です。非同期噴射は余っている8254を使っています。スロットル開度の加速度を求めるには1つ前のスロットル開度を取っておいて新しいスロットル開度との差分から計算します。現状の非同期噴射量は動作の確認用の適当なものです。


今後、以下の機能追加と動作確認が必要です。

・吸気温ー噴射時間補正

・大気圧ー噴射時間補正

・電源電圧ーインジェクタ無効時間

・水温ー噴射時間補正、暖機運転補正

・始動時補正

大気圧吸気温補正のために25℃の時を基準にして吸気温大気圧に対する噴射量の係数を空気の密度の式から計算しておきます。大気圧については標高hPaも付けておきました。大気圧による補正は単純に空気の密度から計算していますが、大気圧が低くなると排気が外に引っ張られて充填効率が上がる分のプラスの補正を相殺する必要があるかもしれません。

<<吸気温度の補正係数Kt>>
tmp=-20 Kt=1.18
tmp=-15 Kt=1.16
tmp=-10 Kt=1.14
tmp=-5  Kt=1.11
tmp= 0  Kt=1.09
tmp= 5  Kt=1.07
tmp= 10 Kt=1.06
tmp= 15 Kt=1.04
tmp= 20 Kt=1.02
tmp= 25 Kt=1.0
tmp= 30 Kt=0.985
tmp= 35 Kt=0.969
tmp= 40 Kt=0.954
tmp= 45 Kt=0.939
tmp= 50 Kt=0.924
tmp= 55 Kt=0.91
tmp= 60 Kt=0.896
tmp= 65 Kt=0.883
tmp= 70 Kt=0.87

<<大気圧の補正係数Kp>>
atm=0.8  H=2022m hPa=810.62 Kp=0.80
atm=0.82 H=1820m hPa=830.89 Kp=0.82
atm=0.84 H=1617m hPa=851.15 Kp=0.84
atm=0.86 H=1414m hPa=871.42 Kp=0.86
atm=0.88 H=1212m hPa=891.68 Kp=0.88
atm=0.9  H=1009m hPa=911.95 Kp=0.90
atm=0.92 H=806m  hPa=932.21 Kp=0.92
atm=0.94 H=604m  hPa=952.48 Kp=0.94
atm=0.96 H=401m  hPa=972.74 Kp=0.96
atm=0.98 H=198m  hPa=993.01 Kp=0.98
atm=1.0  H=0m    hPa=1013.3 Kp=1.0
atm=1.02 H=      hPa=1033.5 Kp=1.02
atm=1.04 H=      hPa=1053.8 Kp=1.04
atm=1.06 H=      hPa=1074.1 Kp=1.06
atm=1.08 H=      hPa=1094.3 Kp=1.08
atm=1.1  H=      hPa=1114.6 Kp=1.1
atm=1.12 H=      hPa=1135.0 Kp=1.12
atm=1.14 H=      hPa=1155.1 Kp=1.14
atm=1.16 H=      hPa=1175.4 Kp=1.16
atm=1.18 H=      hPa=1195.7 Kp=1.18
atm=1.2  H=      hPa=1215.9 Kp=1.2


7月10日
大分昔に買った 負圧センサの特性が載っているページ がありました。ここによると、1気圧で3.6Vで、−200mmHg毎に0.4V下がります。atmのあとはmmHgか〜色々単位があって面倒です。単位の変換はここでできます。けっこう以前の実験 と結構ずれがあります。


7月15日
連続稼動実験中です。右はコンソール表示の1ページ目です。Cの標準ライブラリは組み込んでいないので、簡単な小数点単位が表示できるようにしました。左上からスロットル開度、回転数、インジェクタ開弁率、進角、大気圧、吸気温、水温、電源電圧です。このページと別のページを表示するだけで、まだ値の設定はできません。表示はスロットルOFF、1039回転、開弁率2.3%、進角は
9度で丁度アイドリング中の所です。



7月16日
点火系の考察です。レストアのページにはフォードのオリジナルのハイテンションコードについて書きましたが、こちらの写真は2輪用品店で売っているキジマの0Ωのコードにボッシュの5K入りブラグキャップ。点火コイルは昔デスビレスにしようと思って買ったV−MAXのもので、FETを使って点火の実験中です。オークションにも
ダイレクトイグニッションの点火コイルが出品されていますが、エンジンヘッドの奥く深くプラグがあるため細長い形状のものが多いです。ケントエンジンには付きにくそうです。このV−MAXのコイルを使ってダイレクトイグニッションユニットを作ることにします。このコイルの直流抵抗は 2.8Ωあり、直列に1〜2Ωの抵抗でを入れた方が良さそうです。 実際には常時電気が流れているわけではありませんが、1.5Ωを外付けして直流で考えると単純に44Wになります。



RCオシレータで点火させ1次側 の電圧を測りました。電源は12Vで、外付け抵抗は2Ωを取り付けました。トリガが311Vでも掛かります。電源電圧は14〜15Vくらいになる時もあり余裕をみソース/ドレイン電圧が600V くらいのFETを使った方が良さそうです。



7月22日
オークションで購入したトヨタ旧車系の水温センサ抵抗値を測り対数グラフを作りました。測れなかった温度は推測しています。抵抗を測ったあとエンジンに取り付けました。取り付けた写真は ここです。


データキューはオーバヘッドが大きいのでイベントフラグで気筒、サブタスクを起床して実験してみました。32パルスの割り込みハンドラから各タスクに送るデータは ステート値(0−31)で 良いため、ステートを4ビットシフトしてイベントフラグとORして各タスクに送ります。一見イベントフラグの方が早くて良いと思いましたが、起床の要求がキューイングされないため優先順位の低いLCDへの表示タスクなどへ制御が回らないようです。もう少し実験が必要です。左が以前のデータキュー、右がイベントフラグを使ったタイミングです。データキューでは2パルス分遅れている時も観測されます。



8月21日
カム角、基準角の回転パルスの入力回路を秋月の非接触回転速度センサ用に変更しました。単純なヒステリシス付きのコンパレータです。元はこれよりもかなり複雑でこんな感じでした。大分、すっきりしました。右はSIN波を入れてレベル調整した出力波形です。


以前に使っていた回転センサはRX7のカム角センサですがこれは電磁的に動作します。秋月の非接触回転速度センサはホール素子を使っていて、出力される波形のタイミングが少し違います。以前の電磁的な動作では波形整形回路を通すとタイミングギアの中央部で割り込みを発生させることができますが、ホール素子を使った今回の場合は下図のようにタイミングギアの切れた所の近くで信号が変化しますが、少し不確定な部分があり、調整と確認が必要です。中央部で変化した方が良いですが、ホール素子の場合には超低回転(停止していてもOK)から信号が出力されるのでメリットがあります。


2010年
1月31日
ECU化用コレクタタンク作製開始しました。レストアのページに飛びます。

2月28日
ECU化用インテークマニホールド作製開始しました。レストアのページに飛びます。


12月3日
コレクタタンクやインマニなどハードウェアの作製は少しづつ進んでいますが、プログラムの方も少しづつ修正しています。現在までECUの制御プログラムは1気筒の処理を1つのタスクで制御して、同じタスクを4つ平行に動作させる方式でした。この方式はRTOSらしいのですが、オーバーヘッドが大きいので、単純な割込み処理で動かすようにプログラムを修正しました。新しい割込み処理方式でタスク形式として残っているのはエンジンが止っている時の各センサを読み込むサブタスク、LCDコンソールに表示をするLCDタスクなど、エンジン本体の制御とは直接関係ない部分のみになりました(笑)。元々タスクの形式にしていたのは、せっかくRTOSを使用するのだから、RTOSらしいプログラムということでした。今回の修正で、タイミングも良くなりました。下の写真の上から2番目の波形は約7500rpm時の1番気筒の点火信号です。以前のは立下りにRTOSのデータキューのジッタがあったのですが無くなりました。これと比較してみてください。



ECUをエンジンエミュレータでテストしていて、ちょっとした不具合が発生しました。回転を急に上げると点火信号が次の点火までLOW(通電状態)になるというものです。これは下図のように8253/54を外部のゲートで制御しているため、
エンジンエミュレータのように短時間で回転が上下すると、カウンタが0になる前にゲート信号が無くなってしまうためです。下図の下側は例として上死点前2パルスの時(45度)に一瞬で回転数が2倍になった波形です。このような状態では設定した時間が経過する前にゲート信号が無くなり、LOWのままの状態が伸びてしまします。対策は点火直後にゲート信号をOFFしていたものを1パルス分長くする(下図の下側の青破線の波形)ことで対応します。実際のエンジンではこんなにレスポンスが良くないので対策しなくても問題ないと思います。



12月10日
スロットルスピード方式燃料噴射マップの考察をします。下グラフは新電子制御ガソリン噴射に載っているアクセル開度回転数等空気量曲線グラフの抜粋です。2000ccの4気筒エンジンのあるアクセル開度、ある回転数の時の1時間に必要とする空気の量の等高線グラフです。必要とする空気の量と噴射するガソリンの量は比例しているので係数を掛ければガソリンの必要量と同じになります。このグラフから回転数が一定であれば点線よりも上のアクセル開度では空気の量はほとんど変わらないということです。このことはドカ851のマップのアクセル開度の分割でも解ります。50%以上は57%79%の2つしかありません。下のグラフは空気量を回転数で割らないとガソリン噴射量にならないので直接比較できませんが、スロットルスピードの特徴として、

1.回転数が低い時でアクセル開度が大きくなると噴射量が平坦になる。
2.回転数が上がっていくと平坦な部分は少なくなり、単純増加になる。

大雑把ですが、こんな感じです。
参考になるページを2つ上げておきます。双方とも上の特徴が載っています。

・ホンダビートのページ
・ハルテックのECUのページ


下がドカ851のマップです。このグラフでも上の特徴が出ています。回転数の低い部分では平坦な所があり、回転数が高くなると単純増加になっています。まあ、細かい凹凸はありますが。現在のECUのプログラムでは851のマップに係数を掛けてそのまま組み込んでありますが、凹凸を無くして最高回転を8000rpmくらいまで落した方がよさそうです。



以降、レストアのページをケントのECU化のページに変更して機構作製などECU化のページをマージします。

line