rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
default_base_engine.cpp
Go to the documentation of this file.
1#include "pch.h"
2
3#include "defaults.h"
4#include "vr_pwm.h"
5#include "kline.h"
7#include <rusefi/manifest.h>
8#if HW_PROTEUS
9#include "proteus_meta.h"
10#endif // HW_PROTEUS
11
12#if EFI_ALTERNATOR_CONTROL
20#endif // EFI_ALTERNATOR_CONTROL
21
22void setHpfpLobeProfileAngle(int lobes) {
23#if HPFP_LOBE_PROFILE_SIZE == 16
24static const float hardCodedHpfpLobeProfileAnglesForThreeLobes[16] = {0.0, 7.5, 16.5, 24.0,
2532.0 , 40.0, 48.0, 56.0,
2664.0 , 72.0, 80.0, 88.0,
2796.0 , 103.5, 112.5, 120.0
28};
29
30 float multiplier = 3.0 / lobes;
31 for (size_t i = 0; i < HPFP_LOBE_PROFILE_SIZE; i++) {
32 config->hpfpLobeProfileAngle[i] = multiplier * hardCodedHpfpLobeProfileAnglesForThreeLobes[i];
33 }
34#endif // HPFP_LOBE_PROFILE_SIZE
35}
36
37static void setDefaultHPFP() {
38#if ! EFI_UNIT_TEST
39 // unit tests rely on 'hpfpCamLobes' for isGdiEngine() and we need not-GDI by default for unit tests
41#endif
42
43// todo: would be nice for unit tests to be happy about these defaults
44#if EFI_PROD_CODE || EFI_SIMULATOR
46#endif
53}
54
69
71#ifdef HW_HELLEN_8CHAN
73#endif
74
75 engineConfiguration->injectionMode = IM_SEQUENTIAL;
77 engineConfiguration->ignitionMode = IM_INDIVIDUAL_COILS;
78
80 // Use high pressure sensor
82 // Automatic compensation of injector flow based on rail pressure
83 engineConfiguration->injectorCompensationMode = ICM_SensedRailPressure;
84 // Reference rail pressure is 10 000 kPa = 100 bar
86 //setting "flat" 0.2 ms injector's lag time
88
92}
93
94/* Cylinder to bank mapping */
96 for (size_t i = 0; i < engineConfiguration->cylindersCount; i++) {
97 // zero-based index
99 }
100}
101
102static void mc33810defaults() {
104 engineConfiguration->mc33810maxDwellTimer = mc33810maxDwellTimer_e::DWELL_8MS;
106}
107
128
130 if (config->dynoCarCarMassKg == 0) {
132 }
133
136 }
137
140 }
143 }
144
147 }
150 }
153 }
154
157 }
160 }
163 }
164
167 }
168}
169
171 // Base Engine Settings
174#if MAX_CYLINDER_COUNT >= 4
175 setInline4();
176#else
177 // todo: invoke more complete one cylinder default?
179#endif
180
182
183 for (size_t i = 0; i < engineConfiguration->cylindersCount; i++) {
184 // one knock sensor by default. See also 'setLeftRightBanksNeedBetterName()'
185 // zero-based index
187 }
188
191
196
198
199#ifdef EFI_KLINE
200 engineConfiguration->kLinePeriodUs = 300 /* us*/;
202#endif
203
205
206 // it's useful to know what starting point is given tune based on
207 engineConfiguration->calibrationBirthday = compilationYear() * 10000 + compilationMonth() * 100 + compilationDay();
208
210
213
216
220
223
225
230
232
233 setLinearCurve(engineConfiguration->tractionControlSlipBins, /*from*/0.9, /*to*/1.2, 0.05);
235
237
239
241 // here we assume load is TPS
243
244 engineConfiguration->fuelAlgorithm = engine_load_mode_e::LM_SPEED_DENSITY;
245 // let's have valid default while we still have the field
246 engineConfiguration->debugMode = DBG_EXECUTOR;
247
248 engineConfiguration->speedometerPulsePerKm = 2485; // GM GMT800 platform
249
251 // this should not be below default rpm! maybe even make them equal?
253
254 // todo: this "2JZ" trigger is very powerful for many low tooth quantity applications
255 // todo: we might be getting closer to a re-name
256 // by the way 2GRFE intake likes position 160 / precision 20
257 // see also https://github.com/rusefi/rusefi/issues/7345
258 //
259 // 2JZ values
262
263 // Limits and Fallbacks
269
271
273
274 // CLT RPM limit table - just the X axis
275 copyArray(config->cltRevLimitRpmBins, { -20, 0, 40, 80 });
276
281// engineConfiguration->alsMinPps = 10;
285
287
292
296
297 // Trigger
299
300#if EFI_SIMULATOR
301 engineConfiguration->vvtMode[0] = VVT_SINGLE_TOOTH;
303 engineConfiguration->vvtPins[0] = Gpio::A0; // a random unused pin needed to unblock startSimplePwmExt()
304#endif // EFI_SIMULATOR
305
306#if EFI_SIMULATOR
307 // R
308 config->tcuSolenoidTable[0][0] = 99;
309 config->tcuSolenoidTable[0][1] = 1;
310 config->tcuSolenoidTable[0][2] = 2;
311 config->tcuSolenoidTable[0][3] = 3;
312 config->tcuSolenoidTable[0][4] = 4;
313 config->tcuSolenoidTable[0][5] = 5;
314 // P/N
315 config->tcuSolenoidTable[1][0] = 10;
316 config->tcuSolenoidTable[1][1] = 11;
317 config->tcuSolenoidTable[1][2] = 12;
318 config->tcuSolenoidTable[1][3] = 13;
319 config->tcuSolenoidTable[1][4] = 14;
320 config->tcuSolenoidTable[1][5] = 15;
321 config->tcuSolenoidTable[1][6] = 16;
322 config->tcuSolenoidTable[1][7] = 17;
323 config->tcuSolenoidTable[1][8] = 18;
324 config->tcuSolenoidTable[1][9] = 19;
325 // 1
326 config->tcuSolenoidTable[2][0] = 20;
327 config->tcuSolenoidTable[2][1] = 21;
328 config->tcuSolenoidTable[2][2] = 22;
329 // 2
330 config->tcuSolenoidTable[3][0] = 30;
331 config->tcuSolenoidTable[3][1] = 31;
332 config->tcuSolenoidTable[3][3] = 33;
333 // 3
334 config->tcuSolenoidTable[4][0] = 40;
335 config->tcuSolenoidTable[4][1] = 41;
336 config->tcuSolenoidTable[4][4] = 44;
337 // 4
338 config->tcuSolenoidTable[5][0] = 50;
339 config->tcuSolenoidTable[5][1] = 51;
340 config->tcuSolenoidTable[5][5] = 55;
341
342 // [tag:runNotSquareTest] huh why is this not a unit test?!
343 config->scriptTable4[0][0] = 140;
344 config->scriptTable4[0][1] = 141;
345 config->scriptTable4[0][2] = 142;
346 config->scriptTable4[0][3] = 143;
347 config->scriptTable4[0][4] = 144;
348 config->scriptTable4[0][5] = 145;
349
350 config->scriptTable4[1][0] = 240;
351 config->scriptTable4[1][1] = 241;
352 config->scriptTable4[1][2] = 242;
353 config->scriptTable4[1][3] = 243;
354 config->scriptTable4[1][4] = 244;
355 config->scriptTable4[1][5] = 245;
356
357 config->scriptTable4[4][0] = 40;
358 config->scriptTable4[4][2] = 41;
359 config->scriptTable4[4][3] = 42;
360 config->scriptTable4[4][4] = 43;
361 config->scriptTable4[4][5] = 44;
362 config->scriptTable4[4][5] = 45;
363
364 config->scriptTable4[5][0] = 50;
365 config->scriptTable4[5][1] = 51;
366 config->scriptTable4[5][2] = 52;
367 config->scriptTable4[5][3] = 53;
368 config->scriptTable4[5][4] = 54;
369 config->scriptTable4[5][5] = 55;
370
371#endif // EFI_SIMULATOR
372
374
375 // Default this to on - if you want to diagnose, turn it off.
377
382
383 engineConfiguration->etbSplit = MAX_TPS_PPS_DISCREPANCY;
384
385 // Advanced Trigger
386
387 // Battery and alternator
388 engineConfiguration->vbattDividerCoeff = ((float) (15 + 65)) / 15;
389
390#if EFI_ALTERNATOR_CONTROL
392#endif /* EFI_ALTERNATOR_CONTROL */
393
394 // Fuel pump
395 // todo: maybe change to 2s as default?
397
398 engineConfiguration->kLineBaudRate = KLINE_BAUD_RATE;
399
403
404
405 // Tachometer
406 // 50% duty cycle is the default for tach signal
410
413
416
417 //knock
418#ifdef KNOCK_SPECTROGRAM
423#endif
424
425 // Check engine light
426#if EFI_PROD_CODE
428#else
430#endif /* EFI_PROD_CODE */
431
433
434 // Oil pressure protection
438
439 engine->engineModules.apply_all([](auto & m) { m.setDefaultConfiguration(); });
440
442
443 // we invoke this last so that we can validate even defaults
445}
446
451
456
457void setTPS1Calibration(uint16_t tpsMin, uint16_t tpsMax) {
458 engineConfiguration->tpsMin = tpsMin;
459 engineConfiguration->tpsMax = tpsMax;
460}
461
462void setTPS1Calibration(uint16_t tpsMin, uint16_t tpsMax, uint16_t tps1SecondaryMin, uint16_t tps1SecondaryMax) {
463 setTPS1Calibration(tpsMin, tpsMax);
464
465
466 engineConfiguration->tps1SecondaryMin = tps1SecondaryMin;
467 engineConfiguration->tps1SecondaryMax = tps1SecondaryMax;
468}
469
470void setCustomMap(float lowValue, float mapLowValueVoltage, float highValue, float mapHighValueVoltage) {
471 engineConfiguration->map.sensor.type = MT_CUSTOM;
473 engineConfiguration->mapLowValueVoltage = mapLowValueVoltage;
475 engineConfiguration->mapHighValueVoltage = mapHighValueVoltage;
476}
477
478void setPPSCalibration(float primaryUp, float primaryDown, float secondaryUp, float secondaryDown) {
483}
484
485void setEtbPID(float p, float i, float d) {
489}
490
495
497#if HW_PROTEUS && EFI_PROD_CODE
498 engineConfiguration->tps1_2AdcChannel = PROTEUS_IN_TPS1_2;
499 setPPSInputs(PROTEUS_IN_PPS, PROTEUS_IN_PPS2);
500#endif // HW_PROTEUS
501}
502
503void setupTLE9201(Gpio controlPin, Gpio direction, Gpio disable, int dcIndex) {
504 // TLE9201 driver
505 // This chip has three control pins:
506 // DIR - sets direction of the motor
507 // PWM - pwm control (enable high, coast low)
508 // DIS - disables motor (enable low)
509
510 // PWM pin
511 engineConfiguration->etbIo[dcIndex].controlPin = controlPin;
512 // DIR pin
513 engineConfiguration->etbIo[dcIndex].directionPin1 = direction;
514 // Disable pin
516
517 // we only have pwm/dir, no dira/dirb
519}
520
521void setupTLE9201IncludingStepper(Gpio controlPin, Gpio direction, Gpio disable, int dcIndex) {
522 setupTLE9201(controlPin, direction, disable, dcIndex);
523
524 // on SBC style stepper IAC fully-extended valve shaft would give least idle air
525 // fully-retracted valve shaft would give most idle air
526 int stepperIndexWeirdness = 1 - dcIndex;
527 engineConfiguration->stepperDcIo[stepperIndexWeirdness].controlPin = controlPin;
528 engineConfiguration->stepperDcIo[stepperIndexWeirdness].directionPin1 = direction;
530 engineConfiguration->stepperDcIo[stepperIndexWeirdness].disablePin = disable;
531}
type_list< Mockable< InjectorModelPrimary >, Mockable< InjectorModelSecondary >,#if EFI_IDLE_CONTROL Mockable< IdleController >,#endif TriggerScheduler,#if EFI_HPFP &&EFI_ENGINE_CONTROL Mockable< HpfpController >,#endif #if EFI_ENGINE_CONTROL Mockable< ThrottleModel >,#endif #if EFI_ALTERNATOR_CONTROL AlternatorController,#endif MainRelayController, Mockable< IgnitionController >, Mockable< AcController >, PrimeController, DfcoController,#if EFI_HD_ACR HarleyAcr,#endif Mockable< WallFuelController >, KnockController, SensorChecker,#if EFI_ENGINE_CONTROL Mockable< LimpManager >,#endif #if EFI_VVT_PID VvtController1, VvtController2, VvtController3, VvtController4,#endif #if EFI_BOOST_CONTROL BoostController,#endif TpsAccelEnrichment,#if EFI_LAUNCH_CONTROL NitrousController,#endif #if EFI_LTFT_CONTROL LongTermFuelTrim,#endif ShortTermFuelTrim,#include "modules_list_generated.h" EngineModule > engineModules
Definition engine.h:198
@ Unassigned
void setHpfpLobeProfileAngle(int lobes)
void defaultsOrFixOnBurn()
void setTPS1Calibration(uint16_t tpsMin, uint16_t tpsMax)
void setCustomMap(float lowValue, float mapLowValueVoltage, float highValue, float mapHighValueVoltage)
void setGDIFueling()
void setProteusEtbIO()
static void mc33810defaults()
void setPPSInputs(adc_channel_e pps1, adc_channel_e pps2)
void setInline4()
static void setDefaultAlternatorParameters()
static void setGdiDefaults()
void setTPS1Inputs(adc_channel_e tps1, adc_channel_e tps2)
void setEtbPID(float p, float i, float d)
void setPPSCalibration(float primaryUp, float primaryDown, float secondaryUp, float secondaryDown)
void setupTLE9201IncludingStepper(Gpio controlPin, Gpio direction, Gpio disable, int dcIndex)
void setDynoDefaults()
static void setDefaultHPFP()
void setupTLE9201(Gpio controlPin, Gpio direction, Gpio disable, int dcIndex)
void setLeftRightBanksNeedBetterName()
void setDefaultBaseEngine()
void setGdiWallWetting()
static EngineAccessor engine
Definition engine.h:421
static constexpr persistent_config_s * config
static constexpr engine_configuration_s * engineConfiguration
static RedundantPair tps2(tps2p, tps2s, SensorType::Tps2)
static void disable(const char *param)
Definition settings.cpp:449
uint8_t tractionControlSpeedBins[TRACTION_CONTROL_ETB_DROP_SPEED_SIZE]
scaled_channel< uint16_t, 100, 1 > tractionControlSlipBins[TRACTION_CONTROL_ETB_DROP_SLIP_SIZE]
scaled_channel< int16_t, 100, 1 > battLagCorrTable[VBAT_INJECTOR_CURVE_PRESSURE_SIZE][VBAT_INJECTOR_CURVE_SIZE]
scaled_channel< uint16_t, 10, 1 > injectorFlowLinearizationPressureBins[FLOW_LINEARIZATION_PRESSURE_SIZE]
scaled_channel< uint8_t, 1, 100 > maximumOilPressureBins[4]
scaled_channel< uint16_t, 10, 1 > hpfpFuelMassCompensationFuelPressure[HPFP_FUEL_MASS_COMPENSATION_SIZE]
int16_t injectionPhase[INJ_PHASE_LOAD_COUNT][INJ_PHASE_RPM_COUNT]
uint8_t tcuSolenoidTable[TCU_SOLENOID_COUNT][TCU_GEAR_COUNT]
scaled_channel< uint8_t, 1, 50 > hpfpTargetRpmBins[HPFP_TARGET_SIZE]
scaled_channel< int16_t, 1, 1 > cltRevLimitRpmBins[CLT_LIMITER_CURVE_SIZE]
uint8_t scriptTable4[TABLE_4_LOAD_SIZE][TABLE_4_RPM_SIZE]
uint16_t hpfpTarget[HPFP_TARGET_SIZE][HPFP_TARGET_SIZE]
scaled_channel< uint16_t, 100, 1 > injectorFlowLinearizationFuelMassBins[FLOW_LINEARIZATION_MASS_SIZE]
scaled_channel< uint8_t, 1, 100 > maxKnockRetardRpmBins[KNOCK_TABLE_RPM_SIZE]
scaled_channel< int16_t, 10, 1 > alternatorVoltageTargetTable[ALTERNATOR_VOLTAGE_TARGET_SIZE][ALTERNATOR_VOLTAGE_RPM_SIZE]
scaled_channel< uint16_t, 100, 1 > hpfpFuelMassCompensationFuelMass[HPFP_FUEL_MASS_COMPENSATION_SIZE]
scaled_channel< uint16_t, 10, 1 > hpfpTargetLoadBins[HPFP_TARGET_SIZE]
scaled_channel< uint8_t, 1, 100 > minimumOilPressureBins[8]
scaled_channel< uint8_t, 2, 1 > hpfpLobeProfileAngle[HPFP_LOBE_PROFILE_SIZE]
scaled_channel< uint8_t, 4, 1 > maxKnockRetardTable[KNOCK_TABLE_SIZE][KNOCK_TABLE_RPM_SIZE]
scaled_channel< uint16_t, 100, 1 > hpfpFuelMassCompensation[HPFP_FUEL_MASS_COMPENSATION_SIZE][HPFP_FUEL_MASS_COMPENSATION_SIZE]
constexpr void setTable(TElement(&dest)[N][M], const VElement value)
void setRpmTableBin(TValue(&array)[TSize])
void setLinearCurve(TValue(&array)[TSize], float from, float to, float precision=0.01f)
void setDefaultVrThresholds()
Definition vr_pwm.cpp:57