Difference between revisions of "Siemens MS43"

From MS4X Wiki
Jump to: navigation, search
(Created page with "<div style="float:right;">__TOC__</div> =Getting Started= ==VERY IMPORTANT== It is absolutely crucial before starting to mess with the DME, that you '''need''' to understan...")
 
(Injection)
 
(406 intermediate revisions by 10 users not shown)
Line 1: Line 1:
 +
The Siemens MS43 engine control unit (ECU) uses an Infineon C167CR_SR CPU in combination with a 4 megabit AMD AM29F400BB flash memory. This ECU controls the BMW M54 inline six engine.
 +
 +
When looking at the cryptic item names this might help you: [[Siemens Keyword Translation]]
 
<div style="float:right;">__TOC__</div>
 
<div style="float:right;">__TOC__</div>
 +
=Memory Layout=
 +
The MS43 can be seperated into three major sections, first comes the bootloader, then the program code, and last the calibration data.
  
=Getting Started=
+
See this table for file locations:
 
 
==VERY IMPORTANT==
 
 
 
It is absolutely crucial before starting to mess with the DME, that you '''need''' to understand the importance of having the correct softwareversion!
 
 
 
Softwareversion is a term which describes how old the software on a praticular DME is. The easiest analogy would be to use terms from the computer industry:  
 
 
 
The MS42 could be compared with Windows XP, whereas MS43 would be Windows 7. Both have a unique platform, but have had updates in the past.
 
These updates, called service packs, can be described as the softwareversion of the DME. We´ve been starting with basic Windows 7 (MS430037) and got the first service pack (MS430055). It still had errors so the second service pack (MS430056) was rolled out.
 
At MS43, there have been the following softwareversions:
 
 
 
  
 
{| class="wikitable"
 
{| class="wikitable"
!colspan="4"|Softwareversions
+
! style="text-align: center; font-weight:bold;" | Start
 +
! style="text-align: center; font-weight:bold;" | End
 +
! style="text-align: center; font-weight:bold;" | Section
 +
! style="text-align: center; font-weight:bold;" | Size
 
|-
 
|-
| MS430007
+
| style="text-align: center; background-color:#fe996b;" | 00000
| MS430019
+
| style="text-align: center; background-color:#fe996b;" | 0FFFF
| MS430036
+
| style="text-align: center; background-color:#fe996b;" | Bootloader Code
| '''MS430056'''
+
| style="text-align: center; background-color:#fe996b;" | 64 kByte
 
|-
 
|-
| MS430009
+
| style="text-align: center; background-color:#fffc9e;" | 10000
| MS430021
+
| style="text-align: center; background-color:#fffc9e;" | 1FFFF
| MS430037
+
| rowspan="6" style="text-align: center; background-color:#fffc9e;" | Program Code
| MS430064
+
| rowspan="6" style="text-align: center; background-color:#fffc9e;" | 384 kByte
 
|-
 
|-
| MS430010
+
| style="text-align: center; background-color:#fffc9e; color:#000000;" | 20000
| MS430022
+
| style="text-align: center; background-color:#fffc9e; color:#000000;" | 2FFFF
| MS430050
 
| MS430066
 
 
|-
 
|-
| MS430012
+
| style="text-align: center; background-color:#fffc9e; color:#000000;" | 30000
| MS430024
+
| style="text-align: center; background-color:#fffc9e; color:#000000;" | 3FFFF
| MS430051
 
| MS430069
 
 
|-
 
|-
| MS430014
+
| style="text-align: center; background-color:#fffc9e; color:#000000;" | 40000
| MS430030
+
| style="text-align: center; background-color:#fffc9e; color:#000000;" | 4FFFF
| MS430053
 
| MS430070
 
 
|-
 
|-
| MS430015
+
| style="text-align: center; background-color:#fffc9e; color:#000000;" | 50000
| MS430032
+
| style="text-align: center; background-color:#fffc9e; color:#000000;" | 5FFFF
| MS430054
 
|  
 
 
|-
 
|-
| MS430018
+
| style="text-align: center; background-color:#fffc9e; color:#000000;" | 60000
| MS430034
+
| style="text-align: center; background-color:#fffc9e; color:#000000;" | 6FFFF
| MS430055
+
|-
|  
+
| style="text-align: center; background-color:#9aff99; color:#000000;" | 70000
 +
| style="text-align: center; background-color:#9aff99; color:#000000;" | 7FFFF
 +
| style="text-align: center; background-color:#9aff99; color:#000000;" | Calibration Data
 +
| style="text-align: center; background-color:#9aff99; color:#000000;" | 64 kByte
 
|}
 
|}
  
  
+
'''Bootloader Section'''
  
The very important part now is, each softwareversion got a new feature (whatever that feature might be is not important!). Every new feature means that there needs to be changes done in the code to implement them. Every change in the code also means that the maps in the tune need a new layout/position.
+
The bootloader code section is the most important section of the MS43 and doesnt have to be touched for at least 99% of all use cases.
So keep in mind, a definition file (.xdf/Damos/A2L) is written for a very specific softwareversion! If you load a flash file with e.g. MS430066 into TunerPro and use the definition file from MS430056, it´ll get really messy! If you are seeing strange values double check that you are using the correct version!
 
  
'''AVOID USING DIFFERENT SOFTWAREVERSION'''
+
This section is 64 kByte in size and contains the interrupt setups, input and output initializations, as well as immobilizer information and the UIF (user information fields).
  
If your DME is MS430066, you need to find a XDF/Damos/A2L file for that particular version!
+
The significant difference between the bootloader section and the others is, that it's only one time programmable under normal operation. That means once a byte has been changed from FF to another value, it is not changeable again.
  
'''NEVER EVER FLASH A TUNE FROM A DIFFERENT SOFTWAREVERSION ON YOUR ECU OR IT WILL BE BRICKED!'''
+
Unlimited write access to the bootloader section can only be archieved through JMGarage Flasher and is ONLY needed for virginizing the ECU to pair it with a different EWS module or to alter the UIF without increasing the flashcounter.
  
Even using MS430055 tune in TunerPro with an XDF for MS430056 will result in a mess!
+
Tip: The newest version of immobilizer and checksum delete will not need bootmode flashing.
  
[[File:Old_Wrong_Version_XDF_Error.png |300px|thumb|none|v55 .BIN loaded with v56 .XDF]]
 
  
==Software & Tools==
+
'''Programm Code Section'''
Before rushing into the tuning thing, make sure that all of your tools are working properly and you fully understand the following sentences.
 
  
The Siemens MS43 flashchip contains two different sections:
+
All of the MS43 program code is located here.
  
#0x00000 - 0x6FFFF (448 KByte)
 
#*This is ECUs program space, special features (EWS or checksum deletes, Launch Control, etc.) are programmed here
 
#0x70000 - 0x7FFFF (64 KByte)
 
#*This is the parameter space, where most of the functions in the ECU program lookup their corresponding values
 
  
Together these sections sum up for 512 KBytes total. So when you hear someone talking about the "512k file" or "full read", the whole flash content is meant.
+
'''Calibration Data Section'''
  
Most of the regular tuning stuff can be done inside the parameter space, or often called "partial read".
+
=Checksums=
 +
Checksums are used to verify that the data written to the ROM has not become corrupt.
  
So as long as you only want to raise your limiters, change injection or ignition tables, etc. you're fine with the smaller file. This reduces your flashing time as well.
+
The MS43 uses three CRC16 checksums that covers the boot, program and calibration sections and two addition checksums that covers the data for the monitoring (_mon_) routines.
  
Nevertheless, there are some special functions that require massive code rewritings in the program space, where a full write is nessessary.
+
The variables that the ECU uses to calculate the addition checksum is located in the program section so tools like Ultimo Checksum Corrector can only correct this checksum in a 512KB file.
  
Software collection with some goodies [https://drive.google.com/open?id=0BybpM7kNcnD5flA0QVdhbEpNbEpabENEbGhBZkVZZWpwT09kVDFMazEzMDhDSWVPRzFPTEU Google Drive]
+
Both addition checksums have to be corrected '''before''' the CRC16 checksums, as the addition checksums are located inside the CRC16 checksum areas.
  
===Flashing Software===
+
The checksums are located at the following addresses:
The tools mentioned in this paragraph are responsible for communicating with the flashchip on the MS43, where the ECU data is stored.
+
 
 +
{| class="wikitable" style="text-align:left;"
 +
!CRC16
 +
!Location
 +
|-
 +
| Boot
 +
| 0x3C24
 +
|-
 +
| Program
 +
| 0x6FDE0
 +
|-
 +
| Calibration
 +
| 0x73FE0
 +
|-
 +
!Addition
 +
!Location
 +
|-
 +
| Program Part 1
 +
| 0x6FDAE
 +
|-
 +
| Program Part 2
 +
| 0x6FD80
 +
|-
 +
| Calibration Part 1
 +
| 0x72FFC
 +
|-
 +
| Calibration Part 2
 +
| 0x72FFE
 +
|-
 +
|}
  
'''The ISN area is only written in bootmode, regardless of which software used.'''
+
==Disabling Calibration Checksums==
  
*'''JMGarage Flasher'''
+
'''Disable CRC16 Checksum'''
**Bootmode required (open the ECU and ground a pin)
 
**No checksum correction
 
**Only 512 KByte read/write
 
**Download old version: [[File:JMGarageFlasher_.rar]]
 
**Download new version: [[File:JMFlasher.zip]]
 
  
*'''Galletto 1260'''
+
To disable the CRC16 calibration checksum on all firmwares do the following.
**Only ignition on needed
 
**No checksum correction
 
**Only 64 KByte read/write
 
**Download from [https://drive.google.com/open?id=0BybpM7kNcnD5flA0QVdhbEpNbEpabENEbGhBZkVZZWpwT09kVDFMazEzMDhDSWVPRzFPTEU Google Drive]
 
  
*'''Siemens MSS5x Flasher (Credits belong to Kim Freding)'''
+
; Hexeditor
**Only ignition on needed
+
: 1. Set Word at 0x73FFE to 0xFFFF
**On-the-fly checksum correction before flashing
+
: 2. Set Byte at 0x6FFB0 to 0xA8
**64 KByte read/write
 
**512 KByte read/write
 
**Download V1.1.2.2: [[File:Siemens_Flash_Tool_v1.1.2.2.zip]]
 
**To receive a registration key send your hardware-id and e46fanatics or RomRaider username to ms43wiki@gmail.com
 
  
===Tuning Software===
 
The tuning software is not required, as you can make all the changes to the file with a HEX editor as well, but then you propably wouldn't need this wiki ;)
 
  
There are several tools, that'll make messing with the ECUs tables and values much easier and help a lot with a built in visualization engine.
+
'''Disable Addition Checksum'''
  
Again, there are more than the two programs listed below, but people using WinOLS or even a HEX Editor don't need this guide.
+
To disable the addition calibration checksum use one of the following methods.
  
These programs are relativly dumb, as they rely on so called "definition files". A definition file is unique for every software version, as stated in the beginning.
+
; Tunerpro
 +
: 1. Set lc_swi_cal_mon_cks to 165
  
A definition file describes every value and table of the ECU (at least in the best case) with its HEX location in the flashfile, a conversion factor and its upper and lower limits.
+
; Hexeditor
 +
: 1. Set the Byte in the table to 0xA5
 +
::{| class="wikitable" style="text-align:left;"
 +
!Firmware
 +
!Location
 +
|-
 +
| 430037
 +
| 0x70CE3
 +
|-
 +
| 430055
 +
| 0x70D7C
 +
|-
 +
| 430056
 +
| 0x70D7E
 +
|-
 +
| 430064
 +
| 0x70DA0
 +
|-
 +
| 430066
 +
| 0x70E0A
 +
|-
 +
| 430069
 +
| 0x70E07
 +
|-
 +
|}
  
In addition to that, there are logging definitions, that help you to log all the values for tuning or troubleshooting. Romraider has some nice wideband o2 sensor plugins!
+
=Variants Configuration Switches=
 +
As MS43 is used in many different chassis configurations there are quite a few configuration switches that enable or disable their corresponding features or change their behaviour.
  
#[http://www.tunerpro.net/downloadApp.htm TunerPro]
+
'''Configuration brake light test switch logic variant (c_conf_bts)'''
#*[https://drive.google.com/folderview?id=0BybpM7kNcnD5flA0QVdhbEpNbEpabENEbGhBZkVZZWpwT09kVDFMazEzMDhDSWVPRzFPTEU&usp=sharing Latest TunerPro definition file for MS430056 (.xdf)]
+
*0: Signal high corresponds to 'brake actuated'
#*[http://www.tunerpro.net/downloadBinDefs.htm#BMW Incomplete TunerPro definition files for other softwareversions (.xdf)]
+
*1: Signal low corresponds to 'brake actuated'
#*[http://forum.e46fanatics.com/showpost.php?p=17197443&postcount=2940 TunerPro logging file (.adx)]
 
#[http://www.romraider.com/RomRaider/Download RomRaider]
 
#*[http://www.romraider.com/forum/viewtopic.php?f=43&t=12575 Latest RomRaider definition file for MS430056 (.xml)]
 
#*[http://www.romraider.com/forum/viewtopic.php?t=1642 RomRaider Logging file (.xml)]
 
  
Other datalogging software could be
+
'''Configuration exhaust system variant (c_conf_cat)'''
*BMWLogger [http://bimmersoftware.com/bmwlogger BimmerSoftware]
+
*0: Automatic learning of variants, single-scroll, with one control (pre cat) sensor or CATV variant (SA199)
*Testo [http://www.bimmerforums.com/forum/showthread.php?1830510-Diagnostic-program-with-realtime-graph-view BFC thread with download]
+
*1: Automatic learning of variants, twin-scroll, with two control (pre cat) sensors or CATV variant (SA199)
 +
*2: Single-scroll, 1 control (pre cat) sensor, 1 monitoring (post cat) sensor
 +
*3: Twin-scroll, 2 control (pre cat) sensors, 2 monitoring (post cat) sensors
 +
*4: Automatic learning, twin-scroll, with/without control (pre cat) sensors, with/without monitoring (post cat) sensors or CATV variant (SA199)
  
===Checksum correction===
+
'''Configuration main switch cruise control variant (c_conf_cru_main_swi)'''
Modifying data in any of the two files will invalidate the internal checksum values. These will need to be updated or your car wont start. [[#Flashing_utilities]]
+
*0: main switch function active, main switch controlled over steering wheel button O/I
 +
*1: main switch function inactive for Z3 usage, main switch enabled when ignition key voltage is present
  
You can solve this with ether correcting them before flashing the modified file, or flash the 512 KByte file from Daniel, where the Checksum CHK5 is disabled.
+
'''Configuration DMTL module variant (c_conf_dmtl)'''
 +
*0: DMTL module not present
 +
*1: DMTL module present
  
Be careful, checksum CHK4 is still enabled in that file, so editing _mon_ values is not possible without verifying CHK4.
+
'''Configuration ECF (Electrical Cooling Fan) variant (c_conf_ecf)'''
 +
*0: ECF not present, function and diagnosis OFF
 +
*1: ECF present, function and diagnosis ON
  
*Ultimo checksum corrector [[File:Checksum corrector.zip]]
+
'''Configuration exhaust flap variant (c_conf_ef)'''
 +
*0: Exhaust flap not present, function and diagnosis OFF
 +
*1: Exhaust flap present, function and diagnosis ON
  
==Connecting to the MS43==
+
'''Configuration diagnostic lamp / MIL variant - two control sensors and two monitoring sensors (c_conf_mil)'''
You need some way to read and write files to the ECU. In order to do a full write, the ECU will need to be placed into Bootmode or you use the MSS5x Flasher and a INPA / K-Line capable USB to OBD2 adapter.
+
*0: No control of error lamp, LV_MIL = 0
 +
*1: Debounce after BMW error memory
 +
*2: Debounce after OBDII error memory and all component errors after 2nd driving cycle
 +
*3: Debounce after OBDII error memory and CS-component error, immediately
  
BootMode can be achieved by removing the ECUs enclosure and grounding pin 24 of the 29F400 chip for approximately 6 seconds on startup: [[Bench connection How To]]
+
'''Configuration diagnostic lamp / MIL variant - two control sensors (c_conf_mil_eu2)'''
 +
*0: No control of error lamp, LV_MIL = 0
 +
*1: Debounce after BMW error memory
 +
*2: Debounce after OBDII error memory and all component errors after 2nd driving cycle
 +
*3: Debounce after OBDII error memory and CS-component error, immediately
  
Link to Youtube which explains what to do: https://www.youtube.com/watch?v=BFwdIiqxtbk
+
'''Configuration exhaust gas temperatur sensor variant (c_conf_teg)'''
 +
*0: Automatic learning of EGT sensors
 +
*1: No EGT sensors
 +
*2: twin-scroll exhaust system with four EGT sensors
  
Some cheap china INPA cables don't work without modifying them. You have to short Pin 7&8 of the OBD2 plug from your cable to get them working correctly.
+
'''Configuration torque limit first gear variant (c_conf_tq_lim_gear)'''
 +
*0: Torque limit not active
 +
*1: Torque limit active (E53)
  
===K-Line connections===
+
'''Configuration venturi pump variant (c_conf_vepu)'''
 +
*0: VEPU not present, function and diagnosis OFF
 +
*1: VEPU present, function and diagnosis ON
  
You will need the following connections to properly power up the DME while on the bench.
+
'''Configuration SAP (Secondary Air Pump) variant (c_conf_sap)'''
 +
*0: Automatic learning of SAP varants
 +
*1: SAP not present
 +
*2: SAP present without SAFM (Secondary Air Flow Meter)
 +
*3: SAP present with SAFM (Secondary Air Flow Meter)
  
There are several different wirings to use, but we have found that this is the least amount of wires needed for a properly working setup:
+
=Load Filtration=
 +
In MS43 we have two different load filtration models for injection/ignition load and VANOS load.
  
<gallery mode="packed">
+
'''Note:''' The normal logging routine reports the unfiltered load value that will vary from the filtered loads especially in forced induction applications.
File:BMW MS 42.jpg|K-Line pinout for MS43
 
File:ms43_safer.jpg|Alternative (safer) K-Line connection
 
File:Connection.jpg|OBD-II connection diagram
 
</gallery>
 
  
===CAN-Bus connections===
+
If you ever experience your engine running into a "lean-wall" when hitting positive manifold pressure chances are good that the load filtering was not adjusted for boost.
  
There are two different CAN bus interfaces on the MS43, one for the TCU located on plug X60002, and one for all other modules like ABS, ASC/DSC, instrument cluster, steering angle sensor located on plug X60004.
+
==Injection Load==
 +
[[File:Siemens MS43 Intake Model.png|thumb|right|Intake Manifold Volume Model]]
 +
The load filtering process for ignition and injection is necessary to include valve overlap induced by the VANOS into load calculations and is based on Clapeyrons ideal gas equation.
  
[[File:MS43_CAN_BUS.png|600px|thumb|center|MS43 CAN-Bus connections]]
+
First the ECU calculates the manifold absolute pressure (MAP) by taking the effective intake manifold volume (hPa), the engine speed and the unfiltered load reading into account.
  
=Terminology=
+
The effective volume is different between increasing and decreasing load scenarios and therefore split up into four different tables:
The acronyms are Siemens mapnames from the Funktionsbeschreibung.
 
  
The following list contains a selection of the most used terms. It's crucial to understand at least the major engine states like _is_, _pl_ and _fl_ to make sense out of the cryptical naming of the maps.
+
* '''ip_vol_im__n__maf_mes''' - Effective intake manifold volume at increasing load during part load and full load
 +
* '''ip_vol_im_neg__n__maf_mes''' - Effective intake manifold volume at decreasing load during part load and full load
 +
* '''ip_vol_im_is__n__maf_mes''' - Effective intake manifold volume at increasing load during idle, trailing throttle and trailing throttle fuel cut-off
 +
* '''ip_vol_im_neg_is__n__maf_mes''' - Effective intake manifold volume at decreasing load during idle, trailing throttle and trailing throttle fuel cut-off
  
[[File:Abbreviations.pdf]]
+
Obviously, the more accurate this model is, the more accurate is the calculated MAP value that's used in the next step, where the ECU compensates the load with valve overlap.
  
{| class="wikitable mw-collapsible mw-collapsed" style="text-align:left;"
+
There are 8 lookup tables ('''ip_maf_vo_[1-8]__map__n''') and a selection table ('''ip_nr_ip_maf__vo''') that decides which of those maps will be used, depending on the current valve overlap angle.
! Enginestate
+
 
! Description
+
* '''ip_nr_ip_maf__vo''' - Active _vo_ table for maf_ti signal filtering
|-
+
* '''ip_maf_vo_1__map__n''' - Valve overlap based MAF signal filtering for maf_ti
|as
+
* '''ip_maf_vo_2__map__n''' - Valve overlap based MAF signal filtering for maf_ti
|after start
+
* '''ip_maf_vo_3__map__n''' - Valve overlap based MAF signal filtering for maf_ti
|-
+
* '''ip_maf_vo_4__map__n''' - Valve overlap based MAF signal filtering for maf_ti
|cs
+
* '''ip_maf_vo_5__map__n''' - Valve overlap based MAF signal filtering for maf_ti
|cold start
+
* '''ip_maf_vo_6__map__n''' - Valve overlap based MAF signal filtering for maf_ti
|-
+
* '''ip_maf_vo_7__map__n''' - Valve overlap based MAF signal filtering for maf_ti
|es
+
* '''ip_maf_vo_8__map__n''' - Valve overlap based MAF signal filtering for maf_ti
|engine stopped
+
 
|-
+
These tables will revert the MAP signal back into engine load over engine speed and they are interpolating between 50hPa and 1250hPa absolute pressure from factory.
|fl
+
 
|full load
+
This gives the ECU some headroom to compensate for outside ambient pressure.
|-
+
 
|is
+
==VANOS Load==
|idle speed
+
The VANOS load filtration is a simple weighting factor to blend between real measured load and the MAF substitude table.
|-
+
 
|pl
+
[[File:Siemens MS43 Maf Substitute.png]]
|part load
 
|-
 
|pu
 
|trailing throttle
 
|-
 
|puc
 
|trailing throttle fuel cut-off
 
|-
 
|r
 
|restart
 
|-
 
|st
 
|start
 
|}
 
  
=Fueling=
+
[[File:Vanos Load Weighting Factor.png]]
==Fuel Injection Maps==
 
The injection maps are based on "engine load (mg/stroke) vs. engine speed (rpm)" and the lookup is injection time in milliseconds.
 
  
The lambda sensors for closed loop operation are narrowband. Fuel trim learning only happens during closed loop operation, but the learned fuel trims do affect full throttle fueling as well.
+
The factor depends on unfiltered load and changes to completely rely on MAF substitute with rising load.
  
When there is no VANOS fault, the engine interpolates between "Injection time at part-load, cold engine, Vanos I/II" and "Injection time at part-load, warm engine, Vanos I/II", where the numbers I or II indicate the two banks of the straight six engine.
+
This is done to provide a stable load reading for the VANOS to prevent it from moving too much back and forth when the load is rapidly climbing.
 +
* '''ip_fac_maf_sub_ivvt__maf_sub_diag''' - Measured load weighting factor for maf_ivvt filtering
 +
* '''ip_maf_1_diag__n__tps_av''' - MAF diagnosis table used as a MAF substitute if there is a MAF Sensor error
  
Under VANOS fault conditions, the map "Basic Injection Time (ip_tib)" is used.
+
To make real VANOS load as accurate as possible you can either increase the factor towards 1.0 or fine tune the MAF substitute table (the prefered way).
  
"Full load enrichment (ip_ti_fl)" is a multiplier of the part load calculations and added to them.
+
For that you have to datalog unfiltered load, accelerator pedal value and engine speed. A good side effect of this will be that the engine runs better with a defective MAF sensor.
  
Blending between cold and warm injection maps is done by weighting factor "ip_fac_pl_ivvt__tco__tco_st" for partload and "ip_fac_is_ivvt__tco__tco_st" for idlespeed
+
==Extending Load Filtration For Forced Induction==
 +
When you install a turbo- or super charger the amount of air entering the cylinder will increase tremendously and the ECU will operate off the tables.
  
==Non Stock Injector Maps==
+
Since the ECU is not able to extrapolate values, you will never exceed ~823mg/str engine load with an M54B30 calibration because thats the highest value configured in the valve overlap tables that can be reached wide open throttle.
Changing the fuel injectors may be needed when charging your engine and therefore some constants and maps need to be tweaked.
 
  
You will have to calculate the difference in percentage of volume flow between stock and your new injectors.
+
To make the MAP calculation and VO compensation able to handle higher pressure values than 1250hPa we have to extrapolate said tables on our own.
  
The following scalars need to be adjusted accordingly:
+
You can take following values as a guidance that were proved working in several boosted applications or use our prepared an Excel sheet to extrapolate your own tables:  
 +
[[File:Load Filtration Table Extrapolation.zip|thumb|Load_Filtration_Table_Extrapolation.zip]]
  
*T_TI_AS_[0-5]
+
[[File:Siemens MS43 Load Filtration Boosted.png|800px]]
*c_ti_min_iv
 
  
Depending on the injectors you will have to finetune the injector latency compensation (injector dead times) as well:
+
Please note that this is only an example, but logging showed a perfectly calculated MAP value that matched measured MAP under all circumstances.
*ip_ti_add_dly__vb
 
  
If you happen to have stuttering or unclean combustion when stepping on the gas, rescale the cylinder rewetting tables as well:
+
After houndred kilometers of logging data, we never experienced a measured pressure of under ~150hPa so it can be considered safe to shift the tables and axis values up to clear the last row for expected pressure.
  
*ip_ti_fast_wf_thd_min__tco
+
Another idea that came up recently, all the M50 manifold conversions should take a look at the Alpina B3S binary, this manifold is pretty similar and is pre-calculated from Alpina.
*ip_ti_slow_wf_thd_min__tco
 
  
 +
=Injection=
 +
The fuel injection maps are based on engine load over engine speed and the lookup value is injection time in miliseconds.
  
==Upgraded fuel pumps==
+
The lambda sensors for closed loop operation are narrowband. Fuel trim learning only happens during closed loop operation, but the learned fuel trims do affect full throttle fueling as well.
Under some circumstances, like going forced induction, the OEM fuel pump can't deliver enough fuel to the engine and needs to be upgraded.
 
  
Most aftermarket fuelpumps like the Walbros or Deatschwerks don't have a check valve inside and the fuel flows back into the tank once the vehicle is turned off.
+
There are a lot of blending factors, enrichments and also enleanments involved to calculate the final injection time. The following tables are the most important ones.
  
The MS43 has two time values (in seconds) for controlling the fuelpump before starting and after stopping the engine:
+
*'''ip_tipr_cst__tco''' - Pre cold start injection time basic value
 +
*'''ip_ti_cst__n__tco''' - Cranking injection time basic value
  
*C_T_EFP_PREV: Time the electronic fuel pump relais is on after ignition key ON
+
Without any active VANOS fault codes the engine interpolates between the cold and warm injection tables. There are individual tables for each cylinder bank.
*C_T_EFP: Time delay to shut off the electric fuel pump relay after ignition key OFF
+
*'''ip_ti_tco_1_is_ivvt__n__maf''' - Cold engine injection time used during idle
 +
*'''ip_ti_tco_1_pl_ivvt_1__n__maf''' - Cold engine injection time used for bank 1 during part load
 +
*'''ip_ti_tco_1_pl_ivvt_2__n__maf''' - Cold engine injection time used for bank 2 during part load
 +
*'''ip_ti_tco_2_is_ivvt__n__maf''' - Warm engine injection time used during idle
 +
*'''ip_ti_tco_2_pl_ivvt_1__n__maf''' - Warm engine injection time used for bank 1 during part load
 +
*'''ip_ti_tco_2_pl_ivvt_2__n__maf''' - Warm engine injection time used for bank 2 during part load
 +
'''Axis Values'''
 +
*'''X axis''': filtered engine load for injection subsystem (maf_iga)
 +
*'''Y axis''': engine speed (n)
  
Slightly rising these values may eliminate starting issues.
 
  
=Timing=
+
A blending between cold and warm maps is accomplished by the following transitioning maps. A factor of 1.0 means full useage of cold maps and a factor of 0.0 means full useage of warm maps.
==Basic Timing Maps==
+
*'''ip_fac_is_ivvt__tco__tco_st''' - Engine coolant temperature blending factor for transition from cold to warm during idle
The MS43 uses several ignition maps depending on the engine state and quality of fuel used. Like the injection maps, they are also based on "engine load (mg/stroke) vs. engine speed (rpm)" but obviously the lookup is ignition timing in degrees BTDC (before top dead center).
+
*'''ip_fac_pl_ivvt__tco__tco_st''' - Engine coolant temperature blending factor for transition from cold to warm during part and full load
 +
'''Axis Values'''
 +
*'''X axis''': engine coolant temperature at engine start (tco_st)
 +
*'''Y axis''': current engine coolant temperature (tco)
  
"Ignition at part-load, RON98 (16x20) Airflow -vs- Engine speed" is the main table used with a healthy engine (so no VANOS fault codes, normal warmed up operating temperature) running RON98/PON93 gasoline.
 
  
There is a knock based interpolation between the RON91 and RON98 RON tables. The other tables should be kept safe.
+
The full load enrichment '''ip_ti_fl''' is a multiplier of the part load calculations and added to them respectively. Further explaination is located in the full load section.
  
"Ignition at part-load, cold engine (16x20) Airflow -vs- Engine speed" is used on a cold engine, and blended/interpolated towards "Ignition at part-load, RON98 (16x20) Airflow -vs- Engine speed" during warm up.
+
*'''ip_ti_fast_wf_thd_min__tco'''
 +
*'''ip_ti_slow_wf_thd_min__tco'''
  
Catalyst heating "_CH_" in maps retards ignition during warm up.
+
There is a fuel enleanment '''ip_ti_cat_var__n__maf''' when the c_conf_cat variant has learned CATV and full load condition inactive, so you might want to zero it out to prevent the engine going lean.
  
Antijerk "_AJ_" retards ignition during rapid throttle opening to smooth out torque (can be removed by increasing c_tco_min_aj to 142.5C. Reported to sometimes cause transitional knock on boosted engines, if so consider adjusting other tables designed for this (tra_knk).
+
==Maximum Duty Cycle==
 +
The maximum duty cycle describes the maximum opening time for an injector at a specific engine speed.
  
Experience on standard or near standard European 330ci in cool climate and with 99 RON fuel suggested sporadic pulling of timing here and there up to a few degrees is common, but rarely sufficient even in hard track use to produce more than 1 degree of learned ignition retard from the 98 RON base map. Shows the RON98 map on a standard car is quite good. Question if fueling could be richened to allow more ignition timing and torque/power.
+
The engine speed is really important here, because the '''faster''' the engine spins, the '''less''' time there is to inject fuel into the cylinders.
  
==Exhaust Popping Modifications==
+
When tuning the engines injection tables, especially in the higher load areas, keep in mind that there are additional enrich- and enleanments applied to the specified injection time.
  
'''Exhaust pop with deactivated A/C'''
+
These adjustments require some headroom on top of that value to work correctly and can be life saving regarding engine health.
  
The current solution for exhaust pop/crackle is to supress overrun fuelcut detection from the ecu. This is accomplished by raising the rpm threshold.
+
Often a maximum duty cycle of 90% is sufficient for the safety features and the injectors to work as intended. When going higher we advise to think about upgrading to a higher flowing set of injectors.
  
As this engine state can be set differently when A/C is turned on and off, you can switch between both states by operating the A/C.
+
Full load enrichment should be included, since depending on the target lambda it enriches the mixture more than 10%.
  
The following maps need to be tweaked.
+
To make things easier we include the following Excel sheet: [[File:Maximum_Injection_Time_Calculator.zip|Download Maximum Injection Time Calculator.zip]]
Note: The screenshot actually shows the values to have crackle/pop when A/C is '''off'''
 
  
[[File:TP_PUCpop.jpg|300px|thumb|none|TunerPro depiction of overrun fuelcut mod]]
+
You can easily check your fuel tables with this calculator, just load the engine speed axis, the full load enrichment factor and your desired duty circle into the grey areas and compare the values.
  
Using these settings B25 engine users have reported throttle hang, poor idling, and decreased performance. Test these settings at your own responsibility.
+
[[File:Maximum Injection Time Calculator.png]]
  
'''Timer configurable exhaust pops'''
+
'''Note:''' The table shows the theorethical maximum. As long as your injection time stays below this, you are fine.
  
Thanks to erom9171 for butchering this out!
+
==Aftermarket Injector Scaling==
 +
Changing the fuel injectors will be needed at some point when you change your engines aspiration to forced induction, therefore some constants and tables need to be adjusted.
  
Its now possible to tweak a timer that will let the engine pop for a given time. After this timer is zero, the engine will go back into overrun-fuelcut. So it's pretty easy to have 2 or 3 pretty loud pops followed by "silence".
+
To find a suitable baseline for your new injestion tables you will have to calculate the volume flow difference between the stock and your new injectors.
  
The following screenshot is an example for the values at M54B30 which give 3 loud pops.
+
By dividing the flow rate of the old injectors by the flow rate of the new ones ''at the same fuel pressure'' you end up with a scaling factor.
  
[[File:M54B30 MS430056 ExhaustPop-timer.jpg|300px|thumb|none|TunerPro depiction of timered overrun fuelcut mod]]
+
You can use the injection time multiplier of the MS43s application system that is able to adjust every single cylinder injection duration with a factor '''t_ti_as_[cyl]'''.
  
For anyone wanting the best of both worlds:
+
Playing with these six constants is much easier than always changing all the injection tables.
  
[[File:M54B30 MS430056 ExhaustPop-timer PUCpopACoff.jpg|300px|thumb|none|TunerPro depiction of combined overrun fuelcut mod]]
+
Nevertheless, once you've found a suitable factor for your injectors, apply it to the fuel tables directly and return to factor 1.0, because the application system will NOT alter the injection time reported by the MS43s logging routine.
  
=Vanos=
+
Additionally you must adjust the following injector specific values:
This section contains information on how the dual vanos system is actuated by the DME and how to modify it. Both, intake and exhaust, camshaft can be set independently in relation to the crankshaft.
+
*'''c_ti_min_iv''' - Minimum injection time
 +
*'''ip_ti_add_dly__vb''' - Injector dead time correction with battery voltage compensation
  
The aim of that system is to optimize emission, produce better torque at low engine speeds and have better top end power.  
+
[[Fuel_Injector_Deadtimes|Go here for a list of suitable fuel injectors and their deadtimes.]]
  
The system uses engine oil to pressurize a set of gears at the end of each camshaft.
+
==Correcting Fuel Consumption Gauge==
  
Even though the variation of °crk is pretty limited, it can be used to compensate for different intakes, different camshafts and even turbo application may be benefitting from perfectly tweaked camshafts.
+
When changing injectors you will discover that the fuel consumption reading on your cluster and other monitoring apps is off.
  
==Basic Vanos Maps==
+
The table '''ip_fco_map_cor__pq_main_col''' handles injection value reporting towards the cluster over CAN bus.
  
The main maps used for '''intake''' camshaft are:
+
'''For example:''' You've lowered your fueling tables by MULTIPLIYING them with 0.46, you must DIVIDE the mentioned table by 0.46 to fix readings.
  
'''cold engine'''
+
Fine tuning should be made in the secret menu of your cluster (+- 25%). This is excplained here under "Test 20" [https://www.bimmerforums.com/forum/showthread.php?61718-INFO-E46-Instrument-Cluster-Test INFO: E46 Instrument Cluster Test]
*ip_cam_sp_tco_1_in_is__n__maf_iv(vt)
 
*ip_cam_sp_tco_1_in_pl__n__maf_iv(vt)
 
*ip_cam_sp_tco_1_in_fl__n
 
  
'''warm engine'''
+
==Upgraded Fuel Pumps==
*ip_cam_sp_tco_2_in_is__n__maf_iv
+
Under some circumstances like a forced induction conversion the OEM fuel pump can't deliver enough fuel to the engine and needs to be upgraded.
*ip_cam_sp_tco_2_in_pl__n__maf_iv
 
*ip_cam_sp_tco_2_in_fl__n
 
  
 +
The MS43 has two time values (in seconds) for controlling the electronic fuel pump relay before starting and after stopping the engine:
  
The main maps used for '''exhaust''' camshaft are:
+
*'''c_t_efp_prev''' - Time the electronic fuel pump relay is enabled after ignition turned on
 +
*'''c_t_efp''' - Time delay to disable the electric fuel pump relay after ignition turned off
  
'''cold engine'''
+
Slightly rising these values may eliminate starting issues.
*ip_cam_sp_tco_1_ex_is__n__maf_iv(vt)
 
*ip_cam_sp_tco_1_ex_pl__n__maf_iv(vt)
 
*ip_cam_sp_tco_1_ex_fl__n
 
  
'''warm engine'''
+
'''Tip:''' Some aftermarket fuel pumps don't come with an integrated check valve end therefor let the fuel flow back into the tank once the engine is turned off.
*ip_cam_sp_tco_2_ex_is__n__maf_iv
 
*ip_cam_sp_tco_2_ex_pl__n__maf_iv
 
*ip_cam_sp_tco_2_ex_fl__n
 
  
Blending between cold engine and warm engine is done by:
+
If this is the case consider adding a check valve right after the pump to keep stock-like cranking behaviour.
  
'''idlespeed'''
+
=Ignition=
ip_fac_cam_sp_in_is__tco__tco_st
+
The ECU uses many different ignition maps depending on the engine state, engine temperature and quality of fuel.
ip_fac_cam_sp_ex_is__tco__tco_st
 
  
'''partload'''
+
Main tables that are used during normal engine operation:
ip_fac_cam_sp_in_pl__tco__tco_st
+
*'''ip_iga_tco_1_is_ivvt__n__maf''' - Target ignition angle during idle. Cold engine
ip_fac_cam_sp_ex_pl__tco__tco_st
+
*'''ip_iga_tco_1_pl_ivvt__n__maf''' - Target ignition angle during part and full load. Cold engine
 +
*'''ip_iga_tco_2_is_ivvt__n__maf''' - Target ignition angle during idle. Warm engine
 +
*'''ip_iga_ron_91_pl_ivvt__n__maf''' - Target ignition angle for RON91 during part and full load. Warm engine
 +
*'''ip_iga_ron_98_pl_ivvt__n__maf''' - Target ignition angle for RON98 during part and full load. Warm engine
 +
'''Axis Values'''
 +
*'''X axis''': filtered engine load for ignition subsystem (maf_iga)
 +
*'''Y axis''': engine speed (n)
  
==VANOS Tweak==
 
  
Insert the following tables into the desired part-load map where you need the effect ( part-load cold / part-load warm / both).
+
Starting with a cold engine the ECU uses '''ip_iga_tco_1_is_ivvt__n__maf''' tables for idle, '''ip_iga_tco_1_pl_ivvt__n__maf''' for part and full load to find the target ignition angle.
'''*ATTENTION: Only Suitable for M54B30*'''
 
  
''Credits to e46fanatics.com member DoCR''
+
While warming up the ignition subsystem uses the same blending factor as the injection subsystem. (see [[Siemens_MS43#Injection|Injection]])
  
[[File:vanos_tweak.jpg|frame|left|Map visualisation in TunerPro]]
+
Reaching engine operating temperature, the target ignition setpoint changes to warm ignition maps '''ip_iga_tco_2_is_ivvt__n__maf''' for idle and '''ip_iga_ron_9*''' for part and full load.
  
 +
The target ignition angle in part and full load will then be blended between the RON91 and RON98 tables based on an internal RON factor learned from detected knock.
  
{| class="wikitable"
+
Under all circumstances keep the RON91 table a lot safer than RON98 to give the ECU some room for regulation.
|+ VANOS Tweak maps in table form for copy and pasting into TunerPro
+
 
! Intake cam setpoint part-load !! Exhaust cam setpoint part-load
+
It's common that even an unmodified engine running on RON99 fuel will pull a few degrees of timing here. This shows the RON98 map on a standard car is quite good.
|-
+
 
|
+
 
{| class="wikitable" border="1" style="width: 450pt; margin: auto; border-collapse:collapse; text-align:right;"
+
Catalyst heating "_CH_" in maps retards ignition during warm up.
| 126.00 || 126.00 || 125.63 || 124.88 || 123.00 || 118.88 || 113.25 || 106.50 || 105.00 || 104.25 || 108.00 || 108.00
+
 
|-
+
Antijerk "_AJ_" retards ignition during rapid throttle opening to smooth out torque (can be removed by increasing c_tco_min_aj to 142.5C.
| 126.00 || 126.00 || 125.25 || 124.50 || 122.63 || 118.50 || 112.88 || 106.50 || 105.00 || 104.25 || 105.00 || 105.00
+
 
|-
+
Reported to sometimes cause transitional knock on boosted engines, if so consider adjusting other tables designed for this (tra_knk).
| 126.00 || 125.63 || 124.88 || 124.13 || 122.25 || 118.13 || 112.50 || 105.75 || 104.25 || 103.50 || 100.13 || 100.13
+
 
|-
+
==Ignition Coil Variants==
| 125.63 || 124.88 || 123.75 || 122.63 || 120.38 || 115.88 || 110.25 || 103.88 || 99.75 || 98.63 || 91.50 || 91.50
+
In September 2002 BMW updated the old 300g ignition coils used from M50-M54 to the newer pencil style coils. This change required an automatic learning process for all new hardware variants, starting with Index 04.
|-
+
 
| 125.25 || 124.50 || 123.38 || 121.88 || 119.25 || 114.75 || 109.50 || 102.75 || 98.63 || 97.50 || 90.75 || 90.75
+
The detection was implemented in an easy way. If the EGT Sensor Post-Cat Bank 1 input (Pin X60002.12) is connected to terminal 87 (main relay output) then the MS43 switches to pencil coil mode.
|-
+
 
| 124.50 || 123.38 || 122.25 || 120.38 || 117.38 || 112.50 || 107.25 || 101.25 || 97.50 || 96.75 || 90.75 || 90.75
+
That means, if you retrofit the newer pencil coils or go with the M56 valve cover, you also have to retrofit the jumper wire in X60002 and an Index 04 or newer MS43.
|-
+
 
| 123.38 || 122.25 || 120.75 || 118.88 || 114.38 || 107.63 || 102.00 || 98.25 || 97.13 || 96.38 || 90.38 || 90.38
+
To make this easier you can simply copy all the '''_pc_''' values to their '''_300_''' pendands.
|-
+
[[File:Siemens MS43 Coil Data.png|none|none|none|Pencil Coil Data]]
| 122.63 || 121.13 || 120.00 || 117.75 || 112.13 || 103.50 || 99.38 || 97.50 || 96.75 || 96.38 || 91.50 || 91.50
+
 
|-
+
=VANOS=
| 115.50 || 113.63 || 111.75 || 109.50 || 104.25 || 93.75 || 99.38 || 98.25 || 94.50 || 94.13 || 94.13 || 94.13
+
[[File:Vanos max settings.jpg|300px|thumb|right|VANOS Min/Max Values]]
|-
+
VANOS stands for "VAriable NOckenwellenSteuerung" and translates to adustable camshaft control.
| 113.25 || 111.75 || 110.25 || 107.25 || 100.50 || 91.88 || 100.88 || 99.75 || 94.88 || 94.50 || 94.50 || 94.50
+
 
|-
+
This section contains information on how the dual VANOS system is actuated by the ECU and how to modify it. Both, intake and exhaust camshaft can be set independently in relation to the crankshaft.
| 112.13 || 110.25 || 108.00 || 104.63 || 94.50 || 90.38 || 101.25 || 100.50 || 97.50 || 97.50 || 97.50 || 97.50
+
 
|-
+
The VANOS system uses engine oil pressure and solenoids to control a set of gears at the end of each camshaft. The goal of the VANOS is to optimize emissions, produce better torque at low engine speeds and have more top end power.  
| 110.63 || 105.38 || 99.75 || 95.25 || 89.63 || 90.75 || 105.75 || 105.00 || 101.63 || 100.50 || 100.50 || 100.50
+
 
|-
+
Even though the camshaft adjustment is limited to 30°CRK it can be used to compensate for different intakes, different camshafts and even forced induction application may be benefitting from perfectly tweaked VANOS setpoints.
| 109.88 || 104.25 || 97.50 || 92.25 || 109.50 || 110.25 || 109.50 || 110.25 || 108.75 || 108.75 || 108.75 || 108.75
+
 
|-
+
The main maps used for VANOS control during IS, PL & FL engine states are:
| 108.75 || 103.88 || 99.38 || 94.88 || 115.50 || 118.13 || 118.13 || 118.13 || 117.75 || 117.75 || 117.75 || 117.75
+
 
|-
+
'''Cold Engine'''
| 108.38 || 106.50 || 104.25 || 101.25 || 118.50 || 126.00 || 126.00 || 126.00 || 126.00 || 126.00 || 122.25 || 122.25
+
*'''ip_cam_sp_tco_1_in_is__n__maf_ivvt''' - Intake camshaft setpoint during idle. Cold engine
|-
+
*'''ip_cam_sp_tco_1_ex_is__n__maf_ivvt''' - Exhaust camshaft setpoint during idle. Cold engine
| 108.38 || 108.75 || 108.00 || 106.50 || 122.25 || 126.00 || 126.00 || 126.00 || 126.00 || 126.00 || 126.00 || 126.00
+
*'''ip_cam_sp_tco_1_in_pl__n__maf_ivvt''' - Intake camshaft setpoint during part load. Cold engine
|}
+
*'''ip_cam_sp_tco_1_ex_pl__n__maf_ivvt''' - Exhaust camshaft setpoint during part load. Cold engine
|
+
*'''ip_cam_sp_tco_1_in_fl__n''' - Intake camshaft setpoint during full load. Cold engine
{|class="wikitable" border="1" style="width: 450pt; margin: auto; border-collapse:collapse; text-align:right;"
+
*'''ip_cam_sp_tco_1_ex_fl__n''' - Exhaust camshaft setpoint during full load. Cold engine
| -105.0 || -105.0 || -105.0 || -104.6 || -103.1 || -97.5 || -96.0 || -96.8 || -98.3 || -104.3 || -99.0 || -99.0
+
'''Warm Engine'''
|-
+
*'''ip_cam_sp_tco_2_in_is__n__maf_ivvt''' - Intake camshaft setpoint during idle. Warm engine
| -105.0 || -104.6 || -103.9 || -102.0 || -99.0 || -96.0 || -95.3 || -96.4 || -97.9 || -103.9 || -98.6 || -98.6
+
*'''ip_cam_sp_tco_2_ex_is__n__maf_ivvt''' - Exhaust camshaft setpoint during idle. Warm engine
|-
+
*'''ip_cam_sp_tco_2_in_pl__n__maf_ivvt''' - Intake camshaft setpoint during part load. Warm engine
| -104.6 || -103.9 || -100.9 || -97.5 || -93.8 || -92.6 || -93.4 || -94.9 || -96.4 || -101.6 || -97.5 || -97.5
+
*'''ip_cam_sp_tco_2_ex_pl__n__maf_ivvt''' - Exhaust camshaft setpoint during part load. Warm engine
|-
+
*'''ip_cam_sp_tco_2_in_fl__n''' - Intake camshaft setpoint during full load. Warm engine
| -103.9 || -102.4 || -96.4 || -92.6 || -88.9 || -88.1 || -90.0 || -91.5 || -93.8 || -97.1 || -91.9 || -91.9
+
*'''ip_cam_sp_tco_2_ex_fl__n''' - Exhaust camshaft setpoint during full load. Warm engine
|-
+
'''Axis Values'''
| -103.1 || -101.6 || -94.9 || -91.1 || -87.4 || -86.6 || -88.5 || -90.4 || -92.6 || -96.0 || -90.8 || -90.8
+
*'''X axis''': filtered engine load for VANOS subsystem (maf_ivvt)
|-
+
*'''Y axis''': engine speed (n)
| -100.9 || -98.6 || -90.4 || -87.0 || -85.9 || -85.1 || -85.9 || -88.5 || -91.1 || -95.6 || -90.4 || -90.4
+
 
|-
+
 
| -99.0 || -96.4 || -88.5 || -85.9 || -85.1 || -84.8 || -85.5 || -88.9 || -94.1 || -97.5 || -95.3 || -95.3
+
A blending between cold and warm maps is accomplished by the following transitioning maps. A factor of 1.0 means full useage of cold maps and a factor of 0.0 means full useage of warm maps.
|-
+
 
| -97.9 || -95.3 || -87.8 || -85.9 || -85.1 || -85.1 || -85.9 || -91.9 || -97.5 || -100.9 || -99.0 || -99.0
+
*'''ip_fac_cam_sp_in_is__tco__tco_st''' - Engine coolant temperature blending factor for transition from cam_sp_tco1 to cam_sp_tco2 during idle. Intake camshaft
|-
+
*'''ip_fac_cam_sp_ex_is__tco__tco_st''' - Engine coolant temperature blending factor for transition from cam_sp_tco1 to cam_sp_tco2 during idle. Exhaust camshaft
| -96.8 || -94.5 || -88.5 || -86.6 || -85.9 || -96.0 || -95.6 || -95.6 || -95.6 || -95.6 || -95.6 || -97.5
+
*'''ip_fac_cam_sp_in_pl__tco__tco_st''' - Engine coolant temperature blending factor for transition from cam_sp_tco1 to cam_sp_tco2 during part load. Intake camshaft
|-
+
*'''ip_fac_cam_sp_ex_pl__tco__tco_st''' - Engine coolant temperature blending factor for transition from cam_sp_tco1 to cam_sp_tco2 during part load. Exhaust camshaft
| -95.6 || -94.1 || -91.1 || -88.5 || -88.5 || -99.8 || -101.6 || -101.6 || -101.6 || -101.6 || -100.5 || -101.3
+
 
|-
+
Axis description are:
| -95.3 || -93.8 || -91.9 || -90.4 || -90.4 || -101.3 || -102.0 || -102.0 || -102.0 || -102.0 || -100.9 || -101.6
+
*'''X axis''': engine coolant temperature at engine start (tco_st)
|-
+
*'''Y axis''': current engine coolant temperature (tco)
| -93.8 || -93.0 || -92.3 || -92.3 || -94.5 || -102.4 || -101.3 || -101.3 || -101.3 || -101.3 || -100.1 || -101.3
+
 
|-
+
=Drive-By-Wire=
| -91.9 || -91.5 || -91.9 || -92.3 || -95.3 || -105.8 || -106.1 || -106.1 || -106.1 || -106.1 || -105.0 || -102.8
+
This section contains information on how the Drive-By-Wire system is controlled by the DME and how it can be modified.
|-
+
 
| -87.8 || -88.5 || -89.6 || -91.1 || -94.9 || -106.1 || -106.1 || -106.1 || -106.1 || -106.1 || -105.0 || -103.1
+
The accellerator pedal unit is different between manual and automatic / sequential transmission.  
|-
+
 
| -85.5 || -87.0 || -88.5 || -90.0 || -93.8 || -106.1 || -106.1 || -106.1 || -106.1 || -106.1 || -105.0 || -103.1
+
For the automatic and sequential gearboxes the unit contains a spring mechanism that feels like a switch when the pedal is pressed to imitate a kick-down switch.
|-
+
 
| -84.0 || -85.9 || -87.4 || -88.9 || -93.0 || -106.1 || -106.1 || -106.1 || -106.1 || -106.1 || -105.0 || -103.1
+
Manual pedal value is ranging from 0-85°PVS, whilst the automatic and sequential pedal value reaches from 0-89°PVS with 103°PVS at kick-down.
|}
+
 
|}
+
==Drivers Wish Tables==
 +
[[File:Tunerpro comparison tps sp isapwm sp.PNG|thumbnail|right|Tunerpro comparison of the ip_tps_sp_pvs and ip_isapwm_pvs table.]]
 +
The Drive-By-Wire system is setup so that the ecu uses both the throttle valve and the idle control valve to control how much air is going into the engine.
 +
 
 +
* '''ip_tps_sp_pvs''' is used by the ecu to decide how much it should open the throttle for a given pvs input.
 +
 
 +
* '''ip_isapwm_pvs''' is used by the ecu to decide how much idle control valve duty cycle should be used for a given pvs input.
 +
 
 +
If we look at these tables side by side we can see that a stock ecu is setup to primarily use the idle control valve to control airflow when the pvs input is in the range between 0° and 15° and when the pvs input is higher the ecu will switch over to the throttle valve.
 +
 
 +
==Drivers Wish Input Correction==
 +
To provide a smooth driving experience during part load the ecu actively controls how fast the drivers requested pvs input can increase.
 +
 
 +
'''ip_pvs_cor_max_rpl_[gear]''' is used by the ecu to decide if the drivers requested pvs input increase should be limited. The values in the table is the lower limit and the X-axis is the upper limit.  
 +
If the drivers requested pvs input is between these values then the ecu will start limiting the pvs input increase.
 +
 
 +
If the following conditions are met then the ecu will not try to start limiting the pvs input increase:
 +
* The driver requested pvs input is decreasing.
 +
* The driver requested pvs input change gradient is larger than '''c_pvs_av_grd_max_rpl'''(59,99° pvs).
 +
* The clutch is pressed.
 +
* The driver requested pvs input is higher than '''c_pvs_cor_max_rpl'''(42,5° PVS)
 +
 
 +
When the ecu starts limiting the pvs input increase the pvs input will be increased by the value taken from '''ip_pvs_cor_rpl_lgrd_[gear]''' until the following conditions are met:
 +
* The limitation duration specified in '''ip_t_pvs_cor_rpl_[gear]''' has expired.
 +
* The driver requested pvs input change gradient is larger than '''c_pvs_av_grd_max_rpl'''(59,99° pvs).
 +
* The limited pvs input is larger than the driver requested pvs input.
 +
 
 +
If any of those conditions are met then the ecu will use the driver requested pvs input and will not start limiting the pvs input again until the time specified in '''c_t_dly_pvs_cor_rpl'''(0,2s) has elapsed.
 +
 
 +
To disable the drivers wish input correction function set either '''c_pvs_cor_max_rpl''' or '''c_pvs_av_grd_max_rpl''' to zero.
 +
 
 +
==Throttle Request Correction==
 +
To provide a smooth driving experience during low throttle openings the ecu will control how fast the throttle setpoint can change depending on the current engine load.
 +
 
 +
'''ip_tps_req_ltc_min_[gear]''' is used by the ecu to decide if the throttle setpoint change should be limited.  
 +
If the requested throttle setpoint is lower than the value in the table the throttle setpoint change will be limited.
 +
 
 +
If the following conditions are met then the ecu will not try to start limiting the throttle setpoint change:
 +
* The clutch is pressed.
 +
* The requested throttle setpoint is lower than '''c_tps_req_ltc_min'''(0.248° TPS)
 +
 
 +
When the ecu starts limiting the pvs input the throttle setpoint will be increased by the value taken from '''ip_tps_req_ltc_lgrd_[gear]''' until the following conditions are met:
 +
* The limitation duration specified in '''ip_t_tps_req_ltc_max_[gear]''' has expired.
 +
* The requested throttle setpoint is larger or equal to '''ip_tps_req_ltc_min_[gear]'''.
 +
* The clutch is pressed.
 +
 
 +
If any of those conditions are met then the ecu will use the requested throttle setpoint and will not start limiting the throttle setpoint again until the time specified in '''c_t_dly_tps_req_ltc'''(0,85s) has elapsed.
  
=DTC Suppression=
+
The '''id_tps_req_ltc_gear_[gearbox]''' tables controls if the throttle request correction should be active depending on the current gear.
DTCs can be suppressed in the MS43 by zeroing out the c_abc_... specific codes. The full list of DTCs can be found here:
+
To disable the throttle request correction function set the '''id_tps_req_ltc_gear_[gearbox]''' tables to zero.
 +
 
 +
=Torque=
 +
During engine operation the ecu will try to estimate the current torque being produced by using several static torque models.
 +
 
 +
Torque Models:
 +
* '''ip_tqi_pvs__n__pvs''' - Indexed engine torque (PVS)
 +
* '''ip_tqi_maf__n__maf''' - Indexed engine torque (MAF)
 +
* '''ip_tqfr__n__maf''' - Frictional torque losses (MAF)
 +
 
 +
==Torque Management==
 +
Based on the static models the ecu will ensure that the engine torque does not exceed the maximum allowed torque specified in '''ip_tq_max__n__pvs_cor_rpl'''.
 +
 
 +
As the torque models are setup for a stock engine they can produce unexpected reductions in power if the engine is modified, to disable the function set the torque values in '''ip_tq_max__n__pvs_cor_rpl'''
 +
to 65535 Nm.
 +
 
 +
The ECU also have a function to reduce torque in first gear (In production vehicles this was only used by the E53 X5).
 +
 
 +
The function will be activated if '''c_conf_tq_lim_gear''' is set to one and when active the ecu will ensure that the engine torque does not exceed '''c_tq_max_gear''' while in first gear.
 +
 
 +
=Idlespeed=
 +
This section contains information on how the idle is controlled by the DME and how it can be modified.
 +
 
 +
MS43 has a few different tables that affect the nominal idle speed
 +
 
 +
* '''ip_n_sp_is''' Nominal idle speed without additional load on the engine.
 +
* '''ip_dri_n_sp_is''' Nominal idle speed with drive engaged for AT gearbox.
 +
* '''ip_acin_n_sp_is''' Nominal idle speed with air conditioner switched on.
 +
* '''ip_dri_acin_n_sp_is''' Nominal idle speed with air conditioner switched on and drive engaged for AT gearbox.
 +
 
 +
The idle setpoint is modified from the nominal speed above by
  
{| class="wikitable mw-collapsible mw-collapsed"
+
* '''ip_n_sp_add_cha_cdn_bat''' Nominal idle speed offset for battery charge state.
!rowspan="2"|DTC variables
+
* '''ip_n_sp_add_heat''' Nominal idle speed offset with catalyst heating function active.
!colspan="2"|OBD
+
 
|-
+
In addition, the idle speed change rate can be changed with '''c_n_sp_lgrd_is'''.
!Code
+
 
!Description
+
 
|-
+
=Full Load Detection=
|rowspan=1|c_dtc_ad_mec_ref_ivvt_ex
+
[[File:Full_Load_Diagram.png|thumbnail|right|Full load procedure shown in Tuner Pro]]
|P0014
+
[[File:Full_Load_Injection_AFR_Lambda.png|thumbnail|right|Full load injection converted to lambda and AFR]]
|B Camshaft Position - Timing Over-Advanced or System Performance (Bank 1)
+
[[File:Siemens_MS43_Full_Load_Max_Time.png|thumbnail|right|Full load state maximum timers]]
|-
+
On MS43 we have an accelerator pedal angle (°PVS) dependent full load detection.
|rowspan=1|c_dtc_ad_mec_ref_ivvt_in
+
 
|P0011
+
In full load operation (ES = FL) the engine will leave stoichiometric combustion and enriches the injection for preventing knock and maximum power production.
|A Camshaft Position - Timing Over-Advanced or System Performance (Bank 1)
+
 
 +
The whole lambda learning adaption from the O2 sensors is stopped while the engine operates in this state. Already learned long term fuel trims (LTFTs) will still be applied.
 +
 
 +
The engine will never enter full load state unless the engine speed is greater than '''c_n_min_fl''' which is the lower limit for FL detection. Setting this to 8160 rpm will disable full load state completely.
 +
 
 +
Additionally, either one of the two following conditions has to be fulfilled to activate full load detection.
 +
 
 +
* '''c_vs_min_fl''' - Minimum vehicle speed for full load detection after engine start if c_tco_min_fl has not been exceeded.
 +
* '''c_tco_min_fl''' -  Minimum coolant temperature for full load detection after engine start if c_vs_min_fl has not been exceeded.
 +
 
 +
Finally, once the accelerator pedal angles defined in the following tables are exceeded, the respective function will enter the full load state.
 +
 
 +
* '''id_pvs_fl__n''' - Accelerator pedal position threshold for full load detection - Injection
 +
* '''id_pvs_fl_ivvt__n''' - Accelerator pedal position threshold for full load detection - VANOS
 +
* '''id_pvs_fl_vim__n_vim''' - Accelerator pedal position threshold for full load detection - DISA
 +
 
 +
In the full load state, the MS43 changes VANOS and DISA to seperate tables, but for injection it adds a specified amount of fuel.
 +
 
 +
This leaves us the following tables that actually alter injection, VANOS and DISA behaviour.
 +
 
 +
*'''ip_ti_fl__n''' - Full load enrichment factor for nominal injection time
 +
*'''ip_cam_sp_tco_1_in_fl__n''' - Intake camshaft setpoint during full load with cold engine
 +
*'''ip_cam_sp_tco_1_ex_fl__n''' - Exhaust camshaft setpoint during full load with cold engine
 +
*'''ip_cam_sp_tco_2_in_fl__n''' - Intake camshaft setpoint during full load with warm engine
 +
*'''ip_cam_sp_tco_2_ex_fl__n''' - Exhaust camshaft setpoint during full load with warm engine
 +
*'''id_vim_fl__n_vim''' - Variable intake manifold (DISA) activation setpoints at full load
 +
 
 +
There is a gearbox dependant timer that configures the maximum spendable time in seconds at full load condition per gear.
 +
 
 +
If this timer has counted down to zero, the engine leaves full load operating state on its own. You will have to lift the pedal below the configured minimum position and re-enter full load.
 +
 
 +
*'''id_t_max_fl__gear''' - Maximum time in the full load state. Manual transmission.
 +
*'''id_t_max_fl_at__gear''' - Maximum time in the full load state. Automatic transmission.
 +
 
 +
You can zero these tables to bypass the timer.
 +
 
 +
To extract every last bit of power out of your engine, there is '''c_pvs_fl_accin''' that handles the deactivation of the AC compressor when exceding the configured value.
 +
 
 +
'''Tip:''' To make tuning at full load (and wide open throttle) operation easier, you can change the conversion factor of the '''ip_ti_fl__n''' table to display lamba or AFR depending on your preference.
 +
 
 +
This is only applicable if your part-load table is tuned to stoichiometric combustion (lambda 1.0).
 +
 
 +
{| class="wikitable"
 +
! Title
 +
! Conversion
 +
! Low Range
 +
! High Range
 +
|-
 +
| ip_ti_fl__n (Lambda)
 +
| 1-(0.0039058823*X-0.5)
 +
| 0.500
 +
| 1.500
 
|-
 
|-
|rowspan=2|c_dtc_amp
+
| ip_ti_fl__n (AFR Gas)
 +
| 14.7-(14.7*(0.0039058823*X-0.5))
 +
| 7.409
 +
| 22.050
 +
|}
 +
 
 +
''Warning: Keep in mind, that all full load injection edits rely on a proper part load fueling table.''
 +
 
 +
=DTC Suppression=
 +
DTCs can be suppressed in the MS43 by zeroing out the c_abc_... specific codes.  The full list of DTCs can be found here:
 +
 
 +
{| class="wikitable mw-collapsible mw-collapsed"
 +
!rowspan="2"|DTC variables
 +
!colspan="2"|OBD
 +
|-
 +
!Code
 +
!Description
 +
|-
 +
|rowspan=1|c_dtc_ad_mec_ref_ivvt_ex
 +
|P0014
 +
|B Camshaft Position - Timing Over-Advanced or System Performance (Bank 1)
 +
|-
 +
|rowspan=1|c_dtc_ad_mec_ref_ivvt_in
 +
|P0011
 +
|A Camshaft Position - Timing Over-Advanced or System Performance (Bank 1)
 +
|-
 +
|rowspan=2|c_dtc_amp
 
|P0107
 
|P0107
 
|Manifold Absolute Pressure/Barometric Pressure Circuit Low Input
 
|Manifold Absolute Pressure/Barometric Pressure Circuit Low Input
Line 1,469: Line 1,666:
 
=Extra Features=
 
=Extra Features=
  
==Forced OBD Readiness==
+
==Engine Coolant Temperature Control==
 +
The M54 engine family is fitted with an electronic thermostat that the ECU can control to alter the engine coolant temperature.
 +
 
 +
By altering these values we can change how hot the engine will run in different conditions.
 +
 
 +
'''E-thermostat minimum conditions'''
 +
* c_tam_min_ect - Minimum ambient temperature threshold for e-thermostat activation
 +
* c_tia_min_ect - Minimum intake air temperature threshold for e-thermostat activation
 +
* c_toil_min_ect - Minimum oil temperature threshold for e-thermostat activation
 +
* c_tco_min_ect - Minimum coolant temperature threshold for full energization of the e-thermostat
  
Common solution for forced OBD readiness monitors seems to be setting the following config switches
+
'''E-thermostat maximum conditions'''
 +
* c_tia_max_ect - Maximum intake air temperature threshold. When exceeded target coolant temperature will be set to c_tco_sp_tia_max
 +
* c_tco_ex_max_ect - Maximum radiator outlet temperature threshold. When exceeded target coolant temperature will be set to c_tco_sp_tco_ex_max
 +
* c_toil_max_ect - Maximum oil temperature threshold. When exceeded target coolant temperature will be set to c_tco_sp_tia_max
  
[[File:ForcedOBD.jpg|300px|thumb|none|TunerPro depiction of config switches]]
+
'''E-thermostat target coolant temperature'''
 +
* c_tco_sp_toil_min - Target coolant temperature until the thresholds set by c_toil_min_ect, c_tam_min_ect, and c_tia_min_ect are exceeded.
 +
* c_tco_sp_tco_ex_max - Target coolant temperature if c_tco_ex_max_ect is exceeded
 +
* c_tco_sp_tia_max - Target coolant temperature if c_toil_max_ect or c_tia_max_ect are exceeded
 +
* c_tco_bol_ect - Target coolant temperature if an external low coolant temperature request has been received
  
==Change E-Thermostat Desired Temp Maps==
 
The M54 runs quite warm for the aluminum block and also is very sensitive to temperatures and is one of the leading causes for pulling timing when warm. To set the desired coolant temps, the following maps need to be adjusted:
 
  
*C_TCO_SP_toil_MIN (Minimum Oil temp required to then default to EThermostat maps - 0xCA0h - default 105)
+
'''E-thermostat target coolant temperatures maps'''
*ID_TCO_SP_ECT (Target Coolant temp without AC - 0x5D3Dh)
+
* id_tco_sp_ect__n__maf_sub - Target coolant temperature when c_toil_min_ect, c_tam_min_ect, and c_tia_min_ect are exceeded - AC off
*ID_TCO_SP_ACIN_ECT (Target Coolant temp with AC - 0x5D85h)
+
* id_tco_sp_ect_acin__n__maf_sub - Target coolant temperature Target coolant temperature when c_toil_min_ect, c_tam_min_ect, and c_tia_min_ect are exceeded - AC on
  
 +
'''E-thermostat regulations'''
 +
* ip_ectpwm_i__tco_dif - e-thermostat I component
 +
* ip_ectpwm_p__tco_dif - e-thermostat P component
 +
* id_ectpwm_add__n__tco_sp - Required e-thermostat duty cycle to achieve coolant temperature setpoint
 +
 +
PS : some of you may experience loss of power setting coolant temperature too low on M54B30. Seems that those engines likes higher temp for optimal run.
 
[[File:Coolant-config.JPG|300px|thumb|none|TunerPro depiction of Coolant Maps]]
 
[[File:Coolant-config.JPG|300px|thumb|none|TunerPro depiction of Coolant Maps]]
  
Line 1,503: Line 1,720:
  
 
==MAF Sensor Scalar Adjustments==
 
==MAF Sensor Scalar Adjustments==
The standard MAF sensor map is a non-interpolated 16*16 lookup table, that can also be shown as 1*256 "voltage (v) vs. airflow (kg/h)" table. The 10 bit analog to digital conversion is reduced to 8 bits and 4 bits of each are used to lookup the MAF value.  
+
The standard MAF sensor map is a non-interpolated 16 x 16 lookup table, that can also be shown as 1 x 256 table. The 10 bit analog to digital conversion is reduced to 8 bits and 4 bits of each are used to lookup the MAF value.  
  
 
There are differences in flow between the M54B22/M54B25 and M54B30 MAF sensors, as the diametre is different. Differences in cross sectional area would be expected to rescale the values, but the sensor is part of the tube and not easily modified.
 
There are differences in flow between the M54B22/M54B25 and M54B30 MAF sensors, as the diametre is different. Differences in cross sectional area would be expected to rescale the values, but the sensor is part of the tube and not easily modified.
  
Replacement slot type sensors (Ford based) are often used in high output blow through configurations for turbocharging, as the BMW OEM sensors are not well suited to boost in blow through setup.  
+
Ford or Bosch slot type sensors are often used in high horse power blow through configurations for turbocharging which the BMW OEM sensors are not well suited for.
  
"Engine load (mg/stroke) is proportional to "airflow (kg/h)" divided by RPM and is used to reference most of the important injection and ignition tables.
+
Engine load (mg/stroke) is proportional to airflow (kg/h) divided by RPM and is used to reference most of the important injection and ignition tables.
  
There is a factory airflow limit of 1024kg/h that can be doubled or quadrupled with a patch that has undergone basic testing, but the maximum engine load is still limited to 1389mg/stroke, unless there are massive code rewrites.
+
There is a factory airflow limit of 1024kg/h that can be doubled with a patch that has undergone extensivetesting, but the maximum engine load is still limited to 1389mg/stroke.
 +
 
 +
We are working hard to get around this limit as soon as possible and beta testing showed great results with a limit of 2778mg/stroke.
  
 
A M54B30 pulls about 600mg/stroke in cold conditions with a maximum airflow of about 630kg/h.
 
A M54B30 pulls about 600mg/stroke in cold conditions with a maximum airflow of about 630kg/h.
Line 1,517: Line 1,736:
 
Changes to MAF tables should be kept smooth and progressive. Fuel trims plotted against MAF voltage can be used to fine tune the closed loop areas.
 
Changes to MAF tables should be kept smooth and progressive. Fuel trims plotted against MAF voltage can be used to fine tune the closed loop areas.
  
==Throttle body reaction to accelerator pedal==
+
*'''id_maf_tab__v_maf_1__v_maf_2''' - MAF sensor definition. 1x256
[[File:TunerPro_Drosselklappe.jpg|thumbnail|right|TunerPro depiction of IP_TPS_SP_PVS]]
+
*'''id_maf_tab''' - MAF sensor definition. 16x16
  
Influencing the reaction of the throttle body based on driver wish is calculated in map "IP_TPS_SP_PVS"
+
==Engine Speed Limiter==
 +
The MS43 has two gear dependant engine speed limiters, a softlimiter and a hardlimiter for each gearbox type (manual or automatic transmission).
  
You can tweak it to replicate similar behavior to a pedal box.
+
The softlimiter works by cutting single injectors based on fuelcut pattern, whereas the hardlimiter immediately cuts off all cylinders.
  
===Tweaked throttle map===
+
*'''id_n_max_at''': softlimiter for AT gearbox
 +
*'''id_n_max_mt''': softlimiter for MT gearbox
 +
*'''id_n_max_max_at''': hardlimiter for AT gearbox
 +
*'''id_n_max_max_mt''': hardlimiter for MT gearbox
  
With the following tweak, the accelerator pedal feels more aggressive. Tested on M54B30, be careful with others.  
+
In addition to that, you will want to raise '''id_n_max_vs_max_at''' or '''id_n_max_vs_max_mt''' slightly above the hardlimiter.
  
{|class="wikitable" border="1" style="width: 600pt; border-collapse:collapse; text-align:right;"
+
The Siemens MS43 receives the current vehicle speed (_vs) via CAN bus from the rear right speed sensor signal of the ABS control unit. This is new and differs from older chassis that got it from a sensor inside the differential.
|+ Here is a more aggressive throttle map
 
| 0.000 || 0.000 || 0.000 || 0.000 || 0.000 || 0.000 || 0.000 || 0.000 || 0.000 || 0.000 || 0.000 || 1.999
 
|-
 
| 0.000 || 0.000 || 0.000 || 0.000 || 0.000 || 0.000 || 0.000 || 0.000 || 0.000 || 0.000 || 0.800 || 2.499
 
|-
 
| 1.000 || 0.751 || 0.000 || 0.000 || 0.000 || 0.000 || 0.000 || 0.399 || 0.399 || 1.000 || 2.701 || 3.900
 
|-
 
| 1.500 || 1.000 || 0.000 || 0.000 || 0.000 || 0.150 || 0.350 || 0.699 || 2.400 || 4.299 || 5.000 || 5.801
 
|-
 
| 1.699 || 1.699 || 1.699 || 1.699 || 2.100 || 3.250 || 4.001 || 4.400 || 5.599 || 7.000 || 7.399 || 8.100
 
|-
 
| 5.249 || 5.249 || 5.249 || 5.249 || 6.249 || 7.500 || 8.349 || 8.800 || 9.199 || 9.499 || 9.800 || 9.800
 
|-
 
| 17.343 || 17.343 || 17.343 || 17.343 || 17.343 || 17.343 || 17.343 || 17.343 || 17.343 || 17.343 || 17.343 || 17.343
 
|-
 
| 44.999 || 44.999 || 44.999 || 44.999 || 44.999 || 44.999 || 30.937 || 30.937 || 27.187 || 27.187 || 24.843 || 22.499
 
|-
 
| 69.842 || 69.842 || 69.842 || 69.842 || 69.842 || 69.842 || 39.998 || 39.998 || 32.498 || 32.498 || 29.999 || 28.500
 
|-
 
| 74.998 || 74.998 || 74.998 || 74.998 || 74.998 || 74.998 || 74.998 || 67.498 || 67.498 || 52.498 || 52.498 || 52.498
 
|-
 
| 80.998 || 80.998 || 80.998 || 80.998 || 80.998 || 80.998 || 80.998 || 80.998 || 77.497 || 77.497 || 77.497 || 77.497
 
|-
 
| 80.998 || 80.998 || 80.998 || 80.998 || 80.998 || 80.998 || 80.998 || 80.998 || 80.998 || 80.998 || 80.998 || 80.998
 
|}
 
  
==RPM limiter==
+
In case the ECU doesn't get a valid vehicle speed signal, for example when you put an M54 engine in an older chassis, or strip out the ABS block for weight reasons, a third RPM limiter is applied:
The Siemens MS43 has two gear dependant rpm limiters, a softlimiter and a hardlimiter for each gearbox type (manual or automatic transmission).
 
  
The softlimiter works by cutting injectors based on fuelcut pattern, whereas the hardlimiter immediately cuts off all cylinders.
+
*'''c_n_max_vs_diag''': RPM limiter in case of missing vehicle speed
  
*ID_N_MAX_AT: softlimiter for AT gearbox
+
For aggressive hard cut reduce the limiter hysteresis to:
*ID_N_MAX_MAX_AT: hardlimiter for AT gearbox
+
*'''c_n_max_hys''' 32 to 0
*ID_N_MAX_MT: softlimiter for MT gearbox
+
*'''c_n_max_hys_max''' 320 to 32
*ID_N_MAX_MAX_MT: hardlimiter for MT gearbox
 
  
In addition to that, you will want to raise "ID_N_MAX_VS_MAX_AT" or "ID_N_MAX_VS_MAX_MT" slightly above the hardlimiter.
+
==Vehicle Speed Limiter==
 +
The Siemens MS43 has several vehicle speed limiter for different situations.
  
The Siemens MS43 gets it's vehicle speed signal (_VS) from the ABS control unit and not from a sensor inside the differential, like older chassis.
+
The maximum vehicle speed limiter is depending on the transmission type and only becomes active when the engine speed threshold is passed.
 +
*'''c_vs_max_at_1''' - Applicable maximum speed automatic transmission
 +
*'''c_vs_max_mt_1''' - Applicable maximum speed manual transmission
 +
*'''c_n_min_vs_max''' - Engine speed threshold for activating the speed limitation
  
In case the ECU doesn't get a valid vehicle speed signal, for example when you put an M54 engine in an older chassis, or strip out the ABS block for weight reasons, a third RPM limiter is applied:
+
Setting the '''c_vs_max_*''' limiter to 255km/h won't get rid of the Vmax limit, instead you have to set '''c_n_min_vs_max''' to 8160rpm.
  
*C_N_MAX_VS_DIAG: RPM limiter in case of missing vehicle speed
+
Also there is a vehicle speed limiter if the maximum engine oil temperature is reached
 +
*'''c_vs_max_toil_max''' - Maximum speed when exceeding the max. oil temperature (c_toil_max)
  
==VMAX limiter==
+
=Safety Features=
The Siemens MS43 has two gearbox dependant speed limiters, set them to 255 to have unrestricted vehicle speed.
+
The following information need to be handled with care as you´re able to turn off safety features! This can lead to severe damage to your engine.
  
*C_VS_MAX_AT_1
+
==Catalyst Overheating Prevention==
*C_VS_MAX_MT_1
 
  
==Idle speed==
+
*'''ip_maf_min_cop__n__iga_dif''' - MAF threshold for catalyst overheating prevention function
MS43 has a few different tables that affect the nominal idle speed
+
*'''ip_maf_min_cop_ron__n__iga_dif''' - MAF threshold for catalyst overheating prevention function with bad fuel quality
  
*IP_N_SP_IS__TCO: Nominal idle speed without additional load on the engine.
+
To disable catalyst overheating prevention (COP) set ip_maf_min_cop__n__iga_dif and ip_maf_min_cop_ron__n__iga_dif to 1389mg/stroke.
*IP_DRI_N_SP_IS__TCO: Nominal idle speed with drive engaged for AT gearbox.
 
*IP_ACIN_N_SP_IS__TCO: Nominal idle speed with air conditioner switched on.
 
*IP_DRI_ACIN_N_SP_IS__TCO: Nominal idle speed with air conditioner switched on and drive engaged for AT gearbox.
 
  
The idle setpoint is modified from the nominal speed above by
+
==CAT Heating==
 +
*'''id_t_ch_ti_cat_var__tco_st''' - Duration after start to switch on the injection time correction for catalyst heating function with cat-preparation (c_conf_cat 0 or 1)
 +
*'''ip_t_ch_ti__tco_st__km_ctr''' - Duration after start to switch on the injection time correction for catalyst heating function
 +
*'''id_t_iga_ch_cat_var__tco_st''' - Duration after start to switch on the ignition angle intervention for catalyst heating function with cat-preparation (c_conf_cat 0 or 1)
 +
*'''ip_t_iga_ch__tco_st__km_ctr''' - Duration after start to switch on the ignition angle intervention for catalyst heating function
  
*IP_N_SP_ADD_CHA_CDN_BAT__CHA_CDN: Nominal idle speed offset for battery charge state.
+
Set them to "0" to disable catalyst heating injection and ignition altering.
*IP_N_SP_ADD_HEAT__TCO: Nominal idle speed offset with catalyst heating function active.
 
  
In addition, the idle speed slew rate can be changed with C_N_SP_LGRD_IS.
+
==Misfire Detection==
 +
*c_n_min_er: minimum engine speed for detection of misfire!
 +
*c_n_max_er: maximum engine speed for detection of misfire!
  
==Idle Control Valve Delete==
 
  
Removing the Idle Control Valve / Idle Speed Actuator is possible due to the motorized throttle body, although it is quite a bit of work to remove it electrical.
+
==Knock Detection==
Disconnect ICV/ISA connector and either remove ICV/ISA and plug the hole in the intake manifold (prefered) or use hot glue to seal the ICV/ISA. There must be no air passing the ICV/ISA!
+
*id_iga_dec_knk_1__n: ignition angle reduction based on knock stage1
The engine will respond much harder to gas pedal movement after deleting the ICV/ISA, so be prepared for some new driving experience.
+
*id_iga_dec_knk_2__n: ignition angle reduction based on knock stage2
  
Additional to the values shown in the picture you have to correct CHK4 Checksum.
 
Checksum 4 is an addition checksum that the dme uses to verify that the _mon_ values in the calibration file are not corrupt.
 
The variables that the dme uses to calculate this checksum is located in the program section so tools like Ultimo Checksum Corrector can only correct this checksum in a 512KB file.
 
If you are using 430056 you can disable this checksum by setting lc_swi_cal_mon_cks to 165(0xA5).
 
  
THIS MOD is also tested on automatic transmission cars. It works well.
+
==Injection Adaptation==
 
+
*c_n_ti_ad_fac_min: min engine speed to allow adapation of fuel trim, multiplicative
As the values in the wiki are made for a M54B30 you may need to modify ip_pvs_isa_isapwm__isapwm to get a stable idle with m54b25 and m54b22.
+
*c_n_ti_ad_add_max: max engine speed to allow adapation of fuel trim, additive
This table dictates how much pvs input should be added for a given isa duty cycle. So if your idle is low try increasing this table.
+
 
 +
=Special Functions=
 +
'''Please look here for the old 430056 functions that were published by Daniel.F back in 2015: [[Siemens_MS43_Old_Stuff]]'''
  
 +
'''Here are some handy mods when going forced induction [[Forced_Induction_Upgrades]]'''
  
Credits to Tobias S.! Checksum Credits to Lakemountain.
 
  
  
[[File:2017-04-18 110749.jpg ‎|300px|thumb|none|TunerPro ISAoff]]
 
  
If you have a 3D printer that can print ABS plastic, you can now print your own plug for removing the ISA
 
  
http://www.thingiverse.com/thing:2297204
+
==Differential Vehicle Speed Sensor Mod For E30/E34==
 +
If you want to use an MS43 in an older E30 or E34 chassis and keep the speed signal sensor inside your rear differential housing, you have to change the number of impulses needed for one kilometer.
  
==Fake race camshafts / lumpy idle mod==
+
* '''c_vs_fac''' = Number of vehicle speed sensor pulses per kilometer
  
Faking some serious camshafts is pretty easy as M54 engine has adjustable camshafts. So basically whats happening when going camshafts is, the valve overlap will be increased by a huge amount. This means, intake and exhaust valves are open at the same time.
+
A suitable number for the E30,E34 and e36 diffs is '''c_vs_fac''' = "1096" ~ "1100" (Smaller value = Higher speed reading / Higher Value = Lower speed reading) 
  
*ip_cam_sp_tco_1_ex_is__n__maf_iv
+
'''Note:''' This only affects ECU data aquisition and not the dashboard view, but its helpfull for speed based parameters like LC config
*ip_cam_sp_tco_2_ex_is__n__maf_iv
 
*ip_cam_sp_tco_1_in_is__n__maf_iv
 
*ip_cam_sp_tco_2_in_is__n__maf_iv
 
  
*c_n_min_er >idlespeed, to not trigger during when engine idles lumpy.
+
Values can be fine tuned with a GPS based device to adjust for wheels/tyres dimensions differences
  
Max adjustable value for the different engine specs:
+
Unfortunately this low value will make the reading very unprecise. For a fix check out the [[TunerPro_MS43_Community_Patchlist|MS43 Commuinity Patchlist]].
  
[[File:Vanos max settings.jpg|300px|thumb|none|Vanos specs]]
+
==Exhaust Pop Modifications==
 +
When tuning for exhaust pops there are two approaches that can be taken.
  
The biggest valve overlap will be acchieved when using the lowest adjustable value on the intake side (80° respectively 86°) and the lowest adjustable value on the exhaust side (-80°)
+
===== Toggleable exhaust pops =====
 +
This approach disables the trailing throttle fuel cut by raising the minimum engine speed threshold for trailing throttle fuel cut to an engine speed that the engine can't reach, this will produce continuous exhaust pops as soon as the throttle is lifted.
  
[[File:Camshaft Mod.jpg|300px|thumb|none|TunerPro depiction of min allowed Vanos setpoints]]
+
As the MS43 has two separate tables for when the AC is on or off we can use that logic to for example only activate exhaust pops when the AC is on.
 +
 
 +
*'''ip_n_min_puc__tco''' - Minimum engine speed for trailing throttle fuel cut activation with AC off
 +
*'''ip_n_min_accin_puc__tco''' - Minimum engine speed for trailing throttle fuel cut activation with AC on
 +
 
 +
To tune the intensity of the exhaust pops the following ignition tables can be used.
  
 +
*'''ip_iga_pu__n__tco''' - Target ignition angle in case of trailing throttle
 +
*'''ip_iga_puc__n__tco''' - Target ignition angle in case of trailing throttle fuel cut-off
 +
*'''ip_iga_accin_puc__n__tco''' - Target ignition angle in case of trailing throttle fuel cut-off with AC on
  
A good starting point for further optimization could be:
+
[[File:TP Toggle Exhaust Pops.PNG|300px|thumb|none|TunerPro depiction of toggled exhaust pops. This example should only be used as a starting point for further tuning.]]
  
[[File:GhostCam.jpg|300px|thumb|none|TunerPro depiction of GhostCam mod]]
+
===== Timered exhaust pops =====
 +
This approach uses a built in timer function in the MS43 which delays the activation of the trailing throttle fuel cut by a set amount of time.  
  
=Safety Features=
+
With this approach it's possible to achieve a set amount of pops before the trailing throttle fuel cut is activated.
The following information need to be handled with care as you´re able to turn off safety features! This can lead to severe damage and you´re doing so at your own risk!
+
*'''c_t_puc_deacc_vs''' - Delay before activating trailing throttle fuel cut when car is stationary
 +
*'''ip_t_puc_deacc_1__n__maf_mmv''' - Delay before activating trailing throttle fuel cut. First gear
 +
*'''ip_t_puc_deacc_2__n__maf_mmv''' - Delay before activating trailing throttle fuel cut. Second gear
 +
*'''ip_t_puc_deacc_3__n__maf_mmv''' - Delay before activating trailing throttle fuel cut. Third gear
 +
*'''ip_t_puc_deacc_4__n__maf_mmv''' - Delay before activating trailing throttle fuel cut. Forth gear
 +
*'''ip_t_puc_deacc_5__n__maf_mmv''' - Delay before activating trailing throttle fuel cut. Fifth gear
  
==Misfire Detection==
+
To tune the intensity of the exhaust pops the same tables as the toggleable exhaust pops approach can be used.
  
*c_n_min_er: minimum engine speed for detection of misfire!
+
[[File:TP Timer Exhaust Pops.PNG|300px|thumb|none|TunerPro depiction of timered exhaust pops. This example should only be used as a starting point for further tuning.]]
*c_n_max_er: maximum engine speed for detection of misfire!
 
  
==Knock Detection==
+
Both approaches can also be combined in the following way to have short pops with AC off and continous pops when the AC is on.
 +
[[File:TP Combined Exhaust Pops.PNG|300px|thumb|none|TunerPro depiction of combined exhaust pops. This example should only be used as a starting point for further tuning.]]
  
*id_iga_dec_knk_1__n: ignition angle reduction based on knock stage1
+
==Idle Control Valve Delete==
*id_iga_dec_knk_2__n: ignition angle reduction based on knock stage2
+
[[File:Tunerpro icv delete.PNG ‎|300px|thumb|right|TunerPro ICV Delete]]
 +
Removing the idle control valve (ICV) / idle speed actuator (ISA) is possible due to the motorized throttle body the M54 engine uses.
  
==Injection Adaptation==
+
Disconnect the idle control valve connector and either remove the idle control valve and plug the hole in the intake manifold (preferred) or use something to seal the idle control valve air tight.
  
*c_n_ti_ad_fac_min: min engine speed to allow adapation of fuel trim, multiplicative
+
If you want to machine a matching plug, use this template: [[:File:ISA Delete Plug.pdf|ISA_Delete_Plug.pdf]]
*c_n_ti_ad_add_max: max engine speed to allow adapation of fuel trim, additive
 
  
=Special Functions=
+
The most important table that makes the ICV delete possible is the '''ip_pvs_isa_isapwm''' table. This table is used by the ecu to decide how much pvs input should be added to the drivers requested pvs input for a given idle control valve duty cycle.
  
Some of these functions are only accessable by purchasing a license file.
+
In a stock engine this table is used to extend the idle control valve duty cycle so when the idle control valve duty cycle goes above 100% the throttle will start to open to deliver more air into the engine.
 +
So when we remove the idle control valve we re-scale this table to emulate the idle control valve airflow with different pvs inputs. These pvs inputs are in the end translated to a throttle opening by the '''ip_tps_sp_pvs''' table.
  
This is not yet available, stay tuned here. Please don't write any emails until it's done!
+
If we take an example from the ICV delete values above we will see in the '''ip_pvs_isa_isapwm''' table that at 17.5% idle control valve duty cycle the ecu will add 7.430° of pvs input to the drivers requested pvs input and if we take a look in the '''ip_tps_sp_pvs''' table we will see that around idle speed this pvs input will result in a throttle opening of around 2.999°. As we can see the values in '''ip_pvs_isa_isapwm''' and '''ip_tps_sp_pvs''' are tightly connected so if the '''ip_tps_sp_pvs''' table is modified then the '''ip_pvs_isa_isapwm''' table will also have to be modified accordingly to maintain a stable idle.
  
==Alpha/n==
+
[https://docs.google.com/file/d/1iuopuis61GzssKOn_d_DbgekmFZEyXzd/edit?usp=docslist_api&filetype=msexcel Copyable ICV Delete Tables M54B30 ONLY!].
  
''This feature needs licencing.''
+
The '''ip_pvs_isa_isapwm''' values above are created for a M54B30 engine so the values may need to be modified to get a stable idle with a M54B22 or M54B25 engine as these engines have a smaller throttle body, a good starting point would be to increase the '''ip_pvs_isa_isapwm''' table values with the opening area percentage difference between the M54B30 throttle body and the M54B22/M54B25 throttle body.
  
Full working Alpha/n workaround finished! The ecu behaves like stock, all adaptations work, cruise works fine, rev-matching also works fine!
+
This modification modifies a monitoring table so the calibration addition checksum needs to be corrected or disabled after applying the changes. [[#Checksums|Check here for more information about checksums.]]
  
Note: Suppressing the DTCs and disconnecting the MAF will result in a not starting engine.
 
  
[[File:TunerPro_AlphaN.jpg|300px|thumb|none|TunerPro depiction of Alpha/n map]]
+
==Lumpy Idle / Fake Race Camshafts==
 +
Basically whats happening when installing race camshafts is a huge increase in valve overlap. This means, intake and exhaust valves are open at the same time.  
  
==M3 Cluster LED Control==
+
As M52TU and M54 have an adjustable camshaft system (VANOS) faking the rough idle sound of some serious camshafts pretty easy.
  
''This feature needs licencing.''
+
To get a similar sounding idle state you have to increase valve overlap time by adjusting the VANOS setpoints.
  
After swapping in an M3 cluster into a E46, there is no more "ecometer" displaying the momentary fuel consumption, but a more useful oiltemperature gauge.  
+
The idle speed VANOS setpoint are configurable in the following maps:
 +
*'''ip_cam_sp_tco_1_in_is__n__maf_iv''' - Intake camshaft setpoint during idle. Cold engine
 +
*'''ip_cam_sp_tco_1_ex_is__n__maf_iv''' - Exhaust camshaft setpoint during idle. Cold engine
 +
*'''ip_cam_sp_tco_2_in_is__n__maf_iv''' - Intake camshaft setpoint during idle. Warm engine
 +
*'''ip_cam_sp_tco_2_ex_is__n__maf_iv''' - Exhaust camshaft setpoint during idle. Warm engine
  
Using this cluster and some additional code we can also control the LEDs around the RPM gauge to work similar to the E46 M3 and also manage shiftlight behaviour.
 
  
Following maps are used:
+
Additionally you have to raise the minimum engine speed threshold for the misfire detection '''c_n_min_er''' above your desired idle speed setpoint baucse this will otherwise stall the engine.
  
<gallery>
+
The biggest valve overlap will be achieved when using the lowest adjustable value on the intake side (80° respectively 86°) and the lowest adjustable value on the exhaust side (-80°)
File:OilLight M3 Cluster.jpg|TunerPro depiction of oil warmuplight map
 
File:Shiftlights M3 Cluster.jpg|TunerPro depiction of shiftlight map
 
</gallery>
 
  
==Multifunction M3 Cluster==
+
[[File:Camshaft Mod.jpg|300px|thumb|none|TunerPro depiction of min allowed Vanos setpoints]]
  
''This feature needs licencing.''
 
  
Using the oil temperature gauge from your M3 cluster to toggle between oil temp, exhaust gas temp, wideband lambda, boost gauge, etc.
+
A good starting point for further optimization could be:
  
Option is under development.
+
[[File:GhostCam.jpg|300px|thumb|none|TunerPro depiction of GhostCam mod]]
  
==Variable speed limiter==
+
==M Cluster LED Control==
 +
After swapping in an M3 cluster into a E46 or M5 cluster into E39, there is no more ecometer displaying the momentary fuel consumption, but a more useful oiltemperature gauge.
  
''This feature needs licencing.''
+
Using this cluster and some additional code we can also control the LEDs around the RPM gauge to work similar to the E46 M3 and also manage shiftlights behaviour.  
  
Using the cruise control in serpentine area sometimes is cumbersome as the cruise will be deactivated when breaking, but sometimes it´ll be nice to have the security of being protected against speed traps. Another possible use would be speed limits on the track or something.
+
Following maps are used:
 +
*'''id_icl_toil_led__n''' - LEDs used at the given  oil tempetature for the warmup light feature
 +
*'''ldpm_toil_led''' - Oil temperatur axis to adjust the switch points of the led array for the warmup light feature
 +
*'''id_icl_led__n''' - LEDs used at the given enginespeed for the shift light feature
 +
*'''ldpm_toil_led''' - Engine Speed axis to adjust the switch points of the led array for the shift light feature
  
To engage the variable speed limiter make shure cruise control is deactivated (green led must not light). Accelerate the car to the speed you wanna set as speed limit and push the (-) cruise control button once. The car will then be limited at that speed until you either do a power cycle of the ecu or push (+) to release the variable speed limiter.
+
Explanation for the decimal values used (M3):
  
==Variable engine usage==
+
*112 - all LEDs lit
 +
*96 - 4500 and upwards
 +
*80 - 5000 and upwards
 +
*64 - 5500 and upwards
 +
*48 - 6000 and upwards
 +
*32 - 6500 and upwards
 +
*16 - 7000 and upwards
 +
*00 - 7500 lit
 +
*02 - oil warning LED yellow
 +
*04 - coolant warning LED
  
''This feature needs licencing.''
+
Explanation for the decimal values used (M5):
  
MS43 starts to grow to become universal applicable, so the next big feature is the ability to change the number of cylinders the ecu can be used for. Development for 4 cylinder engines is ongoing, stay tuned for this awesome feature.
+
*64 - 4000 and upwards
 +
*48 - 4500 and upwards
 +
*32 - 5000 and upwards
 +
*16 - 5500 and upwards
 +
*00 - 6500 lit
 +
*01 - oil warning LED yellow
 +
*04 - coolant warning LED
  
<gallery>
+
Download the warmup and shiftlights patch for TunerPro depending on your software version:
File:2017-10-27 121139.jpg|TunerPro depiction of universal engine calibration
+
*'''430056:''' [[:File:Siemens_MS43_MS430056_Cluster_LED_Mod_v2.zip|Siemens_MS43_MS430056_Cluster_LED_Mod_v2.zip]]
</gallery>
+
*'''430066:''' [[:File:Siemens_MS43_MS430066_Cluster_LED_Mod.zip|Siemens_MS43_MS430066_Cluster_LED_Mod.zip]]
  
==Launch Control==
+
'''Use with 512kByte file only. Checksum correction required!'''
[[File:Tunerpro_lc_config.jpg|thumbnail|right|TunerPro launch control maps]]
 
  
'''Setting up LC:'''
+
[[File:TP_MS43_M3_Cluster_Warmuplights.PNG|320|M3 Cluster warmuplight maps]] [[File:TP_MS43_M3_Cluster_Shiftlights.PNG|320|M3 Cluster shiftlight maps]]
  
Set the following maps in TunerPro:
+
<youtube>jYAudhc02nQ</youtube>
  
*Configuration Launch Control
+
== Map Reduction ==
*Launch_PVS_min
+
[[File:Siemens MS43 Map Reduction.png|thumb|MS43 Map Reduction]]
*Launch_TCO_min
+
You can reduce the total amount of maps you have to tune in MS43 with a very simple trick without losing map size like with the "fewmaps" files.
*Launch_RPM_max
 
*Launch_VS_max
 
  
'''Using LC:'''
+
This is done by forcing the MS43 into using the cold engine injection, ignition and VANOS maps for cold enigne only.
  
*1. Make sure coolant temp is equal or above the threshold
+
This is done by setting all the transition tables responsible for changing between cold and warm engine state to "1.0":
*2. Depress the clutch pedal
+
* ip_fac_is_ivvt
*3. Choose first gear
+
* ip_fac_pl_ivvt
*4. Floor the accelerator pedal! (At least that °PVS matches the threshold!)
+
* ip_fac_cam_sp_in_is
*5. Engine speed should bounce at chosen rpm setpoint. There may be offset which engine speed bounces, like +/- 200rpm
+
* ip_fac_cam_sp_ex_is
*6. Release clutch pedal while holding accelerator pedal down.
+
* ip_fac_cam_sp_in_pl
 +
* ip_fac_cam_sp_ex_pl
  
== *7. Engine speed will be reduced until vehicle speed exceeds chosen threshold == Currently not working!
+
That will leave us with the following maps during normal engine operation:
  
*8. ASC/DSC must be turned off
+
* '''Injection'''
 +
** Idle Speed: ip_ti_tco_1_is_ivvt
 +
** Part Load: ip_ti_tco_1_pl_ivvt_1 & ip_ti_tco_1_pl_ivvt_2
  
Engine RPM setting may be adjusted according to road conditions/tire setup, in order to minimize wheel spin.
+
* '''Ignition'''
 +
** Idle Speed: ip_iga_tco_1_is_ivvt
 +
** Part / Full Load: ip_iga_tco_1_pl_ivvt
 +
 
 +
* '''VANOS'''
 +
** Idle Speed: ip_cam_sp_tco_1_in_is & ip_cam_sp_tco_1_ex_is
 +
** Part Load: ip_cam_sp_tco_1_in_pl & ip_cam_sp_tco_1_ex_pl
 +
** Full Load: ip_cam_sp_tco_1_in_fl & ip_cam_sp_tco_1_ex_fl
 +
 
 +
 
 +
'''ATTENTION:''' Be aware that the following tables can be used if there is an active error in the ECU:
 +
*ip_tib__n__maf
 +
*ip_igab_is__n__maf
 +
*ip_igab__n__maf
 +
 
 +
 
 +
 
 +
 
 +
 
 +
==VANOS Tweak for little extra midrange power==
 +
Insert the following tables into the desired part-load map where you need the effect ( part-load cold / part-load warm / both).
 +
 
 +
{| class="wikitable mw-collapsible mw-collapsed" style="width: 920pt"
 +
|+ VANOS Tweak maps in table form for copy and pasting into TunerPro M54B30 only
 +
! Exhaust cam setpoint part-load !! Intake cam setpoint part-load
 +
|-
 +
|
 +
{|class="wikitable border="1" style="width: 450pt; margin: auto; text-align:right"
 +
| -105.0 || -105.0 || -105.0 || -104.6 || -103.1 || -97.5 || -96.0 || -96.8 || -98.3 || -104.3 || -99.0 || -99.0
 +
|-
 +
| -105.0 || -104.6 || -103.9 || -102.0 || -99.0 || -96.0 || -95.3 || -96.4 || -97.9 || -103.9 || -98.6 || -98.6
 +
|-
 +
| -104.6 || -103.9 || -100.9 || -97.5 || -93.8 || -92.6 || -93.4 || -94.9 || -96.4 || -101.6 || -97.5 || -97.5
 +
|-
 +
| -103.9 || -102.4 || -96.4 || -92.6 || -88.9 || -88.1 || -90.0 || -91.5 || -93.8 || -97.1 || -91.9 || -91.9
 +
|-
 +
| -103.1 || -101.6 || -94.9 || -91.1 || -87.4 || -86.6 || -88.5 || -90.4 || -92.6 || -96.0 || -90.8 || -90.8
 +
|-
 +
| -100.9 || -98.6 || -90.4 || -87.0 || -85.9 || -85.1 || -85.9 || -88.5 || -91.1 || -95.6 || -90.4 || -90.4
 +
|-
 +
| -99.0 || -96.4 || -88.5 || -85.9 || -85.1 || -84.8 || -85.5 || -88.9 || -94.1 || -97.5 || -95.3 || -95.3
 +
|-
 +
| -97.9 || -95.3 || -87.8 || -85.9 || -85.1 || -85.1 || -85.9 || -91.9 || -97.5 || -100.9 || -99.0 || -99.0
 +
|-
 +
| -96.8 || -94.5 || -88.5 || -86.6 || -85.9 || -96.0 || -95.6 || -95.6 || -95.6 || -95.6 || -95.6 || -97.5
 +
|-
 +
| -95.6 || -94.1 || -91.1 || -88.5 || -88.5 || -99.8 || -101.6 || -101.6 || -101.6 || -101.6 || -100.5 || -101.3
 +
|-
 +
| -95.3 || -93.8 || -91.9 || -90.4 || -90.4 || -101.3 || -102.0 || -102.0 || -102.0 || -102.0 || -100.9 || -101.6
 +
|-
 +
| -93.8 || -93.0 || -92.3 || -92.3 || -94.5 || -102.4 || -101.3 || -101.3 || -101.3 || -101.3 || -100.1 || -101.3
 +
|-
 +
| -91.9 || -91.5 || -91.9 || -92.3 || -95.3 || -105.8 || -106.1 || -106.1 || -106.1 || -106.1 || -105.0 || -102.8
 +
|-
 +
| -87.8 || -88.5 || -89.6 || -91.1 || -94.9 || -106.1 || -106.1 || -106.1 || -106.1 || -106.1 || -105.0 || -103.1
 +
|-
 +
| -85.5 || -87.0 || -88.5 || -90.0 || -93.8 || -106.1 || -106.1 || -106.1 || -106.1 || -106.1 || -105.0 || -103.1
 +
|-
 +
| -84.0 || -85.9 || -87.4 || -88.9 || -93.0 || -106.1 || -106.1 || -106.1 || -106.1 || -106.1 || -105.0 || -103.1
 +
|}
 +
|
 +
{| class="wikitable" border="1" style="width: 450pt; margin: auto; text-align:right"
 +
| 126.00 || 126.00 || 125.63 || 124.88 || 123.00 || 118.88 || 113.25 || 106.50 || 105.00 || 104.25 || 108.00 || 108.00
 +
|-
 +
| 126.00 || 126.00 || 125.25 || 124.50 || 122.63 || 118.50 || 112.88 || 106.50 || 105.00 || 104.25 || 105.00 || 105.00
 +
|-
 +
| 126.00 || 125.63 || 124.88 || 124.13 || 122.25 || 118.13 || 112.50 || 105.75 || 104.25 || 103.50 || 100.13 || 100.13
 +
|-
 +
| 125.63 || 124.88 || 123.75 || 122.63 || 120.38 || 115.88 || 110.25 || 103.88 || 99.75 || 98.63 || 91.50 || 91.50
 +
|-
 +
| 125.25 || 124.50 || 123.38 || 121.88 || 119.25 || 114.75 || 109.50 || 102.75 || 98.63 || 97.50 || 90.75 || 90.75
 +
|-
 +
| 124.50 || 123.38 || 122.25 || 120.38 || 117.38 || 112.50 || 107.25 || 101.25 || 97.50 || 96.75 || 90.75 || 90.75
 +
|-
 +
| 123.38 || 122.25 || 120.75 || 118.88 || 114.38 || 107.63 || 102.00 || 98.25 || 97.13 || 96.38 || 90.38 || 90.38
 +
|-
 +
| 122.63 || 121.13 || 120.00 || 117.75 || 112.13 || 103.50 || 99.38 || 97.50 || 96.75 || 96.38 || 91.50 || 91.50
 +
|-
 +
| 115.50 || 113.63 || 111.75 || 109.50 || 104.25 || 93.75 || 99.38 || 98.25 || 94.50 || 94.13 || 94.13 || 94.13
 +
|-
 +
| 113.25 || 111.75 || 110.25 || 107.25 || 100.50 || 91.88 || 100.88 || 99.75 || 94.88 || 94.50 || 94.50 || 94.50
 +
|-
 +
| 112.13 || 110.25 || 108.00 || 104.63 || 94.50 || 90.38 || 101.25 || 100.50 || 97.50 || 97.50 || 97.50 || 97.50
 +
|-
 +
| 110.63 || 105.38 || 99.75 || 95.25 || 89.63 || 90.75 || 105.75 || 105.00 || 101.63 || 100.50 || 100.50 || 100.50
 +
|-
 +
| 109.88 || 104.25 || 97.50 || 92.25 || 109.50 || 110.25 || 109.50 || 110.25 || 108.75 || 108.75 || 108.75 || 108.75
 +
|-
 +
| 108.75 || 103.88 || 99.38 || 94.88 || 115.50 || 118.13 || 118.13 || 118.13 || 117.75 || 117.75 || 117.75 || 117.75
 +
|-
 +
| 108.38 || 106.50 || 104.25 || 101.25 || 118.50 || 126.00 || 126.00 || 126.00 || 126.00 || 126.00 || 122.25 || 122.25
 +
|-
 +
| 108.38 || 108.75 || 108.00 || 106.50 || 122.25 || 126.00 || 126.00 || 126.00 || 126.00 || 126.00 || 126.00 || 126.00
 +
|}
 +
|}
  
For additional aggressiveness set "c_n_max_hys_max" to 32 or 64, then LC is much less bouncy
+
[[File:vanos_tweak.jpg|DoCr VANOS Tweak]]
  
'''Example video:'''
+
===Explaination===
 +
For stock engine with stock exhaust and intake flow, above VANOS tune works best.
  
https://www.youtube.com/watch?v=CZDCd-bMDyo
+
For a modded engine, or stock with free flowing exhaust and cold air intake, valve overlap can help increase volumetric efficiency at higher engine speeds (above ~4000rpm), which results in more power.
  
==Boost Control==
+
Taking as a base M54B30 engine with intake cam 126° for max, and 86° for min ; exhaust cam -105° for max and -80° for min
  
==Water Methanol Injection==
+
'''126° represents intake cam in its max retard form, and 86° in its max advance position'''
  
==Map Switching==
+
'''-105° represents exhaust cam in its max advance position, and -80° in its max retard stage'''
  
==Flexfuel==
+
General rule for overlap :
 +
*'''Advancing both cams''' - more low end torque and less top end power
 +
*'''Retarding both cams''' - less low end torque and more top end power
  
''This feature needs licencing.''
+
Tip for full load VANOS table: Begin from low rpm with max number for your cam (intake 126° , exhaust -105°) and  progressively reduce number until you reach 4000rpm and lowest cam number (intake 86,exhaust -80)
  
Implementing a ethanol content sensor from your favorite brand (as long as its analogue 0-5V!) is now possible. You´ll be getting all the benefit from ethanol based fuel and you can tune it to your needs.  
+
From 4000rpm upwards, use inverse technique, start to rise again numbers, progressively. (every engine responds different by exhaust config) Test combinations until you are happy.
  
Spark advance and injection quantity can be tuned to your car individually. You can even see the current ratio displayed in the econometer prior engine start.
+
Also, do changes for intake only, leave exhaust alone if you are on stock exhaust manifold.
  
[[File:MS43_Flexfuel.jpg|300px|thumb|none|TunerPro depiction of Flexfuel]]
+
'''note'''  Theoreticaly, there is no risk of damaging the engine (valve hits piston) if you stay within specified range for your particular cams. (m54b30 intake 126/86 ,exhaust -105/-80)

Latest revision as of 12:50, 15 January 2021

The Siemens MS43 engine control unit (ECU) uses an Infineon C167CR_SR CPU in combination with a 4 megabit AMD AM29F400BB flash memory. This ECU controls the BMW M54 inline six engine.

When looking at the cryptic item names this might help you: Siemens Keyword Translation

Memory Layout

The MS43 can be seperated into three major sections, first comes the bootloader, then the program code, and last the calibration data.

See this table for file locations:

Start End Section Size
00000 0FFFF Bootloader Code 64 kByte
10000 1FFFF Program Code 384 kByte
20000 2FFFF
30000 3FFFF
40000 4FFFF
50000 5FFFF
60000 6FFFF
70000 7FFFF Calibration Data 64 kByte


Bootloader Section

The bootloader code section is the most important section of the MS43 and doesnt have to be touched for at least 99% of all use cases.

This section is 64 kByte in size and contains the interrupt setups, input and output initializations, as well as immobilizer information and the UIF (user information fields).

The significant difference between the bootloader section and the others is, that it's only one time programmable under normal operation. That means once a byte has been changed from FF to another value, it is not changeable again.

Unlimited write access to the bootloader section can only be archieved through JMGarage Flasher and is ONLY needed for virginizing the ECU to pair it with a different EWS module or to alter the UIF without increasing the flashcounter.

Tip: The newest version of immobilizer and checksum delete will not need bootmode flashing.


Programm Code Section

All of the MS43 program code is located here.


Calibration Data Section

Checksums

Checksums are used to verify that the data written to the ROM has not become corrupt.

The MS43 uses three CRC16 checksums that covers the boot, program and calibration sections and two addition checksums that covers the data for the monitoring (_mon_) routines.

The variables that the ECU uses to calculate the addition checksum is located in the program section so tools like Ultimo Checksum Corrector can only correct this checksum in a 512KB file.

Both addition checksums have to be corrected before the CRC16 checksums, as the addition checksums are located inside the CRC16 checksum areas.

The checksums are located at the following addresses:

CRC16 Location
Boot 0x3C24
Program 0x6FDE0
Calibration 0x73FE0
Addition Location
Program Part 1 0x6FDAE
Program Part 2 0x6FD80
Calibration Part 1 0x72FFC
Calibration Part 2 0x72FFE

Disabling Calibration Checksums

Disable CRC16 Checksum

To disable the CRC16 calibration checksum on all firmwares do the following.

Hexeditor
1. Set Word at 0x73FFE to 0xFFFF
2. Set Byte at 0x6FFB0 to 0xA8


Disable Addition Checksum

To disable the addition calibration checksum use one of the following methods.

Tunerpro
1. Set lc_swi_cal_mon_cks to 165
Hexeditor
1. Set the Byte in the table to 0xA5
Firmware Location
430037 0x70CE3
430055 0x70D7C
430056 0x70D7E
430064 0x70DA0
430066 0x70E0A
430069 0x70E07

Variants Configuration Switches

As MS43 is used in many different chassis configurations there are quite a few configuration switches that enable or disable their corresponding features or change their behaviour.

Configuration brake light test switch logic variant (c_conf_bts)

  • 0: Signal high corresponds to 'brake actuated'
  • 1: Signal low corresponds to 'brake actuated'

Configuration exhaust system variant (c_conf_cat)

  • 0: Automatic learning of variants, single-scroll, with one control (pre cat) sensor or CATV variant (SA199)
  • 1: Automatic learning of variants, twin-scroll, with two control (pre cat) sensors or CATV variant (SA199)
  • 2: Single-scroll, 1 control (pre cat) sensor, 1 monitoring (post cat) sensor
  • 3: Twin-scroll, 2 control (pre cat) sensors, 2 monitoring (post cat) sensors
  • 4: Automatic learning, twin-scroll, with/without control (pre cat) sensors, with/without monitoring (post cat) sensors or CATV variant (SA199)

Configuration main switch cruise control variant (c_conf_cru_main_swi)

  • 0: main switch function active, main switch controlled over steering wheel button O/I
  • 1: main switch function inactive for Z3 usage, main switch enabled when ignition key voltage is present

Configuration DMTL module variant (c_conf_dmtl)

  • 0: DMTL module not present
  • 1: DMTL module present

Configuration ECF (Electrical Cooling Fan) variant (c_conf_ecf)

  • 0: ECF not present, function and diagnosis OFF
  • 1: ECF present, function and diagnosis ON

Configuration exhaust flap variant (c_conf_ef)

  • 0: Exhaust flap not present, function and diagnosis OFF
  • 1: Exhaust flap present, function and diagnosis ON

Configuration diagnostic lamp / MIL variant - two control sensors and two monitoring sensors (c_conf_mil)

  • 0: No control of error lamp, LV_MIL = 0
  • 1: Debounce after BMW error memory
  • 2: Debounce after OBDII error memory and all component errors after 2nd driving cycle
  • 3: Debounce after OBDII error memory and CS-component error, immediately

Configuration diagnostic lamp / MIL variant - two control sensors (c_conf_mil_eu2)

  • 0: No control of error lamp, LV_MIL = 0
  • 1: Debounce after BMW error memory
  • 2: Debounce after OBDII error memory and all component errors after 2nd driving cycle
  • 3: Debounce after OBDII error memory and CS-component error, immediately

Configuration exhaust gas temperatur sensor variant (c_conf_teg)

  • 0: Automatic learning of EGT sensors
  • 1: No EGT sensors
  • 2: twin-scroll exhaust system with four EGT sensors

Configuration torque limit first gear variant (c_conf_tq_lim_gear)

  • 0: Torque limit not active
  • 1: Torque limit active (E53)

Configuration venturi pump variant (c_conf_vepu)

  • 0: VEPU not present, function and diagnosis OFF
  • 1: VEPU present, function and diagnosis ON

Configuration SAP (Secondary Air Pump) variant (c_conf_sap)

  • 0: Automatic learning of SAP varants
  • 1: SAP not present
  • 2: SAP present without SAFM (Secondary Air Flow Meter)
  • 3: SAP present with SAFM (Secondary Air Flow Meter)

Load Filtration

In MS43 we have two different load filtration models for injection/ignition load and VANOS load.

Note: The normal logging routine reports the unfiltered load value that will vary from the filtered loads especially in forced induction applications.

If you ever experience your engine running into a "lean-wall" when hitting positive manifold pressure chances are good that the load filtering was not adjusted for boost.

Injection Load

Intake Manifold Volume Model

The load filtering process for ignition and injection is necessary to include valve overlap induced by the VANOS into load calculations and is based on Clapeyrons ideal gas equation.

First the ECU calculates the manifold absolute pressure (MAP) by taking the effective intake manifold volume (hPa), the engine speed and the unfiltered load reading into account.

The effective volume is different between increasing and decreasing load scenarios and therefore split up into four different tables:

  • ip_vol_im__n__maf_mes - Effective intake manifold volume at increasing load during part load and full load
  • ip_vol_im_neg__n__maf_mes - Effective intake manifold volume at decreasing load during part load and full load
  • ip_vol_im_is__n__maf_mes - Effective intake manifold volume at increasing load during idle, trailing throttle and trailing throttle fuel cut-off
  • ip_vol_im_neg_is__n__maf_mes - Effective intake manifold volume at decreasing load during idle, trailing throttle and trailing throttle fuel cut-off

Obviously, the more accurate this model is, the more accurate is the calculated MAP value that's used in the next step, where the ECU compensates the load with valve overlap.

There are 8 lookup tables (ip_maf_vo_[1-8]__map__n) and a selection table (ip_nr_ip_maf__vo) that decides which of those maps will be used, depending on the current valve overlap angle.

  • ip_nr_ip_maf__vo - Active _vo_ table for maf_ti signal filtering
  • ip_maf_vo_1__map__n - Valve overlap based MAF signal filtering for maf_ti
  • ip_maf_vo_2__map__n - Valve overlap based MAF signal filtering for maf_ti
  • ip_maf_vo_3__map__n - Valve overlap based MAF signal filtering for maf_ti
  • ip_maf_vo_4__map__n - Valve overlap based MAF signal filtering for maf_ti
  • ip_maf_vo_5__map__n - Valve overlap based MAF signal filtering for maf_ti
  • ip_maf_vo_6__map__n - Valve overlap based MAF signal filtering for maf_ti
  • ip_maf_vo_7__map__n - Valve overlap based MAF signal filtering for maf_ti
  • ip_maf_vo_8__map__n - Valve overlap based MAF signal filtering for maf_ti

These tables will revert the MAP signal back into engine load over engine speed and they are interpolating between 50hPa and 1250hPa absolute pressure from factory.

This gives the ECU some headroom to compensate for outside ambient pressure.

VANOS Load

The VANOS load filtration is a simple weighting factor to blend between real measured load and the MAF substitude table.

Siemens MS43 Maf Substitute.png

Vanos Load Weighting Factor.png

The factor depends on unfiltered load and changes to completely rely on MAF substitute with rising load.

This is done to provide a stable load reading for the VANOS to prevent it from moving too much back and forth when the load is rapidly climbing.

  • ip_fac_maf_sub_ivvt__maf_sub_diag - Measured load weighting factor for maf_ivvt filtering
  • ip_maf_1_diag__n__tps_av - MAF diagnosis table used as a MAF substitute if there is a MAF Sensor error

To make real VANOS load as accurate as possible you can either increase the factor towards 1.0 or fine tune the MAF substitute table (the prefered way).

For that you have to datalog unfiltered load, accelerator pedal value and engine speed. A good side effect of this will be that the engine runs better with a defective MAF sensor.

Extending Load Filtration For Forced Induction

When you install a turbo- or super charger the amount of air entering the cylinder will increase tremendously and the ECU will operate off the tables.

Since the ECU is not able to extrapolate values, you will never exceed ~823mg/str engine load with an M54B30 calibration because thats the highest value configured in the valve overlap tables that can be reached wide open throttle.

To make the MAP calculation and VO compensation able to handle higher pressure values than 1250hPa we have to extrapolate said tables on our own.

You can take following values as a guidance that were proved working in several boosted applications or use our prepared an Excel sheet to extrapolate your own tables: File:Load Filtration Table Extrapolation.zip

Siemens MS43 Load Filtration Boosted.png

Please note that this is only an example, but logging showed a perfectly calculated MAP value that matched measured MAP under all circumstances.

After houndred kilometers of logging data, we never experienced a measured pressure of under ~150hPa so it can be considered safe to shift the tables and axis values up to clear the last row for expected pressure.

Another idea that came up recently, all the M50 manifold conversions should take a look at the Alpina B3S binary, this manifold is pretty similar and is pre-calculated from Alpina.

Injection

The fuel injection maps are based on engine load over engine speed and the lookup value is injection time in miliseconds.

The lambda sensors for closed loop operation are narrowband. Fuel trim learning only happens during closed loop operation, but the learned fuel trims do affect full throttle fueling as well.

There are a lot of blending factors, enrichments and also enleanments involved to calculate the final injection time. The following tables are the most important ones.

  • ip_tipr_cst__tco - Pre cold start injection time basic value
  • ip_ti_cst__n__tco - Cranking injection time basic value

Without any active VANOS fault codes the engine interpolates between the cold and warm injection tables. There are individual tables for each cylinder bank.

  • ip_ti_tco_1_is_ivvt__n__maf - Cold engine injection time used during idle
  • ip_ti_tco_1_pl_ivvt_1__n__maf - Cold engine injection time used for bank 1 during part load
  • ip_ti_tco_1_pl_ivvt_2__n__maf - Cold engine injection time used for bank 2 during part load
  • ip_ti_tco_2_is_ivvt__n__maf - Warm engine injection time used during idle
  • ip_ti_tco_2_pl_ivvt_1__n__maf - Warm engine injection time used for bank 1 during part load
  • ip_ti_tco_2_pl_ivvt_2__n__maf - Warm engine injection time used for bank 2 during part load

Axis Values

  • X axis: filtered engine load for injection subsystem (maf_iga)
  • Y axis: engine speed (n)


A blending between cold and warm maps is accomplished by the following transitioning maps. A factor of 1.0 means full useage of cold maps and a factor of 0.0 means full useage of warm maps.

  • ip_fac_is_ivvt__tco__tco_st - Engine coolant temperature blending factor for transition from cold to warm during idle
  • ip_fac_pl_ivvt__tco__tco_st - Engine coolant temperature blending factor for transition from cold to warm during part and full load

Axis Values

  • X axis: engine coolant temperature at engine start (tco_st)
  • Y axis: current engine coolant temperature (tco)


The full load enrichment ip_ti_fl is a multiplier of the part load calculations and added to them respectively. Further explaination is located in the full load section.

  • ip_ti_fast_wf_thd_min__tco
  • ip_ti_slow_wf_thd_min__tco

There is a fuel enleanment ip_ti_cat_var__n__maf when the c_conf_cat variant has learned CATV and full load condition inactive, so you might want to zero it out to prevent the engine going lean.

Maximum Duty Cycle

The maximum duty cycle describes the maximum opening time for an injector at a specific engine speed.

The engine speed is really important here, because the faster the engine spins, the less time there is to inject fuel into the cylinders.

When tuning the engines injection tables, especially in the higher load areas, keep in mind that there are additional enrich- and enleanments applied to the specified injection time.

These adjustments require some headroom on top of that value to work correctly and can be life saving regarding engine health.

Often a maximum duty cycle of 90% is sufficient for the safety features and the injectors to work as intended. When going higher we advise to think about upgrading to a higher flowing set of injectors.

Full load enrichment should be included, since depending on the target lambda it enriches the mixture more than 10%.

To make things easier we include the following Excel sheet: File:Maximum Injection Time Calculator.zip

You can easily check your fuel tables with this calculator, just load the engine speed axis, the full load enrichment factor and your desired duty circle into the grey areas and compare the values.

Maximum Injection Time Calculator.png

Note: The table shows the theorethical maximum. As long as your injection time stays below this, you are fine.

Aftermarket Injector Scaling

Changing the fuel injectors will be needed at some point when you change your engines aspiration to forced induction, therefore some constants and tables need to be adjusted.

To find a suitable baseline for your new injestion tables you will have to calculate the volume flow difference between the stock and your new injectors.

By dividing the flow rate of the old injectors by the flow rate of the new ones at the same fuel pressure you end up with a scaling factor.

You can use the injection time multiplier of the MS43s application system that is able to adjust every single cylinder injection duration with a factor t_ti_as_[cyl].

Playing with these six constants is much easier than always changing all the injection tables.

Nevertheless, once you've found a suitable factor for your injectors, apply it to the fuel tables directly and return to factor 1.0, because the application system will NOT alter the injection time reported by the MS43s logging routine.

Additionally you must adjust the following injector specific values:

  • c_ti_min_iv - Minimum injection time
  • ip_ti_add_dly__vb - Injector dead time correction with battery voltage compensation

Go here for a list of suitable fuel injectors and their deadtimes.

Correcting Fuel Consumption Gauge

When changing injectors you will discover that the fuel consumption reading on your cluster and other monitoring apps is off.

The table ip_fco_map_cor__pq_main_col handles injection value reporting towards the cluster over CAN bus.

For example: You've lowered your fueling tables by MULTIPLIYING them with 0.46, you must DIVIDE the mentioned table by 0.46 to fix readings.

Fine tuning should be made in the secret menu of your cluster (+- 25%). This is excplained here under "Test 20" INFO: E46 Instrument Cluster Test

Upgraded Fuel Pumps

Under some circumstances like a forced induction conversion the OEM fuel pump can't deliver enough fuel to the engine and needs to be upgraded.

The MS43 has two time values (in seconds) for controlling the electronic fuel pump relay before starting and after stopping the engine:

  • c_t_efp_prev - Time the electronic fuel pump relay is enabled after ignition turned on
  • c_t_efp - Time delay to disable the electric fuel pump relay after ignition turned off

Slightly rising these values may eliminate starting issues.

Tip: Some aftermarket fuel pumps don't come with an integrated check valve end therefor let the fuel flow back into the tank once the engine is turned off.

If this is the case consider adding a check valve right after the pump to keep stock-like cranking behaviour.

Ignition

The ECU uses many different ignition maps depending on the engine state, engine temperature and quality of fuel.

Main tables that are used during normal engine operation:

  • ip_iga_tco_1_is_ivvt__n__maf - Target ignition angle during idle. Cold engine
  • ip_iga_tco_1_pl_ivvt__n__maf - Target ignition angle during part and full load. Cold engine
  • ip_iga_tco_2_is_ivvt__n__maf - Target ignition angle during idle. Warm engine
  • ip_iga_ron_91_pl_ivvt__n__maf - Target ignition angle for RON91 during part and full load. Warm engine
  • ip_iga_ron_98_pl_ivvt__n__maf - Target ignition angle for RON98 during part and full load. Warm engine

Axis Values

  • X axis: filtered engine load for ignition subsystem (maf_iga)
  • Y axis: engine speed (n)


Starting with a cold engine the ECU uses ip_iga_tco_1_is_ivvt__n__maf tables for idle, ip_iga_tco_1_pl_ivvt__n__maf for part and full load to find the target ignition angle.

While warming up the ignition subsystem uses the same blending factor as the injection subsystem. (see Injection)

Reaching engine operating temperature, the target ignition setpoint changes to warm ignition maps ip_iga_tco_2_is_ivvt__n__maf for idle and ip_iga_ron_9* for part and full load.

The target ignition angle in part and full load will then be blended between the RON91 and RON98 tables based on an internal RON factor learned from detected knock.

Under all circumstances keep the RON91 table a lot safer than RON98 to give the ECU some room for regulation.

It's common that even an unmodified engine running on RON99 fuel will pull a few degrees of timing here. This shows the RON98 map on a standard car is quite good.


Catalyst heating "_CH_" in maps retards ignition during warm up.

Antijerk "_AJ_" retards ignition during rapid throttle opening to smooth out torque (can be removed by increasing c_tco_min_aj to 142.5C.

Reported to sometimes cause transitional knock on boosted engines, if so consider adjusting other tables designed for this (tra_knk).

Ignition Coil Variants

In September 2002 BMW updated the old 300g ignition coils used from M50-M54 to the newer pencil style coils. This change required an automatic learning process for all new hardware variants, starting with Index 04.

The detection was implemented in an easy way. If the EGT Sensor Post-Cat Bank 1 input (Pin X60002.12) is connected to terminal 87 (main relay output) then the MS43 switches to pencil coil mode.

That means, if you retrofit the newer pencil coils or go with the M56 valve cover, you also have to retrofit the jumper wire in X60002 and an Index 04 or newer MS43.

To make this easier you can simply copy all the _pc_ values to their _300_ pendands.

Pencil Coil Data

VANOS

VANOS Min/Max Values

VANOS stands for "VAriable NOckenwellenSteuerung" and translates to adustable camshaft control.

This section contains information on how the dual VANOS system is actuated by the ECU and how to modify it. Both, intake and exhaust camshaft can be set independently in relation to the crankshaft.

The VANOS system uses engine oil pressure and solenoids to control a set of gears at the end of each camshaft. The goal of the VANOS is to optimize emissions, produce better torque at low engine speeds and have more top end power.

Even though the camshaft adjustment is limited to 30°CRK it can be used to compensate for different intakes, different camshafts and even forced induction application may be benefitting from perfectly tweaked VANOS setpoints.

The main maps used for VANOS control during IS, PL & FL engine states are:

Cold Engine

  • ip_cam_sp_tco_1_in_is__n__maf_ivvt - Intake camshaft setpoint during idle. Cold engine
  • ip_cam_sp_tco_1_ex_is__n__maf_ivvt - Exhaust camshaft setpoint during idle. Cold engine
  • ip_cam_sp_tco_1_in_pl__n__maf_ivvt - Intake camshaft setpoint during part load. Cold engine
  • ip_cam_sp_tco_1_ex_pl__n__maf_ivvt - Exhaust camshaft setpoint during part load. Cold engine
  • ip_cam_sp_tco_1_in_fl__n - Intake camshaft setpoint during full load. Cold engine
  • ip_cam_sp_tco_1_ex_fl__n - Exhaust camshaft setpoint during full load. Cold engine

Warm Engine

  • ip_cam_sp_tco_2_in_is__n__maf_ivvt - Intake camshaft setpoint during idle. Warm engine
  • ip_cam_sp_tco_2_ex_is__n__maf_ivvt - Exhaust camshaft setpoint during idle. Warm engine
  • ip_cam_sp_tco_2_in_pl__n__maf_ivvt - Intake camshaft setpoint during part load. Warm engine
  • ip_cam_sp_tco_2_ex_pl__n__maf_ivvt - Exhaust camshaft setpoint during part load. Warm engine
  • ip_cam_sp_tco_2_in_fl__n - Intake camshaft setpoint during full load. Warm engine
  • ip_cam_sp_tco_2_ex_fl__n - Exhaust camshaft setpoint during full load. Warm engine

Axis Values

  • X axis: filtered engine load for VANOS subsystem (maf_ivvt)
  • Y axis: engine speed (n)


A blending between cold and warm maps is accomplished by the following transitioning maps. A factor of 1.0 means full useage of cold maps and a factor of 0.0 means full useage of warm maps.

  • ip_fac_cam_sp_in_is__tco__tco_st - Engine coolant temperature blending factor for transition from cam_sp_tco1 to cam_sp_tco2 during idle. Intake camshaft
  • ip_fac_cam_sp_ex_is__tco__tco_st - Engine coolant temperature blending factor for transition from cam_sp_tco1 to cam_sp_tco2 during idle. Exhaust camshaft
  • ip_fac_cam_sp_in_pl__tco__tco_st - Engine coolant temperature blending factor for transition from cam_sp_tco1 to cam_sp_tco2 during part load. Intake camshaft
  • ip_fac_cam_sp_ex_pl__tco__tco_st - Engine coolant temperature blending factor for transition from cam_sp_tco1 to cam_sp_tco2 during part load. Exhaust camshaft

Axis description are:

  • X axis: engine coolant temperature at engine start (tco_st)
  • Y axis: current engine coolant temperature (tco)

Drive-By-Wire

This section contains information on how the Drive-By-Wire system is controlled by the DME and how it can be modified.

The accellerator pedal unit is different between manual and automatic / sequential transmission.

For the automatic and sequential gearboxes the unit contains a spring mechanism that feels like a switch when the pedal is pressed to imitate a kick-down switch.

Manual pedal value is ranging from 0-85°PVS, whilst the automatic and sequential pedal value reaches from 0-89°PVS with 103°PVS at kick-down.

Drivers Wish Tables

Tunerpro comparison of the ip_tps_sp_pvs and ip_isapwm_pvs table.

The Drive-By-Wire system is setup so that the ecu uses both the throttle valve and the idle control valve to control how much air is going into the engine.

  • ip_tps_sp_pvs is used by the ecu to decide how much it should open the throttle for a given pvs input.
  • ip_isapwm_pvs is used by the ecu to decide how much idle control valve duty cycle should be used for a given pvs input.

If we look at these tables side by side we can see that a stock ecu is setup to primarily use the idle control valve to control airflow when the pvs input is in the range between 0° and 15° and when the pvs input is higher the ecu will switch over to the throttle valve.

Drivers Wish Input Correction

To provide a smooth driving experience during part load the ecu actively controls how fast the drivers requested pvs input can increase.

ip_pvs_cor_max_rpl_[gear] is used by the ecu to decide if the drivers requested pvs input increase should be limited. The values in the table is the lower limit and the X-axis is the upper limit. If the drivers requested pvs input is between these values then the ecu will start limiting the pvs input increase.

If the following conditions are met then the ecu will not try to start limiting the pvs input increase:

  • The driver requested pvs input is decreasing.
  • The driver requested pvs input change gradient is larger than c_pvs_av_grd_max_rpl(59,99° pvs).
  • The clutch is pressed.
  • The driver requested pvs input is higher than c_pvs_cor_max_rpl(42,5° PVS)

When the ecu starts limiting the pvs input increase the pvs input will be increased by the value taken from ip_pvs_cor_rpl_lgrd_[gear] until the following conditions are met:

  • The limitation duration specified in ip_t_pvs_cor_rpl_[gear] has expired.
  • The driver requested pvs input change gradient is larger than c_pvs_av_grd_max_rpl(59,99° pvs).
  • The limited pvs input is larger than the driver requested pvs input.

If any of those conditions are met then the ecu will use the driver requested pvs input and will not start limiting the pvs input again until the time specified in c_t_dly_pvs_cor_rpl(0,2s) has elapsed.

To disable the drivers wish input correction function set either c_pvs_cor_max_rpl or c_pvs_av_grd_max_rpl to zero.

Throttle Request Correction

To provide a smooth driving experience during low throttle openings the ecu will control how fast the throttle setpoint can change depending on the current engine load.

ip_tps_req_ltc_min_[gear] is used by the ecu to decide if the throttle setpoint change should be limited. If the requested throttle setpoint is lower than the value in the table the throttle setpoint change will be limited.

If the following conditions are met then the ecu will not try to start limiting the throttle setpoint change:

  • The clutch is pressed.
  • The requested throttle setpoint is lower than c_tps_req_ltc_min(0.248° TPS)

When the ecu starts limiting the pvs input the throttle setpoint will be increased by the value taken from ip_tps_req_ltc_lgrd_[gear] until the following conditions are met:

  • The limitation duration specified in ip_t_tps_req_ltc_max_[gear] has expired.
  • The requested throttle setpoint is larger or equal to ip_tps_req_ltc_min_[gear].
  • The clutch is pressed.

If any of those conditions are met then the ecu will use the requested throttle setpoint and will not start limiting the throttle setpoint again until the time specified in c_t_dly_tps_req_ltc(0,85s) has elapsed.

The id_tps_req_ltc_gear_[gearbox] tables controls if the throttle request correction should be active depending on the current gear. To disable the throttle request correction function set the id_tps_req_ltc_gear_[gearbox] tables to zero.

Torque

During engine operation the ecu will try to estimate the current torque being produced by using several static torque models.

Torque Models:

  • ip_tqi_pvs__n__pvs - Indexed engine torque (PVS)
  • ip_tqi_maf__n__maf - Indexed engine torque (MAF)
  • ip_tqfr__n__maf - Frictional torque losses (MAF)

Torque Management

Based on the static models the ecu will ensure that the engine torque does not exceed the maximum allowed torque specified in ip_tq_max__n__pvs_cor_rpl.

As the torque models are setup for a stock engine they can produce unexpected reductions in power if the engine is modified, to disable the function set the torque values in ip_tq_max__n__pvs_cor_rpl to 65535 Nm.

The ECU also have a function to reduce torque in first gear (In production vehicles this was only used by the E53 X5).

The function will be activated if c_conf_tq_lim_gear is set to one and when active the ecu will ensure that the engine torque does not exceed c_tq_max_gear while in first gear.

Idlespeed

This section contains information on how the idle is controlled by the DME and how it can be modified.

MS43 has a few different tables that affect the nominal idle speed

  • ip_n_sp_is Nominal idle speed without additional load on the engine.
  • ip_dri_n_sp_is Nominal idle speed with drive engaged for AT gearbox.
  • ip_acin_n_sp_is Nominal idle speed with air conditioner switched on.
  • ip_dri_acin_n_sp_is Nominal idle speed with air conditioner switched on and drive engaged for AT gearbox.

The idle setpoint is modified from the nominal speed above by

  • ip_n_sp_add_cha_cdn_bat Nominal idle speed offset for battery charge state.
  • ip_n_sp_add_heat Nominal idle speed offset with catalyst heating function active.

In addition, the idle speed change rate can be changed with c_n_sp_lgrd_is.


Full Load Detection

Full load procedure shown in Tuner Pro
Full load injection converted to lambda and AFR
Full load state maximum timers

On MS43 we have an accelerator pedal angle (°PVS) dependent full load detection.

In full load operation (ES = FL) the engine will leave stoichiometric combustion and enriches the injection for preventing knock and maximum power production.

The whole lambda learning adaption from the O2 sensors is stopped while the engine operates in this state. Already learned long term fuel trims (LTFTs) will still be applied.

The engine will never enter full load state unless the engine speed is greater than c_n_min_fl which is the lower limit for FL detection. Setting this to 8160 rpm will disable full load state completely.

Additionally, either one of the two following conditions has to be fulfilled to activate full load detection.

  • c_vs_min_fl - Minimum vehicle speed for full load detection after engine start if c_tco_min_fl has not been exceeded.
  • c_tco_min_fl - Minimum coolant temperature for full load detection after engine start if c_vs_min_fl has not been exceeded.

Finally, once the accelerator pedal angles defined in the following tables are exceeded, the respective function will enter the full load state.

  • id_pvs_fl__n - Accelerator pedal position threshold for full load detection - Injection
  • id_pvs_fl_ivvt__n - Accelerator pedal position threshold for full load detection - VANOS
  • id_pvs_fl_vim__n_vim - Accelerator pedal position threshold for full load detection - DISA

In the full load state, the MS43 changes VANOS and DISA to seperate tables, but for injection it adds a specified amount of fuel.

This leaves us the following tables that actually alter injection, VANOS and DISA behaviour.

  • ip_ti_fl__n - Full load enrichment factor for nominal injection time
  • ip_cam_sp_tco_1_in_fl__n - Intake camshaft setpoint during full load with cold engine
  • ip_cam_sp_tco_1_ex_fl__n - Exhaust camshaft setpoint during full load with cold engine
  • ip_cam_sp_tco_2_in_fl__n - Intake camshaft setpoint during full load with warm engine
  • ip_cam_sp_tco_2_ex_fl__n - Exhaust camshaft setpoint during full load with warm engine
  • id_vim_fl__n_vim - Variable intake manifold (DISA) activation setpoints at full load

There is a gearbox dependant timer that configures the maximum spendable time in seconds at full load condition per gear.

If this timer has counted down to zero, the engine leaves full load operating state on its own. You will have to lift the pedal below the configured minimum position and re-enter full load.

  • id_t_max_fl__gear - Maximum time in the full load state. Manual transmission.
  • id_t_max_fl_at__gear - Maximum time in the full load state. Automatic transmission.

You can zero these tables to bypass the timer.

To extract every last bit of power out of your engine, there is c_pvs_fl_accin that handles the deactivation of the AC compressor when exceding the configured value.

Tip: To make tuning at full load (and wide open throttle) operation easier, you can change the conversion factor of the ip_ti_fl__n table to display lamba or AFR depending on your preference.

This is only applicable if your part-load table is tuned to stoichiometric combustion (lambda 1.0).

Title Conversion Low Range High Range
ip_ti_fl__n (Lambda) 1-(0.0039058823*X-0.5) 0.500 1.500
ip_ti_fl__n (AFR Gas) 14.7-(14.7*(0.0039058823*X-0.5)) 7.409 22.050

Warning: Keep in mind, that all full load injection edits rely on a proper part load fueling table.

DTC Suppression

DTCs can be suppressed in the MS43 by zeroing out the c_abc_... specific codes. The full list of DTCs can be found here:

DTC variables OBD
Code Description
c_dtc_ad_mec_ref_ivvt_ex P0014 B Camshaft Position - Timing Over-Advanced or System Performance (Bank 1)
c_dtc_ad_mec_ref_ivvt_in P0011 A Camshaft Position - Timing Over-Advanced or System Performance (Bank 1)
c_dtc_amp P0107 Manifold Absolute Pressure/Barometric Pressure Circuit Low Input
P0108 Manifold Absolute Pressure/Barometric Pressure Circuit High Input
c_dtc_bls_plaus P0571 Cruise Control/Brake Switch A Circuit Malfunction
c_dtc_cam P0340 Camshaft Position Sensor Circuit Malfunction
P0344 Camshaft Position Sensor Circuit Intermittent
c_dtc_cam_ex P0365 Camshaft Position Sensor 'B' Circuit Bank 1
P0369 Camshaft Position Sensor 'B' Circuit Intermittent Bank 1
c_dtc_cam_ex_ivvt P1529 "B" Camshaft Position Actuator Control Circuit Signal Low Bank 1
P1530 "B" Camshaft Position Actuator Control Circuit Signal High Bank 1
P1531 "B" Camshaft Position Actuator Control Open Circuit Bank 1
c_dtc_cam_in_ivvt P1523 "A" Camshaft Position Actuator Signal Low Bank 1
P1524 "A" Camshaft Position Actuator Signal High Bank 1
P1525 "A" Camshaft Position Actuator Control Open Circuit Bank 1
c_dtc_can_boff P1610 CANbus offline
c_dtc_cat_diag_1 P0420 Catalyst System Efficiency Below Threshold (Bank 1)
c_dtc_cat_diag_2 P0430 Catalyst System Efficiency Below Threshold (Bank 2)
c_dtc_cat_eff_1 P0421 Warm Up Catalyst Efficiency Below Threshold (Bank 1)
c_dtc_cat_eff_2 P0431 Warm Up Catalyst Efficiency Below Threshold (Bank 2)
c_dtc_cc
c_dtc_cps P0443 Evaporative Emission Control System Purge Control Valve Circuit Malfunction
P0444 Evaporative Emission Control System Purge Control Valve Circuit Open
P0445 Evaporative Emission Control System Purge Control Valve Circuit Shorted
c_dtc_crk P0335 Crankshaft Position Sensor A Circuit Malfunction
P0339 Crankshaft Position Sensor A Circuit Intermittent
c_dtc_cs P0xxx Clutch Switch
c_dtc_ct
c_dtc_ctoc
c_dtc_diagcps P0441 Evaporative Emission Control System Incorrect Purge Flow
c_dtc_dmtl P1444 Diagnostic Module Tank Leakage (DM-TL) Pump Control Open Circuit
P1445 Diagnostic Module Tank Leakage (DM-TL) Pump Control Circuit Signal Low
P1446 Diagnostic Module Tank Leakage (DM-TL) Pump Control Circuit Signal High
c_dtc_dmtl_leak P0455 Evaporative Emission Control System Leak Detected (gross leak)
P0456 EVAP Leak Monitor Small Leak Detected
c_dtc_dmtlm P1447 Diagnostic Module Tank Leakage (DM-TL) Pump Too High During Switching
P1448 Diagnostic Module Tank Leakage (DM-TL) Pump Too Low During Switching
P1449 Diagnostic Module Tank Leakage (DM-TL) Pump Too High
c_dtc_ecf P0480 Cooling Fan 1 Control Circuit Malfunction
c_dtc_ect P1619 MAP Cooling Control Circuit Signal Low
P1620 MAP Cooling Control Circuit Signal High
c_dtc_ect_mec P0128 Range/Performance Problem In Thermostat
c_dtc_ecu P0604 Internal Control Module Random Access Memory (RAM) Error
c_dtc_ef P0477 Exhaust Pressure Control Valve Low
P0478 Exhaust Pressure Control Valve High
c_dtc_er_ad P0xxx Misfire adaptation
c_dtc_igcfb_0 P0351 Ignition Coil 1 Primary/Secondary Circuit Malfunction
P1301 Misfiring Cylinder 1
c_dtc_igcfb_1 P0355 Ignition Coil 5 Primary/Secondary Circuit Malfunction
P1305 Misfiring Cylinder 5
c_dtc_igcfb_2 P0353 Ignition Coil 3 Primary/Secondary Circuit Malfunction
P1303 Misfiring Cylinder 3
c_dtc_igcfb_3 P0356 Ignition Coil 6 Primary/Secondary Circuit Malfunction
P1306 Misfiring Cylinder 6
c_dtc_igcfb_4 P0352 Ignition Coil 2 Primary/Secondary Circuit Malfunction
P1302 Misfiring Cylinder 2
c_dtc_igcfb_5 P0354 Ignition Coil 4 Primary/Secondary Circuit Malfunction
P1304 Misfiring Cylinder 4
c_dtc_imob P1660 EWS system
P1666 EWS system
c_dtc_is P0505 Idle Control System Malfunction
c_dtc_isa_1 P1506 Idle Speed Control Valve Open Solenoid Control Circuit Signal High
P1507 Idle Speed Control Valve Open Solenoid Control Circuit Signal Low
P1508 Idle Speed Control Valve Opening Solenoid Control Open Circuit
c_dtc_isa_2 P1502 Idle Speed Control Valve Closing Solenoid Control Circuit Signal High or Low
P1503 Idle Speed Control Valve Closing Solenoid Control Circuit Signal Low
P1504 Idle Speed Control Valve Closing Solenoid Control Open Circuit
c_dtc_iv_0 P0201 Injector Circuit Malfunction - Cylinder 1
P0261 Cylinder 1 Injector Circuit Low
P0262 Cylinder 1 Injector Circuit High
c_dtc_iv_1 P0205 Injector Circuit Malfunction - Cylinder 5
P0273 Cylinder 5 Injector Circuit Low
P0274 Cylinder 5 Injector Circuit High
c_dtc_iv_2 P0203 Injector Circuit Malfunction - Cylinder 3
P0267 Cylinder 3 Injector Circuit Low
P0268 Cylinder 3 Injector Circuit High
c_dtc_iv_3 P0206 Injector Circuit Malfunction - Cylinder 6
P0276 Cylinder 6 Injector Circuit Low
P0277 Cylinder 6 Injector Circuit High
c_dtc_iv_4 P0202 Injector Circuit Malfunction - Cylinder 2
P0264 Cylinder 2 Injector Circuit Low
P0265 Cylinder 2 Injector Circuit High
c_dtc_iv_5 P0204 Injector Circuit Malfunction - Cylinder 4
P0270 Cylinder 4 Injector Circuit Low
P0271 Cylinder 4 Injector Circuit High
c_dtc_knk_1 P0327 Knock Sensor 1 Circuit Low Input (Bank 1 or Single Sensor)
c_dtc_knk_2 P0332 Knock Sensor 2 Circuit Low Input (Bank 2)
c_dtc_lam_dly_down_1 P0096 Intake Air Temperature Sensor 2 Circuit Range/Performance
P0097 Intake Air Temperature Sensor 2 Circuit Low
c_dtc_lam_dly_down_2 P0098 Intake Air Temperature Sensor 2 Circuit High
P0099 Intake Air Temperature Sensor 2 Circuit Intermittent/Erratic
c_dtc_lam_dly_up_1 P1090 Pre-Catalyst Fuel Trim Too Lean Bank 1
P1092 Pre-Catalyst Fuel Trim Too Lean Bank 2
c_dtc_lam_dly_up_2 P1091 Pre-Catalyst Fuel Trim Too Rich Bank 1
P1093 Pre-Catalyst Fuel Trim Too Rich Bank 2
c_dtc_lam_lim_1 P1083 Fuel Control Mixture Lean (Bank 1 Sensor 1)
P1084 Fuel Control Mixture Rich (Bank 1 Sensor 1)
P1314 Fuel System Error
c_dtc_lam_lim_2 P1085 Fuel Control Mixture Lean (Bank 2 Sensor 1)
P1086 Fuel Control Mixture Rich (Bank 2 Sensor 1)
P1314 Fuel System Error
c_dtc_lam_stop_1 P0171 System too Lean (Bank 1)
P0172 System too Rich (Bank 1)
P1314 Fuel System Error
c_dtc_lam_stop_2 P0174 System too Lean (Bank 2)
P0175 System too Rich (Bank 2)
P1314 Fuel System Error
c_dtc_leak_big P0441 Evaporative Emission Control System Incorrect Purge Flow
c_dtc_leak_small P0442 Evaporative Emission Control System Leak Detected (small leak)
c_dtc_ls_frq_1 P0133 O2 Sensor Circuit Slow Response (Bank 1 Sensor 1)
P1087 O2 Sensor Circuit Slow Response in Lean Control Range (Bank 1 Sensor 1)
P1088 O2 Sensor Circuit Slow Response in Rich Control Range (Bank 1 Sensor 1)
c_dtc_ls_frq_2 P0153 O2 Sensor Circuit Slow Response (Bank 2 Sensor 1)
P1089 O2 Sensor Circuit Slow Response in Lean Control Range (Bank 1 Sensor 2)
P1094 O2 Sensor Circuit Slow Response in Rich Control Range (Bank 2 Sensor 1)
c_dtc_lsh_down_1 P0036 HO2S Heater Control Circuit Bank 1 Sensor 2
P0037 HO2S Heater Circuit Low Voltage Bank 1 Sensor 2
P0038 HO2S Heater Circuit High Voltage Bank 1 Sensor 2
c_dtc_lsh_down_2 P0056 HO2S Heater Circuit Bank 2 Sensor 2
P0057 HO2S Heater Circuit Low Voltage Bank 2 Sensor 2
P0058 HO2S Heater Circuit High Voltage Bank 2 Sensor 2
c_dtc_lsh_obd_down_1 P0141 O2 Sensor Heater Circuit Malfunction (Bank 1 Sensor 2)
c_dtc_lsh_obd_down_2 P0161 O2 Sensor Heater Circuit Malfunction (Bank 2 Sensor 2)
c_dtc_lsh_obd_up_1 P0135 O2 Sensor Heater Circuit Malfunction (Bank 1 Sensor 1)
c_dtc_lsh_obd_up_2 P0155 O2 Sensor Heater Circuit Malfunction (Bank 2 Sensor 1)
c_dtc_lsh_up_1 P0030 HO2S Heater Control Circuit Bank 1 Sensor 1
P0031 HO2S Heater Circuit Low Voltage Bank 1 Sensor 1
P0032 HO2S Heater Circuit High Voltage Bank 1 Sensor 1
c_dtc_lsh_up_2 P0050 HO2S Heater Circuit Bank 2 Sensor 1
P0051 HO2S Heater Circuit Low Voltage Bank 2 Sensor 1
P0052 HO2S Heater Circuit High Voltage Bank 2 Sensor 1
c_dtc_maf P0102 Mass or Volume Air Flow Circuit Low Input
P0103 Mass or Volume Air Flow Circuit High Input
c_dtc_maf_mafm P0101 Mass or Volume Air Flow Circuit Range/Performance Problem
c_dtc_mec_isa P1500 Idle Speed Control Valve Stuck Open
P1501 Idle Speed Control Valve Stuck Closed
c_dtc_mec_ivvt_ex P0015 B Camshaft Position - Timing Over-Retarded (Bank 1)
c_dtc_mec_ivvt_in P0012 A Camshaft Position - Timing Over-Retarded (Bank 1)
c_dtc_mec_sav P0411 Secondary Air Injection System Incorrect Flow Detected
c_dtc_min_saf P0491 Secondary Air Injection System Insufficient Flow Bank 1
c_dtc_mis_0 P0301 Cylinder 1 Misfire Detected
P0313 Misfire Detected With Low Fuel Level
P1342 Misfire During Start Cylinder 1
P1343 Misfire Cylinder 1 With Fuel Cut-off
c_dtc_mis_1 P0305 Cylinder 5 Misfire Detected
P0313 Misfire Detected With Low Fuel Level
P1350 Misfire During Start Cylinder 5
P1351 Misfire Cylinder 5 With Fuel Cut-off
c_dtc_mis_2 P0303 Cylinder 3 Misfire Detected
P0313 Misfire Detected With Low Fuel Level
P1346 Misfire During Start Cylinder 3
P1347 Misfire Cylinder 3 With Fuel Cut-off
c_dtc_mis_3 P0306 Cylinder 6 Misfire Detected
P0313 Misfire Detected With Low Fuel Level
P1352 Misfire During Start Cylinder 6
P1353 Misfire Cylinder 6 With Fuel Cut-off
c_dtc_mis_4 P0302 Cylinder 2 Misfire Detected
P0313 Misfire Detected With Low Fuel Level
P1344 Misfire During Start Cylinder 2
P1345 Misfire Cylinder 2 With Fuel Cut-off
c_dtc_mis_5 P0304 Cylinder 4 Misfire Detected
P0313 Misfire Detected With Low Fuel Level
P1348 Misfire During Start Cylinder 4
P1349 Misfire Cylinder 4 With Fuel Cut-off
c_dtc_mis_f P0313 Misfire Detected With Low Fuel Level
c_dtc_mis_mul P0300 Random/Multiple Cylinder Misfire Detected
c_dtc_mis_t_s P0336 Crankshaft Position Sensor A Circuit Range/Performance
c_dtc_mon_plaus P1602 Control Module Self Test, Control Module Defective
c_dtc_mon_tqi_av P1603 Control Module Self Test, Torque Monitoring
c_dtc_mon_tqi_n_max P1604 Control Module Self Test, Speed Monitoring
c_dtc_msw_2 P1565 Multifunction Steering Wheel
c_dtc_msw_3 P1565 Multifunction Steering Wheel
c_dtc_msw_tog P1567 Multifunction Steering Wheel, toggle bit
c_dtc_mtc_ctl_1 P1638 Throttle Valve Position Control; Throttle Stuck Temporarily
c_dtc_mtc_ctl_2 P1639 Throttle Valve Position Control; Throttle Stuck Permanently
c_dtc_mtc_ctl_3 P1637 Throttle Valve Position Control; Control Deviation
c_dtc_mtc_dr P1636 Throttle Valve Control Circuit
c_dtc_otcc P1477 Leakage Diagnostic Pump Reed Switch Did Not Open
c_dtc_pvs_1 P1122 Pedal Position 1 Low Input
P1123 Pedal Position 1 High Input
c_dtc_pvs_2 P1222 Pedal Position Sensor 2 Low Input
P1223 Pedal Position Sensor 2 High Input
c_dtc_pvs_bls P0xxx Simultaneous activation of accelerator pedal and brake pedal
c_dtc_pvs_bls_bts_plaus P0xxx Brakelight switch and brake test switch not plausible
c_dtc_pvs_pvs P1120 Pedal Position Sensor Circuit
c_dtc_pvs_ratio P1121 Pedal Position 1 Range/Performance Problem
c_dtc_r_igcfb P0350 Ignition Coil Primary/Secondary Circuit Malfunction
c_dtc_rly_accout P0532 A/C Refrigerant Pressure Sensor Circuit Low Input
P0533 A/C Refrigerant Pressure Sensor Circuit High Input
c_dtc_rly_efp P0231 Fuel Pump Secondary Circuit Low
P0232 Fuel Pump Secondary Circuit High
c_dtc_rly_main P1695 Main relay
c_dtc_rly_main_dly P0xxx Delay in main relay
c_dtc_sa_1 P0491 Secondary Air Injection System Insufficient Flow Bank 1
c_dtc_sa_2 P0492 Secondary Air Injection System Insufficient Flow Bank 2
c_dtc_sa_conf P0411 Secondary Air Injection System Incorrect Flow Detected
c_dtc_safm P1419 Secondary Air System Air Mass Flow Sensor Disconnected or Stuck Signal
c_dtc_sap P1413 Secondary Air Injection Pump Relay Control Circuit Signal Low
P1414 Secondary Air Injection System Monitor Circuit High
c_dtc_sap_safm P0411 Secondary Air Injection System Incorrect Flow Detected
c_dtc_sav P0413 Secondary Air Injection System Switching Valve A Circuit Open
P0414 Secondary Air Injection System Switching Valve A Circuit Shorted
c_dtc_sav_1_safm P0411 Secondary Air Injection System Incorrect Flow Detected
c_dtc_sav_safm P0411 Secondary Air Injection System Incorrect Flow Detected
c_dtc_t_igcfb_2 P0350 Ignition Coil Primary/Secondary Circuit Malfunction
c_dtc_t_lam_act P0125 Insufficient Coolant Temperature for Closed Loop Fuel Control
c_dtc_tco P0117 Engine Coolant Temperature Circuit Low Input
P0118 Engine Coolant Temperature Circuit High Input
c_dtc_tco_ex P1111 Engine Coolant Temperature Radiator Outlet Sensor Low Input
P1112 Engine Coolant Temperature Radiator Outlet Sensor High Input
c_dtc_tco_max P0116 Engine Coolant Temperature Circuit Range/Performance Problem
c_dtc_teg_down_1 P0xxx Exhaust gas temperature post-cat, bank1
c_dtc_teg_down_2 P0431 Exhaust gas temperature post-cat, bank2
c_dtc_teg_up_1 P0431 Exhaust gas temperature pre-cat, bank1
c_dtc_teg_up_2 P0431 Exhaust gas temperature pre-cat, bank2
c_dtc_tia P0112 Intake Air Temperature Circuit Low Input
P0113 Intake Air Temperature Circuit High Input
c_dtc_toil P0197 Engine Oil Temperature Sensor Low
P0198 Engine Oil Temperature Sensor High
c_dtc_tout_amt_1 P1611 Serial Communicating Link Transmission Control Module
c_dtc_tout_asr_1 P1613 Time-out ASR1
c_dtc_tout_asr_3 P1613 Time-out ASR3
c_dtc_tout_cng_ecu_1 P0xxx Time-out CNG ECU
c_dtc_tout_etcu_1 P0600 Serial Communication Link Malfunction
c_dtc_tout_icl_2 P1612 Time-out instrument cluster2
c_dtc_tout_icl_3 P1612 Time-out instrument cluster3
c_dtc_tout_imob P1661 Time-out EWS system
P1662 Time-out EWS system
c_dtc_tout_pste_1 P0xxx Time-out PowerSteering
c_dtc_tps_1 P0122 Throttle/Pedal Position Sensor/Switch A Circuit Low Input
P0123 Throttle/Pedal Position Sensor/Switch A Circuit High Input
c_dtc_tps_2 P0222 Throttle/Pedal Position Sensor/Switch B Circuit Low Input
P0223 Throttle/Pedal Position Sensor/Switch B Circuit High Input
c_dtc_tps_ad P1632 Throttle Valve Adaptation; Adaptation Condition Not Met
P1633 Throttle Valve Adaptation; Limp Home Position
P1634 Throttle Valve Adaptation; Spring Test Failed
P1635 Throttle Valve Adaptation; Lower Mechanical Stop Not Adapted
c_dtc_tps_maf_1 P0121 Throttle/Pedal Position Sensor/Switch A Circuit Range/Performance Problem
c_dtc_tps_maf_2 P0221 Throttle/Pedal Position Sensor/Switch B Circuit Range/Performance Problem
c_dtc_tps_st_chk_1 P1675 TPS stuck, sensor 1 check condition
c_dtc_tps_st_chk_2 P1694 TPS stuck, sensor 2 check condition
c_dtc_tqi_amt_1 P1653 Indicated torque not matching AMT gearbox request
P1654 Indicated torque not matching AMT gearbox request
P1670 Indicated torque not matching AMT gearbox request
c_dtc_tqi_lim P1605 Limiting criteria for indicated torque
c_dtc_tqi_n_max_nvmy_mon P1604 Control Module Self Test, Speed Monitoring
c_dtc_var_amp P1171 Ambient Pressure Sensor Learned Value Error
P1172 Ambient Pressure Sensor Rationality Check
P1173 Ambient Pressure Sensor Rationality Check
c_dtc_vcc_poti_1 P1624 Pedal Position Sensor Potentiometer Supply Channel 1 Electrical
c_dtc_vcc_poti_2 P1625 Pedal Position Sensor Potentiometer Supply Channel 2 Electrical
c_dtc_vdmtl P1451 Diagnostic Module Tank Leakage (DM-TL) Switching Solenoid Control Circuit Signal Low
P1452 Diagnostic Module Tank Leakage (DM-TL) Switching Solenoid Control Circuit Signal High
c_dtc_vim P1512 DISA Control Circuit Signal Low
P1513 DISA Control Circuit Signal High
c_dtc_vls_down_1 P0137 O2 Sensor Circuit Low Voltage (Bank 1 Sensor 2)
P0138 O2 Sensor Circuit High Voltage (Bank 1 Sensor 2)
P0140 O2 Sensor Circuit No Activity Detected (Bank 1 Sensor 2)
c_dtc_vls_down_2 P0157 O2 Sensor Circuit Low Voltage (Bank 2 Sensor 2)
P0158 O2 Sensor Circuit High Voltage (Bank 2 Sensor 2)
P0160 O2 Sensor Circuit No Activity Detected (Bank 2 Sensor 2)
c_dtc_vls_down_act_chk_1 P1143 ???
P1144 ???
c_dtc_vls_down_act_chk_2 P1149 ???
P1150 ???
c_dtc_vls_down_afl_1 P0139 O2 Sensor Circuit Slow Response (Bank 1 Sensor 2)
c_dtc_vls_down_afl_2 P0159 O2 Sensor Circuit Slow Response (Bank 2 Sensor 2)
c_dtc_vls_down_post_puc_1 P1097 O2 Sensor Circuit Slow Response after Coast Down Fuel Cutoff (Bank 1 Sensor 1)
c_dtc_vls_down_post_puc_2 P1098 O2 Sensor Circuit Slow Response after Coast Down Fuel Cutoff (Bank 2 Sensor 2)
c_dtc_vls_down_t_1 P0139 O2 Sensor Circuit Slow Response (Bank 1 Sensor 2)
c_dtc_vls_down_t_2 P0159 O2 Sensor Circuit Slow Response (Bank 2 Sensor 2)
c_dtc_vls_jump_1 P1088 O2 Sensor Circuit Slow Response in Rich Control Range (Bank 1 Sensor 1)
P1119 ???
P1178 O2 Sensor Signal Circuit Slow Switching From Rich to Lean (Bank 1 Sensor 1)
c_dtc_vls_jump_2 P1095 O2 Sensor Circuit Slow Switching From Lean to Rich (Bank 1 Sensor 1)
P1096 O2 Sensor Circuit Slow Switching From Lean to Rich (Bank 2 Sensor 1)
P1114 ???
c_dtc_vls_stk_1 P0136 O2 Sensor Circuit Malfunction (Bank 1 Sensor 2)
c_dtc_vls_stk_2 P0156 O2 Sensor Circuit Malfunction (Bank 2 Sensor 2)
c_dtc_vls_up_1 P0131 O2 Sensor Circuit Low Voltage (Bank 1 Sensor 1)
P0132 O2 Sensor Circuit High Voltage (Bank 1 Sensor 1)
P0134 O2 Sensor Circuit No Activity Detected (Bank 1 Sensor 1)
c_dtc_vls_up_2 P0151 O2 Sensor Circuit Low Voltage (Bank 2 Sensor 1)
P0152 O2 Sensor Circuit High Voltage (Bank 2 Sensor 1)
P0154 O2 Sensor Circuit No Activity Detected (Bank 2 Sensor 1)
c_dtc_vs P0500 Vehicle Speed Sensor Malfunction

Extra Features

Engine Coolant Temperature Control

The M54 engine family is fitted with an electronic thermostat that the ECU can control to alter the engine coolant temperature.

By altering these values we can change how hot the engine will run in different conditions.

E-thermostat minimum conditions

  • c_tam_min_ect - Minimum ambient temperature threshold for e-thermostat activation
  • c_tia_min_ect - Minimum intake air temperature threshold for e-thermostat activation
  • c_toil_min_ect - Minimum oil temperature threshold for e-thermostat activation
  • c_tco_min_ect - Minimum coolant temperature threshold for full energization of the e-thermostat

E-thermostat maximum conditions

  • c_tia_max_ect - Maximum intake air temperature threshold. When exceeded target coolant temperature will be set to c_tco_sp_tia_max
  • c_tco_ex_max_ect - Maximum radiator outlet temperature threshold. When exceeded target coolant temperature will be set to c_tco_sp_tco_ex_max
  • c_toil_max_ect - Maximum oil temperature threshold. When exceeded target coolant temperature will be set to c_tco_sp_tia_max

E-thermostat target coolant temperature

  • c_tco_sp_toil_min - Target coolant temperature until the thresholds set by c_toil_min_ect, c_tam_min_ect, and c_tia_min_ect are exceeded.
  • c_tco_sp_tco_ex_max - Target coolant temperature if c_tco_ex_max_ect is exceeded
  • c_tco_sp_tia_max - Target coolant temperature if c_toil_max_ect or c_tia_max_ect are exceeded
  • c_tco_bol_ect - Target coolant temperature if an external low coolant temperature request has been received


E-thermostat target coolant temperatures maps

  • id_tco_sp_ect__n__maf_sub - Target coolant temperature when c_toil_min_ect, c_tam_min_ect, and c_tia_min_ect are exceeded - AC off
  • id_tco_sp_ect_acin__n__maf_sub - Target coolant temperature Target coolant temperature when c_toil_min_ect, c_tam_min_ect, and c_tia_min_ect are exceeded - AC on

E-thermostat regulations

  • ip_ectpwm_i__tco_dif - e-thermostat I component
  • ip_ectpwm_p__tco_dif - e-thermostat P component
  • id_ectpwm_add__n__tco_sp - Required e-thermostat duty cycle to achieve coolant temperature setpoint

PS : some of you may experience loss of power setting coolant temperature too low on M54B30. Seems that those engines likes higher temp for optimal run.

TunerPro depiction of Coolant Maps

Secondary Air Pump Delete

For forced OBD Readiness set C_CONF_SAP: "1"

Lambda Sensor Configuration

Constant "c_conf_cat" has five different options which represent the ecu´s ability to work with different lambda probe setups.

Set the following values that suit you needs:

  • 0: Single bank with one pre-cat lambda sensor or cat-preparation (SA199)
  • 1: Twin bank with two pre-cat lambda sensors or cat-preparation (SA199) and automatic learning of postcat sensors
  • 2: Single bank with one precat lambda sensor and one post-cat lambda sensor
  • 3: Twin bank with two pre-cat lambda sensors and one post-cat lambda sensors
  • 4: Twin bank with two pre-cat lambda sensors and two post-cat lambda sensors

The automatic learning process of post-cat lambda sensors starts after deleting "learned variants" with INPA.

After installing catless headers, it could be useful to eliminate post-cat sensors with setting "c_conf_cat" to "1".

MAF Sensor Scalar Adjustments

The standard MAF sensor map is a non-interpolated 16 x 16 lookup table, that can also be shown as 1 x 256 table. The 10 bit analog to digital conversion is reduced to 8 bits and 4 bits of each are used to lookup the MAF value.

There are differences in flow between the M54B22/M54B25 and M54B30 MAF sensors, as the diametre is different. Differences in cross sectional area would be expected to rescale the values, but the sensor is part of the tube and not easily modified.

Ford or Bosch slot type sensors are often used in high horse power blow through configurations for turbocharging which the BMW OEM sensors are not well suited for.

Engine load (mg/stroke) is proportional to airflow (kg/h) divided by RPM and is used to reference most of the important injection and ignition tables.

There is a factory airflow limit of 1024kg/h that can be doubled with a patch that has undergone extensivetesting, but the maximum engine load is still limited to 1389mg/stroke.

We are working hard to get around this limit as soon as possible and beta testing showed great results with a limit of 2778mg/stroke.

A M54B30 pulls about 600mg/stroke in cold conditions with a maximum airflow of about 630kg/h.

Changes to MAF tables should be kept smooth and progressive. Fuel trims plotted against MAF voltage can be used to fine tune the closed loop areas.

  • id_maf_tab__v_maf_1__v_maf_2 - MAF sensor definition. 1x256
  • id_maf_tab - MAF sensor definition. 16x16

Engine Speed Limiter

The MS43 has two gear dependant engine speed limiters, a softlimiter and a hardlimiter for each gearbox type (manual or automatic transmission).

The softlimiter works by cutting single injectors based on fuelcut pattern, whereas the hardlimiter immediately cuts off all cylinders.

  • id_n_max_at: softlimiter for AT gearbox
  • id_n_max_mt: softlimiter for MT gearbox
  • id_n_max_max_at: hardlimiter for AT gearbox
  • id_n_max_max_mt: hardlimiter for MT gearbox

In addition to that, you will want to raise id_n_max_vs_max_at or id_n_max_vs_max_mt slightly above the hardlimiter.

The Siemens MS43 receives the current vehicle speed (_vs) via CAN bus from the rear right speed sensor signal of the ABS control unit. This is new and differs from older chassis that got it from a sensor inside the differential.

In case the ECU doesn't get a valid vehicle speed signal, for example when you put an M54 engine in an older chassis, or strip out the ABS block for weight reasons, a third RPM limiter is applied:

  • c_n_max_vs_diag: RPM limiter in case of missing vehicle speed

For aggressive hard cut reduce the limiter hysteresis to:

  • c_n_max_hys 32 to 0
  • c_n_max_hys_max 320 to 32

Vehicle Speed Limiter

The Siemens MS43 has several vehicle speed limiter for different situations.

The maximum vehicle speed limiter is depending on the transmission type and only becomes active when the engine speed threshold is passed.

  • c_vs_max_at_1 - Applicable maximum speed automatic transmission
  • c_vs_max_mt_1 - Applicable maximum speed manual transmission
  • c_n_min_vs_max - Engine speed threshold for activating the speed limitation

Setting the c_vs_max_* limiter to 255km/h won't get rid of the Vmax limit, instead you have to set c_n_min_vs_max to 8160rpm.

Also there is a vehicle speed limiter if the maximum engine oil temperature is reached

  • c_vs_max_toil_max - Maximum speed when exceeding the max. oil temperature (c_toil_max)

Safety Features

The following information need to be handled with care as you´re able to turn off safety features! This can lead to severe damage to your engine.

Catalyst Overheating Prevention

  • ip_maf_min_cop__n__iga_dif - MAF threshold for catalyst overheating prevention function
  • ip_maf_min_cop_ron__n__iga_dif - MAF threshold for catalyst overheating prevention function with bad fuel quality

To disable catalyst overheating prevention (COP) set ip_maf_min_cop__n__iga_dif and ip_maf_min_cop_ron__n__iga_dif to 1389mg/stroke.

CAT Heating

  • id_t_ch_ti_cat_var__tco_st - Duration after start to switch on the injection time correction for catalyst heating function with cat-preparation (c_conf_cat 0 or 1)
  • ip_t_ch_ti__tco_st__km_ctr - Duration after start to switch on the injection time correction for catalyst heating function
  • id_t_iga_ch_cat_var__tco_st - Duration after start to switch on the ignition angle intervention for catalyst heating function with cat-preparation (c_conf_cat 0 or 1)
  • ip_t_iga_ch__tco_st__km_ctr - Duration after start to switch on the ignition angle intervention for catalyst heating function

Set them to "0" to disable catalyst heating injection and ignition altering.

Misfire Detection

  • c_n_min_er: minimum engine speed for detection of misfire!
  • c_n_max_er: maximum engine speed for detection of misfire!


Knock Detection

  • id_iga_dec_knk_1__n: ignition angle reduction based on knock stage1
  • id_iga_dec_knk_2__n: ignition angle reduction based on knock stage2


Injection Adaptation

  • c_n_ti_ad_fac_min: min engine speed to allow adapation of fuel trim, multiplicative
  • c_n_ti_ad_add_max: max engine speed to allow adapation of fuel trim, additive

Special Functions

Please look here for the old 430056 functions that were published by Daniel.F back in 2015: Siemens_MS43_Old_Stuff

Here are some handy mods when going forced induction Forced_Induction_Upgrades



Differential Vehicle Speed Sensor Mod For E30/E34

If you want to use an MS43 in an older E30 or E34 chassis and keep the speed signal sensor inside your rear differential housing, you have to change the number of impulses needed for one kilometer.

  • c_vs_fac = Number of vehicle speed sensor pulses per kilometer

A suitable number for the E30,E34 and e36 diffs is c_vs_fac = "1096" ~ "1100" (Smaller value = Higher speed reading / Higher Value = Lower speed reading)

Note: This only affects ECU data aquisition and not the dashboard view, but its helpfull for speed based parameters like LC config

Values can be fine tuned with a GPS based device to adjust for wheels/tyres dimensions differences

Unfortunately this low value will make the reading very unprecise. For a fix check out the MS43 Commuinity Patchlist.

Exhaust Pop Modifications

When tuning for exhaust pops there are two approaches that can be taken.

Toggleable exhaust pops

This approach disables the trailing throttle fuel cut by raising the minimum engine speed threshold for trailing throttle fuel cut to an engine speed that the engine can't reach, this will produce continuous exhaust pops as soon as the throttle is lifted.

As the MS43 has two separate tables for when the AC is on or off we can use that logic to for example only activate exhaust pops when the AC is on.

  • ip_n_min_puc__tco - Minimum engine speed for trailing throttle fuel cut activation with AC off
  • ip_n_min_accin_puc__tco - Minimum engine speed for trailing throttle fuel cut activation with AC on

To tune the intensity of the exhaust pops the following ignition tables can be used.

  • ip_iga_pu__n__tco - Target ignition angle in case of trailing throttle
  • ip_iga_puc__n__tco - Target ignition angle in case of trailing throttle fuel cut-off
  • ip_iga_accin_puc__n__tco - Target ignition angle in case of trailing throttle fuel cut-off with AC on
TunerPro depiction of toggled exhaust pops. This example should only be used as a starting point for further tuning.
Timered exhaust pops

This approach uses a built in timer function in the MS43 which delays the activation of the trailing throttle fuel cut by a set amount of time.

With this approach it's possible to achieve a set amount of pops before the trailing throttle fuel cut is activated.

  • c_t_puc_deacc_vs - Delay before activating trailing throttle fuel cut when car is stationary
  • ip_t_puc_deacc_1__n__maf_mmv - Delay before activating trailing throttle fuel cut. First gear
  • ip_t_puc_deacc_2__n__maf_mmv - Delay before activating trailing throttle fuel cut. Second gear
  • ip_t_puc_deacc_3__n__maf_mmv - Delay before activating trailing throttle fuel cut. Third gear
  • ip_t_puc_deacc_4__n__maf_mmv - Delay before activating trailing throttle fuel cut. Forth gear
  • ip_t_puc_deacc_5__n__maf_mmv - Delay before activating trailing throttle fuel cut. Fifth gear

To tune the intensity of the exhaust pops the same tables as the toggleable exhaust pops approach can be used.

TunerPro depiction of timered exhaust pops. This example should only be used as a starting point for further tuning.

Both approaches can also be combined in the following way to have short pops with AC off and continous pops when the AC is on.

TunerPro depiction of combined exhaust pops. This example should only be used as a starting point for further tuning.

Idle Control Valve Delete

TunerPro ICV Delete

Removing the idle control valve (ICV) / idle speed actuator (ISA) is possible due to the motorized throttle body the M54 engine uses.

Disconnect the idle control valve connector and either remove the idle control valve and plug the hole in the intake manifold (preferred) or use something to seal the idle control valve air tight.

If you want to machine a matching plug, use this template: ISA_Delete_Plug.pdf

The most important table that makes the ICV delete possible is the ip_pvs_isa_isapwm table. This table is used by the ecu to decide how much pvs input should be added to the drivers requested pvs input for a given idle control valve duty cycle.

In a stock engine this table is used to extend the idle control valve duty cycle so when the idle control valve duty cycle goes above 100% the throttle will start to open to deliver more air into the engine. So when we remove the idle control valve we re-scale this table to emulate the idle control valve airflow with different pvs inputs. These pvs inputs are in the end translated to a throttle opening by the ip_tps_sp_pvs table.

If we take an example from the ICV delete values above we will see in the ip_pvs_isa_isapwm table that at 17.5% idle control valve duty cycle the ecu will add 7.430° of pvs input to the drivers requested pvs input and if we take a look in the ip_tps_sp_pvs table we will see that around idle speed this pvs input will result in a throttle opening of around 2.999°. As we can see the values in ip_pvs_isa_isapwm and ip_tps_sp_pvs are tightly connected so if the ip_tps_sp_pvs table is modified then the ip_pvs_isa_isapwm table will also have to be modified accordingly to maintain a stable idle.

Copyable ICV Delete Tables M54B30 ONLY!.

The ip_pvs_isa_isapwm values above are created for a M54B30 engine so the values may need to be modified to get a stable idle with a M54B22 or M54B25 engine as these engines have a smaller throttle body, a good starting point would be to increase the ip_pvs_isa_isapwm table values with the opening area percentage difference between the M54B30 throttle body and the M54B22/M54B25 throttle body.

This modification modifies a monitoring table so the calibration addition checksum needs to be corrected or disabled after applying the changes. Check here for more information about checksums.


Lumpy Idle / Fake Race Camshafts

Basically whats happening when installing race camshafts is a huge increase in valve overlap. This means, intake and exhaust valves are open at the same time.

As M52TU and M54 have an adjustable camshaft system (VANOS) faking the rough idle sound of some serious camshafts pretty easy.

To get a similar sounding idle state you have to increase valve overlap time by adjusting the VANOS setpoints.

The idle speed VANOS setpoint are configurable in the following maps:

  • ip_cam_sp_tco_1_in_is__n__maf_iv - Intake camshaft setpoint during idle. Cold engine
  • ip_cam_sp_tco_1_ex_is__n__maf_iv - Exhaust camshaft setpoint during idle. Cold engine
  • ip_cam_sp_tco_2_in_is__n__maf_iv - Intake camshaft setpoint during idle. Warm engine
  • ip_cam_sp_tco_2_ex_is__n__maf_iv - Exhaust camshaft setpoint during idle. Warm engine


Additionally you have to raise the minimum engine speed threshold for the misfire detection c_n_min_er above your desired idle speed setpoint baucse this will otherwise stall the engine.

The biggest valve overlap will be achieved when using the lowest adjustable value on the intake side (80° respectively 86°) and the lowest adjustable value on the exhaust side (-80°)

TunerPro depiction of min allowed Vanos setpoints


A good starting point for further optimization could be:

TunerPro depiction of GhostCam mod

M Cluster LED Control

After swapping in an M3 cluster into a E46 or M5 cluster into E39, there is no more ecometer displaying the momentary fuel consumption, but a more useful oiltemperature gauge.

Using this cluster and some additional code we can also control the LEDs around the RPM gauge to work similar to the E46 M3 and also manage shiftlights behaviour.

Following maps are used:

  • id_icl_toil_led__n - LEDs used at the given oil tempetature for the warmup light feature
  • ldpm_toil_led - Oil temperatur axis to adjust the switch points of the led array for the warmup light feature
  • id_icl_led__n - LEDs used at the given enginespeed for the shift light feature
  • ldpm_toil_led - Engine Speed axis to adjust the switch points of the led array for the shift light feature

Explanation for the decimal values used (M3):

  • 112 - all LEDs lit
  • 96 - 4500 and upwards
  • 80 - 5000 and upwards
  • 64 - 5500 and upwards
  • 48 - 6000 and upwards
  • 32 - 6500 and upwards
  • 16 - 7000 and upwards
  • 00 - 7500 lit
  • 02 - oil warning LED yellow
  • 04 - coolant warning LED

Explanation for the decimal values used (M5):

  • 64 - 4000 and upwards
  • 48 - 4500 and upwards
  • 32 - 5000 and upwards
  • 16 - 5500 and upwards
  • 00 - 6500 lit
  • 01 - oil warning LED yellow
  • 04 - coolant warning LED

Download the warmup and shiftlights patch for TunerPro depending on your software version:

Use with 512kByte file only. Checksum correction required!

M3 Cluster warmuplight maps M3 Cluster shiftlight maps

Map Reduction

MS43 Map Reduction

You can reduce the total amount of maps you have to tune in MS43 with a very simple trick without losing map size like with the "fewmaps" files.

This is done by forcing the MS43 into using the cold engine injection, ignition and VANOS maps for cold enigne only.

This is done by setting all the transition tables responsible for changing between cold and warm engine state to "1.0":

  • ip_fac_is_ivvt
  • ip_fac_pl_ivvt
  • ip_fac_cam_sp_in_is
  • ip_fac_cam_sp_ex_is
  • ip_fac_cam_sp_in_pl
  • ip_fac_cam_sp_ex_pl

That will leave us with the following maps during normal engine operation:

  • Injection
    • Idle Speed: ip_ti_tco_1_is_ivvt
    • Part Load: ip_ti_tco_1_pl_ivvt_1 & ip_ti_tco_1_pl_ivvt_2
  • Ignition
    • Idle Speed: ip_iga_tco_1_is_ivvt
    • Part / Full Load: ip_iga_tco_1_pl_ivvt
  • VANOS
    • Idle Speed: ip_cam_sp_tco_1_in_is & ip_cam_sp_tco_1_ex_is
    • Part Load: ip_cam_sp_tco_1_in_pl & ip_cam_sp_tco_1_ex_pl
    • Full Load: ip_cam_sp_tco_1_in_fl & ip_cam_sp_tco_1_ex_fl


ATTENTION: Be aware that the following tables can be used if there is an active error in the ECU:

  • ip_tib__n__maf
  • ip_igab_is__n__maf
  • ip_igab__n__maf



VANOS Tweak for little extra midrange power

Insert the following tables into the desired part-load map where you need the effect ( part-load cold / part-load warm / both).

VANOS Tweak maps in table form for copy and pasting into TunerPro M54B30 only
Exhaust cam setpoint part-load Intake cam setpoint part-load
-105.0 -105.0 -105.0 -104.6 -103.1 -97.5 -96.0 -96.8 -98.3 -104.3 -99.0 -99.0
-105.0 -104.6 -103.9 -102.0 -99.0 -96.0 -95.3 -96.4 -97.9 -103.9 -98.6 -98.6
-104.6 -103.9 -100.9 -97.5 -93.8 -92.6 -93.4 -94.9 -96.4 -101.6 -97.5 -97.5
-103.9 -102.4 -96.4 -92.6 -88.9 -88.1 -90.0 -91.5 -93.8 -97.1 -91.9 -91.9
-103.1 -101.6 -94.9 -91.1 -87.4 -86.6 -88.5 -90.4 -92.6 -96.0 -90.8 -90.8
-100.9 -98.6 -90.4 -87.0 -85.9 -85.1 -85.9 -88.5 -91.1 -95.6 -90.4 -90.4
-99.0 -96.4 -88.5 -85.9 -85.1 -84.8 -85.5 -88.9 -94.1 -97.5 -95.3 -95.3
-97.9 -95.3 -87.8 -85.9 -85.1 -85.1 -85.9 -91.9 -97.5 -100.9 -99.0 -99.0
-96.8 -94.5 -88.5 -86.6 -85.9 -96.0 -95.6 -95.6 -95.6 -95.6 -95.6 -97.5
-95.6 -94.1 -91.1 -88.5 -88.5 -99.8 -101.6 -101.6 -101.6 -101.6 -100.5 -101.3
-95.3 -93.8 -91.9 -90.4 -90.4 -101.3 -102.0 -102.0 -102.0 -102.0 -100.9 -101.6
-93.8 -93.0 -92.3 -92.3 -94.5 -102.4 -101.3 -101.3 -101.3 -101.3 -100.1 -101.3
-91.9 -91.5 -91.9 -92.3 -95.3 -105.8 -106.1 -106.1 -106.1 -106.1 -105.0 -102.8
-87.8 -88.5 -89.6 -91.1 -94.9 -106.1 -106.1 -106.1 -106.1 -106.1 -105.0 -103.1
-85.5 -87.0 -88.5 -90.0 -93.8 -106.1 -106.1 -106.1 -106.1 -106.1 -105.0 -103.1
-84.0 -85.9 -87.4 -88.9 -93.0 -106.1 -106.1 -106.1 -106.1 -106.1 -105.0 -103.1
126.00 126.00 125.63 124.88 123.00 118.88 113.25 106.50 105.00 104.25 108.00 108.00
126.00 126.00 125.25 124.50 122.63 118.50 112.88 106.50 105.00 104.25 105.00 105.00
126.00 125.63 124.88 124.13 122.25 118.13 112.50 105.75 104.25 103.50 100.13 100.13
125.63 124.88 123.75 122.63 120.38 115.88 110.25 103.88 99.75 98.63 91.50 91.50
125.25 124.50 123.38 121.88 119.25 114.75 109.50 102.75 98.63 97.50 90.75 90.75
124.50 123.38 122.25 120.38 117.38 112.50 107.25 101.25 97.50 96.75 90.75 90.75
123.38 122.25 120.75 118.88 114.38 107.63 102.00 98.25 97.13 96.38 90.38 90.38
122.63 121.13 120.00 117.75 112.13 103.50 99.38 97.50 96.75 96.38 91.50 91.50
115.50 113.63 111.75 109.50 104.25 93.75 99.38 98.25 94.50 94.13 94.13 94.13
113.25 111.75 110.25 107.25 100.50 91.88 100.88 99.75 94.88 94.50 94.50 94.50
112.13 110.25 108.00 104.63 94.50 90.38 101.25 100.50 97.50 97.50 97.50 97.50
110.63 105.38 99.75 95.25 89.63 90.75 105.75 105.00 101.63 100.50 100.50 100.50
109.88 104.25 97.50 92.25 109.50 110.25 109.50 110.25 108.75 108.75 108.75 108.75
108.75 103.88 99.38 94.88 115.50 118.13 118.13 118.13 117.75 117.75 117.75 117.75
108.38 106.50 104.25 101.25 118.50 126.00 126.00 126.00 126.00 126.00 122.25 122.25
108.38 108.75 108.00 106.50 122.25 126.00 126.00 126.00 126.00 126.00 126.00 126.00

DoCr VANOS Tweak

Explaination

For stock engine with stock exhaust and intake flow, above VANOS tune works best.

For a modded engine, or stock with free flowing exhaust and cold air intake, valve overlap can help increase volumetric efficiency at higher engine speeds (above ~4000rpm), which results in more power.

Taking as a base M54B30 engine with intake cam 126° for max, and 86° for min ; exhaust cam -105° for max and -80° for min

126° represents intake cam in its max retard form, and 86° in its max advance position

-105° represents exhaust cam in its max advance position, and -80° in its max retard stage

General rule for overlap :

  • Advancing both cams - more low end torque and less top end power
  • Retarding both cams - less low end torque and more top end power

Tip for full load VANOS table: Begin from low rpm with max number for your cam (intake 126° , exhaust -105°) and progressively reduce number until you reach 4000rpm and lowest cam number (intake 86,exhaust -80)

From 4000rpm upwards, use inverse technique, start to rise again numbers, progressively. (every engine responds different by exhaust config) Test combinations until you are happy.

Also, do changes for intake only, leave exhaust alone if you are on stock exhaust manifold.

note Theoreticaly, there is no risk of damaging the engine (valve hits piston) if you stay within specified range for your particular cams. (m54b30 intake 126/86 ,exhaust -105/-80)