アルドウィーノを使った
オープンソース、オープンハードの
ローコストECU
テージのECUが壊れているみたいなので
Speeduino(STM32)に装換しました。
その23:
アイドリング中のエンジン停止の解析
ダイレクトイグニッションへの変更
2025年
4月28日
エンジンをかけないで、疑似パルスでシンク・ロスが出るか確認の続きです。通常状態では現象が再現しないので、プラグコードを抜いてみました。少し待つと、現象が再現しました。下のロジックアナライザ波形は意図した所とは別の前側の緑枠でトリガがかかっていますが、その後の緑枠に点火パルス、噴射パルスが非常に多く出る波形が測定できました。プラグコードを抜くと現象が再現するのは、高電圧の信号の行先が無いため、エネルギが空間に放射されるためと思います。

問題の部分を拡大します。丸々1サイクル中(クランク2回転)、プライマリパルスと同じようなタイミングで点火パルス、噴射パルスが多数出力されています。点火パルスはメータユニットの回転信号にも繋がっているので、この時はアイドリング中にも関わらず、18000rpmのような異常な表示をします。疑似パルスではエンジンは止まらないので継続しますが、この状態で実車ならエンジンは停止すると思われます。

異常状態の前の部分を拡大します。ここではプライマリ、セカンダリパルスに異常があるようには見えません。ロジックアナライザの特性上、短いノイズは見えないだけで、実際にはノイズによる不具合がECU内で発生しているのだと思います。

4月29日
点火系の放射ノイズを軽減させるためにダイレクトイグニッションのコイルを使ってみます。ヤフーオークションでちょっと昔のホンダのVFR800のダイレクトイグニッションコイルが売っていたので、購入しました。動作未確認品なので、動かないものもあるかもしれません。ダイレクトイグニッションは高電圧部の配線が短いので、大幅に放射ノイズが減るはずです。テージのエンジンは右側のプラグはタイミングベルト越しなのでプラグキャップが長く、左側は短いのでプラグ接続部の改造が必要と思います。因みにVFR800のプラグはCRxなので、プラグのネジ径は10mmでテージの12mmより細いプラグです。

行きつけのお店からVFR800の配線図を送ってもらいました。中央がGNDだということは分かりますが、どちらが電源なのか、この図からは不明です。

ホンダのフィットのダイレクトイグニッションコイルもヤフーオークションで売っていたので、購入しておきました。ちょっとコイル部が大きいですが、こちらは動作確認済みとのことでした。

こちらは同じコイルと思われる、コネクタのピン配置がWEBで見つかりました。中央がGNDなので、VFR800のピン配置も同じかもしれません。

このコイルはプラグキャップの部分が外れるようで、これならプラグキャップの短い左側のへ接続が簡単そうです。

4月30日
ヤフーオークションのVFR800のコイルが到着しました。

コネクタのピン配置を調べます。コイルにあったマーキングの部品番号の099700−070で調べるとケーブルが付いたものが見つかりました。ケーブルの色は左から赤青、黒、白黒です。上の配線図と比べると、赤青は点火信号、黒がGND、白黒が12Vです。

早速、電源と点火信号を繋げて動作確認します。4本とも動作良好でした。

K20Aで検索すると、インテグラやシビックにも使われてたようで、アマゾンにコイルの内部構造が載っていました。上部にイグナイタ(トランジスタスイッチ回路)、下の部分に1/2次コイルがあるようです。残念ながら、短く加工することはできなさそうです。

5月2日
フィットのダイレクトイグニッションコイルが到着しました。早速、動作確認を行います。4本とも動作良好です。

このコイルはイグナイタとコイルが上部にあり、接続部には抵抗とスプリングが入っているだけです。抵抗を入れなければ、寸法は自由に調整できます。短い方は接続部を外してゴムキャップを取り付けました。長い方はゴミの日に捨てられていた永井のシリコンコードに付属していたプラグキャップを短く加工してゴムキャップを取り付けました。

短い方を左側に仮止めしてみます。ちょっと飛び出していますが、良いようです。

続いて、長い方を右側に取り付けてみました。こちらも良いようです。この後、双方に芯線のスプリングを入れて動作確認を行います。

5月3日
長い方をもう1個作ります。永井のシリコンコードに付属していたプラグキャップを分解します。


プラグキャップは短くして使います。内径をコイルに合うように大きくして、電極のスプリングを取り付けます。

フィットのコイルはカバーの下に隠れる部品なので、見せるように出来ていません。色も黒で地味なので、ステッカを作って貼ります。Qcadで図面を書いて、jpegに変換します。

ステカのインポートでjpegを取り込み、輪郭抽出します。赤のカッティングシートを切り出して貼りました。

5月6日
ダイレクトイグニッションコイルを仮配線します。ケーブルは専用コネクタが来た時のために、少し長くしておきます。

残念ながら、ダイレクトイグニッションコイルに変更してもシンク・ロスが発生してエンジンが止まりました。別のSTM32ボードに変更しても同じでした。コントローラボードをSTM32からアルドウィーノに変更すると発生しなくなるようです。ガレージ内での短い間なので、少し遠乗りして確認する必要があります。

5月6日
コントローラボードをアルドウィーノに変更して、少し遠乗りしてみます。40kmほど走ってシンク・ロスが0です。アイドリング中にエンジンが止まることはありませんでした。Speeduinoベースボードは同じなので、シンク・ロスでエンジンが止まるのはSTM32コントローラボードに原因があるようです。


アリエクスプレスで購入のフィット用のダイレクトイグニッションコイルの専用コネクタが到着しました。見た目だけで注文したので、心配していましたが、勘合しました。


5月8日
ヤフーオークションでフィットのコイルが1000円で売っていたので、予備に買っておきました。

ダイレクトイグニッションの配線用に6mmの熱収縮チューブを購入しました。

5月9日
ステーを伸ばしてコイルを固定して、熱収縮チューブとアリエクスプレスで購入の専用コネクタを使ってハーネスを作り代えました。

STM32を使うとシンク・ロスが出る件を考察してみます。コントローラボードによっているので、アルドウィーノMEGAとSTM32_MEGAを比べてみます。シンク・ロスはプライマリ/セカンダリパルスの不具合なので、ソフトウェアでは割り込みハンドラの動作、ハードウェアでは動作電圧、IO電圧、ノイズ耐性が問題になると思います。
<Arduino_MEGA>
CPU:ATmega2560
動作クロック:16MHz
動作電圧:5V
IO電圧:5V
ファーム:Speeduino-2023.05版
<STM32_MEGA>
CPU:STM32F407VET6
動作クロック:168MHz
動作電圧:3.3V
IO電圧:3.3/5Vトレラント
ファーム:Speeduino- 2024.02版
上がアルドウィーノMEGAが互換ボード、下がSTM32_MEGAボードです。機能面では動作クロック、SDログの有無が主な違いです。動作クロックが16MHzのアルドウィーノMEGAでは9000rpmくらいが上限で、テージの1100DSエンジンで余裕が無く、ギリギリです。

5月11日
STM32_MEGAボードでは使わないGPIOポートを後からTunerStudioのプログラマブル出力とAux入力に使えるように、コメントにして削除していたのですが、削除すると初期が行われず、用途が出力ポートでもリセット時のままの入力ポートになります。入力ポートだと、ノイズに弱いと思われるので、これを復活させました。これにより、用途が出力のポートは未使用ですが出力ポートになります。

未使用ポート設定を修正したファームウェアで往復50kmほど試走してみました。シンク・ロスでエンジン停止したのは1回で、頻度が減ったようです。

5月12日
さらに、VSCとST−LINKでデバッグして、未使用ポートを調べます。デスクトップPCには本物のシリアルポートが付いているのでレベル変換モジュールを介してシリアルケーブル接続してTunerStudioと接続します。

シリアルケーブル接続ではデバッガでプログラムを停止しても一旦OffLineになりますが、再実行で接続が復活します。USB接続では復活しないです。

VSCはペリフェラルレジスタが参照できます。ポートA〜Eのモードレジスタを調べて、未使用で入力になっているポートを探します。レジスタの内容もビットフィールド表示され、レジスタ名も出るので、直ぐに確認できます。00なら入力ポートです。

ポート設定をCALCにまとめました。

未使用で入力になっているポートを出力に設定するコードを追加しました。

未使用のアナログポートは下側の分割抵抗の910Ωだけ実装して電位をGNDにしました。

5月13日
未使用ピンの対策したSTM32で試走しました。片道約30kmの鶴ヶ島のスーパまで行きましたが、残念ながら、行きに1回だけシンク・ロスでエンジン停止しました。帰りは1区間だけ高速に乗り、工事渋滞もありましたが、シンク・ロスは無しでした。

5月14日
シンク・ロスの考察をしてみます。初めにプライマリ/セカンダリパルスの入力部です。センサは秋月電子の2ピンの非接触回転速度センサを使っています。

High時に14mA、Low時に7mAを流す定電流出力で内部のデバイスの電源もこの電流で賄っています。電源電圧にあまり影響されず、8〜20Vまでほぼ一定の出力をします。110Ωの負荷で0.8〜1.6Vを交番します。センサの電源はIG電源に直付けしていますが、仕様上は問題無さそうです。

昨日の試走でSDログのバッテリ電圧を確認します。赤がバッテリ電圧です。最小が13.7V、最大が14.8Vでした。開放型レ
ギュレータの出力は1Vほど変動しています。9Vの三端子レギュレータで電源を安定化させると何か変化があるかもしれません。

非接触回転速度センサの出力はヒステリシスコンパレータで5V系に変換しています。LTspiceのシミュレーションではLow−>High時に1.39V、High−>Low時に1.04Vです。入力は0.8〜1.6Vなので、閾値は良さそうです。

9Vの100mA級の三端子レギュレータのLDOをさがしましたが、短納期のものは見つかりませんでした。秋月にちょっと大きいですがドロップ0.3Vの1AのLDOがあったので注文しておきました。

TunerStudioにはトリガフィルタの設定があります。設定は無し、ウイーク、ミディアム、アグレッシブの4種類です。プログラムを解析して動きを調べます。

トリガフィルタのアルゴリズムは緑枠のようにプラ
イマリパルスの割り込みハンドラで前回とのギャップ時間を計算し、フィルタ時間未満なら本来の割り込みハンドラの処理しないで終了するというものです。 フィルタ時間より短い時間で入ったプライマリパルスはノイズとして無かったことになります。

フィルタ時間はsetFilter関数で、ギャップ時間からプライマリパルスの割り込みの都度計算します。ウイーク、ミディアム、アグレッシブ計算はギャップ時間のそれぞれ25%、50%、75%だけ短い時間に設定します。プライマリパルスの割り込み
ハンドラはクランク2回転で36パルス発生します。例えば1000rpmでアイドリング中は毎秒300回(3.3mSec)です。今まで、ウイークかミディア
ムに設定しましたが、シンク・ロスは防げないようです。マニュアルではなるべく、軽いフィルタを使うように書いてあります。これは速いエンジン回転の変化についていけなくなるからですが、普通のエンジンではギャップ間(クランク回転の1/18期間)に75%短くなる、回転上昇はなさそです。エンジンエミュレータでアグレッシブに設定してみましたが、素早く回転数を変化させても特に問題無さそうです。

5月15日
秋月の9VのLDOが到着しました。

ハーネスを確認します。ECUから出力される12V電源を使っているのはプライマリ/セカンダリパルスセンサのみです。

早速、空きエリアに実装しました。

エンジンエミュレータで動作確認します。非接触回転速度センサは電源電圧に依存しないので、他の修正無しで動作します。

シンク・ロスの考察の続きです。セカンダリパルスの割り込みハンドラ内でプライマリパルスの数が36でない時がシンク・ロス判定です。そこで、使っていないパラメータにシンク・ロス判定が起きた時のプライマリパルス数(toothCurrentCounter)を代入すればTunerStudioで表示できます。同じ型のuint16のCurrentStatus.vss(車速)があるので、プログラムを修正してみます。decoder.cppに新しい変数loss_toothCurrentCounterを追加します。

同じく、シンク・ロス判定の所でloss_toothCurrentCounterとCurrentStatus.vssにtoothCurrentCounterを代入します。

decoder.hにはloss_toothCurrentCounterをエクスターン定義します。

logger.cppで車速の代わりにloss_toothCurrentCounterをログに記録します。

メインループでgetSpeed関数で車速をCurrentStatus.vssに代入しているので上書きされないように、コメントに変更します。

エンジンエミュレータで動作確認を行います。赤枠にシンク・ロスと車速を表示して、わざとシンク・ロスを発生させます。車速にプライマリパルスのカウント数が表示されるようになりました。2回目のシンク・ロスの時のプライマリパルスカウントは20でした。ログを確認しなくてもゲージでリアルタイム表示できます。36より多ければ、プライマリパルスにノイズが乗っている、また36より少なければ、セカンダリパルスにノイズが乗っている可能性が高いと思われます。

