Closed Loop Idle

    Not having closed loop idle isn't something that was broken in the code.  I am not sure why they did not include closed loop idle capability.  Being this unit was designed as a kind of a general EFI system and not to a specific motor / cam combination, maybe closed loop idle caused some kind of problem in a particular application.  My cam is at the top of the wild list and you would think as you went milder any problems would become less sever.  Don't know...  One of the main reasons I wanted to close the loop at idle was the code's poor performance when the air temperature gets hot.  I would have to set the Idle Fuel Modifier so rich so that when everything got good and heat soaked the idle mixture wouldn't lean out so much it would start surging severely.  There is so much ignition advance at idle (in the high 40's) that I don't need such a rich mixture to keep the motor running reliably.  I was always able to manually bring the idle mixture down and still maintain a decent idle.

    Well we have all of the hardware in place to close the loop at idle.  The heated O2 sensor being a big one.  If the O2 sensor was not heated and your installation mounted it too far down stream there might have not been enough heat in the exhaust gases to keep the sensor up to its operating temperature.  With the heated sensor this is not as large of a concern.  My first attempt at closed loop idle was just to bring down the minimum closed loop RPM limit parameter.  Well this did allow closed loop idle but I experienced quite a bit of off idle stumbling.  The large cam needs extra fuel in this area because of its poor low RPM efficiency and dilution of the intake charge.  I didn't really think this was going to work but it was simple so I gave it a shot.

These are the Closed Loop Idle Rules I have applied....

    When you get into how closed loop works on this thing you will see that after the calibration routine come up with a pulse width for the injectors it can be further modified to adjust the mixture to stochiometric via the feed back path of the O2 sensor.  Normally the maximum amount it can modify the fuel mixture is about +/-20%.  I found that this was not enough to control the idle mixture through all the air temperature ranges my motor experienced.  I found that I needed to adjust the user's Idle Fuel Modifier a little on the fat side to make the motor run good till it got really warm.  That is where the 170 degree Coolant rule comes from.  If the water temperature is at or above 170 degrees and the normal closed loop fuel modifier runs out of authority I start modifying the actual Idle Fuel Modifier at $00AB.  This value has another potential +/-50% of adjustment range.  So if the normal closed loop fuel accumulator (L0079) gets to a rail after a short period of time, currently every .5 seconds, the main Idle Fuel Modifier at $00AB gets bumped.  Basically what is happening here is that the ECU is learning where it needs to adjust itself to keep the idle mixture under control.  It works really well.  No matter how hot it gets it is always able to keep the mixture within reasonable bounds.
    Another area I had to modify was how the code determined if the O2 sensor was working ok or not.  What it did originally was if the O2 voltage swung below 302 mv (Red LED) and above 618 mv (Green LED) within a short period of time  (255 ignition events) then it considered the O2 working.  What happens during closed loop idle is that I can maintain a sensor voltage very close to the 447 mv (cooling of the O2 sensor helps a little here I'm sure) trip point so the error voltage stopped swinging outside of the 302 mv and 618 mv window and shortly after words it would come up with an O2 sensor error and stop working.  What I do now is reset the error counter (L0077) every time the O2 voltage crosses 447 mv and only bump it in the timer overflow handler.  The timer overflow handler is real time (gets hit every 131 ms) so it now takes a little over 33 seconds with the error voltage never crossing 447 mv before the O2 sensor will signal an error.  This helped the idle quality also because an AFR around 14.6:1 is just about as lean as this motor will idle at.  Any leaner and you can really feel it.  So by letting the O2 error voltage oscillate in a very narrow band around 447 mv works out well.


    Below are some plots showing the progress from first attempts to what is happening today.  You probably should check here for how these graphs are Scaled.

    Well this was the first pass at closed loop idle.  Basically all that was done at this point was to extend the minimum closed loop RPM rule to around 700 RPM.  All the original closed loop algorithms are still in place at this point in time.  You can see that the loop is way slow with the O2 sensor's response always lagging the fuel modifier (at $0079).   Remember that a count of 16000 (1600 on the plot) is about a 20% change in fuel so there is almost a 40% peak-to-peak change in fuel going on here.


    Here is where I started to break out the closed loop idle routines from the normal closed loop operations.  You can see how the code was learning how much fuel was needed at idle.  When the throttle was first closed the fuel modifier (L0079) went to the lean rail trying to bring in the O2 voltage.  What you don't see on the plot is the main Idle Fuel Modifier at $00AB being adjust to bring the closed loop fuel modifier (L0079) off of the rail.  As time progresses the Idle Fuel Modifier is pulled enough to keep the closed loop fuel modifier off of the rail.


    Here you can see the effects on closed loop idling of me trying to reduce the swing of the closed loop fuel modifier in L0079 during normal closed loop operations.  The value at L0075 is the rate of change that the L0079 fuel modifier is adjusted every ignition event.  What I was trying to do at this point in time was to slow the closed loop response some by reducing the rate of change as a function of O2 voltage (more on that in the O2 stabilization discussion).   You can see that the value of L0075 was zero most of the time here leaving the fuel modifier at L0079 alone.  You can see how little change in error voltage there is when you are not over controlling the fuel going into the motor.  This worked well for idling but was not aggressive enough for higher RPM's.


    These two plots show the current state of the closed loop operations.  If you look closely you see how the fuel modifier at L0079 steps back half way to the last toggle point and waits every time the O2 voltage crosses 447 mv.  This is the technique that I am using to try to tame the normal closed loop operations.  You can also see how much more stable the closed loop fuel modifier in L0079 is compared to the first plot above.