Because I'm bored at work, I thought I'd simplify things a bit... it basically goes a little like this:
Closed Loop.
ECU: Hey, Temp Sensor, how cold is it out there?
Temp Sensor: It’s 15 degrees
Sol2.be Module: No, it’s 5 degrees
ECU (thinks): Brr, bit chilly 5 degrees, I’d better inject more fuel
ECU: Hey, Injector, Temp Sensor says it’s a bit cold outside, please can you stay open a bit longer and inject more fuel.
Injector: Sure, not a problem.
Spark Plug: Bang!!!!!!!
AFR Sensor: Hey, ECU, you’re running a bit too rich.
ECU: OK, thanks for telling me.
ECU (thinks): Hmmm, better do something about that.
ECU: Hey, Injector, I know I said to stay open a bit longer because Temp Sensor said it was cold but AFR Sensor says we’re running a bit too rich so don’t open quite so long next time, please.
Injector: OK.
Spark Plug: Bang!!!!!!!!
AFR Sensor: Hey, ECU, that’s perfect now.
ECU: Great, thanks!
ECU (thinks): Hmmm, weird my programmer said I needed a wider injector pulse width at this temperature so either I’m running in some sort of oxygen starved air or Temp Sensor is lying to me. Either way, I’d better remember that I don’t need such a big injector pulse width at this air temperature in future.
Sol2.be Module: Damn, I've been foiled!
Open Loop.
ECU: Hey MAF Sensor, how much air is flowing?
MAF Sensor: 3g/s
ECU: Hey Temp Sensor, how cold is it out there?
Temp Sensor: It’s 15 degrees
Sol2.be Module: No, it’s 5 degrees
ECU: Great, thanks.
ECU (thinks): Hmm, I know I’ve been told I need to inject this much fuel for that engine load at this RPM and at 5 degrees, but when I was running in closed loop earlier I needed much less injector pulse width than I thought. I’d better compensate and open for 3ms instead of 3.5ms.
ECU: Hey Injector, open for 3ms please
Injector: OK, no problem.
Spark Plug: Bang!!!!!!
AFR: Sorry, value out of bounds
ECU: OK, well I’ll assume I got it right based on data I’ve been told about and data I’ve learnt about.
Sol2.be Module: Damn, foiled again!