Config:Idle: Difference between revisions
No edit summary |
Stepper acceleration profile |
||
| (2 intermediate revisions by one other user not shown) | |||
| Line 1: | Line 1: | ||
<!-- section:idleSettings --> | <!-- section:idleSettings --> | ||
= Idle settings = | = Idle settings = | ||
Configuration for engine idle: the target speed, the open- and closed-loop control that holds it, idle ignition timing, and the idle air hardware (IAC solenoid, stepper, or electronic throttle). | |||
<!-- section:idleBasicSettings --> | <!-- section:idleBasicSettings --> | ||
== Idle settings == | == Idle settings == | ||
Core idle behaviour: how idle is controlled and the conditions under which the ECU decides the engine is idling. | |||
<!-- field:idleMode --> | <!-- field:idleMode --> | ||
| Line 47: | Line 49: | ||
<!-- section:idleOverrides --> | <!-- section:idleOverrides --> | ||
== Idle overrides == | == Idle overrides == | ||
Optional tables and ramps that override normal idle fuel and timing: separate idle/coasting ignition and VE tables, return-to-idle target ramping, and cranking-taper handling. | |||
<!-- field:useSeparateAdvanceForIdle --> | <!-- field:useSeparateAdvanceForIdle --> | ||
| Line 54: | Line 57: | ||
<!-- field:useIdleAdvanceWhileCoasting --> | <!-- field:useIdleAdvanceWhileCoasting --> | ||
==== Use idle ignition table while coasting ==== | ==== Use idle ignition table while coasting ==== | ||
When enabled, the idle ignition table is also applied during coasting (overrun), not only at idle. Limited by [[Idle#Max RPM for idle advance while coasting|Max RPM for idle advance while coasting]]. | |||
<!-- field:useIdleAdvanceWhileCoastingMaxRpm --> | <!-- field:useIdleAdvanceWhileCoastingMaxRpm --> | ||
| Line 93: | Line 97: | ||
<!-- section:idleOpenLoop --> | <!-- section:idleOpenLoop --> | ||
== Open Loop Idle == | == Open Loop Idle == | ||
Open-loop idle adders. Each active accessory load (A/C, transmission in gear, fans, CAN idle-up) raises the base idle air and/or the target RPM so the engine does not sag when the load engages. | |||
<!-- field:acIdleExtraOffset --> | <!-- field:acIdleExtraOffset --> | ||
| Line 136: | Line 141: | ||
<!-- section:idlePidSettings --> | <!-- section:idlePidSettings --> | ||
== Closed Loop Idle == | == Closed Loop Idle == | ||
Closed-loop idle PID. The ECU trims idle air (IAC duty or ETB angle) to hold the target RPM, working on top of the open-loop position. See https://content.epicefi.com/wiki/index.php/Guides:PID_Control for tuning the gains. | |||
<!-- field:idleRpmPid_pFactor --> | <!-- field:idleRpmPid_pFactor --> | ||
| Line 178: | Line 184: | ||
<!-- section:etbIdle --> | <!-- section:etbIdle --> | ||
== ETB idle settings == | == ETB idle settings == | ||
Idle settings specific to electronic throttle (ETB) cars, where idle air is metered by the throttle plate itself instead of a separate IAC valve. | |||
<!-- field:etbIdleThrottleRange --> | <!-- field:etbIdleThrottleRange --> | ||
| Line 185: | Line 192: | ||
<!-- section:dashpotEmulation --> | <!-- section:dashpotEmulation --> | ||
== Dashpot emulation == | == Dashpot emulation == | ||
Dashpot (coasting-to-idle) emulation. Adds a temporary slug of idle air when dropping back to idle from a coast, then holds it and decays it away, softening the transition and preventing stall — emulating a mechanical throttle dashpot. Separate values are provided for when A/C is on. | |||
<!-- field:iacByTpsTaper --> | <!-- field:iacByTpsTaper --> | ||
| Line 212: | Line 220: | ||
<!-- section:ignitionIdle --> | <!-- section:ignitionIdle --> | ||
== Ignition idle settings == | == Ignition idle settings == | ||
Idle ignition timing. Lets idle be stabilised with spark as well as air — advancing to recover from a sag and retarding to bleed off speed, for faster correction than air alone. | |||
<!-- field:useIdleTimingTargetError --> | <!-- field:useIdleTimingTargetError --> | ||
| Line 223: | Line 232: | ||
<!-- section:ignitionIdlePid --> | <!-- section:ignitionIdlePid --> | ||
=== Closed loop ignition timing (PID) === | === Closed loop ignition timing (PID) === | ||
Closed-loop idle ignition timing: a fast PID that adjusts spark advance around the idle target for quick correction, working alongside the slower air-based idle PID. | |||
<!-- field:useIdleTimingPidControl --> | <!-- field:useIdleTimingPidControl --> | ||
| Line 257: | Line 267: | ||
<!-- section:idlehw --> | <!-- section:idlehw --> | ||
= Idle hardware = | = Idle hardware = | ||
Physical idle air hardware: the IAC solenoid or stepper outputs and their drive settings. Electronic-throttle cars meter idle air through the throttle plate instead — see [[Idle#ETB idle settings|ETB idle settings]]. | |||
<!-- section:idleSolenoid --> | <!-- section:idleSolenoid --> | ||
== Solenoid == | == Solenoid == | ||
PWM idle air control (IAC) solenoid valve output(s). Supports a single valve or a Subaru/BMW-style double solenoid. | |||
<!-- field:idle_solenoidPin --> | <!-- field:idle_solenoidPin --> | ||
==== Idle Solenoid Primary output ==== | ==== Idle Solenoid Primary output ==== | ||
Primary output pin driving the PWM idle air control (IAC) solenoid valve. | |||
To find the actual value for your hardware, see [[Hardware]]. | |||
<!-- field:isDoubleSolenoidIdle --> | <!-- field:isDoubleSolenoidIdle --> | ||
| Line 273: | Line 285: | ||
<!-- field:secondSolenoidPin --> | <!-- field:secondSolenoidPin --> | ||
==== Idle Solenoid Secondary output ==== | ==== Idle Solenoid Secondary output ==== | ||
Second output pin for double-solenoid idle valves (some Subaru and Mazda), where one solenoid opens the valve further and the other closes it past the default position. Only used in [[Idle#Double Solenoid Mode|Double Solenoid Mode]]. | |||
To find the actual value for your hardware, see [[Hardware]]. | |||
<!-- field:idle_solenoidPinMode --> | <!-- field:idle_solenoidPinMode --> | ||
==== Idle Solenoid output(s) Mode ==== | ==== Idle Solenoid output(s) Mode ==== | ||
Output mode for the idle solenoid pin(s). See [[Hardware:ECU output mode selection|ECU output mode selection]]. | |||
<!-- field:idle_solenoidFrequency --> | <!-- field:idle_solenoidFrequency --> | ||
==== Idle Solenoid Frequency ==== | ==== Idle Solenoid Frequency ==== | ||
PWM frequency for the idle air control solenoid output. Match it to your valve: too low buzzes audibly and meters air unevenly, too high and the valve cannot respond. Two-wire IAC solenoids are typically driven around 200–300 Hz. | |||
<!-- section:cltIdleRPMCurve --> | <!-- section:cltIdleRPMCurve --> | ||
= Idle target RPM = | = Idle target RPM = | ||
Target idle RPM as a function of coolant temperature. A cold engine targets a higher idle, tapering down to the warm idle as it heats up. | |||
<!-- section:cltIdleTable --> | <!-- section:cltIdleTable --> | ||
= Idle open loop position = | = Idle open loop position = | ||
Open-loop idle air position (IAC % or stepper steps) versus coolant temperature. This is the base feed-forward opening; closed-loop control trims around it. | |||
<!-- section:cltCrankingCurveDialog --> | <!-- section:cltCrankingCurveDialog --> | ||
= Idle cranking position = | = Idle cranking position = | ||
Idle air position held while cranking, versus coolant temperature. Sets how far the valve opens to get the engine to fire, before the crank-to-run taper takes over. | |||
<!-- field:etbIdleThrottleRange#1 --> | <!-- field:etbIdleThrottleRange#1 --> | ||
==== ETB idle maximum angle ==== | ==== ETB idle maximum angle ==== | ||
This sets the range of the idle control on the ETB. At 100% idle position, the value specified here sets the base ETB position. | This sets the range of the idle control on the ETB. At 100% idle position, the value specified here sets the base ETB position. | ||
<!-- curve:cltCrankingCurve --> | |||
== Cranking Idle Valve Curve == | |||
2D curve — X: Coolant (-40 to 120), Y: Percent (0 to 100). | |||
<!-- section:afterCrankingIACtaperDurationDialog --> | <!-- section:afterCrankingIACtaperDurationDialog --> | ||
= Idle after start (crank-to-run) taper = | = Idle after start (crank-to-run) taper = | ||
After the engine starts, the extra cranking idle air is tapered out over a number of engine cycles (versus coolant temperature) down to the running idle position. | |||
<!-- curve:afterCrankingIACtaperCurve --> | |||
== Idle valve Crank-to-Run Taper == | |||
2D curve — X: Coolant (-40 to 120), Y: cycles (0 to 500). | |||
<!-- section:iacPidMultTbl --> | <!-- section:iacPidMultTbl --> | ||
= Idle PID output gain = | = Idle PID output gain = | ||
Optional PID output multiplier (0.0–1.0) versus RPM, used to compensate for the non-linear relationship between IAC position and RPM. Enabled by [[Idle#Use PID output gain table|Use PID output gain table]]. | |||
<!-- section:idleExtraPidCurve --> | <!-- section:idleExtraPidCurve --> | ||
= Idle PID error gain = | = Idle PID error gain = | ||
Extra PID gain applied as a function of RPM error, letting the controller react harder the further idle is from target. | |||
<!-- section:iacCoastingCurve --> | <!-- section:iacCoastingCurve --> | ||
= Coasting idle position override = | = Coasting idle position override = | ||
Idle air position used during overrun/coasting (versus coolant temperature) when the separate coasting idle table is enabled, used to manage engine braking and return-to-idle. | |||
<!-- section:idleValveForceClose --> | <!-- section:idleValveForceClose --> | ||
= Valve force close / stepper re-park = | = Valve force close / stepper re-park = | ||
Gradually drives the idle valve closed and re-parks the stepper once the engine is clearly off-idle (above an RPM and TPS threshold). Prevents manifold pressure leaking through the valve at cruise and resets accumulated stepper step-loss without a full homing cycle. | |||
<!-- field:idleValveForceCloseRpm --> | <!-- field:idleValveForceCloseRpm --> | ||
| Line 334: | Line 361: | ||
Number of extra steps to overstep toward closed when re-parking after force-close. Compensates for stepper drift without needing the full startup homing sequence. 5 is a good starting point. | Number of extra steps to overstep toward closed when re-parking after force-close. Compensates for stepper drift without needing the full startup homing sequence. 5 is a good starting point. | ||
<!-- section:IdleTimingTargetErrorDialog --> | <!-- section:IdleTimingTargetErrorDialog -->= Stepper acceleration profile = | ||
Complete theory explained by Texas Instruments: https://www.ti.com/lit/an/slyt482/slyt482.pdf?ts=1781468773748 | |||
=== The problem === | |||
An idle '''stepper''' IAC is open-loop: the ECU counts steps; it does not know if the motor actually moved. Commanding a high step rate from a standstill often causes '''lost steps''', noise, or a valve that only works if you keep the rate unrealistically low. | |||
The older logic used a single '''Stepper reaction time''' (ms) as a fixed delay between steps — safe, but slow on long moves. | |||
'''Stepper acceleration profile''' ramps speed: start slow → accelerate → cruise → decelerate → stop soft. Long moves finish faster without demanding full rate from a standstill. | |||
{| class="wikitable" | |||
!Mode | |||
!How to get it | |||
!Behavior | |||
|- | |||
|'''Constant speed (legacy)''' | |||
|Set '''Starting speed''', '''Target speed''', '''Accel rate''', or '''Decel rate''' to '''0''' | |||
|Fixed pace from reaction time (old behavior) | |||
|- | |||
|'''Accel/decel profile''' | |||
|Starting, Target, Accel, and Decel all '''> 0''' | |||
|Trapezoid on long moves; triangle on short moves | |||
|} | |||
<code>Stopping speed</code> of 0 is treated as at least 1 step/s when the profile is enabled. | |||
=== Parameters === | |||
{| class="wikitable" | |||
!Parameter | |||
!Unit | |||
!Role | |||
|- | |||
|'''Stepper reaction time''' | |||
|ms | |||
|Caps how fast the profile may run. Treat as: '''reactionTime = 1000 / (max steps/s)'''. Also used for pauses (direction change, sleep, parking). | |||
|- | |||
|'''Stepper total steps''' | |||
|count | |||
|Full valve travel. Independent of the speed profile. | |||
|- | |||
|'''Starting speed''' | |||
|steps/s | |||
|Rate at the beginning of a move. '''0 disables the profile.''' | |||
|- | |||
|'''Target speed''' | |||
|steps/s | |||
|Cruise / maximum rate on long moves. | |||
|- | |||
|'''Stopping speed''' | |||
|steps/s | |||
|Rate at the end of a move (soft stop). | |||
|- | |||
|'''Acceleration rate''' | |||
|steps/s² | |||
|Ramp from starting → target. | |||
|- | |||
|'''Deceleration rate''' | |||
|steps/s² | |||
|Ramp down toward stopping. | |||
|} | |||
Firmware also keeps starting ≤ target and stopping ≤ starting, and clamps speeds that exceed what the hardware can achieve. | |||
=== Reaction time and maximum speed === | |||
'''Reaction time limits the maximum speed the acceleration profile can reach.''' | |||
(Strictly this ceiling is most important on H-bridge drive; for safety, configure it the same on every setup.) | |||
Set reaction time from the motor’s maximum rated step rate: | |||
<code>reactionTime (ms) = 1000 / max_steps_per_second</code> | |||
Example: motor rated '''500 steps/s''' → reaction time '''2 ms'''. | |||
If reaction time is left too large, the profile will never reach the target speed you configured, no matter how high target/accel are. | |||
== Starting from scratch == | |||
You can use this to get the stepper working. Tune the values according to how the stepper behaves. Faster target speed or acceleration/deceleration can be achieved if the motor doesn't skip steps. Meanwhile some motors might need slower starting and stopping speeds. | |||
1. Set '''total steps''', wiring, and parking so the valve homes correctly. | |||
2. From the motor rating, set: | |||
- '''Target speed''' = maximum rated steps/s | |||
If the manufacturer gives '''step time at max speed''' (ms per step): | |||
<code>Target speed = 1000 / step_time_ms</code> | |||
- '''Reaction time''' = <code>1000 / Target speed</code> | |||
(same number as above, expressed as ms) | |||
3. Initial profile values: | |||
- '''Starting speed''' = Target speed / 10 | |||
- '''Stopping speed''' = Target speed / 10 | |||
- '''Acceleration rate''' = Target speed ''(numerically equal to target steps/s → reaches cruise in about 1 second from a low start)'' | |||
- '''Deceleration rate''' = Target speed ''(same idea for the ramp-down)'' | |||
4. Test large moves (parking, big IAC swings) and small corrections. If you lose steps or hear harsh buzz at the start/stop, lower starting/stopping further or soften accel/decel. If moves are clean but slow, raise accel/decel first; only push target if the motor rating allows it. | |||
5. Keep reaction time matched to the '''rated''' max speed so it does not silently cap a correctly set target. | |||
--- | |||
== Migrating from fixed step time == | |||
If the old constant-speed tune ('''reaction time only''') was '''not''' losing steps: | |||
1. Use the '''old reaction time''' only to seed the soft ends of the move: | |||
<code>Starting speed = Stopping speed = 1000 / old_reaction_time</code> | |||
2. Set '''everything else as when starting from scratch''': | |||
- '''Target speed''' from the motor’s max rated speed (or <code>1000 / manufacturer_step_time</code>) | |||
- '''Reaction time''' = <code>1000 / Target speed</code> | |||
- '''Accel rate''' = Target | |||
- '''Decel rate''' = Target | |||
So migration reuses the proven old pace as a conservative start/stop rate, then adopts full rated cruise and the same 1-second ramp starting points as a new setup. | |||
If the old tune ''was'' losing steps, do not use it for starting/stopping — go back to '''Target /''' '''10''' (or lower) and fix mechanical/electrical issues before chasing speed. | |||
'''To keep pure legacy behavior instead, leave Starting / Target / Accel / Decel at 0.''' | |||
= Open loop ignition idle timing (RPM-error) = | = Open loop ignition idle timing (RPM-error) = | ||
Open-loop idle timing curve: ignition advance/retard as a function of how far RPM is from the idle target. Enabled by [[Idle#Open loop idle timing (RPM-error)|Open loop idle timing (RPM-error)]]. | |||
<!-- curve:idleTimingTargetErrorCRV --> | |||
== Idle Target Error == | |||
2D curve — X: Delta (-500 to 500), Y: Deg (-30 to 30). | |||
<!-- section:idleVeTableTbl --> | <!-- section:idleVeTableTbl --> | ||
= Idle fuel table = | = Idle fuel table = | ||
Separate VE/fuel table used at idle when [[Idle#Separate idle VE table|Separate idle VE table]] is enabled, for fine control of idle fuelling independent of the main table. | |||
<!-- section:idleAdvanceCurve --> | <!-- section:idleAdvanceCurve --> | ||
= Idle ignition table = | = Idle ignition table = | ||
Separate ignition timing table used at idle when [[Idle#Separate idle ignition table|Separate idle ignition table]] is enabled. Advance at low idle speed prevents stalling; retard at high idle speed bleeds off power to settle the idle. | |||
<!-- section:rotIdleDialog --> | <!-- section:rotIdleDialog --> | ||
= Rotational idle = | = Rotational idle = | ||
Rotational idle (a race/anti-lag-style lumpy idle): deliberately cuts spark and/or fuel in a rotating pattern at idle to produce a distinctive idle sound, with three accumulators that shift the pattern for different exhaust notes. Can be engaged manually by pin or automatically by TPS/CLT. | |||
<!-- field:rotIdleEnabled --> | <!-- field:rotIdleEnabled --> | ||
| Line 352: | Line 513: | ||
<!-- field:rotationalIdlePin --> | <!-- field:rotationalIdlePin --> | ||
==== Pin ==== | ==== Pin ==== | ||
Switch input that activates [[Idle#Rotational idle|rotational idle]] when held. | |||
To find the actual value for your hardware, see [[Hardware]]. | |||
<!-- field:rotationalIdlePinMode --> | <!-- field:rotationalIdlePinMode --> | ||
==== Pin Mode ==== | ==== Pin Mode ==== | ||
Input mode for the rotational idle pin. See [[Hardware:ECU input mode selection|ECU input mode selection]]. | |||
<!-- field:rot_idle_zero_stft --> | <!-- field:rot_idle_zero_stft --> | ||
| Line 476: | Line 635: | ||
<!-- section:transmissionIdleUpSettings --> | <!-- section:transmissionIdleUpSettings --> | ||
= Transmission idle compensation = | = Transmission idle compensation = | ||
Raises idle air and/or target RPM when an automatic transmission is put in gear (switch input), so the engine does not sag under the torque-converter load. | |||
<!-- field:transmissionIdleUpPin --> | <!-- field:transmissionIdleUpPin --> | ||
==== Transmission idle up switch ==== | ==== Transmission idle up switch ==== | ||
Switch input that signals the transmission is in gear, activating transmission idle-up. | |||
To find the actual value for your hardware, see [[Hardware]]. | |||
<!-- field:transmissionIdleUpPinMode --> | <!-- field:transmissionIdleUpPinMode --> | ||
==== Transmission idle up switch mode ==== | ==== Transmission idle up switch mode ==== | ||
Input mode for the transmission idle-up switch. See [[Hardware:ECU input mode selection|ECU input mode selection]]. | |||
<!-- field:transmissionIdleExtraOffset#1 --> | <!-- field:transmissionIdleExtraOffset#1 --> | ||
Latest revision as of 14:54, 7 August 2026
Idle settings
Configuration for engine idle: the target speed, the open- and closed-loop control that holds it, idle ignition timing, and the idle air hardware (IAC solenoid, stepper, or electronic throttle).
Idle settings
Core idle behaviour: how idle is controlled and the conditions under which the ECU decides the engine is idling.
Idle control mode
See also idleRpmPid
- Open Loop + Closed Loop
- Open Loop
TPS threshold
Below this throttle position, the engine is considered idling. If you have an electronic throttle, this checks accelerator pedal position instead of throttle position, and should be set to 1-2%.
Force idle below throttle threshold
Force idle STATE below DriveIntent threshold.
Force timing only below pedal threshold
Force idle ignition (delta target only) below DriverThreshold threshold, only for ignition timing
Idle force delayed by DFCO
Do not force idle ignition while DFCO is active for either of the above.
Delta target rpm smoothing factor
Smoothing factor for delta target rpm ignition adjustment
RPM upper limit
How far above idle speed do we consider idling, i.e. coasting detection threshold. For example, if target = 800, this param = 200, then anything below 1000 RPM is considered idle.
RPM deadzone
If the RPM closer to target than this value, disable closed loop idle correction to prevent oscillation
Max vehicle speed
Above this speed, disable closed loop idle control. Set to 0 to disable (allow closed loop idle at any speed).
Idle overrides
Optional tables and ramps that override normal idle fuel and timing: separate idle/coasting ignition and VE tables, return-to-idle target ramping, and cranking-taper handling.
Separate idle ignition table
This activates a separate ignition timing table for idle conditions, this can help idle stability by using ignition retard and advance either side of the desired idle speed. Extra advance at low idle speeds will prevent stalling and extra retard at high idle speeds can help reduce engine power and slow the idle speed.
Use idle ignition table while coasting
When enabled, the idle ignition table is also applied during coasting (overrun), not only at idle. Limited by Max RPM for idle advance while coasting.
Max RPM for idle advance while coasting
Maximum RPM for which idle advance while coasting is enabled
Separate idle VE table
This activates a separate fuel table for Idle, this allows fine tuning of the idle fuelling.
Override Idle VE table load axis
Allows you to change the default load axis used for the VE table, which is typically MAP (manifold absolute pressure).
- None
- MAP
- TPS
- PERCENT BARO
Ramp target RPM on return to idle
Ramp the idle target down from the entry threshold over N seconds when returning to idle. Helps prevent overshooting (below) the idle target while returning to idle from coasting.
- no
- yes
Ramp target duration
idle return target ramp duration
Separate idle tables for cranking taper
This uses separate ignition timing and VE tables not only for idle conditions, also during the postcranking-to-idle taper transition (See also afterCrankingIACtaperDuration).
Separate coasting idle table
Override the IAC position during overrun conditions to help reduce engine breaking, this can be helpful for large engines in light weight cars or engines that have trouble returning to idle.
Open Loop Idle
Open-loop idle adders. Each active accessory load (A/C, transmission in gear, fans, CAN idle-up) raises the base idle air and/or the target RPM so the engine does not sag when the load engages.
A/C adder
Additional idle % while A/C is active
A/C RPM target
Idle target speed when A/C is enabled. Some cars need the extra speed to keep the AC efficient while idling.
Transmission idle up adder
Additional idle % while transmission idle up is active
Transmission idle up RPM target
Idle target speed when transmission idle up is enabled. Some transmissions need extra idle speed when engaged.
Fan #1 adder
Additional idle % when fan #1 is active. In PWM mode this is scaled according to PWM %
Fan #1 RPM target
Idle RPM target adder when fan #1 is active. Raises the idle RPM target so the closed-loop PID does not fight the open-loop IAC adder.
Fan #2 adder
Additional idle % when fan #2 is active. In PWM mode this is scaled according to PWM %
Fan #2 RPM target
Idle RPM target adder when fan #2 is active. Raises the idle RPM target so the closed-loop PID does not fight the open-loop IAC adder.
CAN idle-up target RPM adder
can box idle up demand
CAN idle-up % adder
can box idle up demand %
Closed Loop Idle
Closed-loop idle PID. The ECU trims idle air (IAC duty or ETB angle) to hold the target RPM, working on top of the open-loop position. See https://content.epicefi.com/wiki/index.php/Guides:PID_Control for tuning the gains.
P gain
Proportional value. See https://content.epicefi.com/wiki/index.php/Guides:PID_Control
I gain
Integral value
See https://content.epicefi.com/wiki/index.php/Guides:PID_Control.
D gain
Derivative value
See https://content.epicefi.com/wiki/index.php/Guides:PID_Control.
Min
PID controller output minimum duty value.
Max
PID controller output maximum duty value.
iTerm Min
iTerm min value
iTerm Max
iTerm max value
PID Extra for low RPM
Increases PID reaction for RPM<target by adding extra percent to PID-error
Use PID output gain table
This flag allows to use a special 'PID Multiplier' table (0.0-1.0) to compensate for nonlinear nature of IAC-RPM controller
ETB idle settings
Idle settings specific to electronic throttle (ETB) cars, where idle air is metered by the throttle plate itself instead of a separate IAC valve.
ETB idle maximum angle
This sets the range of the idle control on the ETB. At 100% idle position, the value specified here sets the base ETB position.
Dashpot emulation
Dashpot (coasting-to-idle) emulation. Adds a temporary slug of idle air when dropping back to idle from a coast, then holds it and decays it away, softening the transition and preventing stall — emulating a mechanical throttle dashpot. Separate values are provided for when A/C is on.
Dashpot coasting-to-idle Initial idle Adder
This value is an added for base idle value. Idle Value added when coasting and transitioning into idle.
Dashpot coasting-to-idle Hold time
How long initial idle adder is held before starting to decay.
Dashpot coasting-to-idle Decay time
How long it takes to remove initial IAC adder to return to normal idle.
Dashpot coasting-to-idle Initial idle Adder(AC ON)
This value is an added for base idle value(AC ON). Idle Value added when coasting and transitioning into idle.
Dashpot coasting-to-idle Hold time(AC ON)
How long initial idle adder is held before starting to decay(AC ON).
Dashpot coasting-to-idle Decay time(AC ON)
How long it takes to remove initial IAC adder to return to normal idle(AC ON).
Ignition idle settings
Idle ignition timing. Lets idle be stabilised with spark as well as air — advancing to recover from a sag and retarding to bleed off speed, for faster correction than air alone.
Open loop idle timing (RPM-error)
Use Idle Target Error Delta timing curve
Include corrections in idle timing
If enabled, adds the result from the RPM-error curve to the corrected idle advance. If disabled, it discards all corrections (IAT, CLT, PID etc.) and uses the curve value directly.
Closed loop ignition timing (PID)
Closed-loop idle ignition timing: a fast PID that adjusts spark advance around the idle target for quick correction, working alongside the slower air-based idle PID.
Enable PID control
Gain is in degrees advance per rpm away from target, a good starting point is 0.1 = 10 deg per 100 rpm
P gain
Proportional value. See https://content.epicefi.com/wiki/index.php/Guides:PID_Control
I gain
Integral value
See https://content.epicefi.com/wiki/index.php/Guides:PID_Control.
D gain
Derivative value
See https://content.epicefi.com/wiki/index.php/Guides:PID_Control.
Min adjustment (retard)
PID controller output minimum duty value.
Max adjustment (advance)
PID controller output maximum duty value.
Soft entry time
When entering idle, and the PID settings are aggressive, it's good to make a soft entry upon entering closed loop
Idle hardware
Physical idle air hardware: the IAC solenoid or stepper outputs and their drive settings. Electronic-throttle cars meter idle air through the throttle plate instead — see ETB idle settings.
Solenoid
PWM idle air control (IAC) solenoid valve output(s). Supports a single valve or a Subaru/BMW-style double solenoid.
Idle Solenoid Primary output
Primary output pin driving the PWM idle air control (IAC) solenoid valve.
To find the actual value for your hardware, see Hardware.
Double Solenoid Mode
Subaru/BMW style where default valve position is somewhere in the middle. First solenoid opens it more while second can close it more than default position.
Idle Solenoid Secondary output
Second output pin for double-solenoid idle valves (some Subaru and Mazda), where one solenoid opens the valve further and the other closes it past the default position. Only used in Double Solenoid Mode.
To find the actual value for your hardware, see Hardware.
Idle Solenoid output(s) Mode
Output mode for the idle solenoid pin(s). See ECU output mode selection.
Idle Solenoid Frequency
PWM frequency for the idle air control solenoid output. Match it to your valve: too low buzzes audibly and meters air unevenly, too high and the valve cannot respond. Two-wire IAC solenoids are typically driven around 200–300 Hz.
Idle target RPM
Target idle RPM as a function of coolant temperature. A cold engine targets a higher idle, tapering down to the warm idle as it heats up.
Idle open loop position
Open-loop idle air position (IAC % or stepper steps) versus coolant temperature. This is the base feed-forward opening; closed-loop control trims around it.
Idle cranking position
Idle air position held while cranking, versus coolant temperature. Sets how far the valve opens to get the engine to fire, before the crank-to-run taper takes over.
ETB idle maximum angle
This sets the range of the idle control on the ETB. At 100% idle position, the value specified here sets the base ETB position.
Cranking Idle Valve Curve
2D curve — X: Coolant (-40 to 120), Y: Percent (0 to 100).
Idle after start (crank-to-run) taper
After the engine starts, the extra cranking idle air is tapered out over a number of engine cycles (versus coolant temperature) down to the running idle position.
Idle valve Crank-to-Run Taper
2D curve — X: Coolant (-40 to 120), Y: cycles (0 to 500).
Idle PID output gain
Optional PID output multiplier (0.0–1.0) versus RPM, used to compensate for the non-linear relationship between IAC position and RPM. Enabled by Use PID output gain table.
Idle PID error gain
Extra PID gain applied as a function of RPM error, letting the controller react harder the further idle is from target.
Coasting idle position override
Idle air position used during overrun/coasting (versus coolant temperature) when the separate coasting idle table is enabled, used to manage engine braking and return-to-idle.
Valve force close / stepper re-park
Gradually drives the idle valve closed and re-parks the stepper once the engine is clearly off-idle (above an RPM and TPS threshold). Prevents manifold pressure leaking through the valve at cruise and resets accumulated stepper step-loss without a full homing cycle.
Force close: RPM threshold
Gradually close the idle valve and re-park the stepper when RPM is above this value AND TPS is above idleValveForceCloseTps. Prevents manifold pressure leakage through the valve at cruise, and resets accumulated stepper step-loss errors. Set to 0 to disable.
Force close: delay (s)
Seconds to wait after RPM and TPS conditions are both met before beginning to close the idle valve. Prevents closing on brief throttle blips.
Force close: TPS taper start (%)
TPS at which the idle valve starts closing toward zero (taper start). Used together with idleValveForceCloseRpm and idleValveForceCloseTpsEnd.
Force close: TPS taper end (%)
TPS at which the idle valve reaches fully closed and the stepper is re-parked (taper end). Position is linearly interpolated from current to zero between idleValveForceCloseTps and this value. Should be greater than idleValveForceCloseTps.
Force close: re-park overstep (steps)
Number of extra steps to overstep toward closed when re-parking after force-close. Compensates for stepper drift without needing the full startup homing sequence. 5 is a good starting point.
Stepper acceleration profile
Complete theory explained by Texas Instruments: https://www.ti.com/lit/an/slyt482/slyt482.pdf?ts=1781468773748
The problem
An idle stepper IAC is open-loop: the ECU counts steps; it does not know if the motor actually moved. Commanding a high step rate from a standstill often causes lost steps, noise, or a valve that only works if you keep the rate unrealistically low.
The older logic used a single Stepper reaction time (ms) as a fixed delay between steps — safe, but slow on long moves.
Stepper acceleration profile ramps speed: start slow → accelerate → cruise → decelerate → stop soft. Long moves finish faster without demanding full rate from a standstill.
| Mode | How to get it | Behavior |
|---|---|---|
| Constant speed (legacy) | Set Starting speed, Target speed, Accel rate, or Decel rate to 0 | Fixed pace from reaction time (old behavior) |
| Accel/decel profile | Starting, Target, Accel, and Decel all > 0 | Trapezoid on long moves; triangle on short moves |
Stopping speed of 0 is treated as at least 1 step/s when the profile is enabled.
Parameters
| Parameter | Unit | Role |
|---|---|---|
| Stepper reaction time | ms | Caps how fast the profile may run. Treat as: reactionTime = 1000 / (max steps/s). Also used for pauses (direction change, sleep, parking). |
| Stepper total steps | count | Full valve travel. Independent of the speed profile. |
| Starting speed | steps/s | Rate at the beginning of a move. 0 disables the profile. |
| Target speed | steps/s | Cruise / maximum rate on long moves. |
| Stopping speed | steps/s | Rate at the end of a move (soft stop). |
| Acceleration rate | steps/s² | Ramp from starting → target. |
| Deceleration rate | steps/s² | Ramp down toward stopping. |
Firmware also keeps starting ≤ target and stopping ≤ starting, and clamps speeds that exceed what the hardware can achieve.
Reaction time and maximum speed
Reaction time limits the maximum speed the acceleration profile can reach.
(Strictly this ceiling is most important on H-bridge drive; for safety, configure it the same on every setup.)
Set reaction time from the motor’s maximum rated step rate:
reactionTime (ms) = 1000 / max_steps_per_second
Example: motor rated 500 steps/s → reaction time 2 ms.
If reaction time is left too large, the profile will never reach the target speed you configured, no matter how high target/accel are.
Starting from scratch
You can use this to get the stepper working. Tune the values according to how the stepper behaves. Faster target speed or acceleration/deceleration can be achieved if the motor doesn't skip steps. Meanwhile some motors might need slower starting and stopping speeds.
1. Set total steps, wiring, and parking so the valve homes correctly.
2. From the motor rating, set:
- Target speed = maximum rated steps/s
If the manufacturer gives step time at max speed (ms per step):
Target speed = 1000 / step_time_ms
- Reaction time = 1000 / Target speed
(same number as above, expressed as ms)
3. Initial profile values:
- Starting speed = Target speed / 10
- Stopping speed = Target speed / 10
- Acceleration rate = Target speed (numerically equal to target steps/s → reaches cruise in about 1 second from a low start)
- Deceleration rate = Target speed (same idea for the ramp-down)
4. Test large moves (parking, big IAC swings) and small corrections. If you lose steps or hear harsh buzz at the start/stop, lower starting/stopping further or soften accel/decel. If moves are clean but slow, raise accel/decel first; only push target if the motor rating allows it.
5. Keep reaction time matched to the rated max speed so it does not silently cap a correctly set target.
---
Migrating from fixed step time
If the old constant-speed tune (reaction time only) was not losing steps:
1. Use the old reaction time only to seed the soft ends of the move:
Starting speed = Stopping speed = 1000 / old_reaction_time
2. Set everything else as when starting from scratch:
- Target speed from the motor’s max rated speed (or 1000 / manufacturer_step_time)
- Reaction time = 1000 / Target speed
- Accel rate = Target
- Decel rate = Target
So migration reuses the proven old pace as a conservative start/stop rate, then adopts full rated cruise and the same 1-second ramp starting points as a new setup.
If the old tune was losing steps, do not use it for starting/stopping — go back to Target / 10 (or lower) and fix mechanical/electrical issues before chasing speed.
To keep pure legacy behavior instead, leave Starting / Target / Accel / Decel at 0.
Open loop ignition idle timing (RPM-error)
Open-loop idle timing curve: ignition advance/retard as a function of how far RPM is from the idle target. Enabled by Open loop idle timing (RPM-error).
Idle Target Error
2D curve — X: Delta (-500 to 500), Y: Deg (-30 to 30).
Idle fuel table
Separate VE/fuel table used at idle when Separate idle VE table is enabled, for fine control of idle fuelling independent of the main table.
Idle ignition table
Separate ignition timing table used at idle when Separate idle ignition table is enabled. Advance at low idle speed prevents stalling; retard at high idle speed bleeds off power to settle the idle.
Rotational idle
Rotational idle (a race/anti-lag-style lumpy idle): deliberately cuts spark and/or fuel in a rotating pattern at idle to produce a distinctive idle sound, with three accumulators that shift the pattern for different exhaust notes. Can be engaged manually by pin or automatically by TPS/CLT.
Enable
Enable rotational idle.
Pin
Switch input that activates rotational idle when held.
To find the actual value for your hardware, see Hardware.
Pin Mode
Input mode for the rotational idle pin. See ECU input mode selection.
Stop STFT for rotational idle (no fuel trim)
Zero STFT for rotational idle.
Rotational cut spark
Rotational cut spark.
Rotational cut fuel
Rotational cut fuel.
Enable automatic engagement for TPS
Enable automatic engagement of rotational idle.
Engage rotational idle below this Driver Intent(TPS/PPS)
Engage rotational idle under this Driver Intent.
Enable auto engage for CLT
Enable Rotational Idle Auto engage CLT.
Auto engage above this CLT
Rotational Idle Auto engage CLT.
Minimum CLT
Minimum CLT for the rotational idle.
Maximum TPS/PPS (0 to disable)
Disengage rotational idle above this Driver Intent.
Minimum RPM
Minimum RPM for the rotational idle.
Maximum RPM
Maximum RPM for the rotational idle.
Disable closed loop idle when rotational idle active
Disable closed loop idle control when rotational idle is active.
Add idle % idle output
Add air to the idle.
Add/Remove air percentage
Percentage of air to add/remove to the idle.
Override ETB Idle Authority (0 to disable override)
Override the ETB authority for the rotational idle.
Fuel Multiplier (1.5 = 150% , 0 to 2.5)
Rotational idle fuel multiplier
Rotational Absolute Timing (-30 = 30 ATDC, 0 = original timing, 10 - -100)
Rotational idle absolute ignition (-20 = atdc 20 degrees)
Old rotational idle logic (true = old, false = new) - see tooltip
Old rotational idle logic, New logic is based on global spark counter, the three layers of accumulators and adders run at the same time, offset shifts the pattern forward or backward with relation to each other, this should allow different sound patterns by combining different offsets;
Rotational Fuel Offset (should be 0, this shifts fuel cut in relation to ignition signal)
Rotational idle fuel offset (should be 0, this shifts fuel cut in relation to ignition signal). At 0, in sequential injection/ignition the fuel pulse is cut before the ignition pulse. so fuel is not wasted.
Accumulator Max 1
Max value for the rotational idle accumulator to skip
Accumulator Adder 1
Accumulator adder
Accumulator Offset 1
Rotational pattern shift #1
Accumulator Max 2
Max value for the rotational idle accumulator to skip
Accumulator Adder 2
Accumulator adder
Accumulator Offset 2
Rotational pattern shift #2
Accumulator Max 3
Max value for the rotational idle accumulator to skip
Accumulator Adder 3
Accumulator adder
Accumulator Offset 3
Rotational pattern shift #3
Transmission idle compensation
Raises idle air and/or target RPM when an automatic transmission is put in gear (switch input), so the engine does not sag under the torque-converter load.
Transmission idle up switch
Switch input that signals the transmission is in gear, activating transmission idle-up.
To find the actual value for your hardware, see Hardware.
Transmission idle up switch mode
Input mode for the transmission idle-up switch. See ECU input mode selection.
Transmission idle up adder
Additional idle % while transmission idle up is active
Transmission idle up RPM target
Idle target speed when transmission idle up is enabled. Some transmissions need extra idle speed when engaged.