The system I worked on would go into closed-loop idle speed right off the 'start flare'. This meant that once RPM reached a threshold (about 1200 from memory) it would go closed-loop with spark.
Idle speed was determined by cat light-off parameters (totally separate from idle speed itself) and warmup parameters, and the base idle speed. There was a rate limit to how fast the idle speed could be changed (I think it was around 100 rpm/sec). When in idle speed control, all of the table lookups were done at target speed instead of current speed, this provided a lot more stability in idle control.
The warmup parameters were based on accumulated air (grams of air since engine start) as well as the coolant temperature when the engine started. The most significant warmup parameters were fueling related (% of fuel that would evaporate and burn vs pass through as droplets), idle speed didn't have many. Base idle speed was just scalar. I think it could be two 1d tables - one outputs elevated RPM as a function of start ECT and the other outputs decay factor (% of elevated RPM to base RPM) as a function of accum air or cycle count.
With my small engines I don't have idle speed control and that isn't a problem since nothing can load the engine (there is no accessory belt and we have either a speed-engaged CVT or centrifugal clutch so there are no clutch or trans loads at idle speed). For normal engines, the accessory belt loads are quite significant, and the driver can shift to D or engage the clutch at idle speed without pedal input, so the engine needs much more idle control to prevent stalls.
To actually control idle, the simplest way is to do it entirely through spark (for the actual idle control), and apply min/max advance limits (probably max would be the spark table value and min would be ???). Then, set a target spark advance in idle and have the ETC (or IAC for mechanical throttle) slowly dial it open/closed to hold a target advance. Fast (spark) control could be PI or PID and slow (air) control could be PI or just I. If you can predict any loads you can use them to bump the slow control loop so the fast loop has more room to work before it hits min or max spark. For multiple ETC's (not sure how you're handling your V12), it would also be good to try to balance the banks.
Another feature I've seen is 'stall protection' which adds torque whenever RPM gets below some speed threshold (usually cal'd as a % between target idle speed and 0). If idle speed target is e.g. 700 and RPM sags to e.g. 500, it might request a rather large amount of torque. Without a torque-based system it would probably add both ETC % and fuel (since presumably spark is already at max or the idle speed controller would have caught the issue, so adding fuel is the quickest way to save the engine).
_________________ "Sometimes, the elegant implementation is a function. Not a method. Not a class. Not a framework. Just a function." ~ John Carmack
"Any sufficiently advanced technology is indistinguishable from magic" ~Arthur C. Clarke
|