DONE (1.1.90): After lot of test with cars with very light flywheel i found out it is better to set iac integral to 0 always when car is moving(regardless of map).


+ if (iac_integral_moving() && wheel_speed1.wspeed ) {

+ iac.integral = 0;

+ // why not return here ??? Marcell applied return

+ }

+ if (engine_kpa8() < config.iac_integral_lowmap && !iac_integral_frozen() ){

+ iac.integral = 0;

+ return;

+ }

Test with 1.1.87 and all is good. Idle is again perfect :).


How to set perfect idle. First you need perfect VE table:).

Than set your ref iac position to +200-300rpm above target rpms.

Set PID, P=35 I=10 D=50 (or similar), iac limit -60 and +50.

My proposal for universal solution(all are happy :)

Add two bits:

first bit= iac integral frozen bit, so if bit is set and engine is in idle and engine_kpa8() < config.iac_integral_lowmap then iac.integral is frozen (doesn't change)

But when isn't set, and ngine is in idle and ngine_kpa8() < config.iac_integral_lowmap then iac.integral is set to 0

second bit= iac integral moving bit, when is set and cars is moving (car speed from speed sensor>0) and car is in idle then iac.integral is set to 0

if isn't set, then nothing

+ if (engine_kpa8() < config.iac_integral_lowmap ){/// TODO: needs to check result

+ if (!iac_integral_frozen() || (iac_integral_moving() && wheel_speed1.wspeed ))

+ iac.integral = 0;

+ return;

+ }

  1. define iac_integral_frozen() (config.config12 & _BV(iac_integral_frozen_bit))
  2. define iac_integral_moving() (config.config12 & _BV(iac_integral_moving_bit))
You find an experimental 1.1.87 with this iac twilight-zone experiment under

I new version of firmware (1.1.80, 1.1.84) iac.integral is frozen if map is higher than in config. But when you shift gears, always you have small decrease in iac.integral as you can see in log:

At idle i have iac.integral -32(1s). When i start driving iac.integral is -34, but when i change gear from first to second (5s in log), iac.integral is decreased to -44. After 4 gear changes iac.integral is -70 and i have problem with car stalling.

IMHO better solution is like older firmware has(less than 1.1.74). If map is higher than in config iac.intergral is 0.

  • set is to 255s. With that value and 1.1.74 firmware i had perfect idle at 800rpm. Now i have problems with 950rpm.
Tomorrow i'll try to set it low.
  • Tried to set 3,5,10s, nothing is good. IMHO one bit should be add. If engine.speed>0 than iac.integral=0. That feature use most cars ecu. So if you are driving or driving slow idle is little higher(ref position table) and with that you don't have problems when you are driving few km/h at parking lot with small amount of throttle(no changing of IAC values).

- Didn't the integral reset after this time? or did you still get a negative windup resulting in engine stall? Try to set correct overrun_fuelcut settings(1500rpm or so), I saw your was set to 25 000. These settings affects Integral reset aswell.. (when tps=0 and rpm > overrun_fuelresume then integral=0) /Larsa

- Well then it would be better as you say, like it was before integral=0 when map reading is lower than configured. The problem with this what I've discovered is that sometimes you can get the idle stuck at high rpm because when rpm raise at idle (for some reason) you get a lower vaacum and you will get under the ingegral_lowmap resulting the integral controller will be disabled and you are stuck at this high rpm (happends when reference-position and integral-lowmap is set too high). Another problem is when you are engine braking and just passing above the integral_lowmap limit, the integral controller tries to lower the iac-valve opening until you get under this limit again and integral resets, then you get a higher map again and so on. (happends when integral-lowmap set too low and reference-position set too high).. But with correct idle-settings (reference-position, integral-lowmap) this didn't become a problem!

-- but if you put when car is moving iac.integral=0 and integral min map=0 you don't have problem with stuck at high rpms(only when driving(speed!=0)). Only problems are if ref position is set to low(imho good setting is 200-250 above idle).