Lemmiwinks
What is Lemmiwinks?
Named after an infamous Southpark character, lemmiwinks gives the average person access to a few parameters used by the Bosch Motronic ME7.1 to make engine management control decisions. While it does not allow the user to directly modify the internal boost/fueling/timing maps, let alone the control code responsible for interpreting those maps, it does allow quite a bit of customization.
Of most interest, it allows quite a bit of control over fueling, which, in the case of the B5 S4, is probably the single most important parameter when using a larger turbo than stock.
Of secondary interest is its ability to change the overall timing maps. However, ME7.1's built-in knock sensor control loop somewhat limits the usefulness of this feature.
In addition, Lemmiwinks allows changes to the speed limiter, parameters governing engine idle characteristics, and "specified load" scaling. This last function is unfortunately also of limited use. Even though target load is directly related to specified boost, the default value is 100%, so target load (and therefore boost) can only be scaled downwards, not upwards. However, reducing overall boost can help prevent excessive negative boost deviation which can cause throttle cut.
Channel summary
Ch. | Name | Function | Increase/decreasing value result |
---|---|---|---|
01 | Idle Speed Offset | Adjust idle RPM level | Increase/decrease idle (RPM) |
02 | Fuel Tweak (Accel Pump) - Increasing Loads | Fuel trim tweak while load is rapidly increasing | Add/remove fuel (%) |
03 | Fuel Tweak (Accel Pump) - Decreasing Loads | Fuel trim tweak while load is rapidly decreasing | Add/remove fuel (%) |
04 | Start Up Fuel Enrich | Fuel trim during engine start | Add/remove fuel (%) |
05 | Warm Up fuel Enrich | Fuel trim during engine warmup | Add/remove fuel (%) |
06 | Lambda Regulation | Controls narrow band 02 cycle time | Increase/decrease cycle time |
07 | Additive Offset To Speed Limiter | Speed limiter | Increase/decrease speed limiter (km/hr) |
08 | Secondary Fuel Tweak | Additive fuel term | Increase/decrease additive term (offset) |
09 | Ignition Timing Offset | Adjust overall timing | Advance/retard timing (degrees) |
10 | Primary Fuel Tweak | Multiplicative fuel term | Increase/decrease multiplicative term (%) |
11 | Unused | Unused | |
12 | SEL Scaling (Turbo Cars Only) | Scale specified load | Increase/decrease requested boost (%) |
13 | Control Bits | Unused | |
14 | Idle Torque Additive Offset | Controls engine load at idle | Increase/decrease spec load at idle |
Bosch Motronic ME7.1, load, and you
So, how does the ECU decide on injector on time, boost, and timing? One word: load. The ME7.1 is a "requested torque" based control system, which basically means that all decisions it makes is based on what it thinks the driver is asking for in terms of torque. The B5S4 is completely drive by wire, which means there is no direct connection between the accelerator pedal and the throttle valve. All the accelerator pedal does is tell the ECU how much the driver wishes to "accelerate". Based on that input, the ECU calculates a "target torque" that the user seems to be requesting. This, in turn generates a "load" percentage - 100% meaning wide open throttle (WOT), or, to put it another way "give me all you got Scotty."
Once the ECU decides it needs a target load of 100+% (i.e. the requested torque is greater or equal to what the ECU thinks the engine can deliver), its fueling control system goes open loop. In the ME7.1 asynchronous path, this means that all fueling decisions are going to be made almost soley based on mass air flow sensor readings. Those MAF readings also go into the boost map as a "specified load" and, along with RPM, determine specified boost. In the ME7.1 synchronous path, the timing maps determine the timing at every cycle of every cylinder, and should the knock sensor for a given cylinder reach a certain threshold, the timing will be cut down for the next cycle for that cylinder. If the knock sensor activity subsides, the timing will be restored, one step at a time, until another knock event occurs on that cylinder.
Fueling curve
To simplify things, from here on out will we assume the injector on time is ONLY a function of MAF readings. At its simplest, the fueling vs MAF value curve is a straight line with two terms. For those of you who know geometery and algebra, call it y=a*x+b, where x is the MAF, y is the injector on time, a is the "multiplicative" term and b is the "additive" term. There are additional terms based on the slope of the MAF, but that will wait for later.
To "enrich" the fueling across the board by a fixed percentage, one would increase the a (multiplicative) term, so the fueling is increased proportionally for every MAF value.
For example adding 10% to 10 yields 11, for an increase of 1, but adding 10% to 10 yields 110, for an increase of 11.
The "additive" value b does not have as much an effect near the top of the curve, because it is additive. In other words, adding a small amount everywhere means that the percentage increase of fueling for "high" MAF values is much lower than the percentage increase for "low" MAF values.
For example, adding 1 to 10 (to 11) is a 10% increase, whereas adding 1 to 100 (to 101) is only a 1% increase!
What does this mean for lemmiwinks? It means that the primary (multiplicative) fuel tweak increases fuel across the board, whereas the secondary (additive) fuel tweak has almost no effect for high MAF readings!
Now, lets talk about those other terms - channels 02 and 03: Increasing and decreasing loads. Basically, those terms "tweak" the basic y=a*x+b by multiplying the over all result by a term that is dependant on the slope (or derivative dx/dt where x is MAF reading and t is time) of the MAF. That means the faster the MAF is increasing (or decreasing) the more this term affects the fueling. So the faster the MAF value is going up, the more the "increasing load" term will adjust fueling. Similarly, the faster the MAF value, is dropping, the more the "decreasing load" term will change fueling.
How lemmiwinks works
According to Revo (the makers of Lemmiwinks):
Directly transferring the new adaptation channel values into the ECU works by finding the RAM memory location where the ECU stores the adaptation channel data and directly writing the changes to those RAM memory locations. When the ignition key is turned off the ECU enters a housekeeping mode where among other tasks the modified adaptation channel data is written into the serial eeprom. This roundabout method is required because memory writes directly to the serial eeprom are blocked.
Interestingly, this method will not work using the VAG mode protocol. Write access is allowed to any ECU RAM location except those locations that store the serial eeprom data. Someone at Bosch clearly knew about this vulnerability and took measures to close this loophole. But for some reason this loophole was left in the KWP2000 routines.
Each ECU code stores this adaptation channel data in different RAM locations. To make this method work with any ECU one runs through the following steps:
- Establish communications with the ECU using KWP2000 mode
- Read data directly from serial eeprom (since read access is allowed)
- Search for this data in the ECU's RAM
- Write the new adaptation channel settings to the RAM location
- Cycle ignition key to have ECU transfer the new settings into the serial eeprom.
The KWP2000 protocol is not as reliable as the VAG protocol. Some cars will have communications problems which often can be worked around by pulling the instrument cluster fuse (make sure VAG-COM will be able to
clear your air bag DTC light before doing this!).[1]