implement ignition timing clamping (#212)

* implement ignition timing clamping

* ui, improved comment

* wrap atdc timing correctly

* tests
This commit is contained in:
Matthew Kennedy 2023-07-21 15:55:04 -07:00 committed by GitHub
parent 8b6eb9d562
commit 6f4a4fc373
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 28 additions and 4 deletions

View File

@ -32,6 +32,7 @@ Release template (copy/paste this for new release):
- Log per-cylinder true ignition timing (includes trim, knock retard, etc) #76 - Log per-cylinder true ignition timing (includes trim, knock retard, etc) #76
- Add mode for CLT/IAT sensors that are installed "high side" instead of typical "low side" #116 - Add mode for CLT/IAT sensors that are installed "high side" instead of typical "low side" #116
- Automatic supply voltage compensation for VVT solenoids, giving more stable control as battery voltage changes #209 - Automatic supply voltage compensation for VVT solenoids, giving more stable control as battery voltage changes #209
- Configurable ignition timing limits, adding safety particularly for engines running wasted spark with a large cam #211
### Fixed ### Fixed
- Improved bench test resolution (more usable for testing injectors, dwell, etc) - Improved bench test resolution (more usable for testing injectors, dwell, etc)

View File

@ -75,6 +75,9 @@ void setDefaultIgnition() {
engineConfiguration->timingMode = TM_DYNAMIC; engineConfiguration->timingMode = TM_DYNAMIC;
engineConfiguration->fixedModeTiming = 50; engineConfiguration->fixedModeTiming = 50;
engineConfiguration->minimumIgnitionTiming = -10;
engineConfiguration->maximumIgnitionTiming = 60;
// Dwell table // Dwell table
setConstantDwell(4); setConstantDwell(4);

View File

@ -80,6 +80,17 @@ static void prepareCylinderIgnitionSchedule(angle_t dwellAngleDuration, floatms_
// Pull any extra timing for knock retard // Pull any extra timing for knock retard
- engine->module<KnockController>()->getKnockRetard(); - engine->module<KnockController>()->getKnockRetard();
// 10 ATDC ends up as 710, convert it to -10 so we can log and clamp correctly
if (finalIgnitionTiming > 360) {
finalIgnitionTiming -= 720;
}
// Clamp the final ignition timing to the configured limits
// finalIgnitionTiming is deg BTDC
// minimumIgnitionTiming limits maximium retard
// maximumIgnitionTiming limits maximum advance
finalIgnitionTiming = clampF(engineConfiguration->minimumIgnitionTiming, finalIgnitionTiming, engineConfiguration->maximumIgnitionTiming);
engine->outputChannels.ignitionAdvanceCyl[event->cylinderNumber] = finalIgnitionTiming; engine->outputChannels.ignitionAdvanceCyl[event->cylinderNumber] = finalIgnitionTiming;
angle_t sparkAngle = angle_t sparkAngle =

View File

@ -92,7 +92,7 @@
! Any time an incompatible change is made to the configuration format stored in flash, ! Any time an incompatible change is made to the configuration format stored in flash,
! update this string to the current date! It is required to also update TS_SIGNATURE above ! update this string to the current date! It is required to also update TS_SIGNATURE above
! when this happens. ! when this happens.
#define FLASH_DATA_VERSION 20009 #define FLASH_DATA_VERSION 20010
! this offset is part of console compatibility mechanism, please DO NOT change this offset ! this offset is part of console compatibility mechanism, please DO NOT change this offset
#define TS_FILE_VERSION_OFFSET 124 #define TS_FILE_VERSION_OFFSET 124
@ -1169,7 +1169,8 @@ int16_t tps2Max;;"ADC", 1, 0, 0, 1023, 0
custom pwm_freq_t 2 scalar, U16, @OFFSET@, "Hz", 1, 0, 0, 3000, 0 custom pwm_freq_t 2 scalar, U16, @OFFSET@, "Hz", 1, 0, 0, 3000, 0
pwm_freq_t vvtOutputFrequency pwm_freq_t vvtOutputFrequency
uint16_t unused1538 int8_t minimumIgnitionTiming;Minimim timing advance allowed. No spark on any cylinder will ever fire after this angle BTDC. For example, setting -10 here means no spark ever fires later than 10 deg ATDC. Note that this only concerns the primary spark: any trailing sparks or multispark may violate this constraint.;"deg BTDC", 1, 0, -90, 90, 0
int8_t maximumIgnitionTiming;Maximum timing advance allowed. No spark on any cylinder will ever fire before this angle BTDC. For example, setting 45 here means no spark ever fires earlier than 45 deg BTDC;"deg BTDC", 1, 0, -90, 90, 0
int alternatorPwmFrequency;;"Hz", 1, 0, 0, 3000, 0 int alternatorPwmFrequency;;"Hz", 1, 0, 0, 3000, 0

View File

@ -2207,10 +2207,12 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@@@ts_command_e_TS_
dialog = ignitionBasic, "" dialog = ignitionBasic, ""
field = "Enabled", isIgnitionEnabled field = "Enabled", isIgnitionEnabled
field = "Mode", ignitionMode, {isIgnitionEnabled == 1} field = "Mode", ignitionMode, {isIgnitionEnabled}
field = "Maximum timing advance", maximumIgnitionTiming, {isIgnitionEnabled}
field = "Minimum timing advance", minimumIgnitionTiming, {isIgnitionEnabled}
field = "Override ignition table load axis", ignOverrideMode, {isIgnitionEnabled} field = "Override ignition table load axis", ignOverrideMode, {isIgnitionEnabled}
field = "#Use fixed timing while validating with a timing gun" field = "#Use fixed timing while validating with a timing gun"
field = "Timing Mode", timingMode, {isIgnitionEnabled == 1} field = "Timing Mode", timingMode, {isIgnitionEnabled}
field = "Fixed Timing", fixedTiming, {isIgnitionEnabled == 1 && timingMode == 1} field = "Fixed Timing", fixedTiming, {isIgnitionEnabled == 1 && timingMode == 1}
dialog = ignitionSettings, "", xAxis dialog = ignitionSettings, "", xAxis

View File

@ -84,6 +84,8 @@ TEST(trigger, test1995FordInline6TriggerDecoder) {
EngineTestHelper eth(engine_type_e::FORD_INLINE_6_1995); EngineTestHelper eth(engine_type_e::FORD_INLINE_6_1995);
engineConfiguration->isFasterEngineSpinUpEnabled = false; engineConfiguration->isFasterEngineSpinUpEnabled = false;
engineConfiguration->minimumIgnitionTiming = -15;
setWholeTimingTable(-13); setWholeTimingTable(-13);
Sensor::setMockValue(SensorType::Iat, 49.579071f); Sensor::setMockValue(SensorType::Iat, 49.579071f);
@ -104,7 +106,9 @@ TEST(trigger, test1995FordInline6TriggerDecoder) {
ASSERT_EQ(true, ecl->isReady) << "ford inline ignition events size"; ASSERT_EQ(true, ecl->isReady) << "ford inline ignition events size";
EXPECT_NEAR(ecl->elements[0].dwellAngle, 8.960f, 1e-3); EXPECT_NEAR(ecl->elements[0].dwellAngle, 8.960f, 1e-3);
EXPECT_NEAR(ecl->elements[0].sparkAngle, 14.96f, 1e-3);
EXPECT_NEAR(ecl->elements[5].dwellAngle, 608.960f, 1e-3); EXPECT_NEAR(ecl->elements[5].dwellAngle, 608.960f, 1e-3);
EXPECT_NEAR(ecl->elements[5].sparkAngle, 614.960f, 1e-3);
ASSERT_FLOAT_EQ(0.5, engine->ignitionState.getSparkDwell(2000)) << "running dwell"; ASSERT_FLOAT_EQ(0.5, engine->ignitionState.getSparkDwell(2000)) << "running dwell";
} }
@ -188,6 +192,7 @@ TEST(misc, testRpmCalculator) {
efiAssertVoid(ObdCode::CUSTOM_ERR_6670, engineConfiguration!=NULL, "null config in engine"); efiAssertVoid(ObdCode::CUSTOM_ERR_6670, engineConfiguration!=NULL, "null config in engine");
engineConfiguration->minimumIgnitionTiming = -15;
setWholeTimingTable(-13); setWholeTimingTable(-13);
engineConfiguration->trigger.customTotalToothCount = 8; engineConfiguration->trigger.customTotalToothCount = 8;
@ -237,6 +242,7 @@ TEST(misc, testRpmCalculator) {
assertEqualsM("one degree", 111.1111, engine->rpmCalculator.oneDegreeUs); assertEqualsM("one degree", 111.1111, engine->rpmCalculator.oneDegreeUs);
ASSERT_EQ( 1, ilist->isReady) << "size #2"; ASSERT_EQ( 1, ilist->isReady) << "size #2";
EXPECT_NEAR(ilist->elements[0].dwellAngle, 8.5f, 1e-3); EXPECT_NEAR(ilist->elements[0].dwellAngle, 8.5f, 1e-3);
EXPECT_NEAR(ilist->elements[0].sparkAngle, 13.0f, 1e-3);
ASSERT_EQ( 0, eth.engine.triggerCentral.triggerState.getCurrentIndex()) << "index #2"; ASSERT_EQ( 0, eth.engine.triggerCentral.triggerState.getCurrentIndex()) << "index #2";
ASSERT_EQ( 4, engine->executor.size()) << "queue size/2"; ASSERT_EQ( 4, engine->executor.size()) << "queue size/2";