Tuning

Getting Started
Things you need


 * 1) KWP2000+ OBD cable
 * 2) KWP2000+ flashing software
 * 3) TunerPro
 * 4) XDF file for the revision of ECU you are using. If you wish to use a different version software than your car came with, read  this carefully.
 * 5) * XDF for M-box.
 * 6) ECUFix (required, the KWP2000 flashing software does not always get all the checksums right.)
 * 7) VCDS (aka VAG-COM) and/or ECUx
 * 8) A wide-band O2 sensor if you are not using stock fueling. A tailpipe sniffer is fine, as long as you have test-pipes and no pre-cats in your downpipes.

If you are using the Galletto flasher (the one linked above), you will have to put your ECU into boot mode for it to work. It is 100% reliable and will even flash bricked ECUs (assuming the hardware is ok), but it can be a pain. Tony@NefMoto has been working on his own flashing solution that does not rely on boot mode, but will not flash bricked ECUs. Checksum support is coming soon, apparently.

Checksum support for ME7 is now available as a plugin for TunerPro, look at TunerPro Checksum Plugins

Fueling
Always start with this first. If you get fueling wrong, you will likely break something. Get this right, and do not try pushing the envelope in any tables until you are confident your fueling is where you want it. Always use a wideband sensor. Do not skimp on this. The stock narrow bands do not provide you with accurate enough readings. For stage 1-2+, adjusting fueling isn't technically necessary; however, a bit of extra fuel via KFLBTS isn't such a bad idea if you are running pump gas and a bunch of extra boost.

Primary

 * MLHFM - compensate for MAF housing diameter. Some argue that using a different MAF housing (to extend the functional metered flow range) requires you to fix this so that measured load is "correct". The upside is that all of Motronic's tables that are based on load are probably still good. The downside is that you may hit the hard limit of load, and you'll go lean at high loads because the ECU can't tell how much air the motor is ingesting. That's obviously very bad. If that's the case, you'll definitely want to scale back the MAF readings some. Even if you don't ride the hard limit, you'll also run off the end of the load axis in the timing tables. Some say this isn't so much of an issue.

If you do scale your MAF, you may throw a "MAF too high" code. You'll have to increase:
 * KFMLDMX - maximum load

Finally:


 * KRKTE - primary fueling. Start with this to get your WOT AFR to roughly match your requested AFR. If you are using stock injectors and fuel pump, you should not have to touch this.

Desired AFR
The main tables that determine requested AFR:


 * LAMFA - requested lambda. Not very flexible for high load enrichment.

Instead, use the EGT enrichment tables:


 * KFLBTS_0_A - requested lambda for component protection when calculated EGT is above TABGBTS, scaled by FBSTABGM. Note that lambts also modified by KFDLBTS and KFFDLBTS: lambts = KFLBTS + (KFDLBTS * KFFDLBTS). Setting KFLBTS to 1 where you don't need it won't disable bts, you also have to set KFFDLBTS = 0 to disable it.


 * TABGBTS - Threshold for KFLBTS. Unless calculated EGTs are above this threshold, KFLBTS is ignored, and LAMFA controls requested AFR if it is lower than lambts. You may have to lower TABGBTS if you have a scaled MAF, since calculated EGTs will be artificially low.


 * FBSTABGM - KFLBTS multiplier. Make sure you change the axis properly to represent your lowered TABGBTS. Again, not necessary if you have a properly scaled MAF.

The result of all this is "lambts" which, if lower, overrides "lamfa".

Part throttle LTFT
Once you get your WOT AFR right, you may notice that your LTFTs are way out of whack. If they get too far out, you'll throw a code and possibly go into limp mode.


 * KFKHFM - Correction map for MAF. Log STFTs at various part throttle positions, RPMs, inclines, and gears to determine where the MAF readings need tweaking. If you are using the stock MAF and intake system, you should not have to touch this.

Idle LTFT and idle misfires
If you have idle problems (and/or idle LTFTs you can't seem to zero out), you may have to investigate tuning for your injector latency and/or idle injection period.
 * TVUB - Injection time offset
 * FKKVS - Correction factor for fuel supply system

If you are running really big injectors, and you are running rich no matter how much you turn down KRKTE, you may need to reduce the minimum injector on time
 * TEMIN - minimum injector on time

If you did not properly scale your MAF, and you are getting a rough idle but aren't seeing idle misfires, it could be because your load at idle is too low, inhibiting misfire detection. Scale your MAF properly, or decrease your misfire recognition load threshold.
 * RLSALUN - Load threshold for shear detection for suppression of misfire detection
 * RLSALULL - Load threshold for shear detection for suppression of misfire detection during idle

Finally, if none of this works, you may have to increase your idle RPM and/or idle torque reserve (alters idle timing)
 * NLLM - idle RPM
 * NFSM - idle RPM while in gear
 * KFMRES - idle torque reserve
 * KFMRESK - idle torque reserve while transmission decoupled (clutch in)

Consumption
Now that you have your fueling set up, you'll probably notice that your MPG readings in your cluster are totally wrong. Fill up a with a tank of gas, and reset your trip odometer and average MPG. When you are done with the tank, fill up your tank, see how much gas you used and how far you went, and check it against the new average MPG. Get a calculator out, and correct it here:


 * KVB - fuel consumption (MPG in cluster)

For reference, you may be able to derive the right value using this (although some fine trial and error tweaking is much easier):

$$TKVAG = \frac{\sum_{t=0}^{TMAIN} (rk_w+rkte_w) \times KRKTE [ms] \times KVB [cm^3/min] \times 1000}{Kd [mm^3/s] \times 0.0512 [ms] \times 60000}$$

Boost
ME7.1 doesn't really have a "boost" table. It does everything based on "specified load". Requested boost is roughly 10*(spec load)+300mbar.

First, make sure the 100% pedal position requests enough load:
 * KFMIRL - specified load

Specified load/boost will never exceed these limits:
 * LDRXN - maximum specified load
 * KFLDHBN - maximum requested pressure ratio

Specifically, on a full throttle pull, your boost profile will follow LDRXN. K03s and K04s have some severe flow limitations, so unlike big turbos, you will want your boost to taper (not ramp up) to redline. ECUxPlot has a pressure ratio/flow plotter that you can use to compare against your turbo's compressor map.

You will throw a 17963 Charge pressure: Maximum limit exceeded code if your boost deviation is too high:
 * KFDLULS - Delta pressure for overboost protection

If you are running significantly more boost than stock, or you have made changes to the boost PID, you may have to increase these limits. The most unsophisticated way is to simply max the entire table. Obviously, you will get better results if you spend a bit more time tuning this table to something appropriate. It is generally not a good idea to disable too many safety features, particularly when it comes to boost.

If you screw up, it is possible that specified boost is higher than the maximum possible measured boost. For obvious reasons, the PID will not like this. To prevent this, set this to zero:


 * DSLOFS - MAP pressure sensor offset

Absolute maximum measured boost is 0xffff/25.6 = 2559.96 mBar (assuming DSLOFS = 0)

Maximum spec boost is 0xff*10 = 2550 mBar

These are both hard ECU limits, and cannot be increased by simply changing sensors or internal ECU MAP scaling.

IAT effect on requested boost
ME7.1 will adjust the specified load limit depending on IATs. As IAT's go up, ME7.1 brings the max boost up a bit so that the driver can't tell that the car is slow in hot weather. It can do this because the stock boost curve is relatively conservative, and there is plenty of headroom. At some point, if IATs go high enough, max specified load is pulled to prevent knock:
 * KFTARX - IAT correction for maximum specified load

However, if you are running a lot of boost, and always want maximum performance, there is no point in increasing boost when it is hot, let alone reducing boost when it is cold. Also, as IATs rise, even with a perfectly flat KFTARX and LDIATA (see below), you will see more requested boost because the ECU knows that a higher P/R is required for a given cylinder fill (PV=nRT for you thermodynamics nerds out there). It is unknown if there is a table for that calculation. To compensate, you may want to taper KFTARX across the board as IATs rise to keep your requested boost sane. In particular, be aware that the maximum requested boost is slightly above the maximum MAP reading. Readers who understand PIDs should recognize that really bad things happen when the measured output cannot reach the setpoint...

Cam changeover effect on requested boost
Motronic likes to change requested boost depending on cam position. While it may seem like a good idea in theory, in practice, abrupt changes in requested boost near the MAP limit can make the boost PID unhappy. When logging, you may see an odd notch in requested boost between 3000 and 4000 RPM. These maps are what is causing that notch
 * KFPBRK - Correction factor for combustion chamber pressure
 * KFPBRKNWS - Correction factor for combustion chamber pressure when NWS active
 * KFPRG - Internal exhaust partial pressure dependent on cam adjustment when sumode=0
 * KFURL - Conversion constant for ps->rl dependent on cam adjustment when sumode=0

Boost PID
If your actual boost is not meeting requested boost, you may have to increase the PID I limit between 2250 and 5000 RPM for 850 and 1000mBar:
 * KFLDIMX - LDR I-Regulator limit

To go along with KFTARX above, there is another IAT correction that ME7.1 uses to allow the PID to add waste-gate duty cycle at elevated IATs. You may want to zero it all out:
 * LDIATA - LDR I-Regulator limit as a function of IAT

If you aren't using K03s, you may have to tweak the PID response. Note: this is NOT used to adjust requested boost. It is used to compensate for different waste-gate responses.
 * KFLDRL - Map for linearization of boost pressure = f(TV). This is the post-PID waste-gate duty correction table.
 * LDRQ0S - LDR PID Q0 in static operation (proportional term)
 * LDRQ1ST - LDR PID Q1 in static operation (integral term)
 * KFLDRQ2 - LDR PID Q2 (differential term)

KFLDRL can also be used to get open-loop type behavior for operation past the MAP and requested boost limit by making the output duty cycle unresponsive (flat) to uncorrected duty cycle (from the PID) at various RPM/DC points.

Torque limits
On tiptronic cars, you may get Engine Torque Monitor: Control Limit Exceeded codes. This is probably for protecting the torque converter. To get around it, you will have to look at:
 * RAMPASR
 * KFMIZUFIL/KFMIZUNS
 * KFMPED_/KFMPNS_
 * RLVMXN/RLVSMXN - Maximum relative indicated torque under open throttle body
 * KFMIOP - Optimal engine torque map

Timing
When running elevated boost on pump gas, you will have to significantly cut requested timing to prevent timing retard. Keep your worst case correction factors in the single digits, and always carefully monitor your knock voltages when tuning your timing.


 * KFZW/KFZW2 - primary timing maps. ME7.1 has a two point variable cam timing system; there is a table for each cam timing state.

If you did not fully "correct" your MAF using KFKHFM, make sure you do a lot of logging to see where the various load points are and how much timing ME7.1 is pulling due to knock activity. Most likely, you will have to adjust the entire map. If you did correct your MAF, you can probably leave most of the timing table alone, except at very high load.

Other niceties
If noted, map locations are for the M-box

Speed limiter

 * VAVMX/VMAX - Speed limiter

Rev limiter

 * NMAX - RPM limit
 * NLLM - idle RPM
 * NFSM - idle RPM while in gear

Left foot braking
Set either of these to maximum to prevent throttle cut when left foot braking:


 * NWPMBBR - Minimum RPM for acc pedal value lockout on brake operation
 * VWPMBBR - Minimum speed for acc pedal value lockout on brake operation

Knock recognition
'''Adjust these maps with care. Abusing any of them can cause severe ping/knock/detonation and probable motor damage'''
 * KRFKLN - Ignition retard per knock event.
 * KRALH - Load hysteresis. This adjusts how quickly timing will be restored as load changes.
 * KRANH - Engine speed hysteresis. This adjusts how quickly timing will be restored as RPM changes.

Requested load cut on knock detection

 * KFFLLDE - Factor for slow LDR intervention on rlmax via KR

Long term knock control adaptation
If you want your long term knock control to add timing back quicker if knock activity subsides, you may want to lower KRDWA
 * KRDWA - Knock control adaptation to differential current ZW map

Fuel enrichment on knock detection

 * KFLAMKRL - Enrichment on ignition retard

Launch control

 * VNMX (1157E) - The vehicle speed for activating the raised (normal) rev limit. We set this as low at it goes (1.25 km/h) so the launch control shuts off as soon as you start moving off the line.
 * DNMAXH (16304) - This is the RPM above rev limit when the fuel cut comes on. Tweaking this helps make more boost on the limiter. I use 50 RPM
 * ITNMXH (16308) - Dwell time under lower limit before activating the upper limit. We set this to 0 seconds
 * NMAX (1630A) - Ends up being the launch RPM. I've found 4500 RPM works well.
 * NMAXOG (16312) - This is the raised RPM limit which becomes the standard limit. Mine is set at 7100 RPM
 * TMOTNMX (16316) - Coolant temp for activating raised (normal) rev limit. We set this at -48 so that it can activate at any coolant temp.
 * TNMXH (1631A) - This is the time duration of the raised (normal) rev limit. We set this at it's maximum value of 655.3500 seconds. I haven't had a problem yet with this and have been testing for months.

Some ECU's need:
 * CWNMAXMD (CWDNMAX?) (8-bit) - Codeword Drehzahlbegrenzung (Codeword for RPM limiter). Change from 0 to 1

Example bin based on stock binary.

Unfortunately, this method is useless for building boost, since it uses a soft rev limiter (throttle plate control/fuel cut) rather than a hard limiter (cutting spark). ME7 has a hard limiter, but it apparently can't be used here.

Rear O2 Sensors

 * CDKAT - Cat diagnosis in OBDII-Mode. Set to zero to disable rear cat DTC

If you want to remove your rear O2s entirely, also set these to zero:
 * CDHSH - Post cat O2 heater diagnosis
 * CDHSHE - Post cat O2 heater amplifier diagnosis
 * CDLSH - Post cat O2 sensor diagnosis
 * CLAHSH - Error Class: Bank 1 post cat O2 sensor heater
 * CLAHSH2 - Error Class: Bank 2 post cat O2 sensor heater
 * CLAHSHE - Error Class: Bank 1 post cat O2 sensor heater amplifier
 * CLAHSHE2 - Error Class: Bank 2 post cat O2 sensor heater amplifier

You may also have to change these to disable rear catalyst lambda control (untested):
 * CLRHK (0x11A87) - Code word for Lambda - Control post cat on/off: set to odd? (original value 72)
 * CLRHKA (0x19FCF) - Code word for Lambda - Control post cat: set to 1? (original value 0)

EGT
If you want to remove your EGT sensors: Note that my old M-box xdf is wrong for CDATR/ATS. Please use these offsets.


 * CDATR (0x18196) - Configuration byte diagnosis exhaust gas temperature regulation
 * CDATS (0x18197) - Configuration byte diagnosis exhaust gas temperature sensor
 * CLAATR - Error class exhaust gas temperature regulation
 * CLAATR2 - Error class exhaust gas temperature regulation bank 2
 * CLAATS - Error class exhaust gas temperature sensor
 * CLAATS2 - Error class exhaust gas temperature sensor bank 2

There is anecdotal evidence that this will not allow you to completely remove the EGT sensors; keeping dead ones connected might be necessary.

Wheel speed sensor
If you have different wheel rolling diameters from stock, and you want to log the correct speed:
 * AIMVM (0x12A56) - Number of speed pulses per m for signal normalization v

Additional Reading

 * Tony@NefMoto's website - one stop shopping for real tuning discussions, without the glass bead trading game and secret handshakes.
 * Motronic abbreviations
 * VCDS
 * Lemmiwinks