DBDelve
Dive deep into your data. A fast, native, multi-engine database client written in Rust. Free and open source, no telemetry.
翻訳待ち
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Arduino UNO R4(RA4M1)/ 互換環境上で動作するエコラン車両用ECUプログラム
Routine
AGTimer.init による24usec毎処理)WH_PULSE_ISRReadNe_ISR(パルスでクランク角更新)G_PULSE_ISRfastestdigitalWrite / fastestdigitalReadstatusTask : Serial1 出力 100ms 周期 (10Hz) / SerialUSB 出力 500ms 周期 (2Hz)mapConsoleTask : MAP 書き換えコンソールtools/strategy/)tools/send_map.py でそのまま転送できる)PlatformIO 環境: platformio.ini
| Env | ボード | 備考 |
|---|---|---|
uno_r4_minima | Arduino UNO R4 Minima | デフォルト |
rmc_ra4m1_20 | カスタム RA4M1 (-D rmc_ra4m1_20) | SD動作分岐あり |
ビルド例:
pio run -e uno_r4_minima
pio run -t upload
pio device monitor -b 115200
| 項目 | 定義 | 説明 |
|---|---|---|
| ROUTINE_CYCLE_US | 24 | メイン周期 (µs) |
| PERIMETER_MM | 1548 | タイヤ周長(mm) |
| TACHO_RPM_MAX | 6000 | レブリミット (回転数上限保護) |
| Dwell_Time_US | 5000 | ドゥエル時間(us) IGコイルへの充電時間 |
| Dwell_Time_CRANK_US | 6500 | クランキング中(スタータON中)のドゥエル時間(us) スタータ負荷による電圧低下の補償 |
| start_RPM | 1500 | スタータ自動停止の判定回転数(RPM) MAP切替用の専用定数ではない |
始動時・通常時で切り替わる専用定数(start_INJ_time 等)は無い。
燃料噴射量・点火進角・燃料噴射終了タイミングは全て単一の MAP テーブルから rpm に応じて読み出され、ビルドし直さずに USB シリアルから調整できる。
(MAP 節参照)
74HC14 によるシュミットトリガ回路でチャタリング防止・反転入力Nch MOSFET による LOW アクティブ。| 信号 | 物理ピン | 説明 |
|---|---|---|
| NE_A_IN | 2 | クランク角 A (1deg/パルス) |
| NE_B_IN | 8 | クランク角 B (位相判定) |
| NE_Z_IN | 9 | クランク角0deg基準 |
| WH_IN | 3 | 車軸パルス入力 1回転で1パルスIN |
| G_IN | 5 | カムパルス入力 クランク角720°毎に1パルス入力 |
| STR_IN | 6 | エンジンスタートスイッチ(LOW=ON) |
| ENGOFF_IN | 7 | キルスイッチ(LOW=ON=運転状態, HIGH=OFF=停止状態) |
| INJ_OUT | A0 | 燃料噴射(LOW=ON) |
| IGN_OUT | A1 | 点火(LOW=ON) |
| STR_OUT | A2 | スタータリレー(LOW=ON) |
| DISRESET_OUT | A3 | リセットランプ(LOW=点灯, HIGH=消灯) |
| MA735_CS | 10 | MA735 SPI CS |
LOW アクティブ出力注意 (INJ/IGN/STR/DISRESET)。
割り込みで角度/速度更新
ReadNe_ISR: NE_A パルスで Ne_deg ±1 更新(NE_Bの位相参照)
G_PULSE_ISR: カムパルス同期フラグ設定
角度モデルと usecperdig
usecperdig は非エンコーダ・非MA735モード時にのみ補間に使用。Ne_deg += ROUTINE_CYCLE_US / usecperdig (エンコーダ無効かつ MA735無効時)。EncoderEnabled = true のため使用されない(初期値 1.0、無信号タイムアウト時にリセット)。周期関数 Routine:
スタート/キル状態評価
スタータステートマシン (StarterState): キルスイッチON時にスタートボタン押下(エッジ)でクランキング開始。
start_RPM 以上を 0.1秒 維持で始動成功(スタータ自動停止)、1.5秒(STARTER_TIMEOUT_MS)タイムアウトで始動失敗(再押しで再試行可)。
低rpm帯のMAP行(400/800/1200rpm、inj_end_ca=20)が始動用パラメータとして自動的に採用される
(始動専用のMAP切替フラグは無い。MAP 節参照)。
STR_IDLE → [ボタン押下(エッジ)+キルスイッチON] → STR_CRANKING
STR_CRANKING → [start_RPM以上を0.1秒維持] → STR_STARTED(スタータOFF)
STR_CRANKING → [1.5秒タイムアウト] → STR_FAILED(スタータOFF・ENG_ON OFF)
STR_FAILED → [ボタン再押し(エッジ)] → STR_CRANKING
キルスイッチOFF → 常に STR_IDLE へ強制リセット(`Launch` はリセットしない)
カム同期タイムアウト→cycleReset
マップ更新: updateEngineMap
噴射開始条件 (角度 >= INJ_STR_CA、MAP行の inj_end_ca と噴射時間から逆算、0CA跨ぎ対応)
360CA通過時に噴射継続中なら強制OFF(安全リセット)
噴射時間経過で OFF & 燃料量積算
点火進角計算 & 保持時間後 OFF
タスク statusTask:
snprintf + 一括 write)噴射終了角度: calculatedINJ_END_CA(MAPの該当行の inj_end_ca 列をそのまま採用。
始動時・通常時で切り替える専用ロジックは無く、rpmに応じたMAP行選択(MAP 節)に一本化されている)
噴射開始角度: INJ_STR_CA(毎サイクルリセット時に逆算)
INJ_STR_CA = calculatedINJ_END_CA - (calculatedINJ_time * 100[µs] * 360[deg]) / tachoWidth[µs]
// INJ_STR_CA < 0 の場合(0CA跨ぎ): INJ_STR_CA += 720
0CA跨ぎ対応: 噴射開始が720CA付近・終了が次サイクル序盤(例: 716CA→20CA)の場合、
INJ_STR_CA が負値になるため +720 で正規化(0〜720CAの範囲に収める)。
cycleReset() 呼び出し時に噴射継続中(INJ_Status == 2)であれば INJ状態をリセットせず、
タイマーで正常終了させる。
360CA安全リセット: 1サイクル内で360CAを通過した時点でも噴射中の場合は強制OFFし、
意図しない噴射継続を防止(inj360Reset フラグで1サイクルに1回限り実行)。
噴射時間: calculatedINJ_time (0.1ms単位) → 実際 µs: injDuration = calculatedINJ_time * 100
燃料量近似:
gasml += ( (Δt * 0.0000007) + 0.0015 ) / 1.5073
係数は実測燃費から逆算したインジェクタ流量補正。
calculatedIGN_CADwell_Time_US(クランキング中は Dwell_Time_CRANK_US)。適用中の値は Dwell_Time_Act_US
Dwell_Time_CA = Dwell_Time_Act_US * 360 / tachoWidthNe_deg >= (360 - calculatedIGN_CA - Dwell_Time_CA) で点火 LOW360 - calculatedIGN_CA に達する or Dwell_Time_Act_US 経過で HIGH 戻しMAP は RAM 上のダブルバンク(src/map_store.cpp)で保持し、ビルドし直さずに USB シリアル経由で書き換えられる。
参照ロジック: RPM 昇順テーブルの、最初に tachoRpm < rpm となるエントリを採用(階段状)。
行数は可変(最大 24 行)。
列順(CSV / SD 読込も同一。4列必須):
rpm,inj_time(x0.1msec),ign_ca(deg),inj_end_ca(deg)
This is the beginning of the README. Read the rest at the original. Read the full README ↗