auto-sync

This commit is contained in:
rusEfi 2014-11-06 09:06:08 -06:00
parent a2ec9ec37f
commit 1647ad5efc
12 changed files with 29 additions and 22 deletions

View File

@ -24,6 +24,10 @@ void setBmwE43(engine_configuration_s *engineConfiguration) {
engineConfiguration->injectionMode = IM_SIMULTANEOUS; engineConfiguration->injectionMode = IM_SIMULTANEOUS;
engineConfiguration->ignitionMode = IM_WASTED_SPARK; engineConfiguration->ignitionMode = IM_WASTED_SPARK;
setConstantDwell(engineConfiguration, 3); // a bit shorter dwell
engineConfiguration->useConstantDwellDuringCranking = true;
engineConfiguration->ignitionDwellForCrankingMs = 5;
// todo: check the digital sniffer while simulating // todo: check the digital sniffer while simulating
// set_global_trigger_offset_angle 84 // set_global_trigger_offset_angle 84
engineConfiguration->globalTriggerAngleOffset = 84; engineConfiguration->globalTriggerAngleOffset = 84;

View File

@ -179,8 +179,6 @@ void printState(Engine *engine, int currentCkpEventCounter) {
debugFloat(&logger, "timing", getAdvance(rpm, engineLoad), 2); debugFloat(&logger, "timing", getAdvance(rpm, engineLoad), 2);
// float map = getMap(); // float map = getMap();
// float fuel = getDefaultFuel(rpm, map);
// debugFloat(&logger, "d_fuel", fuel, 2);
#endif /* EFI_SHAFT_POSITION_INPUT */ #endif /* EFI_SHAFT_POSITION_INPUT */
} }
@ -454,7 +452,7 @@ void updateTunerStudioState(Engine *engine, TunerStudioOutputChannels *tsOutputC
tsOutputChannels->isIatError = !isValidIntakeAirTemperature(getIntakeAirTemperature(engine)); tsOutputChannels->isIatError = !isValidIntakeAirTemperature(getIntakeAirTemperature(engine));
#endif #endif
tsOutputChannels->tCharge = getTCharge(rpm, tps, coolant, intake); tsOutputChannels->tCharge = getTCharge(rpm, tps, coolant, intake);
tsOutputChannels->sparkDwell = getSparkDwellMs(rpm); tsOutputChannels->sparkDwell = getSparkDwellMsT(engineConfiguration, rpm);
tsOutputChannels->pulseWidthMs = getRunningFuel(baseFuelMs, engine, rpm); tsOutputChannels->pulseWidthMs = getRunningFuel(baseFuelMs, engine, rpm);
tsOutputChannels->crankingFuelMs = getCrankingFuel(engine); tsOutputChannels->crankingFuelMs = getCrankingFuel(engine);
} }

View File

@ -50,7 +50,7 @@ float getAdvance(int rpm, float engineLoad) {
} else { } else {
angle = -getBaseAdvance(rpm, engineLoad); angle = -getBaseAdvance(rpm, engineLoad);
} }
return fixAngle(angle + engineConfiguration->ignitionOffset); return fixAngle(engineConfiguration, angle + engineConfiguration->ignitionOffset);
} }
void prepareTimingMap(void) { void prepareTimingMap(void) {

View File

@ -141,6 +141,7 @@ void setDefaultConfiguration(engine_configuration_s *engineConfiguration, board_
} }
setConstantDwell(engineConfiguration, 4); // 4ms is global default dwell setConstantDwell(engineConfiguration, 4); // 4ms is global default dwell
engineConfiguration->useConstantDwellDuringCranking = false;
setFuelLoadBin(engineConfiguration, 1.2, 4.4); setFuelLoadBin(engineConfiguration, 1.2, 4.4);
setFuelRpmBin(engineConfiguration, 800, 7000); setFuelRpmBin(engineConfiguration, 800, 7000);

View File

@ -440,6 +440,7 @@ typedef struct {
bool_t hasIatSensor : 1; // bit 1 bool_t hasIatSensor : 1; // bit 1
bool_t hasBaroSensor : 1; // bit 1 bool_t hasBaroSensor : 1; // bit 1
bool_t hasAfrSensor : 1; // bit 2 bool_t hasAfrSensor : 1; // bit 2
bool_t useConstantDwellDuringCranking : 1; // bit 3
// that's the next 32 bit field // that's the next 32 bit field
int hasCltSensor; int hasCltSensor;
@ -480,7 +481,9 @@ typedef struct {
float crankingCycleCoef[CRANKING_CURVE_SIZE]; float crankingCycleCoef[CRANKING_CURVE_SIZE];
float crankingCycleBins[CRANKING_CURVE_SIZE]; float crankingCycleBins[CRANKING_CURVE_SIZE];
int unused3[94]; float ignitionDwellForCrankingMs;
int unused3[93];
} engine_configuration_s; } engine_configuration_s;

View File

@ -50,7 +50,7 @@ float getCrankshaftRevolutionTimeMs(int rpm) {
* @brief Shifts angle into the [0..720) range * @brief Shifts angle into the [0..720) range
* TODO: should be 'crankAngleRange' range? * TODO: should be 'crankAngleRange' range?
*/ */
float fixAngle(float angle) { float fixAngle(engine_configuration_s const *engineConfiguration, float angle) {
// I guess this implementation would be faster than 'angle % 720' // I guess this implementation would be faster than 'angle % 720'
while (angle < 0) while (angle < 0)
angle += 720; angle += 720;
@ -231,9 +231,13 @@ void addFuelEvents(engine_configuration_s const *e, engine_configuration2_s *eng
*/ */
float getSparkDwellMsT(engine_configuration_s *engineConfiguration, int rpm) { float getSparkDwellMsT(engine_configuration_s *engineConfiguration, int rpm) {
if (isCrankingR(rpm)) { if (isCrankingR(rpm)) {
if(engineConfiguration->useConstantDwellDuringCranking) {
return engineConfiguration->ignitionDwellForCrankingMs;
} else {
// technically this could be implemented via interpolate2d // technically this could be implemented via interpolate2d
float angle = engineConfiguration->crankingChargeAngle; float angle = engineConfiguration->crankingChargeAngle;
return getOneDegreeTimeMs(rpm) * angle; return getOneDegreeTimeMs(rpm) * angle;
}
} }
efiAssert(!cisnan(rpm), "invalid rpm", NAN); efiAssert(!cisnan(rpm), "invalid rpm", NAN);
@ -255,7 +259,7 @@ int getEngineCycleEventCount(engine_configuration_s const *engineConfiguration,
void findTriggerPosition(engine_configuration_s const *engineConfiguration, trigger_shape_s * s, void findTriggerPosition(engine_configuration_s const *engineConfiguration, trigger_shape_s * s,
event_trigger_position_s *position, float angleOffset) { event_trigger_position_s *position, float angleOffset) {
angleOffset = fixAngle(angleOffset + engineConfiguration->globalTriggerAngleOffset); angleOffset = fixAngle(engineConfiguration, angleOffset + engineConfiguration->globalTriggerAngleOffset);
int engineCycleEventCount = getEngineCycleEventCount(engineConfiguration, s); int engineCycleEventCount = getEngineCycleEventCount(engineConfiguration, s);
@ -345,7 +349,7 @@ void prepareOutputSignals(Engine *engine) {
engine_configuration2_s *engineConfiguration2 = engine->engineConfiguration2; engine_configuration2_s *engineConfiguration2 = engine->engineConfiguration2;
// todo: move this reset into decoder // todo: move this reset into decoder
engineConfiguration2->triggerShape.calculateTriggerSynchPoint(&engineConfiguration->triggerConfig); engineConfiguration2->triggerShape.calculateTriggerSynchPoint(engineConfiguration, &engineConfiguration->triggerConfig);
injectonSignals.clear(); injectonSignals.clear();
EventHandlerConfiguration *config = &engineConfiguration2->engineEventConfiguration; EventHandlerConfiguration *config = &engineConfiguration2->engineEventConfiguration;

View File

@ -21,8 +21,6 @@ void findTriggerPosition(engine_configuration_s const *engineConfiguration, trig
int isInjectionEnabled(engine_configuration_s *engineConfiguration); int isInjectionEnabled(engine_configuration_s *engineConfiguration);
float fixAngle(float angle);
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
@ -30,7 +28,7 @@ extern "C"
{ {
#endif /* __cplusplus */ #endif /* __cplusplus */
float getDefaultFuel(int rpm, float map); float fixAngle(engine_configuration_s const *engineConfiguration, float angle);
/** /**
* So that's how 'inline' syntax for both GCC and IAR * So that's how 'inline' syntax for both GCC and IAR
@ -57,7 +55,6 @@ float getEngineLoadT(Engine *engine);
#define getEngineLoad() getEngineLoadT(&engine) #define getEngineLoad() getEngineLoadT(&engine)
float getSparkDwellMsT(engine_configuration_s *engineConfiguration, int rpm); float getSparkDwellMsT(engine_configuration_s *engineConfiguration, int rpm);
#define getSparkDwellMs(rpm) getSparkDwellMsT(engineConfiguration, rpm)
int getCylinderId(firing_order_e firingOrder, int index); int getCylinderId(firing_order_e firingOrder, int index);

View File

@ -22,6 +22,7 @@
#include "trigger_structure.h" #include "trigger_structure.h"
#include "error_handling.h" #include "error_handling.h"
#include "trigger_decoder.h" #include "trigger_decoder.h"
#include "engine_math.h"
trigger_shape_helper::trigger_shape_helper() { trigger_shape_helper::trigger_shape_helper() {
for (int i = 0; i < TRIGGER_CHANNEL_COUNT; i++) { for (int i = 0; i < TRIGGER_CHANNEL_COUNT; i++) {
@ -53,13 +54,12 @@ int trigger_shape_s::getTriggerShapeSynchPointIndex() {
// todo: clean-up! // todo: clean-up!
int getEngineCycleEventCount2(operation_mode_e mode, trigger_shape_s * s); int getEngineCycleEventCount2(operation_mode_e mode, trigger_shape_s * s);
float fixAngle(float angle);
void trigger_shape_s::calculateTriggerSynchPoint(trigger_config_s const*triggerConfig) { void trigger_shape_s::calculateTriggerSynchPoint(engine_configuration_s const*engineConfiguration, trigger_config_s const*triggerConfig) {
setTriggerShapeSynchPointIndex(findTriggerZeroEventIndex(this, triggerConfig)); setTriggerShapeSynchPointIndex(engineConfiguration, findTriggerZeroEventIndex(this, triggerConfig));
} }
void trigger_shape_s::setTriggerShapeSynchPointIndex(int triggerShapeSynchPointIndex) { void trigger_shape_s::setTriggerShapeSynchPointIndex(engine_configuration_s const *engineConfiguration, int triggerShapeSynchPointIndex) {
this->triggerShapeSynchPointIndex = triggerShapeSynchPointIndex; this->triggerShapeSynchPointIndex = triggerShapeSynchPointIndex;
int engineCycleEventCount = getEngineCycleEventCount2(operationMode, this); int engineCycleEventCount = getEngineCycleEventCount2(operationMode, this);
@ -71,7 +71,7 @@ void trigger_shape_s::setTriggerShapeSynchPointIndex(int triggerShapeSynchPointI
// explicit check for zero to avoid issues where logical zero is not exactly zero due to float nature // explicit check for zero to avoid issues where logical zero is not exactly zero due to float nature
eventAngles[i] = 0; eventAngles[i] = 0;
} else { } else {
eventAngles[i] = fixAngle(getAngle((triggerShapeSynchPointIndex + i) % engineCycleEventCount) - firstAngle); eventAngles[i] = fixAngle(engineConfiguration, getAngle((triggerShapeSynchPointIndex + i) % engineCycleEventCount) - firstAngle);
} }
} }
} }

View File

@ -83,9 +83,9 @@ public:
int getTriggerShapeSynchPointIndex(); int getTriggerShapeSynchPointIndex();
void calculateTriggerSynchPoint(trigger_config_s const*triggerConfig); void calculateTriggerSynchPoint(engine_configuration_s const *engineConfiguration, trigger_config_s const*triggerConfig);
void setTriggerShapeSynchPointIndex(int triggerShapeSynchPointIndex); void setTriggerShapeSynchPointIndex(engine_configuration_s const *engineConfiguration, int triggerShapeSynchPointIndex);
/** /**
* These angles are in event coordinates - with synchronization point located at angle zero. * These angles are in event coordinates - with synchronization point located at angle zero.
* These values are pre-calculated for performance reasons. * These values are pre-calculated for performance reasons.

View File

@ -234,7 +234,7 @@ static void reportWave(Logging *logging, int index) {
float oneDegreeUs = getOneDegreeTimeUs(getRpm()); float oneDegreeUs = getOneDegreeTimeUs(getRpm());
appendPrintf(logging, "advance%d%s", index, DELIMETER); appendPrintf(logging, "advance%d%s", index, DELIMETER);
appendFloat(logging, fixAngle((offsetUs / oneDegreeUs) - engineConfiguration->globalTriggerAngleOffset), 3); appendFloat(logging, fixAngle(engineConfiguration, (offsetUs / oneDegreeUs) - engineConfiguration->globalTriggerAngleOffset), 3);
appendPrintf(logging, "%s", DELIMETER); appendPrintf(logging, "%s", DELIMETER);
} }
} }

View File

@ -249,5 +249,5 @@ void firmwareError(const char *fmt, ...) {
} }
int getRusEfiVersion(void) { int getRusEfiVersion(void) {
return 20141105; return 20141106;
} }

View File

@ -156,7 +156,7 @@ void testAngleResolver(void) {
confgiureFordAspireTriggerShape(ts); confgiureFordAspireTriggerShape(ts);
ts->calculateTriggerSynchPoint(&engineConfiguration->triggerConfig); ts->calculateTriggerSynchPoint(engineConfiguration, &engineConfiguration->triggerConfig);
assertEqualsM("index 2", 232.76, ts->eventAngles[3]); // this angle is relation to synch point assertEqualsM("index 2", 232.76, ts->eventAngles[3]); // this angle is relation to synch point
assertEqualsM("time 2", 0.3233, ts->wave.getSwitchTime(2)); assertEqualsM("time 2", 0.3233, ts->wave.getSwitchTime(2));