Idle control - HOW TO

Many people have problems to set up idle control. Here is a guide how to do it step by step.
Remeber PID is only for fine tuning, the VE table (stable lambda) and Active state airflow table are essential.
If you have any question please ask here, as it helps to polish the tutorial.

How to properly set up idle control?

Properly configured idle settings should maintain the desired idle RPM under standard conditions without the need for PID controllers.
PID controllers are used to correct idle speed under varying conditions such as coolant temperature changes or engine load (e.g. when the rear window defroster or radiator fan is activated).


Step 1: Configure the Idle Activation parameters
Ensure that Idle On PPS is set lower than Idle Off PPS. For initial setup, the default values can be used.


Step 2: Configure the desired idle target based on coolant temperature
This is done in the Idle Target RPM table.
The colder the engine, the higher the idle RPM should be.
If the engine is equipped with aggressive camshafts, oversized injectors, or a lightweight flywheel, the idle target should be set higher than in a stock engine.

Also configure the Afterstart RPM Increase table under Idle Target.
This table defines how much the idle RPM should be increased after engine startup.
The colder the coolant, the more the RPM should be raised during startup.


Step 3: Configure the Idle Ignition target angle table
Set ignition timing so that advancing or retarding timing affects engine speed in a predictable and symmetrical way.
This is typically a few degrees before TDC.
At this point, set all PID parameters (kP, kI, and kD) to 0.


Step 4: Configure the airflow control method
This step is critical for proper idle control.
In the Actuator settings, choose the correct method of airflow control (e.g. DBW, PWM valve, etc.).
Make sure the actuator can provide sufficient airflow for maximum idle RPM during cold start, and that it does not allow the engine to stall at minimum airflow (adjust DBW Target Min/Max or Solenoid Min/Max DC accordingly).


Step 5: Use the Override Airflow feature
Start the engine and log engine RPM at various coolant temperatures and airflow percentages.
These values will help you fill in the Active State Airflow table.
This table is essential for the correct operation of idle control!


Important note:
If the engine speed is unstable with a constant airflow setting, it likely indicates problems such as incorrect fueling, wrong injection timing, oversized injectors, or idle RPM set too low to be stable.
PID controllers cannot compensate for such issues.
Ensure a stable lambda for each airflow value. Lambda < 1 usually results in more stable idle.


Step 6: Fill in the Active State Airflow table
Use the logged data. Interpolate missing values from surrounding cells.
At this point, changing the Idle RPM Target should result in actual engine RPM closely following the target.
If not, adjust airflow values for the relevant temperature.


Step 7: If idle is still unstable
Improve the fuel map in the idle region, use a lower Lambda Target, or increase the idle target RPM (a higher target usually results in better idle stability).


Step 8: Tune the Armed State Airflow table
If RPMs are not dropping as expected and the idle controller remains Armed, reduce values in the Armed State Airflow table.
This table controls how quickly RPM drops after throttle closure.
Too high of a value will prevent RPM from dropping effectively.


Step 9: Fine-tune the deceleration to idle behavior
Once stable idle has been achieved for all combinations of CLT and idle targets, configure idle behavior when RPMs are dropping in Neutral gear.
Briefly tap the throttle and observe how RPM falls compared to the fall of the idle target affected by the Ramp Down Offset.

Tune Ramp Down Decay Rate and Ramp Down Delay so that engine RPM decreases in sync with the ramp down offset.
This prevents PID saturation and ensures a smooth transition to idle without RPM dipping below the target.


Step 10: Configure the PID controller for ignition (Ignition PID)
This should help minimize idle RPM deviation from the target.
The default values are a good starting point.

10 Likes

I’ve done all the above, I have a sold idle around all of the CLT points but every now and again the RPMs drop below 500 and it stalls. Target is 950 but for whatever reason once or twice on a drive it doesn’t react and stalls. I’ve had this issue a while now.

I use almost the same manual (by expirience) and it works well, but when I turned on airflow PID - oscillations started.
I tried several ways, but how I noticed it always goes fight with each other (ign pid vs af pid).
I set 12 degrees btdc for idle, but sometimes it’s around 20, because airflow pid can’t achive normal position. I wouldn’t like to post logs ~2 hours on idle.
As I understand, sometimes it “think” that is ok to 20 degrees instead of 12, just because of target rpm = rpm. But in my head its should work another way - for idle is airflow control, but for immediately corrections - ignition control.
It’s hard to tell how it was in v2, I start use EMU Black from v3. But with MS3 - this engine, with this configuration (only ECU has been changed) - it works ideal on idle, 800 rpms (790-810 max osc), even tuner the same (me),

I still hope that it’s just new SW for me and I still don’t understand something.
Please continue the HOW TO from step 10… only on Ign PID it works well, even 600-1200 rpms can be achived only by ignition advance. Airflow PID makes IDLE ocsillation.

Excellent write up, Jadzwin. Very timely since I’m in the process of sorting out the idle settings.

Question: What is the process to calibrate the “Airflow VE correction” table? I have ITBs, an idle air control valve and am running Alpha-N. Is this a critical setting or can I use some default values?

Hi @Jadzwin_ECUMASTER

You’ve looked at this issue before but I’m still getting random stalls once or twice on each drive. I have a nice smooth idle that control’s well at around 950rpm. Please see attached log, the stall happens at 46:50 in the log.

Thanks
Wayne

cut out.emublog3 (5.0 MB)
20250521_0656_00.emub3 (66.9 KB)

I also have a problem that sometimes the idle speed control does not enter the armed state and the engine stalls


20250611_0743_idle_not_armed2.emublog3 (118.9 KB)
20250611_0736_idle_armed_active.emublog3 (94.3 KB)
20250611_0730_idle_not_armed.emublog3 (106.4 KB)

Your problem are those settings:

You have very high vacum in manifold (about 16-16 kPa) so the idle control activate much to late.
So you can put small numer like 14kPa for idle On if MAP over or adjust armed state airflow to lower vacum during engine brake.
I would start to put 0 for MAP over parameter and drive to check if stalls dissapear

1 Like

I think you have the same problem with the MAP over setting wrong. But I cant confirm without base map

What about makes armed state table 3D , with CLT axis. For example from 1x8 to 2x4 to not waste memory. It can make transition to idle more stable during warmup. Its detail, but…

Something I noticed with this tune/base map/log is that the accel enrichment is hammering all the time. The table has 15% across the zero TPS row. This doesn’t seem right. This causes the AFRs to be all over the place.

Gents, not sure if that’s directly related to Idle, as when idle kicks in it works nice.
When starting the engine I have a drop in RPM caused by IGN target (?) being at 0, before Idle control kicks in.
Cranking is at 6 deg BTDC. Maybe I’m missing something?
Which parameter I should set so the IGN would not try to go to ZERO before Idle goes active?


2025-06-17-005_Idle-setup-start-tune.emub3 (66.1 KB)
20250618_1524_Idle-Start-Tune.emublog3 (11.3 KB)

Second question, when trying to drive half-clutch, or exactly to start moving by slowly depressing the clutch pedal I see that my PWN DC for Airflow sticks to c.a. 50% (and the engine dies). Why it’s not going over to like 60-70% to prevent engine stall?
Which parameter limits that?

20250618_1743-half-clutch-stall.emublog3 (20.3 KB)

One important note. I’ve upgraded from 3.033 where all was running fine and after upgrading to 3.051 this went bananas.

Another thing that is not clear to me.
We have three tables for Idle Ignition Management.

Min Torque ign. ang.
Max Torque ign. ang.
Target Ign. Table

I would expect that the Min/max tables refer to the REAL RPM and help to add some advance or remove it to get the real RPM closer to Idle RPM target and then stabilise on ing. adv. defined in Target Ign. Table.

BUT I see that Min/Max operate in the range of a TARGET RPM not the Real RPM.
Therefore when engine begins to stall and RPM drops Ign. Adv. is added as in the Target RPM range, not Real RPM range.

This is counter intuitive to me honestly.

1 Like

Very good point!!! I didnt even notice it said target rpm and not ACTUAL rpm, no wonder timing never behaved like expected!

Is there a recommended way to pull up engine revs when operating half clutch (no TPS movement, fixed at 0%)?

This is for “driving” in a traffic jam.

For the time being I use custom correction table for AIR active when Fn out is 1 (RPM >400 to not make mess when cranking). When RPM drops to 600, 800, 900 I open Idle Air Valve 50, 30 10% (add) respectively.

This causes some oscillation issues sometimes, as the PID controller is not dealing with a bigger volume of additional air (at least the way I tuned it for the remaining part of Idle).

I want to have this as close to OEM behaviour as possible - which basically means the engine almost stalls and recovers smoothly with no oscillation.

Thank you :slight_smile:

Do you have a clutch switch? I bump up the idle target by 200rpm when the clutch is depressed. This helps with moving the car around as OEM.

Nope. No clutch switch. An old car (1990) and no option to add one.

You are right. There should be RPM not Idle RPM target. It will be changed in next build.

I think you should use afterstart ignition lock:

1 Like