mirror of https://github.com/FOME-Tech/fome-fw.git
remove idle thread; just call from periodicSlowCallback (#1924)
* remove thread * remove ui
This commit is contained in:
parent
11ad112bc3
commit
605269c358
|
@ -421,7 +421,6 @@ void setMiataNA6_MAP_MRE(DECLARE_CONFIG_PARAMETER_SIGNATURE) {
|
||||||
engineConfiguration->idleTimingPid.dFactor = 0.0;
|
engineConfiguration->idleTimingPid.dFactor = 0.0;
|
||||||
engineConfiguration->idleTimingPid.minValue = -13;
|
engineConfiguration->idleTimingPid.minValue = -13;
|
||||||
engineConfiguration->idleTimingPid.maxValue = 13;
|
engineConfiguration->idleTimingPid.maxValue = 13;
|
||||||
engineConfiguration->idleTimingPid.periodMs = 8;
|
|
||||||
engineConfiguration->idleTimingPidWorkZone = 150;
|
engineConfiguration->idleTimingPidWorkZone = 150;
|
||||||
engineConfiguration->idlePidFalloffDeltaRpm = 50;
|
engineConfiguration->idlePidFalloffDeltaRpm = 50;
|
||||||
engineConfiguration->idleTimingPidDeadZone = 10;
|
engineConfiguration->idleTimingPidDeadZone = 10;
|
||||||
|
|
|
@ -182,7 +182,7 @@ void setIdleMode(idle_mode_e value DECLARE_ENGINE_PARAMETER_SUFFIX) {
|
||||||
showIdleInfo();
|
showIdleInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
percent_t getIdlePosition(void) {
|
percent_t getIdlePosition() {
|
||||||
return engine->engineState.idle.currentIdlePosition;
|
return engine->engineState.idle.currentIdlePosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,7 +329,7 @@ static percent_t automaticIdleController(float tpsPos DECLARE_ENGINE_PARAMETER_S
|
||||||
// If errorAmpCoef > 1.0, then PID thinks that RPM is lower than it is, and controls IAC more aggressively
|
// If errorAmpCoef > 1.0, then PID thinks that RPM is lower than it is, and controls IAC more aggressively
|
||||||
getIdlePid(PASS_ENGINE_PARAMETER_SIGNATURE)->setErrorAmplification(errorAmpCoef);
|
getIdlePid(PASS_ENGINE_PARAMETER_SIGNATURE)->setErrorAmplification(errorAmpCoef);
|
||||||
|
|
||||||
percent_t newValue = getIdlePid(PASS_ENGINE_PARAMETER_SIGNATURE)->getOutput(targetRpm, rpm);
|
percent_t newValue = getIdlePid(PASS_ENGINE_PARAMETER_SIGNATURE)->getOutput(targetRpm, rpm, SLOW_CALLBACK_PERIOD_MS / 1000.0f);
|
||||||
engine->engineState.idle.idleState = PID_VALUE;
|
engine->engineState.idle.idleState = PID_VALUE;
|
||||||
|
|
||||||
// the state of PID has been changed, so we might reset it now, but only when needed (see idlePidDeactivationTpsThreshold)
|
// the state of PID has been changed, so we might reset it now, but only when needed (see idlePidDeactivationTpsThreshold)
|
||||||
|
@ -368,12 +368,8 @@ static percent_t automaticIdleController(float tpsPos DECLARE_ENGINE_PARAMETER_S
|
||||||
return newValue;
|
return newValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int IdleController::getPeriodMs() {
|
float IdleController::getIdlePosition() {
|
||||||
return GET_PERIOD_LIMITED(&engineConfiguration->idleRpmPid);
|
efiAssert(OBD_PCM_Processor_Fault, engineConfiguration != NULL, "engineConfiguration pointer", 0);
|
||||||
}
|
|
||||||
|
|
||||||
void IdleController::PeriodicTask() {
|
|
||||||
efiAssertVoid(OBD_PCM_Processor_Fault, engineConfiguration != NULL, "engineConfiguration pointer");
|
|
||||||
/*
|
/*
|
||||||
* Here we have idle logic thread - actual stepper movement is implemented in a separate
|
* Here we have idle logic thread - actual stepper movement is implemented in a separate
|
||||||
* working thread,
|
* working thread,
|
||||||
|
@ -508,11 +504,22 @@ static percent_t automaticIdleController(float tpsPos DECLARE_ENGINE_PARAMETER_S
|
||||||
}
|
}
|
||||||
|
|
||||||
engine->engineState.idle.currentIdlePosition = iacPosition;
|
engine->engineState.idle.currentIdlePosition = iacPosition;
|
||||||
applyIACposition(engine->engineState.idle.currentIdlePosition PASS_ENGINE_PARAMETER_SUFFIX);
|
|
||||||
|
return iacPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IdleController::update() {
|
||||||
|
float position = getIdlePosition();
|
||||||
|
applyIACposition(position PASS_ENGINE_PARAMETER_SUFFIX);
|
||||||
}
|
}
|
||||||
|
|
||||||
IdleController idleControllerInstance;
|
IdleController idleControllerInstance;
|
||||||
|
|
||||||
|
void updateIdleControl()
|
||||||
|
{
|
||||||
|
idleControllerInstance.update();
|
||||||
|
}
|
||||||
|
|
||||||
static void applyPidSettings(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
static void applyPidSettings(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
||||||
getIdlePid(PASS_ENGINE_PARAMETER_SIGNATURE)->updateFactors(engineConfiguration->idleRpmPid.pFactor, engineConfiguration->idleRpmPid.iFactor, engineConfiguration->idleRpmPid.dFactor);
|
getIdlePid(PASS_ENGINE_PARAMETER_SIGNATURE)->updateFactors(engineConfiguration->idleRpmPid.pFactor, engineConfiguration->idleRpmPid.iFactor, engineConfiguration->idleRpmPid.dFactor);
|
||||||
iacPidMultMap.init(CONFIG(iacPidMultTable), CONFIG(iacPidMultLoadBins), CONFIG(iacPidMultRpmBins));
|
iacPidMultMap.init(CONFIG(iacPidMultTable), CONFIG(iacPidMultLoadBins), CONFIG(iacPidMultRpmBins));
|
||||||
|
@ -522,7 +529,6 @@ void setDefaultIdleParameters(DECLARE_CONFIG_PARAMETER_SIGNATURE) {
|
||||||
engineConfiguration->idleRpmPid.pFactor = 0.1f;
|
engineConfiguration->idleRpmPid.pFactor = 0.1f;
|
||||||
engineConfiguration->idleRpmPid.iFactor = 0.05f;
|
engineConfiguration->idleRpmPid.iFactor = 0.05f;
|
||||||
engineConfiguration->idleRpmPid.dFactor = 0.0f;
|
engineConfiguration->idleRpmPid.dFactor = 0.0f;
|
||||||
engineConfiguration->idleRpmPid.periodMs = 10;
|
|
||||||
|
|
||||||
engineConfiguration->idlerpmpid_iTermMin = -200;
|
engineConfiguration->idlerpmpid_iTermMin = -200;
|
||||||
engineConfiguration->idlerpmpid_iTermMax = 200;
|
engineConfiguration->idlerpmpid_iTermMax = 200;
|
||||||
|
@ -564,12 +570,6 @@ void setIdleDFactor(float value) {
|
||||||
showIdleInfo();
|
showIdleInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
void setIdleDT(int value) {
|
|
||||||
engineConfiguration->idleRpmPid.periodMs = value;
|
|
||||||
applyPidSettings();
|
|
||||||
showIdleInfo();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Idle test would activate the solenoid for three seconds
|
* Idle test would activate the solenoid for three seconds
|
||||||
*/
|
*/
|
||||||
|
@ -637,8 +637,6 @@ void startIdleThread(Logging*sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX) {
|
||||||
|
|
||||||
//scheduleMsg(logger, "initial idle %d", idlePositionController.value);
|
//scheduleMsg(logger, "initial idle %d", idlePositionController.value);
|
||||||
|
|
||||||
idleControllerInstance.Start();
|
|
||||||
|
|
||||||
#if ! EFI_UNIT_TEST
|
#if ! EFI_UNIT_TEST
|
||||||
// this is neutral/no gear switch input. on Miata it's wired both to clutch pedal and neutral in gearbox
|
// this is neutral/no gear switch input. on Miata it's wired both to clutch pedal and neutral in gearbox
|
||||||
// this switch is not used yet
|
// this switch is not used yet
|
||||||
|
|
|
@ -15,15 +15,16 @@
|
||||||
class Logging;
|
class Logging;
|
||||||
class Pid;
|
class Pid;
|
||||||
|
|
||||||
class IdleController : public PeriodicTimerController {
|
class IdleController {
|
||||||
public:
|
public:
|
||||||
DECLARE_ENGINE_PTR;
|
DECLARE_ENGINE_PTR;
|
||||||
|
|
||||||
int getPeriodMs() override;
|
float getIdlePosition();
|
||||||
void PeriodicTask() override;
|
void update();
|
||||||
};
|
};
|
||||||
|
|
||||||
percent_t getIdlePosition(void);
|
void updateIdleControl();
|
||||||
|
percent_t getIdlePosition();
|
||||||
|
|
||||||
void applyIACposition(percent_t position DECLARE_ENGINE_PARAMETER_SUFFIX);
|
void applyIACposition(percent_t position DECLARE_ENGINE_PARAMETER_SUFFIX);
|
||||||
void setManualIdleValvePosition(int positionPercent);
|
void setManualIdleValvePosition(int positionPercent);
|
||||||
|
@ -31,14 +32,12 @@ void setManualIdleValvePosition(int positionPercent);
|
||||||
void startIdleThread(Logging* sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX);
|
void startIdleThread(Logging* sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX);
|
||||||
void setDefaultIdleParameters(DECLARE_CONFIG_PARAMETER_SIGNATURE);
|
void setDefaultIdleParameters(DECLARE_CONFIG_PARAMETER_SIGNATURE);
|
||||||
void startIdleBench(void);
|
void startIdleBench(void);
|
||||||
void setIdleDT(int value);
|
|
||||||
void setIdleOffset(float value);
|
void setIdleOffset(float value);
|
||||||
void setIdlePFactor(float value);
|
void setIdlePFactor(float value);
|
||||||
void setIdleIFactor(float value);
|
void setIdleIFactor(float value);
|
||||||
void setIdleDFactor(float value);
|
void setIdleDFactor(float value);
|
||||||
void setIdleMode(idle_mode_e value DECLARE_ENGINE_PARAMETER_SUFFIX);
|
void setIdleMode(idle_mode_e value DECLARE_ENGINE_PARAMETER_SUFFIX);
|
||||||
void setTargetIdleRpm(int value);
|
void setTargetIdleRpm(int value);
|
||||||
void setIdleDT(int value);
|
|
||||||
void onConfigurationChangeIdleCallback(engine_configuration_s *previousConfiguration);
|
void onConfigurationChangeIdleCallback(engine_configuration_s *previousConfiguration);
|
||||||
float getIdlePidOffset(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
float getIdlePidOffset(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
||||||
Pid * getIdlePid(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
Pid * getIdlePid(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
||||||
|
|
|
@ -146,8 +146,7 @@ angle_t getAdvanceCorrections(int rpm DECLARE_ENGINE_PARAMETER_SUFFIX) {
|
||||||
shouldResetTimingPid = false;
|
shouldResetTimingPid = false;
|
||||||
}
|
}
|
||||||
// get PID value (this is not an actual Advance Angle, but just a additive correction!)
|
// get PID value (this is not an actual Advance Angle, but just a additive correction!)
|
||||||
percent_t timingRawCorr = idleTimingPid.getOutput(targetRpm, rpm,
|
percent_t timingRawCorr = idleTimingPid.getOutput(targetRpm, rpm, FAST_CALLBACK_PERIOD_MS / 1000.0f);
|
||||||
/* is this the right dTime? this period is not exactly the period at which this code is invoked*/engineConfiguration->idleTimingPid.periodMs);
|
|
||||||
// tps idle-running falloff
|
// tps idle-running falloff
|
||||||
pidTimingCorrection = interpolateClamped(0.0f, timingRawCorr, CONFIG(idlePidDeactivationTpsThreshold), 0.0f, tps);
|
pidTimingCorrection = interpolateClamped(0.0f, timingRawCorr, CONFIG(idlePidDeactivationTpsThreshold), 0.0f, tps);
|
||||||
// rpm falloff
|
// rpm falloff
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "fsio_impl.h"
|
#include "fsio_impl.h"
|
||||||
#include "perf_trace.h"
|
#include "perf_trace.h"
|
||||||
#include "backup_ram.h"
|
#include "backup_ram.h"
|
||||||
|
#include "idle_thread.h"
|
||||||
#include "idle_hardware.h"
|
#include "idle_hardware.h"
|
||||||
#include "sensor.h"
|
#include "sensor.h"
|
||||||
#include "gppwm.h"
|
#include "gppwm.h"
|
||||||
|
@ -189,6 +190,8 @@ void Engine::periodicSlowCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
||||||
|
|
||||||
updateGppwm();
|
updateGppwm();
|
||||||
|
|
||||||
|
updateIdleControl();
|
||||||
|
|
||||||
cylinderCleanupControl(PASS_ENGINE_PARAMETER_SIGNATURE);
|
cylinderCleanupControl(PASS_ENGINE_PARAMETER_SIGNATURE);
|
||||||
|
|
||||||
standardAirCharge = getStandardAirCharge(PASS_ENGINE_PARAMETER_SIGNATURE);
|
standardAirCharge = getStandardAirCharge(PASS_ENGINE_PARAMETER_SIGNATURE);
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#endif /* EFI_UNIT_TEST */
|
#endif /* EFI_UNIT_TEST */
|
||||||
|
|
||||||
#define FAST_CALLBACK_PERIOD_MS 5
|
#define FAST_CALLBACK_PERIOD_MS 5
|
||||||
|
#define SLOW_CALLBACK_PERIOD_MS 50
|
||||||
|
|
||||||
class RpmCalculator;
|
class RpmCalculator;
|
||||||
class AirmassModelBase;
|
class AirmassModelBase;
|
||||||
|
|
|
@ -156,7 +156,7 @@ class PeriodicSlowController : public PeriodicTimerController {
|
||||||
|
|
||||||
int getPeriodMs() override {
|
int getPeriodMs() override {
|
||||||
// no reason to have this configurable, looks like everyone is happy with 20Hz
|
// no reason to have this configurable, looks like everyone is happy with 20Hz
|
||||||
return 50;
|
return SLOW_CALLBACK_PERIOD_MS;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -996,12 +996,6 @@ const plain_get_integer_s getI_plain[] = {
|
||||||
// {"bor", setBor},
|
// {"bor", setBor},
|
||||||
// {"can_mode", setCanType},
|
// {"can_mode", setCanType},
|
||||||
// {"idle_rpm", setTargetIdleRpm},
|
// {"idle_rpm", setTargetIdleRpm},
|
||||||
// {"idle_dt", setIdleDT},
|
|
||||||
// {"", },
|
|
||||||
// {"", },
|
|
||||||
// {"", },
|
|
||||||
// {"", },
|
|
||||||
// {"", },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const plain_get_float_s getF_plain[] = {
|
const plain_get_float_s getF_plain[] = {
|
||||||
|
@ -1208,7 +1202,6 @@ const command_i_s commandsI[] = {{"ignition_mode", setIgnitionMode},
|
||||||
#if EFI_IDLE_CONTROL
|
#if EFI_IDLE_CONTROL
|
||||||
{"idle_position", setManualIdleValvePosition},
|
{"idle_position", setManualIdleValvePosition},
|
||||||
{"idle_rpm", setTargetIdleRpm},
|
{"idle_rpm", setTargetIdleRpm},
|
||||||
{"idle_dt", setIdleDT},
|
|
||||||
#endif /* EFI_IDLE_CONTROL */
|
#endif /* EFI_IDLE_CONTROL */
|
||||||
#endif /* EFI_PROD_CODE */
|
#endif /* EFI_PROD_CODE */
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,6 @@ enable2ndByteCanID = false
|
||||||
|
|
||||||
; CONFIG_DEFINITION_END
|
; CONFIG_DEFINITION_END
|
||||||
idleRpmPid_offset = "Constant base value"
|
idleRpmPid_offset = "Constant base value"
|
||||||
idleRpmPid_periodMs = "PID recalculation period"
|
|
||||||
|
|
||||||
|
|
||||||
[Tuning]
|
[Tuning]
|
||||||
|
@ -2445,7 +2444,6 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@\x00\x31\x00\x00"
|
||||||
field = "Max", idleRpmPid_maxValue
|
field = "Max", idleRpmPid_maxValue
|
||||||
field = "iTerm Min", idlerpmpid_iTermMin
|
field = "iTerm Min", idlerpmpid_iTermMin
|
||||||
field = "iTerm Max", idlerpmpid_iTermMax
|
field = "iTerm Max", idlerpmpid_iTermMax
|
||||||
field = "period", idleRpmPid_periodMs
|
|
||||||
field = "RPM dead zone to deactivate IAC pid", idlePidRpmDeadZone
|
field = "RPM dead zone to deactivate IAC pid", idlePidRpmDeadZone
|
||||||
field = "RPM upper limit to deactivate IAC pid",idlePidRpmUpperLimit
|
field = "RPM upper limit to deactivate IAC pid",idlePidRpmUpperLimit
|
||||||
field = "PID Extra for low RPM", pidExtraForLowRpm
|
field = "PID Extra for low RPM", pidExtraForLowRpm
|
||||||
|
@ -2479,7 +2477,6 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@\x00\x31\x00\x00"
|
||||||
field = "Offset", idleTimingPid_offset, {useIdleTimingPidControl == 1}
|
field = "Offset", idleTimingPid_offset, {useIdleTimingPidControl == 1}
|
||||||
field = "Min Delta", idleTimingPid_minValue, {useIdleTimingPidControl == 1}
|
field = "Min Delta", idleTimingPid_minValue, {useIdleTimingPidControl == 1}
|
||||||
field = "Max Delta", idleTimingPid_maxValue, {useIdleTimingPidControl == 1}
|
field = "Max Delta", idleTimingPid_maxValue, {useIdleTimingPidControl == 1}
|
||||||
field = "period", idleTimingPid_periodMs, {useIdleTimingPidControl == 1}
|
|
||||||
field = "#See RPM dead zone to deactivate IAC pid"
|
field = "#See RPM dead zone to deactivate IAC pid"
|
||||||
field = "RPM working zone for timing pid", idleTimingPidWorkZone, {useIdleTimingPidControl == 1}
|
field = "RPM working zone for timing pid", idleTimingPidWorkZone, {useIdleTimingPidControl == 1}
|
||||||
field = "RPM working zone falloff", idlePidFalloffDeltaRpm, {useIdleTimingPidControl == 1}
|
field = "RPM working zone falloff", idlePidFalloffDeltaRpm, {useIdleTimingPidControl == 1}
|
||||||
|
|
|
@ -58,7 +58,7 @@ TEST(idle, fsioPidParameters) {
|
||||||
|
|
||||||
// todo finish this unit test!
|
// todo finish this unit test!
|
||||||
// timeNowUs = MS2US(700);
|
// timeNowUs = MS2US(700);
|
||||||
idleControllerInstance.PeriodicTask();
|
idleControllerInstance.update();
|
||||||
// ASSERT_EQ(0, engine->acSwitchLastChangeTime);
|
// ASSERT_EQ(0, engine->acSwitchLastChangeTime);
|
||||||
// ASSERT_EQ(1, engine->acSwitchState);
|
// ASSERT_EQ(1, engine->acSwitchState);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue