rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
idle_thread.h
Go to the documentation of this file.
1/**
2 * @file idle_thread.h
3 * @brief Idle Valve Control thread
4 *
5 * @date May 23, 2013
6 * @author Andrey Belomutskiy, (c) 2012-2020
7 */
8
9#pragma once
10
11#include "engine_module.h"
12#include "rusefi_types.h"
13#include "efi_pid.h"
14#include "sensor.h"
16#include "closed_loop_idle.h"
17#include "biquad.h"
18
20 enum class Phase : uint8_t {
21 Cranking, // Below cranking threshold
22 Idling, // Below idle RPM, off throttle
23 Coasting, // Off throttle but above idle RPM
24 CrankToIdleTaper, // Taper between cranking and idling
25 Running, // On throttle
26 };
27
28 struct TargetInfo {
29 // Target speed for closed loop control
31
32 // If below this speed, enter idle
34
35 // If above this speed, exit idle
37
38 bool operator==(const TargetInfo& other) const {
40 }
41 };
42
43 virtual Phase determinePhase(float rpm, TargetInfo targetRpm, SensorResult tps, float vss, float crankingTaperFraction) = 0;
44 virtual TargetInfo getTargetRpm(float clt) = 0;
45 virtual float getCrankingOpenLoop(float clt) const = 0;
46 virtual float getRunningOpenLoop(IIdleController::Phase phase, float rpm, float clt, SensorResult tps) = 0;
47 virtual float getOpenLoop(Phase phase, float rpm, float clt, SensorResult tps, float crankingTaperFraction) = 0;
48 virtual float getClosedLoop(Phase phase, float tps, float rpm, float target) = 0;
49 virtual float getCrankingTaperFraction(float clt) const = 0;
50 virtual bool isIdlingOrTaper() const = 0;
51 virtual bool isCoastingAdvance() const = 0;
52 virtual float getIdleTimingAdjustment(float rpm) = 0;
53 virtual Phase getCurrentPhase() const = 0;
54};
55
57public:
58 // Mockable<> interface
60
61 void init();
62
63 float getIdlePosition(float rpm);
64
65 // TARGET DETERMINATION
66 TargetInfo getTargetRpm(float clt) override;
67
68 // PHASE DETERMINATION: what is the driver trying to do right now?
69 Phase determinePhase(float rpm, TargetInfo targetRpm, SensorResult tps, float vss, float crankingTaperFraction) override;
70 float getCrankingTaperFraction(float clt) const override;
71
72 // OPEN LOOP CORRECTIONS
73 percent_t getCrankingOpenLoop(float clt) const override;
74 percent_t getRunningOpenLoop(IIdleController::Phase phase, float rpm, float clt, SensorResult tps) override;
75 percent_t getOpenLoop(Phase phase, float rpm, float clt, SensorResult tps, float crankingTaperFraction) override;
76
77 float getIdleTimingAdjustment(float rpm) override;
78 float getIdleTimingAdjustment(float rpm, float targetRpm, Phase phase);
79
80 // CLOSED LOOP CORRECTION
81 float getClosedLoop(IIdleController::Phase phase, float tpsPos, float rpm, float targetRpm) override;
82
83 void onConfigurationChange(engine_configuration_s const * previousConfig) override final;
84 void onFastCallback() override final;
85 void onEngineStop() override final;
86
87 // Allow querying state from outside
91
95
96 Phase getCurrentPhase() const override {
97 return m_lastPhase;
98 }
99
101
102 #if EFI_IDLE_PID_CIC
103 // Use PID with CIC integrator
105 #endif //EFI_IDLE_PID_CIC
106
108 #if EFI_IDLE_PID_CIC
110 return &idleCicPid;
111 }
112 #endif /* EFI_IDLE_PID_CIC */
114 }
115
116 void updateLtit(float rpm, float clt, bool acActive, bool fan1Active, bool fan2Active, float idleIntegral);
117 void onIgnitionStateChanged(bool ignitionOn) override;
118
119private:
120
121 // These are stored by getIdlePosition() and used by getIdleTimingAdjustment()
124 // used by 'dashpot' (hold+decay) logic for iacByTpsTaper
125 efitimeus_t lastTimeRunningUs = 0;
126 // used by "soft" idle entry
129
131
132 // This is stored by getClosedLoop and used in case we want to "do nothing"
134
138};
139
141
142void applyIACposition(percent_t position);
143void setManualIdleValvePosition(int positionPercent);
144
145void startIdleThread();
147void startIdleBench(void);
148void setTargetIdleRpm(int value);
149void startSwitchPins();
150void stopSwitchPins();
float m_modeledFlowIdleTiming
PidIndustrial industrialWithOverrideIdlePid
bool isIdlingOrTaper() const override
Definition idle_thread.h:88
void onFastCallback() override final
bool isCoastingAdvance() const override
Definition idle_thread.h:92
Phase getCurrentPhase() const override
Definition idle_thread.h:96
float getCrankingTaperFraction(float clt) const override
float getClosedLoop(IIdleController::Phase phase, float tpsPos, float rpm, float targetRpm) override
void onConfigurationChange(engine_configuration_s const *previousConfig) override final
Phase determinePhase(float rpm, TargetInfo targetRpm, SensorResult tps, float vss, float crankingTaperFraction) override
float m_idleTimingSoftEntryEndTime
Pid * getIdlePid()
float m_lastAutomaticPosition
Timer m_timeInIdlePhase
void onEngineStop() override final
float getIdleTimingAdjustment(float rpm) override
efitimeus_t restoreAfterPidResetTimeUs
percent_t getOpenLoop(Phase phase, float rpm, float clt, SensorResult tps, float crankingTaperFraction) override
TargetInfo getTargetRpm(float clt) override
void onIgnitionStateChanged(bool ignitionOn) override
efitimeus_t lastTimeRunningUs
percent_t getCrankingOpenLoop(float clt) const override
float m_crankTaperEndTime
void updateLtit(float rpm, float clt, bool acActive, bool fan1Active, bool fan2Active, float idleIntegral)
percent_t getRunningOpenLoop(IIdleController::Phase phase, float rpm, float clt, SensorResult tps) override
Definition efi_pid.h:34
static constexpr engine_configuration_s * engineConfiguration
void setTargetIdleRpm(int value)
void setDefaultIdleParameters()
void setManualIdleValvePosition(int positionPercent)
void applyIACposition(percent_t position)
void startIdleBench(void)
void stopSwitchPins()
percent_t getIdlePosition()
void startIdleThread()
void startSwitchPins()
static CCM_OPTIONAL FunctionalSensor clt(SensorType::Clt, MS2NT(10))
float percent_t
Base class for sensors. Inherit this class to implement a new type of sensor.
expected< float > SensorResult
Definition sensor.h:46
bool operator==(const TargetInfo &other) const
Definition idle_thread.h:38
virtual float getCrankingOpenLoop(float clt) const =0
virtual float getIdleTimingAdjustment(float rpm)=0
virtual bool isIdlingOrTaper() const =0
virtual float getRunningOpenLoop(IIdleController::Phase phase, float rpm, float clt, SensorResult tps)=0
virtual TargetInfo getTargetRpm(float clt)=0
virtual float getCrankingTaperFraction(float clt) const =0
virtual float getClosedLoop(Phase phase, float tps, float rpm, float target)=0
virtual bool isCoastingAdvance() const =0
virtual float getOpenLoop(Phase phase, float rpm, float clt, SensorResult tps, float crankingTaperFraction)=0
virtual Phase getCurrentPhase() const =0
virtual Phase determinePhase(float rpm, TargetInfo targetRpm, SensorResult tps, float vss, float crankingTaperFraction)=0