951 List of all DME Maps
- Tom
- Site Admin
- Posts: 8920
- Joined: Fri Jun 25, 2021 2:04 pm
- Location: Silicon Valley, CA
- Has thanked: 931 times
- Been thanked: 3989 times
- Contact:
Here is a list of all known maps in the 951 DME, including their starting location, the starting location for XFD purposes, and a snippet of starting bytes. This list can be used to enhance your TunerPro XDF file if you want to make changes to a more obscure map not already included in the Carpokes XDF files. This list was derived from the SourceForge Open DME project found here: https://sourceforge.net/projects/opendme/
You need to be registered and logged in to download files. Registration is free and easy!
I'm working on documenting the DME program in detail. Here's the current index of stuff I've come up with
How the Motronic DME Maps Work - this covers the structure of the maps, breakpoints etc. for both 1 and 2 axis maps, and shows a few examples (https://jhnbyrn.github.io/951-KLR-PAGES ... _info.html)
The Motronic map locations - if you use the Opendme notes from the first post, you'll notice that the maps are referred to with numbers starting at 1. And indeed this is how the program code refers to the maps everywhere. But it doesn't correspond with the map locations in the TunerPro file. Those are much bigger numbers. This article explains what's going on there, and how to translate the "short name" (i.e. "map 1", "map 2" etc.) into the real location (https://jhnbyrn.github.io/951-KLR-PAGES ... tions.html)
How the DME reads engine temperature - a fairly deep dive into how the DME determines engine temperature. Many of the DME's maps use engine temperature as the input variable (or one of two input variables) but looking at the raw map values, it's not at all obvious what temperatures they represent. This article will explain how all that works and make interpreting temperature based maps a breeze (https://jhnbyrn.github.io/951-KLR-PAGES/ntc_info.html)
Idle Stabilizer Valve (ISV) routine - a few questions came up in the forum about how the 944 idle control works. Some people have into strange situations with the FTech9 DME, and others just want to tune the idle control to suit some hardware changes (light flywheel etc.). Here's a very detailed explanation of how the 944's idle stabilizer valve is controlled, complete with all relevant maps and constants (https://jhnbyrn.github.io/951-KLR-PAGES/isv_routine.htm)
How the Motronic DME Maps Work - this covers the structure of the maps, breakpoints etc. for both 1 and 2 axis maps, and shows a few examples (https://jhnbyrn.github.io/951-KLR-PAGES ... _info.html)
The Motronic map locations - if you use the Opendme notes from the first post, you'll notice that the maps are referred to with numbers starting at 1. And indeed this is how the program code refers to the maps everywhere. But it doesn't correspond with the map locations in the TunerPro file. Those are much bigger numbers. This article explains what's going on there, and how to translate the "short name" (i.e. "map 1", "map 2" etc.) into the real location (https://jhnbyrn.github.io/951-KLR-PAGES ... tions.html)
How the DME reads engine temperature - a fairly deep dive into how the DME determines engine temperature. Many of the DME's maps use engine temperature as the input variable (or one of two input variables) but looking at the raw map values, it's not at all obvious what temperatures they represent. This article will explain how all that works and make interpreting temperature based maps a breeze (https://jhnbyrn.github.io/951-KLR-PAGES/ntc_info.html)
Idle Stabilizer Valve (ISV) routine - a few questions came up in the forum about how the 944 idle control works. Some people have into strange situations with the FTech9 DME, and others just want to tune the idle control to suit some hardware changes (light flywheel etc.). Here's a very detailed explanation of how the 944's idle stabilizer valve is controlled, complete with all relevant maps and constants (https://jhnbyrn.github.io/951-KLR-PAGES/isv_routine.htm)
Last edited by johnb on Sun Oct 05, 2025 4:09 pm, edited 10 times in total.
I'll start adding the info needed to make sense of the maps here (in no particular order for now)
First up is the maps related to control of the idle stabilizer valve (ISV). This is probably more detail than anyone needs but if you're having idle tuning issues, maybe this stuff will be useful.
Firstly, the ISV uses the open-loop map all the time, except when you disable it by connecting terminals B and C on the diagnostic port (part of the factory idle screw adjustment procedure). When you do that, the ISV operates at 30% ON regardless of any variables.
The closed loop correction is only used when the idle switch is closed.
The values shown here in the open loop map are duty cycle % values. The formula to convert the raw map values into duty cycle can be written as
(map_value * 0.54 + 66)/256
If you play around with the formula you'll quickly see that the ISV cannot get below 25% or above ~80% no matter what the map value is (this remains true when the closed loop correction is added). This is probably to protect the solenoids. Solenoids generally have a maximum duty cycle somewhere below 100%. But the ISV has two solenoids that always work in a complementary way, so when one is ON the other is OFF. So having a max duty cycle means it must have a minimum too, or else the other one would exceed the max!
Map 60 - base (feed-forward) ISV PWM % values by RPM and coolant temperature (in deg C)
Map 53 - target rpm for cranking and coasting (by Temp in C)
Map 54 - target rpm for alternate path (pin 28 not grounded as it should be)
Map 55 - normal target rpm
Maps 87-90 - (depending on code plug) min load to allow negative idle RPM correction, by engine temp
(I can't say much about what these load values mean in familiar units, except that they are out of a possible 0-255 in a linear scale for a given rpm).
The next 3 maps are used to calculate the amount of the ISV pulse width correction when the idle RPM is not at its target value.
The first two, 56 and 57 are used to calculate the integral term. You can think of this as a small, longer term trim value. It accumulates over a number of cycles to fine-tune the idle speed.
The third one, map 58 is the gain for the proportional term. This is the big adjustment, and is only used when the RPM is below target. This is calculated anew every cycle - it doesn't accumulate like the previous two.
In all 3 cases, the RPM value used to look up the map is the error, i.e the difference between current and target rpm - so for example, using map 56 if the current RPM is 40rpm above the idle target value, the map will return a gain factor of 10.
This gain factor is multiplied by the error (the raw error is rpm/40, so just 1 in our example) and the result is added to the base PWM value after some scaling depending on which term it's for (P or I).
Map 56 - idle rpm correction I gain (rpm > target)
Map 57 - idle rpm correction I gain (rpm < target)
Map 58 - idle rpm correction P gain (rpm < target)
Single value Constants:
For all the gory details on how the ISV is controlled, see https://jhnbyrn.github.io/951-KLR-PAGES ... utine.html
For general info on how to interpret raw map values, see https://jhnbyrn.github.io/951-KLR-PAGES ... _info.html
First up is the maps related to control of the idle stabilizer valve (ISV). This is probably more detail than anyone needs but if you're having idle tuning issues, maybe this stuff will be useful.
Firstly, the ISV uses the open-loop map all the time, except when you disable it by connecting terminals B and C on the diagnostic port (part of the factory idle screw adjustment procedure). When you do that, the ISV operates at 30% ON regardless of any variables.
The closed loop correction is only used when the idle switch is closed.
The values shown here in the open loop map are duty cycle % values. The formula to convert the raw map values into duty cycle can be written as
(map_value * 0.54 + 66)/256
If you play around with the formula you'll quickly see that the ISV cannot get below 25% or above ~80% no matter what the map value is (this remains true when the closed loop correction is added). This is probably to protect the solenoids. Solenoids generally have a maximum duty cycle somewhere below 100%. But the ISV has two solenoids that always work in a complementary way, so when one is ON the other is OFF. So having a max duty cycle means it must have a minimum too, or else the other one would exceed the max!
Map 60 - base (feed-forward) ISV PWM % values by RPM and coolant temperature (in deg C)
Code: Select all
| | -35 | 0 | 36 | 76 |
|-------|-------|-------|-------|-------|
|800 | 0.79| 0.42| 0.36| 0.29|
|1000| 0.79| 0.42| 0.36| 0.29|
|1200| 0.79| 0.45| 0.36| 0.29|
|1560| 0.79| 0.47| 0.39| 0.31|
|2000| 0.79| 0.57| 0.5 | 0.37|
|4000| 0.79| 0.67| 0.61| 0.53|
Map 53 - target rpm for cranking and coasting (by Temp in C)
Code: Select all
| Temp | -33 | -23 | 50 | 65 |
|------|------|------|------|------|
| RPM | 1600 | 1000 | 920 | 800 |
Code: Select all
| Temp | -28 | 21 | 40 | 76 |
|------|------|------|------|------|
| RPM | 800 | 800 | 800 | 800 |Map 55 - normal target rpm
Code: Select all
| Temp | -21 | 50 | 76 |
|------|------|------|------|
| RPM | 1000 | 920 | 840 |
Code: Select all
| Temp | -33 | 18 | 37 | 65 |
|-------|------|------|------|------|
| Load | 40 | 27 | 22 | 20 |The next 3 maps are used to calculate the amount of the ISV pulse width correction when the idle RPM is not at its target value.
The first two, 56 and 57 are used to calculate the integral term. You can think of this as a small, longer term trim value. It accumulates over a number of cycles to fine-tune the idle speed.
The third one, map 58 is the gain for the proportional term. This is the big adjustment, and is only used when the RPM is below target. This is calculated anew every cycle - it doesn't accumulate like the previous two.
In all 3 cases, the RPM value used to look up the map is the error, i.e the difference between current and target rpm - so for example, using map 56 if the current RPM is 40rpm above the idle target value, the map will return a gain factor of 10.
This gain factor is multiplied by the error (the raw error is rpm/40, so just 1 in our example) and the result is added to the base PWM value after some scaling depending on which term it's for (P or I).
Map 56 - idle rpm correction I gain (rpm > target)
Code: Select all
| ΔRPM | 0 | 80 | 520 | 640 |
|------|---|----|-----|-----|
| Gain | 2 | 10 | 16 | 1 |Map 57 - idle rpm correction I gain (rpm < target)
Code: Select all
| ΔRPM | 0 | 80 | 320 | 520 |
|------|---|----|-----|-----|
| Gain | 2 | 10 | 10 | 16 |Code: Select all
| ΔRPM | 40 | 80 | 400 | 640 |
|------|---|----|-----|-----|
| Gain | 0 | 30 | 80 | 80 |Code: Select all
Relative Location | Absolute Location | Hex | Decimal | Meaning
------------------|-------------------|------|--------|--------
3C | 119C | 17 | 23 | PWM value for idle setting mode (~30%)
39 | 1199 | 15 | 21 | Minimum idle rpm when AC is on (normal path, 840rpm)
40 | 11A0 | 01 | 01 | Counter value for startup flare
3F | 119F | 02 | 02 | Counter value for coasting return-to-idle flare
38 | 1198 | 04 | 04 | Idle RPM error threshold for correction reset
3B | 119B | 00 | 00 | ISV PWM correction for AC-on (alternate path)
3A | 119A | 18 | 24 | ISV PWM correction for AC-on (normal path)
3D | 119D | C0 | 192 | ISV PWM correction positive limit (divide by 2, add 128)
3E | 119E | 27 | 39 | ISV PWM correction negative limit (divide by 2, complement, add 128)
41 | 11A1 | 8A | 138 | ISV PWM scaling factor (read as 138/256 = ~0.54)
42 | 11A2 | 42 | 66 | ISV PWM offset term (read as 66/256 = ~0.25)
0B | 116B | 1631 | 5681 | 16-bit value (includes the next byte): timer ticks that make one complete periodFor general info on how to interpret raw map values, see https://jhnbyrn.github.io/951-KLR-PAGES ... _info.html
