Advertising:

Siemens MS43: Difference between revisions

From MS4X Wiki
 
(168 intermediate revisions by 7 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.
The Siemens MS43 engine control unit (ECU) uses an Infineon C167CR_SR CPU clocked at 24MHz 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]]
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=
=Memory Layout=
The MS43 can be seperated into three major sections, first comes the bootloader, then the program code, and last the calibration data.
The MS43 flash memory can be separated into three major sections, first comes the bootloader, then the program code, and lastly the calibration data.


See this table for file locations:
See the following table for where the sections are located:


{| class="wikitable"
{| class="wikitable"
Line 16: Line 18:
| style="text-align: center; background-color:#fe996b;" | 00000
| style="text-align: center; background-color:#fe996b;" | 00000
| style="text-align: center; background-color:#fe996b;" | 0FFFF
| style="text-align: center; background-color:#fe996b;" | 0FFFF
| style="text-align: center; background-color:#fe996b;" | Bootloader Code
| style="text-align: center; background-color:#fe996b;" | Bootloader & UIF
| style="text-align: center; background-color:#fe996b;" | 64 kByte
| style="text-align: center; background-color:#fe996b;" | 64 kByte
|-
|-
Line 48: Line 50:
'''Bootloader Section'''
'''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 kilobytes in size and contains the boot code that initializes the ecu and verifies that everything is ok before control is handed over to the program code section. This section also contains one time writeable data such as immobilizer information and user information fields (UIF).


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).
'''Program Code Section'''


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.
This section is 384 kilobytes in size and contains the program code that operates the engine.


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.
'''Calibration Data Section'''
 
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.


 
This section is 64 kilobytes in size and contains the calibration data that the program code uses to operate the engine.
'''Calibration Data Section'''


=Checksums=
=Checksums=
Checksums are used to verify that the data written to the ROM has not become corrupt.
The MS43 uses three CRC16 checksums that verifies the data integrity of the boot, program and calibration sections and two addition checksums that verifies the data integrity of the system monitoring (_mon) parameters.
If any of the checksums are incorrect the ecu assumes that the data on flash has been corrupted and it won't allow the engine to start.


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.
When correcting the checksum the addition checksums have to be corrected '''before''' the CRC16 checksums, as the addition checksums are located inside the CRC16 checksum areas.
 
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:
The checksums are located at the following addresses:
Line 108: Line 99:


==Disabling Calibration Checksums==
==Disabling Calibration Checksums==
'''Note:''' It's not advised to disable the calibration checksums as the ecu looses the ability to verify the data integrity of the calibration data.


'''Disable CRC16 Checksum'''
'''Disable CRC16 Checksum'''


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


; Hexeditor
; Hexeditor
: 1. Set Word at 0x73FFE to 0xFFFF
: 1. Set Word at 0x73FFE to 0xFFFF
: 2. Set Byte at 0x6FFB0 to 0xA8
: 2. Set Byte at 0x6FFB0 to 0xA8
: 3. Change the Byte in the table from 0x84 to 0x94
::{| class="wikitable" style="text-align:left;"
!Firmware
!Location
|-
| 430037
| 0x58999
|-
| 430055
| 0x5B87D
|-
| 430056
| 0x5B87F
|-
| 430064
| 0x5FEB3
|-
| 430066
| 0x63595
|-
| 430069
| 0x63595
|-
|}


'''Disable Monitor Checksum'''


'''Disable Addition Checksum'''
'''Warning:''' Disabling the calibration monitor checksum should be avoided as it's an important part of the drive by wire safety system.
 
To disable the calibration monitor checksum use one of the following methods.
To disable the addition calibration checksum use one of the following methods.


; Tunerpro
; Tunerpro
Line 151: Line 167:
|}
|}


=Variants Configuration Switches=
=Variants Configuration=
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.
As the MS43 ecu is used in many different chassis configurations it uses a combination of configuration switches and automatic learning routines to detect which features or behaviors should be enabled.
 
==Switches==


'''Configuration brake light test switch logic variant (c_conf_bts)'''
'''Configuration brake light test switch logic variant (c_conf_bts)'''
*0: Signal high corresponds to 'brake actuated'
*0: Signal high corresponds to 'brake pedal pressed'
*1: Signal low corresponds to 'brake actuated'
*1: Signal low corresponds to 'brake pedal pressed'


'''Configuration exhaust system variant (c_conf_cat)'''
'''Configuration exhaust system variant (c_conf_cat)'''
*0: Automatic learning of variants, single-scroll, with one control (pre cat) sensor or CATV variant (SA199)
*0: Automatic learning of variants, single bank, 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)
*1: Automatic learning of variants, dual bank, with two control (pre cat) sensors or CATV variant (SA199)
*2: Single-scroll, 1 control (pre cat) sensor, 1 monitoring (post cat) sensor
*2: Single bank, 1 control (pre cat) sensor, 1 monitoring (post cat) sensor
*3: Twin-scroll, 2 control (pre cat) sensors, 2 monitoring (post cat) sensors
*3: Dual bank, 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)
*4: Automatic learning, dual bank, with/without control (pre cat) sensors, with/without monitoring (post cat) sensors or CATV variant (SA199)
 
After changing c_conf_cat you need to unplug all lambda sensors you won't be using and then clear the "learned variants" adaptation in the ecu. This will instruct the ecu to re-learn which lambda sensor configuration it should be using.
 
For example if you are removing the post-cat lambda sensors in a dual bank setup you need to set "c_conf_cat" to "1", unplug both post-cat lambda sensors and then clear the "learned variants" adaptation.
 
'''Note:''' CATV variant (SA199) corresponds to a vehicle with no oxygen sensors mounted in the exhaust.


'''Configuration main switch cruise control variant (c_conf_cru_main_swi)'''
'''Configuration main switch cruise control variant (c_conf_cru_main_swi)'''
Line 170: Line 194:


'''Configuration DMTL module variant (c_conf_dmtl)'''
'''Configuration DMTL module variant (c_conf_dmtl)'''
*0: DMTL module not present
*0: DMTL module not present, function and diagnosis OFF
*1: DMTL module present
*1: DMTL module present, function and diagnosis ON


'''Configuration ECF (Electrical Cooling Fan) variant (c_conf_ecf)'''
'''Configuration ECF (Electrical Cooling Fan) variant (c_conf_ecf)'''
Line 193: Line 217:
*3: Debounce after OBDII error memory and CS-component error, immediately
*3: Debounce after OBDII error memory and CS-component error, immediately


'''Configuration exhaust gas temperatur sensor variant (c_conf_teg)'''
'''Configuration exhaust gas temperature sensor variant (c_conf_teg)'''
*0: Automatic learning of EGT sensors
*0: Automatic learning of EGT sensors
*1: No EGT sensors
*1: No EGT sensors
*2: twin-scroll exhaust system with four EGT sensors
*2: Dual bank exhaust system with four EGT sensors
 
To re-do the exhaust gas temperature learning process the "learned variants" adaptation needs to cleared in the ecu.


'''Configuration torque limit first gear variant (c_conf_tq_lim_gear)'''
'''Configuration torque limit first gear variant (c_conf_tq_lim_gear)'''
*0: Torque limit not active
*0: First gear torque limiter not active
*1: Torque limit active (E53)
*1: First gear torque limiter 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)'''
'''Configuration SAP (Secondary Air Pump) variant (c_conf_sap)'''
*0: Automatic learning of SAP varants
*0: Automatic learning of SAP configuration
*1: SAP not present  
*1: SAP not present  
*2: SAP present without SAFM (Secondary Air Flow Meter)
*2: SAP present without SAFM (Secondary Air Flow Meter)
*3: SAP present with SAFM (Secondary Air Flow Meter)
*3: SAP present with SAFM (Secondary Air Flow Meter)


=Load Filtration=
To re-do the secondary air pump learning process the "learned variants" adaptation needs to cleared in the ecu.
In MS43 we have two different load filtration models for injection/ignition load and VANOS load.
 
== Gearbox variant detection ==
To accommodate different gearbox configurations the ecu will monitor the CAN-bus for certain CAN messages.
* If the '''EGS1''' CAN message is detected then the gearbox variant will be set to automatic (at)
* If the '''SSG1''' CAN message is detected then the gearbox variant will be set to manual automatic (amt)
* If neither of the above messages are detected the gearbox variant will be set to manual (mt)
 
When the detection is made the result is stored on the on-board EEPROM.
 
To re-do the gearbox variant learning process the "learned variants" adaptation needs to cleared in the ecu.
 
== Air condition system detection ==
To detect if an air condition system is mounted the ecu will monitor the CAN-bus for the '''INSTR3''' CAN message, if the message is detected the air condition system logic is activated.
 
When the detection is made the result is stored on the on-board EEPROM.
 
To re-do the air condition system learning process the "learned variants" adaptation needs to cleared in the ecu.
 
== Steering angle sensor detection ==
To detect if steering angle sensor is mounted the ecu will monitor the CAN-bus for the '''LWS1''' CAN message, if the message is detected the steering angle sensor logic is activated.
 
When the detection is made the result is stored on the on-board EEPROM.
 
To re-do the steering angle sensor learning process the "learned variants" adaptation needs to cleared in the ecu.
 
== Ignition coil detection ==
Midways into the production cycle of the MS43 the 300g ignition coils was replaced with pencil ignition coils. To accommodate the different ignition coil configurations a new hardware revision Index 04 was introduced alongside a new detection logic where the ecu checks if pin X60002.12 is connected to terminal 87 (main relay output). If the pin is not connected then 300g coils are mounted and if it's connected then pencil coils are mounted. When the detection is made the result is stored on the on-board EEPROM.
 
To re-do the ignition coil learning process the "learned variants" adaptation needs to cleared in the ecu.
 
'''Note:''' If pencil coils are used with an older Index 03 MS43 or an Index 04 or newer MS43 without the X60002.12 jumper wire retrofitted the values from the '''_pc_''' ignition coil tables can be copied over to their '''_300_''' counterparts.
[[File:Siemens MS43 Coil Data.png|none|none|none|Pencil Coil Data]]
 
== Ambient pressure sensor detection ==
Midways into the production cycle of the MS43 the Motorola ambient pressure sensor was replaced with a smaller Infineon version. To accommodate the different configurations a new detection logic was implemented where the ecu checks the voltage on one of the ambient pressure sensors input pins. If the voltage is less than c_v_var_amp a Motorola sensor is mounted and if the voltage is greater an Infineon sensor is mounted.
 
When the detection is made the result is written into the boot sector area at address 0x3EEC-0x3EF1. The ecu will fill this area with the values 0xA5 if a Motorola sensor was detected and 0x5A if an Infineon sensor was detected.
 
Due to the boot sector being used to store the detected variant the ambient sensor learning process can normally only be done once in the ecu's lifetime but if we use boot mode the learning process can be reset by filling the area at 0x3EEC-0x3EF1 with the values 0xFF.
 
=Mass Air Flow Sensor=
[[File:M54B30 MAF Scalar TunerPro.png|thumb|M54B30 MAF Scalar]]
The mass airflow sensor is one of the most important sensors as it allows the engine management system to measure how much air is entering the intake system and it's a key component for many calculations.
 
MS43 uses a MAF sensor that outputs a 0-5V signal that is then converted to a kg/h reading.
 
There is also provision for a secondary MAF sensor that was planned to be used to meter the air entering the secondary air pump system but is was never used in production.
 
The analog signals are converted to a MAF reading in kg/h by the following scalars.
* '''id_maf_tab''' - MAF Sensor Scalar 1x256
* '''id_saf_tab''' - Secondary Air MAF Sensor Scalar 1x256
* '''id_maf_tab__v_maf_1__v_maf_2''' - MAF Sensor Scalar 16x16
* '''id_saf_tab__v_saf_1__v_saf_2''' - Secondary Air MAF Sensor Scalar 16x16
 
An important note for the sensor definition tables is that there is no configurable voltage scale as the voltage scale is based upon the resolution of the ADC input and no interpolation is performed on the data in the tables.
 
For better visualization the voltage scale is only included in the 1x256 tables, the 16x16 tables are only numbered.
 
===Input Monitoring===
 
To diagnose the mass airflow sensor values the mass airflow sensor input is continuously monitors that the voltage is between the thresholds that are set by the following variables:
*'''c_maf_max_diag''' - Maximum load threshold to trigger a short to positive fault
*'''c_maf_min_diag''' - Minimum load threshold to trigger a short to ground fault
 
If the voltage falls outside these thresholds an error code will be set for the MAF sensor input and MAF failsafe mode will be activated.
 
When increasing the engine breathing capabilities '''c_maf_max_diag''' should be raised to a value just above the maximum load values that the engine can produce.
 
===Failsafe Mode===
 
In case of a mass airflow sensor failure or malfunction the MAF failsafe mode is activated and the MAF sensor load reading will be substituted with the values from the MAF diagnosis table.
 
* '''ip_maf_1_diag__n__tps_av''' - MAF diagnosis table used as a load substitute if there is a MAF sensor error
**'''X axis''': throttle position sensor value (tps_av)
**'''Y axis''': engine speed (n)


'''Note:''' The normal logging routine reports the unfiltered load value that will vary from the filtered loads especially in forced induction applications.
The MAF diagnosis table is also used during normal operation to filter VANOS load and diagnosis purposes so if the engine is modified to consume more air it's advisable to re-tune the MAF sensor substitute table to keep the load values as accurate as possible.


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.
When doing this it's good practice to data log MAF sensor load, accelerator pedal value and engine speed to create a histogram table that can be used as a base when modifying the MAF sensor substitute table.
 
'''Note:''' Be aware that the MAF sensor substitute table can not accurately model all factors that affects the engines breathing capabilities so it's not advisable to use it as a replacement for a real MAF sensor.
 
=Engine Load=
During operation several filtered engine load parameters are created with the most important ones for tuning being the following:
* Injection load (maf_ti)
* Ignition Load (maf_iga)
* VANOS load (maf_ivvt)
 
'''Note:''' Many logging options only reports the engine load measured by the mass airflow sensor that can vary greatly from the filtered loads which can give an incorrect view on what is actually happening.
 
In boosted applications it's really important that the injection load is monitored and tuned correctly as otherwise the engine will run into a "lean-wall" when hitting positive manifold pressure.
See [[#Extending_VO_Tables_For_Forced_Induction|Extending VO Tables For Forced Induction]] for tuning guidelines.


==Injection Load==
==Injection Load==
[[File:Siemens MS43 Intake Model.png|thumb|right|Intake Manifold Volume Model]]
[[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.
The load filtering process for the injection load is used to account for changes in the engines volumetric efficiency due to the variable valve overlap induced by the variable valve timing. This filtration process is in short an optimized version of the speed density control strategy where several steps are pre-calculated and stored in tables which are retrieved at runtime.


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.
'''Calculated Manifold Pressure'''


The effective volume is different between increasing and decreasing load scenarios and therefore split up into four different tables:
First the ecu calculates the manifold absolute pressure with the help of Clapeyrons ideal gas equation by taking the effective intake manifold volume, the engine speed, the current airflow reading from the mass airflow sensor and the volumetric efficiency of the engine defined by the vo tables into account.
 
So for example if the mass airflow sensor measured that 200 mg/stk of air entered the intake manifold and the vo tables defined that the engine at the current intake pressure and engine speed can only consume 100 mg/stk of air then the remaining 100 mg/stk of air must still be inside the intake manifold which increases the pressure inside the intake manifold.
 
The effective intake volume is different between increasing and decreasing load scenarios and is 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__n__maf_mes''' - Effective intake manifold volume at increasing load during part load and full load
Line 232: Line 345:
* '''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
* '''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.
The more accurate these models and the MAF sensor readings is, the more accurate the calculated manifold absolute pressure value will be that's used in the next step.


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.
'''Volumetric Efficiency Calculation'''


* '''ip_nr_ip_maf__vo''' - Active _vo_ table for maf_ti signal filtering
After the current manifold pressure is calculated 8 volumetric efficiency lookup tables '''ip_maf_vo_[1-8]__map__n''' and a selection table '''ip_nr_ip_maf__vo''' selects the active vo table based on the current valve overlap.
* '''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.
The vo tables can be viewed as speed density lookup tables that contains the pre-calculated results of the speed density formula at different engine speed and intake pressures. The values represent how much air is able to enter the cylinders for a given valve overlap during an engine revolution.


This gives the ECU some headroom to compensate for outside ambient pressure.
* '''ip_nr_ip_maf__vo''' - Active vo table for speed density calculation
* '''ip_maf_vo_1__map__n''' - Engine volumetric effiency - Valve overlap step 1
* '''ip_maf_vo_2__map__n''' - Engine volumetric effiency - Valve overlap step 2
* '''ip_maf_vo_3__map__n''' - Engine volumetric effiency - Valve overlap step 3
* '''ip_maf_vo_4__map__n''' - Engine volumetric effiency - Valve overlap step 4
* '''ip_maf_vo_5__map__n''' - Engine volumetric effiency - Valve overlap step 5
* '''ip_maf_vo_6__map__n''' - Engine volumetric effiency - Valve overlap step 6
* '''ip_maf_vo_7__map__n''' - Engine volumetric effiency - Valve overlap step 7
* '''ip_maf_vo_8__map__n''' - Engine volumetric effiency - Valve overlap step 8
 
As the current valve overlap will not always be exactly at the 8 different valve overlap breakpoints defined in the '''ip_nr_ip_maf''' table the ecu will interpolate the load value between the '''ip_maf_vo_[1-8]''' tables so for example if the current valve overlap is halfway between the '''ip_maf_vo_1''' table and the '''ip_maf_vo_2''' table then the ecu will combine half of the load value from the '''ip_maf_vo_1''' table with half of the load value from the '''ip_maf_vo_2''' table.
 
'''Note:''' In stock form these tables are setup to support manifold pressures between 50hPa and 1250hPa which gives some headroom to compensate for outside ambient pressure. In boosted applications the manifold pressure axis of these tables will need to be extended to allow higher pressures to be processed correctly. 
For boosted applications see [[#Extending_VO_Tables_For_Forced_Induction|Extending VO Tables For Forced Induction]] for tuning guidelines.
 
'''Coolant temperature correction'''
 
Due to the speed density calculation being pre-calculated with an assumed temperature of the air entering the cylinders the output from the '''ip_maf_vo_[1-8]__map__n''' tables is multiplied with a correction factor from the '''ip_maf_tco_cor__tco''' table to correct the output for the cooling/heating effect the engine temperature will have on the air entering the cylinders.


==VANOS Load==
==VANOS Load==
The VANOS load filtration is a simple weighting factor to blend between real measured load and the MAF substitude table.
The VANOS load is filtered with a simple weighting factor that blends between load measured by the MAF sensor and load read from the MAF sensor substitute table.


[[File:Siemens MS43 Maf Substitute.png]]
[[File:Siemens MS43 Maf Substitute.png]]
Line 257: Line 379:
[[File:Vanos Load Weighting Factor.png]]
[[File:Vanos Load Weighting Factor.png]]


The factor depends on unfiltered load and changes to completely rely on MAF substitute with rising load.
The blending factor is setup to mostly rely on the load measured by the MAF sensor during low load and as the load readings start to climb the factor start to gravitate more and more against the readings from the MAF sensor substitute table.
 
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==
This is done to provide a more stable load reading for the VANOS control logic when MAF sensor readings are changing rapidly.
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.
* '''ip_fac_maf_sub_ivvt__maf_sub_diag''' - Measured load weighting factor for maf_ivvt load
* '''ip_maf_1_diag__n__tps_av''' - MAF diagnosis table used as a load substitute if there is a MAF sensor error


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.
When the engine is modified to consume more air it's advisable to re-tune the MAF sensor substitute table to keep the VANOS load as accurate as possible.
See [[#Failsafe_Mode|MAF Failsafe Mode]] for tuning guidelines.


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.
==Extending VO Tables For Forced Induction==
In stock form the VO tables are setup to support manifold pressures between 50hPa and 1250hPa which gives some headroom to compensate for outside ambient pressure. But a boosted applications can easily exceed 1250hPa of pressure so for the ecu to be able to correctly operate above this pressure we need to re-scale the pressure axis for the VO tables.


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:  
On an engine running stock cams the following values can be used as a guideline. We have also prepared an Excel sheet that can be used to extrapolate your own tables:  
[[File:Load Filtration Table Extrapolation.zip|thumb|Load_Filtration_Table_Extrapolation.zip]]
[[File:Load Filtration Table Extrapolation.zip|thumb|Load_Filtration_Table_Extrapolation.zip]]


[[File:Siemens MS43 Load Filtration Boosted.png|800px]]
[[File:Siemens MS43 Load Filtration Boosted.png|800px]]


Please note that this is only an example, but logging showed a perfectly calculated MAP value that matched measured MAP under all circumstances.
Please note that this is only an example that should get you in the ballpark so further tuning may be needed, ideally a real map sensor should be connected to the engine to verify that the calculated map values are correct.


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.
After hundreds of 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.
When doing a M50 manifold conversions it could be a good idea to take a look at the intake models in the Alpina B3S binary, the Alpina manifold is pretty similar to the M50 so the intake model values should be closer than the M54 intake models.


=Injection=
=Injection=
The MS43 fuel injection maps are based on engine load over engine speed and the lookup value is injection time in miliseconds.
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.
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.
There are a lot of blending, enrichment and enleanment factors 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_tipr_cst__tco''' - Pre cold start injection time basic value
*'''ip_ti_cst__n__tco''' - Cranking injection time basic value
*'''ip_ti_cst__n__tco''' - Cranking injection time basic value
*'''ip_tib__n__maf''' - Basic injection time under VANOS fault condition


Without any active VANOS fault codes the engine interpolates between the cold and warm injection tables. There are individual tables for each cylinder bank.
During normal operation the ecu 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
'''Cold Engine'''
*'''ip_ti_tco_1_pl_ivvt_2__n__maf''' - Cold engine injection time used for bank 2 during part load
*'''ip_ti_tco_1_is_ivvt__n__maf''' - Injection time used during idle. Cold engine
*'''ip_ti_tco_2_is_ivvt__n__maf''' - Warm engine injection time used during idle
*'''ip_ti_tco_1_pl_ivvt_1__n__maf''' - Injection time used for bank 1 during part load. Cold engine
*'''ip_ti_tco_2_pl_ivvt_1__n__maf''' - Warm engine injection time used for bank 1 during part load
*'''ip_ti_tco_1_pl_ivvt_2__n__maf''' - Injection time used for bank 2 during part load. Cold engine
*'''ip_ti_tco_2_pl_ivvt_2__n__maf''' - Warm engine injection time used for bank 2 during part load
'''Warm Engine'''
*'''ip_ti_tco_2_is_ivvt__n__maf''' - Injection time used during idle. Warm engine
*'''ip_ti_tco_2_pl_ivvt_1__n__maf''' - Injection time used for bank 1 during part load. Warm engine
*'''ip_ti_tco_2_pl_ivvt_2__n__maf''' - Injection time used for bank 2 during part load. Warm engine
'''Axis Values'''
*'''X axis''': filtered engine load for injection subsystem (maf_ti)
*'''Y axis''': engine speed (n)
 
'''Important:''' With an active VANOS fault the ecu will fall back to using the base injection time table '''ip_tib__n__maf''' to derive the injection time, so don't forget to also update this table after tuning the part-load tables.
 
==Transition between cold/warm engine operation==
 
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)
 
==Full load operation==
 
During full load operation the part load injection time is multiplied by an enrichment factor defined by the '''ip_ti_fl''' table to produce a richer air fuel ratio to cool the combustion temperatures and prevent detonation.
 
'''Viewing full load enrichment table as Lambda/AFR'''
[[File:Full_Load_Injection_AFR_Lambda.png|thumbnail|right|Full load injection converted to lambda and AFR]]


Blending between cold and warm injection maps is done by the following factor tables. Both tables are engine temperature over egnine temperatur at engine start.
To make tuning of the full load operation easier, you can change the conversion factor of the '''ip_ti_fl__n''' table to display lambda or AFR depending on your preference.
*'''ip_fac_is_ivvt__tco__tco_st''' - Weighting factor for blending between idle speed injection tables
*'''ip_fac_pl_ivvt__tco__tco_st''' - Weighting factor for blending between part load injection tables


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.
'''Warning:''' Keep in mind, that to reach the lambda/AFR values in the table the part load injection tables needs to be properly tuned to deliver the correct amount of fuel for stochiometric combustion (lambda 1.0).


*'''ip_ti_fast_wf_thd_min__tco'''
{| class="wikitable"
*'''ip_ti_slow_wf_thd_min__tco'''
! 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
|}


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.
==Cat preparation operation==
If the ecu is in the "cat preparation"/CATV state i.e. there are no lambda sensors connected to the ecu then the part-load injection time will be leaned out by the '''ip_ti_cat_var__n__maf''' table.


==Maximum Duty Cycle==
==Maximum Duty Cycle==
[[File:Maximum Injection Time Calculator.png|thumb|right|Maximum Injection Time Calculator]]
The maximum duty cycle describes the maximum opening time for an injector at a specific engine speed.
The maximum duty cycle describes the maximum opening time for an injector at a specific engine speed.


Line 332: Line 486:
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.
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.


[[File:Maximum Injection Time Calculator.png]]
'''Note:''' The table on the right shows the theorethical maximum. As long as your injection time stays below this, you are fine.
 
'''Note:''' The table shows the theorethical maximum. As long as your injection time stays below this, you are fine.


==Aftermarket Injector Scaling==
==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.
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.
To find a suitable baseline for your new injection 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.
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.
Line 354: Line 506:


[[Fuel_Injector_Deadtimes|Go here for a list of suitable fuel injectors and their deadtimes.]]
[[Fuel_Injector_Deadtimes|Go here for a list of suitable fuel injectors and their deadtimes.]]
The maps to scale are:
*'''ip_tipr_cst__tco''' - Pre cold start injection time basic value
*'''ip_ti_cst__n__tco''' - Cranking injection time basic value
*'''ip_tib__n__maf''' - Basic injection time under VANOS fault condition
*'''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
*'''ip_ti_slow_wf_thd_min__tco''' - Cylinder wall rewetting
*'''ip_ti_fast_wf_thd_min__tco''' - Cylinder wall rewetting
After getting your base values for all these maps, you should log your lambda integrator to fine tune and get it as close as possible to +/- 0.
To fine tune starting and after start behavior, you can play with the following maps.
*'''ip_ti_cast__tia__tco''' - Initialized value for post-start enrichment factor (After start enrichment)
*'''ip_ti_cr_cst__cyc__tco''' - Gradual reduction of fuel enrichment at engine start
*'''ip_ti_cr_cast__cyc__tco''' - Gradual reduction of fuel enrichment after engine start
'''DO NOT''' scale them to your injector like previous fuel maps, because these are factors, not injector pulse width in milliseconds!
==Tip-In Enrichment / Cylinder Rewetting==
An injection model with a fast and a slow deactivation of the compensation injection amount is used for the compensation of the wall film amount stored in the intake ports.
To reduce air ratio fluctuations because of the updating error in the air path, a further wall film compensation amount is calculated from the change of the throttle angle, which is effective shortly after triggering a load jump.
For the load-dependent wall film compensation, the total wall film difference amount and the wall film difference amount to be compensated with high dynamic response between two sampling steps is quickly determined from the injection time difference (load difference) and a total wall film factor. The wall film difference amount to be compensated with lower dynamic response is calculated from the difference between these two variables.
The wall film difference amount for compensation of the updating error results from the difference between the map values IP_TI_PVS__PVS__N resulting from a map point change. This injection amount is corrected depending on the coolant temperature.
*'''ip_ti_pvs__pvs__n''' - PVS angle-dependent wall film amount
*'''ip_ti_tco_pos_wf__n__tco''' - Total wall film amount factor on acceleration
*'''ip_ti_tco_pos_fast_wf__n__tco''' - Total wall film amount factor on acceleration (high dynamic)
*'''ip_ti_tco_neg_wf__n__tco''' - Total wall film amount factor on deceleration
*'''ip_ti_tco_neg_fast_wf__n__tco''' - Total wall film amount factor on deceleration (high dynamic)
The best way to scale the wall film table is rev the car then let off and see what AFR instantly appears. The goal is to achieve lambda 1.0 or gasoline AFR 14.7.
If the value is too rich, you need to decrease the wall film amount table. If the value is too lean, you need increase the wall film amount table.
Applying 5% steps to the whole table '''ip_ti_pvs__pvs__n''' in either direction shows good results soon.


==Correcting Fuel Consumption Gauge==
==Correcting Fuel Consumption Gauge==
Line 361: Line 555:
The table '''ip_fco_map_cor__pq_main_col''' handles injection value reporting towards the cluster over CAN bus.
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.
'''For example:''' You've lowered your fueling tables by MULTIPLIYING them with 0.46, you must DIVIDE the mentioned table by 0.46 to correct fuel consumption readings.


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]
Fine tuning should be made in the secret menu of your cluster (+- 25%). This is explained here under "Test 20" [https://www.bimmerforums.com/forum/showthread.php?61718-INFO-E46-Instrument-Cluster-Test INFO: E46 Instrument Cluster Test]


==Upgraded Fuel Pumps==
==Upgraded Fuel Pumps==
Line 377: Line 571:
'''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.
'''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.
If this is the case consider adding a check valve right after the pump to keep stock-like cranking behavior.


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


Like the injection maps, they are also based on engine load over engine speed but obviously the lookup is ignition timing in °BTDC (degrees before top dead center).
Main tables that are used during normal engine operation:


*'''ip_iga_ron_91_pl_ivvt__n__maf''' - Target ignition angle for RON91 during part and full load
'''Cold Engine'''
*'''ip_iga_ron_98_pl_ivvt__n__maf''' - Target ignition angle for RON98 during part and full load
*'''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
'''Warm 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)




'''ip_iga_ron_98_pl_ivvt__n__maf''' is the main table used with a healthy engine (so no VANOS fault codes, normal warmed up operating temperature) running RON98/PON93 gasoline.  
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.


There is a knock based interpolation between the RON91 and RON98 RON tables. The other tables should be kept safe.
While warming up the ignition subsystem uses the same blending factor as the injection subsystem. (see [[Siemens_MS43#Transition_between_cold/warm_engine_operation|Transition_between_cold/warm_engine_operation]])
 
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.


"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.


Catalyst heating "_CH_" in maps retards ignition during warm up.
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).
Anti-jerk "_AJ_" retards ignition during rapid throttle opening to smooth out torque (can be removed by increasing c_tco_min_aj to 142.5C.


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.
Reported to sometimes cause transitional knock on boosted engines, if so consider adjusting other tables designed for this (tra_knk).


==Ignition Coil Variants==
==Ignition Current Feedback==
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.
MS43 uses a voltage divider (shunt resistor) in the primary coil circuit to measure spark duration on pin X60005.6. The 240Ohm shunt resistor for this is part of the ignition coil wiring loom and hidden in the plastic protecion tray.


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.
When using aftermarket or upgrade coils, it is possible that this protection method falsely identifies a "spark duration too short" or "no spark" DTC.


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.
'''Note:''' Some early M52TU heads have tighter tolerances for clearing the ignition coils causing the mantle to touch the head. This will short circuit the resistor and the ECU can no longer read spark duration. Isloating the coils with some Kapton tape will do the job here, or you grind away some of the aluminum.


To make this easier you can simply copy all the '''_pc_''' values to their '''_300_''' pendands.
*'''c_tco_min_igcfb''' - Minimum coolant temperature for ignition diagnostic
[[File:Siemens MS43 Coil Data.png|none|none|none|Pencil Coil Data]]
*'''id_t_igcfb_min_300__n__maf''' - Minimum spark burning duration - screw type ignition coils
*'''id_t_igcfb_min_pc__n__maf''' - Minimum spark burning duration - pencil type ignition coils
*'''c_n_max_igcfb_diag''' - Minimum engine speed for ignition current feedback diagnostic
*'''c_cur_igc_max_diag''' - Maximum valid ignition current to detect a bad resistor
*'''c_n_max_er''' - Maximum engine speed for misfire detection


=VANOS=
=VANOS=
[[File:Vanos max settings.jpg|300px|thumb|right|VANOS Min/MAx Values]]
[[File:Vanos max settings.jpg|300px|thumb|right|VANOS Min/Max Values]]
VANOS stands for "VAriable NOckenwellenSteuerung" and translates to variable camshaft control.
VANOS stands for "VAriable NOckenwellenSteuerung" and translates to adjustable 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.
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 one hall sensor each on the intake and on the exhaust camshaft. Each of the sensors scans a toothed wheel with two 180° phases.
The intake CAM sensor serves for cylinder bank detection in the case of pre injection, for synchronisation, engine speed source in the case of crankshaft sensor errors and for position control of the intake camshaft (CAM).
To ensure correct pre injection, the intake CAM sensor has been designed as a static sensor, i.e. detection of the toothed wheel phase is even possible at 0 rpm.
The exhaust CAM sensor serves for position control of the exhaust CAM. Since it is designed as a dynamic sensor, a minimum engine speed is required to enable phase detection.


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.  
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 variation of °CRK is pretty limited, it can be used to compensate for different intakes, different camshafts and even forced induction application may be benefitting from perfectly tweaked VANOS setpoints.
Even though the camshaft adjustment is limited to 40°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 usage of cold maps and a factor of 0.0 means full usage of warm maps.


The main maps used for intake camshaft are:
*'''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


'''cold engine'''
Axis description are:
*ip_cam_sp_tco_1_in_is__n__maf_ivvt
*'''X axis''': engine coolant temperature at engine start (tco_st)
*ip_cam_sp_tco_1_in_pl__n__maf_ivvt
*'''Y axis''': current engine coolant temperature (tco)
*ip_cam_sp_tco_1_in_fl__n


'''warm engine'''
==Camshaft Parameters==
*ip_cam_sp_tco_2_in_is__n__maf_ivvt
In the initial position of VANOS (maximum spread), the edges of the exhaust CAM sensor are positioned at CRK tooth number 18/78 + C_COR_CAM_EX_REF °CRK, and the edges of the intake CAM sensor at CRK tooth number 42/102 + C_COR_CAM_IN_REF °CRK.
*ip_cam_sp_tco_2_in_pl__n__maf_ivvt
*ip_cam_sp_tco_2_in_fl__n


Plausibility limits have been defined for the non-adapted CAM edges; exceeding of these limits will result in an CAM diagnostic error:
*Plausible range of intake cam: CRK teeth 31 - 46 and CRK teeth 91 - 106.
*Plausible range of exhaust cam: CRK teeth 14 - 26 and CRK teeth 74 - 86.


The main maps used for exhaust camshaft are:
If you want to change cams between engines or even go with aftermarket cams, you can use the following values to calibrate them.


'''cold engine'''
'''Intake Camshaft:'''
*ip_cam_sp_tco_1_ex_is__n__maf_ivvt
*'''c_cam_op_in''' - Intake camshaft duration in degrees
*ip_cam_sp_tco_1_ex_pl__n__maf_ivvt
*'''c_cam_adj_rng_max_in''' - Intake camshaft maximum VANOS adjustment range
*ip_cam_sp_tco_1_ex_fl__n
*'''c_cam_ini_in''' - Initialization value for intake camshaft refence angle adaptation
*'''c_cor_cam_in_ref''' - CRK-correction for intake camshaft edges (aka intake lobe centerline)


'''warm engine'''
'''Exhaust Camshaft:'''
*ip_cam_sp_tco_2_ex_is__n__maf_ivvt
*'''c_cam_op_ex''' - Exhaust camshaft duration in degrees
*ip_cam_sp_tco_2_ex_pl__n__maf_ivvt
*'''c_cam_adj_rng_max_ex''' - Exhaust camshaft maximum VANOS adjustment range
*ip_cam_sp_tco_2_ex_fl__n
*'''c_cam_ini_ex''' - Initialization value for exhaust camshaft refence angle adaptation
*'''c_cor_cam_ex_ref''' - CRK-correction for exhaust camshaft edges (aka exhaust lobe centerline)


Blending between cold engine and warm engine is done by:
Please make sure that the VANOS setpoint tables explained in the section prior to this are calibrated accordingly to the camshaft values.


'''idlespeed'''
'''Note:''' The B30 intake camshaft does not only have more lift and longer opening but its also 6° more advanced to support the engine in higher engine speeds compared to all other M52TU or M54 intake camshafts. Observations showed that tilting the intake camshaft by those 6° already made an improvement for top end power.
*ip_fac_cam_sp_in_is__tco__tco_st
*ip_fac_cam_sp_ex_is__tco__tco_st


'''partload'''
As a rule of thumb you can calculate a valid VANOS setpoint area for your cam setup as following. (B30 intake values for ease of calculation)
*ip_fac_cam_sp_in_pl__tco__tco_st
*'''Upper Limit:''' c_cam_ini_in/ex (126°)
*ip_fac_cam_sp_ex_pl__tco__tco_st
*'''Lower Limit:''' c_cam_ini_in/ex - c_cam_adj_rng_max_in/ex (126° - 40° = 86°)


=Drive-By-Wire=
=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.
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.  
The accelerator 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.
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.
Line 476: Line 720:


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.
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 Dashpot==
To provide a smoother driving experience and lower emissions when the accelerator pedal is released the ecu will limit how fast the accelerator pedal sensor (pvs) input decreases.
To determine the scale of the dashpot the ecu first determines how fast the pvs input is decreasing by subracting the previous pvs input with the current pvs input.
The resulting pvs input difference is then multiplied by the factors in '''ip_pvs_dif_neg_fac''' and '''ip_pvs_dif_cr_neg''' to create an initial dashpot correction value.
After this the dashpot correction result from the previous execution cycle is also multiplied by the '''ip_pvs_dif_cr_neg''' factor and it's then added to the newly calculated dashpot correction factor.
This operation will make the dashpot correction decay over time which provides a smooth change of the correction.
The resulting dashpot correction is then subtracted from the requested pvs input to create a corrected pvs input which is further processed by the [[Siemens_MS43#Drivers_Wish_Input_Correction|Drivers Wish Input Correction]] function.
If the corrected pvs input is smaller or equal to the requested pvs input the requested pvs input will be used instead.
The ecu also provides the option to disable the dashpot function when the clutch is pressed by setting '''lc_dhp_ltc''' to 1.


==Drivers Wish Input Correction==
==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.
To provide a smooth driving experience during part load the ecu actively controls how fast the accelerator pedal sensor 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.  
'''ip_pvs_cor_max_rpl_[gear]''' is used by the ecu to decide if the 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 drivers requested pvs input is between these values then the ecu will start limiting the pvs input increase.


Line 499: Line 758:


==Throttle Request Correction==
==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.
To provide a smoother driving experience the ecu will limit how fast the throttle can close based 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 clutch is not pressed and the requested throttle setpoint is larger than the value specified in '''c_tps_req_ltc_min''' or smaller than the value specified in '''ip_tps_req_ltc_min_[gear]''' the throttle setpoint closing rate will 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:
When the ecu starts limiting the throttle setpoint it will be decremented by the value taken from '''ip_tps_req_ltc_lgrd_[gear]''' until the following conditions are met:
* 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 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 requested throttle setpoint is larger or equal to '''ip_tps_req_ltc_min_[gear]'''.
* The limited throttle setpoint is smaller than the requested throttle setpoint.
* The clutch is pressed.
* The clutch is pressed.


Line 554: Line 809:




=Full Load Detection=
=Full Load Operation=
[[File:Full_Load_Diagram.png|thumbnail|right|Full load procedure shown in Tuner Pro]]
[[File:Full_Load_Diagram.png|thumbnail|right|Full load tables shown in Tuner Pro]]
[[File:Full_Load_Injection_AFR_Lambda.png|thumbnail|right|Full load injection converted to lambda and AFR]]
[[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.


In full load operation (ES = FL) the engine will leave stoichiometric combustion and enriches the injection for preventing knock and maximum power production.
In full load operation the ecu will stop targeting a stoichiometric combustion and injection will be enriched to prevent knock and keep the combustion temperature under control.


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.
During full load the closed loop lambda correction will be disabled but already learned fuel trims 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.
==Activation==
To determine if the full load state should be activated the ecu performs a number of checks.


Additionally, either one of the two following conditions has to be fulfilled to activate full load detection.  
First it checks if the engine speed is greater than '''c_n_min_fl''' which is the lower engine speed limit for 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.
After that it checks if the current accelerator pedal position exceeds the values defined in the following tables are exceeded. If this is the case then the respective function will enter the full load state.
* '''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__n''' - Accelerator pedal position threshold for full load detection - Injection
Line 577: Line 827:
* '''id_pvs_fl_vim__n_vim''' - Accelerator pedal position threshold for full load detection - DISA
* '''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.
To prevent damage to the AC compressor and to extract every last bit of power out of the engine, the AC compressor will be disengaged if the accelerator pedal position exceeds the threshold set in  '''c_pvs_fl_accin'''.
 
Additionally to prevent that the full load state is not activated to early after an engine start either one of the two following conditions has to be fulfilled before the ecu is able to activate the full load state.
After either condition is achieved this check will be disabled until the engine is restarted again.
 
* '''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.
 
==Effect On Operation==
 
When the VANOS and DISA function enters full load they will switch over to separate full load tables, but for the injection function an enrichment factor will be applied to the injection amount.


This leaves us the following tables that actually alter injection, VANOS and DISA behaviour.
This leaves us with the following tables that alter injection, VANOS and DISA behavior during full load.


*'''ip_ti_fl__n''' - Full load enrichment factor for nominal injection time
*'''ip_ti_fl__n''' - Full load enrichment factor for nominal injection time
Line 588: Line 848:
*'''id_vim_fl__n_vim''' - Variable intake manifold (DISA) activation setpoints at full load
*'''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.
==Time Limited Operation==
[[File:Siemens_MS43_Full_Load_Max_Time.png|thumbnail|right|Full load state maximum timers]]
 
This function doesn't seem to have been used in production but the full load function also has the capabilities to limit how long the full load state can be active in each 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.
When the gear dependent timer has counted down to zero the ecu will leave the full load operating state and the driver has to lift the accelerator pedal below the configured full load detection threshold before the ecu can re-enter the full load operating state again.


*'''id_t_max_fl__gear''' - Maximum time in the full load state. Manual transmission.
*'''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.
*'''id_t_max_fl_at__gear''' - Maximum time in the full load state. Automatic transmission.
*'''c_n_max_fl''' - Maximum engine speed for time limited full load
*'''c_vs_max_fl''' - Maximum vehicle speed before time limited full load can be activated (This is set to 255km/h in production which disables this function)
=Lambda Regulation=
MS43 has a cylinder bank selective lambda regulation that is utilizing one narrow band O2 sensor per cylinder bank.
That means the ECU knows when a lean or rich condition occurs, but doesn't know HOW rich or lean it currently runs.
Due to this limitation the ECU continuously regulates the mixture to keep combustion exactly at lambda 1.0 (14.7 AFR / Stoichiometric) while in closed loop operating state.
'''Closed loop lambda regulation''' means that the O2 sensors or lambda probes provide feedback to the fuel injection routines which will then correct injection time accordingly.
'''Open loop''' means that the fuel injection time will solely depend on input quantities like air mass flow and ambient pressure without a feedback loop.
The MS43 has several requirements to be fulfilled to enter closed loop mode:
*'''c_lam_n_min''' - Minimum engine speed to enable closed loop regulation
*'''id_t_max_ls__tco_st''' - Minimum time after engine start to enable closed loop regulation
*'''id_lam_tco_min__tco_st''' - Minimum coolant temperature after engine start to enable closed loop regulation
If every of these conditions is met, MS43 will enable closed loop feedback. Whilst active, there is a lower and upper limit to lean out or enrichen the air fuel mixture:
*'''c_lam_min''' - Minimum lambda integrator value for leaning the mixture
*'''c_lam_max''' - Maximum lambda integrator value for richening the mixture
Between these two values the ECU can regulate the air fuel mixture instantaneously. These are called lambda integrators or short time fuel trims (STFT).
===Lambda Adaptation===
[[File:Lambda Adaptation Scheme.png]]
The additive and multiplicative adaptation corrections are taken into account in the entire map for calculation of the injection time.
To avoid problems involving the mixture while the engine is not at operating temperature, the lambda adaptation values of TCO and their own values (determined with engine at service temperature) can be attenuated.
This is accomplished by weighting the multiplicative components with IP_TI_AD_FAC_FAC__TCO__TI_AD_FAC and the additive components with IP_TI_AD_ADD_FAC__TCO__TI_AD_ADD.
'''Main Conditions:'''
*'''c_tco_ti_ad_min''' - Minimum coolant temperature for lambda adaptation
*'''c_tia_ti_ad_max''' - Maximum intake air temperature for lambda adaptation
*'''c_maf_ti_ad_max''' - Maximum air mass for lambda adaptation
'''Lambda Additive Corrections:'''
*'''c_ti_ad_add_min''' - Minimum value of lambda adaptation additive factor
*'''c_ti_ad_add_max''' - Maximum value of lambda adaptation additive factor
*'''c_maf_ti_ad_add_max''' - Maximum air mass for additive lambda adaptation
*'''c_n_ti_ad_add_max''' - Maximum engine speed for additive lambda adaptation


You can zero these tables to bypass the timer.
'''Lambda Multiplicative Corrections:'''
*'''c_ti_ad_fac_min''' - Minimum value of lambda adaptation multiplicative factor
*'''c_ti_ad_fac_max''' - Maximum value of lambda adaptation multiplicative factor
*'''c_n_ti_ad_fac_min''' - Minimum engine speed for multiplicative lambda adaptation
*'''c_maf_ti_ad_fac_min''' - Minimum air mass for multiplicative lambda adaptation
*'''ip_maf_ti_ad_min__n''' - Minimum air mass for multiplicative lambda adaptation
*'''ip_maf_ti_ad_max__n''' - Maximum air mass for multiplicative lambda adaptation


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.
To temporary disable fuel learning trims (additive & multiplicative) you can simply set c_tco_ti_ad_min to something like 140°C. This will disable adaptation, but keeps short term regulation working.


'''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.
MS43 also stores cylinder individual fuel trim adaptation values for all cylinders (-10% to +10%). This function is quite CPU heavy and only happens below engine speed threashold '''c_n_max_cyl_lam'''. With any other exhaust manifold than the factory ones this may lead to wrong adaptations and therefor wrong AFR. You can disable cylinder individual fuel trims by setting before mentioned constant to "0".


This is only applicable if your part-load table is tuned to stoichiometric combustion (lambda 1.0).
=Diagnostic Trouble Codes (DTC)=
During operation MS43 will perform a series of self diagnostic tests to ensure that everything is operating correctly.


{| class="wikitable"
To prevent an error from triggering too quickly the MS43 uses a debounce system where an error has to be detected a set number of times before the error can become active.
! Title
 
! Conversion
===DTC To P-Code Translation===
! Low Range
To translate the active DTCs to the equivalent OBD2 P code the ECU uses a set of variables '''c_dtc_[dtc name]_x''' that specifies the corresponding OBD2 P code.
! High Range
 
|-
The full list of DTCs and their corresponding OBD2 P code can be found here: [[Diagnostic_Trouble_Code_Translation|Diagnostic Trouble Code Translation]]
| 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.''
===Suppressing Diagnostic Trouble Codes===
Not all DTCs can be suppressed but those who can be suppressed have an incrementation variable '''c_abc_inc_[dtc name]''' which defines how much the debounce counter should increment each time the error is detected and a threshold variable '''c_abc_max_[dtc name]''' which defines the maximum value for the debounce counter before the error is activated.


=DTC Suppression=
To suppress a DTC the corresponding '''c_abc_inc_[dtc name]''' variable needs to be set to zero. This prevents the debounce counter from incrementing which prevents the DTC from activating.
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"
'''Note:''' Suppressing a DTC will not de-activate the functions associated with it so it's advised to correct the tune instead of suppressing any DTC.
!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
|Manifold Absolute Pressure/Barometric Pressure Circuit Low Input
|-
|P0108
|Manifold Absolute Pressure/Barometric Pressure Circuit High Input
|-
|rowspan=1|c_dtc_bls_plaus
|P0571
|Cruise Control/Brake Switch A Circuit Malfunction
|-
|rowspan=2|c_dtc_cam
|P0340
|Camshaft Position Sensor Circuit Malfunction
|-
|P0344
|Camshaft Position Sensor Circuit Intermittent
|-
|rowspan=2|c_dtc_cam_ex
|P0365
|Camshaft Position Sensor 'B' Circuit Bank 1
|-
|P0369
|Camshaft Position Sensor 'B' Circuit Intermittent Bank 1
|-
|rowspan=3|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
|-
|rowspan=3|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
|-
|rowspan=1|c_dtc_can_boff
|P1610
|CANbus offline
|-
|rowspan=1|c_dtc_cat_diag_1
|P0420
|Catalyst System Efficiency Below Threshold (Bank 1)
|-
|rowspan=1|c_dtc_cat_diag_2
|P0430
|Catalyst System Efficiency Below Threshold (Bank 2)
|-
|rowspan=1|c_dtc_cat_eff_1
|P0421
|Warm Up Catalyst Efficiency Below Threshold (Bank 1)
|-
|rowspan=1|c_dtc_cat_eff_2
|P0431
|Warm Up Catalyst Efficiency Below Threshold (Bank 2)
|-
|rowspan=1|c_dtc_cc
|-
|rowspan=3|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
|-
|rowspan=2|c_dtc_crk
|P0335
|Crankshaft Position Sensor A Circuit Malfunction
|-
|P0339
|Crankshaft Position Sensor A Circuit Intermittent
|-
|rowspan=1|c_dtc_cs
|P0xxx
|Clutch Switch
|-
|rowspan=1|c_dtc_ct
|-
|rowspan=1|c_dtc_ctoc
|-
|rowspan=1|c_dtc_diagcps
|P0441
|Evaporative Emission Control System Incorrect Purge Flow
|-
|rowspan=3|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
|-
|rowspan=2|c_dtc_dmtl_leak
|P0455
|Evaporative Emission Control System Leak Detected (gross leak)
|-
|P0456
|EVAP Leak Monitor Small Leak Detected
|-
|rowspan=3|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
|-
|rowspan=1|c_dtc_ecf
|P0480
|Cooling Fan 1 Control Circuit Malfunction
|-
|rowspan=2|c_dtc_ect
|P1619
|MAP Cooling Control Circuit Signal Low
|-
|P1620
|MAP Cooling Control Circuit Signal High
|-
|rowspan=1|c_dtc_ect_mec
|P0128
|Range/Performance Problem In Thermostat
|-
|rowspan=1|c_dtc_ecu
|P0604
|Internal Control Module Random Access Memory (RAM) Error
|-
|rowspan=2|c_dtc_ef
|P0477
|Exhaust Pressure Control Valve Low
|-
|P0478
|Exhaust Pressure Control Valve High
|-
|rowspan=1|c_dtc_er_ad
|P0xxx
|Misfire adaptation
|-
|rowspan=2|c_dtc_igcfb_0
|P0351
|Ignition Coil 1 Primary/Secondary Circuit Malfunction
|-
|P1301
|Misfiring Cylinder 1
|-
|rowspan=2|c_dtc_igcfb_1
|P0355
|Ignition Coil 5 Primary/Secondary Circuit Malfunction
|-
|P1305
|Misfiring Cylinder 5
|-
|rowspan=2|c_dtc_igcfb_2
|P0353
|Ignition Coil 3 Primary/Secondary Circuit Malfunction
|-
|P1303
|Misfiring Cylinder 3
|-
|rowspan=2|c_dtc_igcfb_3
|P0356
|Ignition Coil 6 Primary/Secondary Circuit Malfunction
|-
|P1306
|Misfiring Cylinder 6
|-
|rowspan=2|c_dtc_igcfb_4
|P0352
|Ignition Coil 2 Primary/Secondary Circuit Malfunction
|-
|P1302
|Misfiring Cylinder 2
|-
|rowspan=2|c_dtc_igcfb_5
|P0354
|Ignition Coil 4 Primary/Secondary Circuit Malfunction
|-
|P1304
|Misfiring Cylinder 4
|-
|rowspan=2|c_dtc_imob
|P1660
|EWS system
|-
|P1666
|EWS system
|-
|rowspan=1|c_dtc_is
|P0505
|Idle Control System Malfunction
|-
|rowspan=3|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
|-
|rowspan=3|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
|-
|rowspan=3|c_dtc_iv_0
|P0201
|Injector Circuit Malfunction - Cylinder 1
|-
|P0261
|Cylinder 1 Injector Circuit Low
|-
|P0262
|Cylinder 1 Injector Circuit High
|-
|rowspan=3|c_dtc_iv_1
|P0205
|Injector Circuit Malfunction - Cylinder 5
|-
|P0273
|Cylinder 5 Injector Circuit Low
|-
|P0274
|Cylinder 5 Injector Circuit High
|-
|rowspan=3|c_dtc_iv_2
|P0203
|Injector Circuit Malfunction - Cylinder 3
|-
|P0267
|Cylinder 3 Injector Circuit Low
|-
|P0268
|Cylinder 3 Injector Circuit High
|-
|rowspan=3|c_dtc_iv_3
|P0206
|Injector Circuit Malfunction - Cylinder 6
|-
|P0276
|Cylinder 6 Injector Circuit Low
|-
|P0277
|Cylinder 6 Injector Circuit High
|-
|rowspan=3|c_dtc_iv_4
|P0202
|Injector Circuit Malfunction - Cylinder 2
|-
|P0264
|Cylinder 2 Injector Circuit Low
|-
|P0265
|Cylinder 2 Injector Circuit High
|-
|rowspan=3|c_dtc_iv_5
|P0204
|Injector Circuit Malfunction - Cylinder 4
|-
|P0270
|Cylinder 4 Injector Circuit Low
|-
|P0271
|Cylinder 4 Injector Circuit High
|-
|rowspan=1|c_dtc_knk_1
|P0327
|Knock Sensor 1 Circuit Low Input (Bank 1 or Single Sensor)
|-
|rowspan=1|c_dtc_knk_2
|P0332
|Knock Sensor 2 Circuit Low Input (Bank 2)
|-
|rowspan=2|c_dtc_lam_dly_down_1
|P0096
|Intake Air Temperature Sensor 2 Circuit Range/Performance
|-
|P0097
|Intake Air Temperature Sensor 2 Circuit Low
|-
|rowspan=2|c_dtc_lam_dly_down_2
|P0098
|Intake Air Temperature Sensor 2 Circuit High
|-
|P0099
|Intake Air Temperature Sensor 2 Circuit Intermittent/Erratic
|-
|rowspan=2|c_dtc_lam_dly_up_1
|P1090
|Pre-Catalyst Fuel Trim Too Lean Bank 1
|-
|P1092
|Pre-Catalyst Fuel Trim Too Lean Bank 2
|-
|rowspan=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
|-
|rowspan=3|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
|-
|rowspan=3|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
|-
|rowspan=3|c_dtc_lam_stop_1
|P0171
|System too Lean (Bank 1)
|-
|P0172
|System too Rich (Bank 1)
|-
|P1314
|Fuel System Error
|-
|rowspan=3|c_dtc_lam_stop_2
|P0174
|System too Lean (Bank 2)
|-
|P0175
|System too Rich (Bank 2)
|-
|P1314
|Fuel System Error
|-
|rowspan=1|c_dtc_leak_big
|P0441
|Evaporative Emission Control System Incorrect Purge Flow
|-
|rowspan=1|c_dtc_leak_small
|P0442
|Evaporative Emission Control System Leak Detected (small leak)
|-
|rowspan=3|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)
|-
|rowspan=3|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)
|-
|rowspan=3|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
|-
|rowspan=3|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
|-
|rowspan=1|c_dtc_lsh_obd_down_1
|P0141
|O2 Sensor Heater Circuit Malfunction (Bank 1 Sensor 2)
|-
|rowspan=1|c_dtc_lsh_obd_down_2
|P0161
|O2 Sensor Heater Circuit Malfunction (Bank 2 Sensor 2)
|-
|rowspan=1|c_dtc_lsh_obd_up_1
|P0135
|O2 Sensor Heater Circuit Malfunction (Bank 1 Sensor 1)
|-
|rowspan=1|c_dtc_lsh_obd_up_2
|P0155
|O2 Sensor Heater Circuit Malfunction (Bank 2 Sensor 1)
|-
|rowspan=3|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
|-
|rowspan=3|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
|-
|rowspan=2|c_dtc_maf
|P0102
|Mass or Volume Air Flow Circuit Low Input
|-
|P0103
|Mass or Volume Air Flow Circuit High Input
|-
|rowspan=1|c_dtc_maf_mafm
|P0101
|Mass or Volume Air Flow Circuit Range/Performance Problem
|-
|rowspan=2|c_dtc_mec_isa
|P1500
|Idle Speed Control Valve Stuck Open
|-
|P1501
|Idle Speed Control Valve Stuck Closed
|-
|rowspan=1|c_dtc_mec_ivvt_ex
|P0015
|B Camshaft Position - Timing Over-Retarded (Bank 1)
|-
|rowspan=1|c_dtc_mec_ivvt_in
|P0012
|A Camshaft Position - Timing Over-Retarded (Bank 1)
|-
|rowspan=1|c_dtc_mec_sav
|P0411
|Secondary Air Injection System Incorrect Flow Detected
|-
|rowspan=1|c_dtc_min_saf
|P0491
|Secondary Air Injection System Insufficient Flow Bank 1
|-
|rowspan=4|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
|-
|rowspan=4|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
|-
|rowspan=4|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
|-
|rowspan=4|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
|-
|rowspan=4|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
|-
|rowspan=4|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
|-
|rowspan=1|c_dtc_mis_f
|P0313
|Misfire Detected With Low Fuel Level
|-
|rowspan=1|c_dtc_mis_mul
|P0300
|Random/Multiple Cylinder Misfire Detected
|-
|rowspan=1|c_dtc_mis_t_s
|P0336
|Crankshaft Position Sensor A Circuit Range/Performance
|-
|rowspan=1|c_dtc_mon_plaus
|P1602
|Control Module Self Test, Control Module Defective
|-
|rowspan=1|c_dtc_mon_tqi_av
|P1603
|Control Module Self Test, Torque Monitoring
|-
|rowspan=1|c_dtc_mon_tqi_n_max
|P1604
|Control Module Self Test, Speed Monitoring
|-
|rowspan=1|c_dtc_msw_2
|P1565
|Multifunction Steering Wheel
|-
|rowspan=1|c_dtc_msw_3
|P1565
|Multifunction Steering Wheel
|-
|rowspan=1|c_dtc_msw_tog
|P1567
|Multifunction Steering Wheel, toggle bit
|-
|rowspan=1|c_dtc_mtc_ctl_1
|P1638
|Throttle Valve Position Control; Throttle Stuck Temporarily
|-
|rowspan=1|c_dtc_mtc_ctl_2
|P1639
|Throttle Valve Position Control; Throttle Stuck Permanently
|-
|rowspan=1|c_dtc_mtc_ctl_3
|P1637
|Throttle Valve Position Control; Control Deviation
|-
|rowspan=1|c_dtc_mtc_dr
|P1636
|Throttle Valve Control Circuit
|-
|rowspan=1|c_dtc_otcc
|P1477
|Leakage Diagnostic Pump Reed Switch Did Not Open
|-
|rowspan=2|c_dtc_pvs_1
|P1122
|Pedal Position 1 Low Input
|-
|P1123
|Pedal Position 1 High Input
|-
|rowspan=2|c_dtc_pvs_2
|P1222
|Pedal Position Sensor 2 Low Input
|-
|P1223
|Pedal Position Sensor 2 High Input
|-
|rowspan=1|c_dtc_pvs_bls
|P0xxx
|Simultaneous activation of accelerator pedal and brake pedal
|-
|rowspan=1|c_dtc_pvs_bls_bts_plaus
|P0xxx
|Brakelight switch and brake test switch not plausible
|-
|rowspan=1|c_dtc_pvs_pvs
|P1120
|Pedal Position Sensor Circuit
|-
|rowspan=1|c_dtc_pvs_ratio
|P1121
|Pedal Position 1 Range/Performance Problem
|-
|rowspan=1|c_dtc_r_igcfb
|P0350
|Ignition Coil Primary/Secondary Circuit Malfunction
|-
|rowspan=2|c_dtc_rly_accout
|P0532
|A/C Refrigerant Pressure Sensor Circuit Low Input
|-
|P0533
|A/C Refrigerant Pressure Sensor Circuit High Input
|-
|rowspan=2|c_dtc_rly_efp
|P0231
|Fuel Pump Secondary Circuit Low
|-
|P0232
|Fuel Pump Secondary Circuit High
|-
|rowspan=1|c_dtc_rly_main
|P1695
|Main relay
|-
|rowspan=1|c_dtc_rly_main_dly
|P0xxx
|Delay in main relay
|-
|rowspan=1|c_dtc_sa_1
|P0491
|Secondary Air Injection System Insufficient Flow Bank 1
|-
|rowspan=1|c_dtc_sa_2
|P0492
|Secondary Air Injection System Insufficient Flow Bank 2
|-
|rowspan=1|c_dtc_sa_conf
|P0411
|Secondary Air Injection System Incorrect Flow Detected
|-
|rowspan=1|c_dtc_safm
|P1419
|Secondary Air System Air Mass Flow Sensor Disconnected or Stuck Signal
|-
|rowspan=2|c_dtc_sap
|P1413
|Secondary Air Injection Pump Relay Control Circuit Signal Low
|-
|P1414
|Secondary Air Injection System Monitor Circuit High
|-
|rowspan=1|c_dtc_sap_safm
|P0411
|Secondary Air Injection System Incorrect Flow Detected
|-
|rowspan=2|c_dtc_sav
|P0413
|Secondary Air Injection System Switching Valve A Circuit Open
|-
|P0414
|Secondary Air Injection System Switching Valve A Circuit Shorted
|-
|rowspan=1|c_dtc_sav_1_safm
|P0411
|Secondary Air Injection System Incorrect Flow Detected
|-
|rowspan=1|c_dtc_sav_safm
|P0411
|Secondary Air Injection System Incorrect Flow Detected
|-
|rowspan=1|c_dtc_t_igcfb_2
|P0350
|Ignition Coil Primary/Secondary Circuit Malfunction
|-
|rowspan=1|c_dtc_t_lam_act
|P0125
|Insufficient Coolant Temperature for Closed Loop Fuel Control
|-
|rowspan=2|c_dtc_tco
|P0117
|Engine Coolant Temperature Circuit Low Input
|-
|P0118
|Engine Coolant Temperature Circuit High Input
|-
|rowspan=2|c_dtc_tco_ex
|P1111
|Engine Coolant Temperature Radiator Outlet Sensor Low Input
|-
|P1112
|Engine Coolant Temperature Radiator Outlet Sensor High Input
|-
|rowspan=1|c_dtc_tco_max
|P0116
|Engine Coolant Temperature Circuit Range/Performance Problem
|-
|rowspan=1|c_dtc_teg_down_1
|P0xxx
|Exhaust gas temperature post-cat, bank1
|-
|rowspan=1|c_dtc_teg_down_2
|P0431
|Exhaust gas temperature post-cat, bank2
|-
|rowspan=1|c_dtc_teg_up_1
|P0431
|Exhaust gas temperature pre-cat, bank1
|-
|rowspan=1|c_dtc_teg_up_2
|P0431
|Exhaust gas temperature pre-cat, bank2
|-
|rowspan=2|c_dtc_tia
|P0112
|Intake Air Temperature Circuit Low Input
|-
|P0113
|Intake Air Temperature Circuit High Input
|-
|rowspan=2|c_dtc_toil
|P0197
|Engine Oil Temperature Sensor Low
|-
|P0198
|Engine Oil Temperature Sensor High
|-
|rowspan=1|c_dtc_tout_amt_1
|P1611
|Serial Communicating Link Transmission Control Module
|-
|rowspan=1|c_dtc_tout_asr_1
|P1613
|Time-out ASR1
|-
|rowspan=1|c_dtc_tout_asr_3
|P1613
|Time-out ASR3
|-
|rowspan=1|c_dtc_tout_cng_ecu_1
|P0xxx
|Time-out CNG ECU
|-
|rowspan=1|c_dtc_tout_etcu_1
|P0600
|Serial Communication Link Malfunction
|-
|rowspan=1|c_dtc_tout_icl_2
|P1612
|Time-out instrument cluster2
|-
|rowspan=1|c_dtc_tout_icl_3
|P1612
|Time-out instrument cluster3
|-
|rowspan=2|c_dtc_tout_imob
|P1661
|Time-out EWS system
|-
|P1662
|Time-out EWS system
|-
|rowspan=1|c_dtc_tout_pste_1
|P0xxx
|Time-out PowerSteering
|-
|rowspan=2|c_dtc_tps_1
|P0122
|Throttle/Pedal Position Sensor/Switch A Circuit Low Input
|-
|P0123
|Throttle/Pedal Position Sensor/Switch A Circuit High Input
|-
|rowspan=2|c_dtc_tps_2
|P0222
|Throttle/Pedal Position Sensor/Switch B Circuit Low Input
|-
|P0223
|Throttle/Pedal Position Sensor/Switch B Circuit High Input
|-
|rowspan=4|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
|-
|rowspan=1|c_dtc_tps_maf_1
|P0121
|Throttle/Pedal Position Sensor/Switch A Circuit Range/Performance Problem
|-
|rowspan=1|c_dtc_tps_maf_2
|P0221
|Throttle/Pedal Position Sensor/Switch B Circuit Range/Performance Problem
|-
|rowspan=1|c_dtc_tps_st_chk_1
|P1675
|TPS stuck, sensor 1 check condition
|-
|rowspan=1|c_dtc_tps_st_chk_2
|P1694
|TPS stuck, sensor 2 check condition
|-
|rowspan=3|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
|-
|rowspan=1|c_dtc_tqi_lim
|P1605
|Limiting criteria for indicated torque
|-
|rowspan=1|c_dtc_tqi_n_max_nvmy_mon
|P1604
|Control Module Self Test, Speed Monitoring
|-
|rowspan=3|c_dtc_var_amp
|P1171
|Ambient Pressure Sensor Learned Value Error
|-
|P1172
|Ambient Pressure Sensor Rationality Check
|-
|P1173
|Ambient Pressure Sensor Rationality Check
|-
|rowspan=1|c_dtc_vcc_poti_1
|P1624
|Pedal Position Sensor Potentiometer Supply Channel 1 Electrical
|-
|rowspan=1|c_dtc_vcc_poti_2
|P1625
|Pedal Position Sensor Potentiometer Supply Channel 2 Electrical
|-
|rowspan=2|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
|-
|rowspan=2|c_dtc_vim
|P1512
|DISA Control Circuit Signal Low
|-
|P1513
|DISA Control Circuit Signal High
|-
|rowspan=3|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)
|-
|rowspan=3|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)
|-
|rowspan=2|c_dtc_vls_down_act_chk_1
|P1143
|???
|-
|P1144
|???
|-
|rowspan=2|c_dtc_vls_down_act_chk_2
|P1149
|???
|-
|P1150
|???
|-
|rowspan=1|c_dtc_vls_down_afl_1
|P0139
|O2 Sensor Circuit Slow Response (Bank 1 Sensor 2)
|-
|rowspan=1|c_dtc_vls_down_afl_2
|P0159
|O2 Sensor Circuit Slow Response (Bank 2 Sensor 2)
|-
|rowspan=1|c_dtc_vls_down_post_puc_1
|P1097
|O2 Sensor Circuit Slow Response after Coast Down Fuel Cutoff (Bank 1 Sensor 1)
|-
|rowspan=1|c_dtc_vls_down_post_puc_2
|P1098
|O2 Sensor Circuit Slow Response after Coast Down Fuel Cutoff (Bank 2 Sensor 2)
|-
|rowspan=1|c_dtc_vls_down_t_1
|P0139
|O2 Sensor Circuit Slow Response (Bank 1 Sensor 2)
|-
|rowspan=1|c_dtc_vls_down_t_2
|P0159
|O2 Sensor Circuit Slow Response (Bank 2 Sensor 2)
|-
|rowspan=3|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)
|-
|rowspan=3|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
|???
|-
|rowspan=1|c_dtc_vls_stk_1
|P0136
|O2 Sensor Circuit Malfunction (Bank 1 Sensor 2)
|-
|rowspan=1|c_dtc_vls_stk_2
|P0156
|O2 Sensor Circuit Malfunction (Bank 2 Sensor 2)
|-
|rowspan=3|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)
|-
|rowspan=3|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)
|-
|rowspan=1|c_dtc_vs
|P0500
|Vehicle Speed Sensor Malfunction
|}


=Extra Features=
=Extra Features=
This section describes extra functions or modification that where not intended by Siemens or BMW.


==Engine Coolant Temperature Control==
==Engine Coolant Temperature Control==
Line 1,688: Line 973:
[[File:Coolant-config.JPG|300px|thumb|none|TunerPro depiction of Coolant Maps]]
[[File:Coolant-config.JPG|300px|thumb|none|TunerPro depiction of Coolant Maps]]


==Secondary Air Pump Delete==
==Electronic Coolant Fan Control==
For forced OBD Readiness set C_CONF_SAP: "1"
The cooling fan is controlled by MS43 via a PWM output signal. The fan speed depends on exhaust temperature, radiator ouput temperature, climate control requirement and vehicle speed.


==Lambda Sensor Configuration==
*'''ip_n_ecf__tco_ex''' - Electric coolant fan minimum speed stage depending on radiator outlet temperature
Constant "c_conf_cat" has five different options which represent the ecu´s ability to work with different lambda probe setups.
*'''ip_n_ecf_temp_cat__temp_cat''' - Electric coolant fan minimum speed stage depending on catalyst temperature
*'''id_n_ecf_min_accin__n_ecf''' - Electric coolant fan minimum speed stage CAN-bus request
*'''ip_n_ecf_vs_cor__vs''' - Vehicle speed correction of electric coolant fan speed


Set the following values that suit you needs:
==Secondary Air Pump Removal==
 
When removing the secondary air pump the ecu needs to be configured to ignore the removed sap equipment.
*0: Single bank with one pre-cat lambda sensor or cat-preparation (SA199)
To instruct the ecu that there is no secondary air pump installed set '''c_conf_sap''' to 1 and clear the "learned variants" adaptation in the ecu.
*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==
==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.  
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 diameter 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.
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.
Line 1,715: Line 994:
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 with a patch that has undergone extensivetesting, but the maximum engine load is still limited to 1389mg/stroke.
There is a factory airflow limit of 1024kg/h that can be doubled with a patch that has undergone extensive testing, 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,727: Line 1,004:


==Engine Speed Limiter==
==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 MS43 has two gear dependent engine speed limiters, a soft-limiter and a hard-limiter 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.
The soft-limiter works by cutting single injectors based on fuel-cut pattern, whereas the hard-limiter immediately cuts off all cylinders.


*'''id_n_max_at''': softlimiter for AT gearbox
*'''id_n_max_at''': soft-limiter for AT gearbox
*'''id_n_max_mt''': softlimiter for MT gearbox
*'''id_n_max_mt''': soft-limiter for MT gearbox and SMG
*'''id_n_max_max_at''': hardlimiter for AT gearbox
*'''id_n_max_max_at''': hard-limiter for AT gearbox
*'''id_n_max_max_mt''': hardlimiter for MT gearbox
*'''id_n_max_max_mt''': hard-limiter for MT gearbox and SMG


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.
In addition to that, there is a maximum engine speed threashold for the soft limiter '''id_n_max_vs_max_at__gear''' or '''id_n_max_vs_max_mt__gear'''. If engine speed exceeds this value the soft limiter will be disabled.


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.
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.
Line 1,749: Line 1,026:


==Vehicle Speed Limiter==
==Vehicle Speed Limiter==
The Siemens MS43 has several vehicle speed limiter for different situations.
The maximum allowed vehicle speed is dependent on the transmission type and operates in two stages.
 
The first stage consist of a soft limiter where the ecu will shut down cylinders to prevent the vehicle speed from increasing.
The activation point of the soft limiter is defined by the following variables:
*'''c_vs_max_at_1''' - Maximum vehicle speed automatic transmission
*'''c_vs_max_mt_1''' - Maximum vehicle speed manual transmission
 
 
The second stage consist of a hard limiter where the ecu will shut down the fuel pump to prevent the vehicle speed from increasing.
The activation point of the hard limiter is calculated by adding '''c_vs_max_add''' to the soft limiter threshold.
'''ov_vs_max_max = c_vs_max_[at/mt]_1 + c_vs_max_add'''
 
*'''c_vs_max_add''' - Additive fuel cut hard limit for vehicle speed
 
 
By maxing out '''c_vs_max_[at/mt]_1''' and '''c_vs_max_add''' the vehicle speed limit can be increased to 287km/h.  


The maximum vehicle speed limiter is depending on the transmission type and only becomes active when the engine speed threshold is passed.
To completely disable the vehicle speed limiter set '''c_n_min_vs_max''' to 8160rpm.
*'''c_vs_max_at_1''' - Applicable maximum speed automatic transmission
*'''c_n_min_vs_max''' - Minimum engine speed for activation of vehicle speed limiter
*'''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
There is also some additional vehicle speed limits that will override in different scenarios:
*'''c_vs_max_toil_max''' - Maximum speed when exceeding the max. oil temperature (c_toil_max)
*'''c_vs_max_toil_max''' - Maximum speed when exceeding the max. oil temperature (c_toil_max)
*'''c_vs_max_amt''' - Maximum speed with an active ssg error


=Safety Features=
=Safety Features=
Line 1,780: Line 1,070:


==Misfire Detection==
==Misfire Detection==
*c_n_min_er: minimum engine speed for detection of misfire!  
*'''c_n_min_er''': minimum engine speed for detection of misfire!  
*c_n_max_er: maximum engine speed for detection of misfire!
*'''c_n_max_er''': maximum engine speed for detection of misfire!
 
==Knock Detection==
The ECU samples the knock sensor voltage several times during the measurement window set by the '''id_knkwb_[0-5]''' and '''id_knkwe_[0-5]''' tables and the biggest reading is then selected for further processing to calculate the noise level for each cylinder '''nl_[0-5]'''.


To determine the level 1 knock (light knock) threshold the '''nl_[0-5]''' data is multiplied with the '''ip_fac_knk_[0-5]''' tables and if the knock signal '''knks_[0-5]''' exceeds this threshold a level 1 knock event is signaled.


==Knock Detection==
To determine the level 2 (heavy knock) knock threshold the level 1 knock threshold is multiplied by the '''id_fac_knks_thd__tia''' table.
*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


If the multiplication factors in the '''ip_fac_knk_[0-5]'''/'''id_fac_knks_thd__tia''' tables is made smaller it will make the knock detection logic more sensitive and if they are made bigger the multiplication factor will make the knock detection logic less sensitive.


==Injection Adaptation==
Ignition angle retards are specified in the following tables:
*c_n_ti_ad_fac_min: min engine speed to allow adapation of fuel trim, multiplicative
*'''id_iga_dec_knk_1__n''': ignition angle reduction based on knock stage1
*c_n_ti_ad_add_max: max engine speed to allow adapation of fuel trim, additive
*'''id_iga_dec_knk_2__n''': ignition angle reduction based on knock stage2


=Special Functions=
=Special Functions=
'''Please look here for the old 430056 functions that were published by Daniel.F back in 2015: [[Siemens_MS43_Old_Stuff]]'''
'''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==
==Differential Vehicle Speed Sensor Mod For E30/E34==
Line 1,809: Line 1,096:
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)   
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
'''Note:''' This only affects ECU data acquisition and not the dashboard view, but its helpful for speed based parameters like LC config


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


Unfortunately this low value will make the reading very unprecise. For a fix check out the [[TunerPro_MS43_Community_Patchlist|MS43 Commuinity Patchlist]].
Unfortunately this low value will make the reading very unprecise. For a fix check out the [[TunerPro_MS43_Community_Patchlist|MS43 Commuinity Patchlist]].
Line 1,860: Line 1,147:
If you want to machine a matching plug, use this template: [[:File:ISA Delete Plug.pdf|ISA_Delete_Plug.pdf]]
If you want to machine a matching plug, use this template: [[:File:ISA Delete Plug.pdf|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.
The most important change that makes the ICV delete possible is the changes to the '''ip_pvs_isa_isapwm''' table. This table is used by the ecu to decide if any additional pvs input should be added to the drivers requested pvs input for a given idle control 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.
In the stock setup the ecu will primarily try to use the idle control valve to alternate the air going into the engine during idle, but if the ecu encounters a scenario where it needs more air than what the idle control valve is capable of delivering at 100% duty cycle the '''ip_pvs_isa_isapwm''' table will help by translating the duty cycle to an additional pvs input that will be added to the drivers requested pvs input (which will be zero at idle as the driver isn't touching the throttle).
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.
If take a look at the stock M54B30 '''ip_pvs_isa_isapwm''' table we will see that at 109% idle control duty cycle the table will add 17.5 degrees of pvs input and with an idle speed of 700 rpm the '''ip_tps_sp_pvs''' table would give us a throttle opening of 1.699 degrees.
 
If we then look at a scenario where ecu only needs a idle control duty cycle of 75% then the '''ip_pvs_isa_isapwm''' table will add 15 degrees of pvs input and with the same idle speed of 700 rpm the '''ip_tps_sp_pvs''' table would give us a throttle opening of 0 degrees which means the engine will only be receiving air from the idle control valve.
 
So when we remove the idle control valve we re-scale the '''ip_pvs_isa_isapwm''' table to emulate the idle control valve air flow with the help of the electronic throttle.


[https://docs.google.com/file/d/1iuopuis61GzssKOn_d_DbgekmFZEyXzd/edit?usp=docslist_api&filetype=msexcel Copyable ICV Delete Tables M54B30 ONLY!].
[https://docs.google.com/file/d/1iuopuis61GzssKOn_d_DbgekmFZEyXzd/edit?usp=docslist_api&filetype=msexcel 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.
The '''ip_pvs_isa_isapwm''' table 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 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. [[#Checksums|Check here for more information about checksums.]]
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.]]
Line 1,888: Line 1,178:




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.
Additionally you have to raise the minimum engine speed threshold for the misfire detection '''c_n_min_er''' above your desired idle speed setpoint because 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°)
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°)
Line 1,898: Line 1,188:


[[File:GhostCam.jpg|300px|thumb|none|TunerPro depiction of GhostCam mod]]
[[File:GhostCam.jpg|300px|thumb|none|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:
*'''430056:''' [[:File:Siemens_MS43_MS430056_Cluster_LED_Mod_v2.zip|Siemens_MS43_MS430056_Cluster_LED_Mod_v2.zip]]
*'''430066:''' [[:File:Siemens_MS43_MS430066_Cluster_LED_Mod.zip|Siemens_MS43_MS430066_Cluster_LED_Mod.zip]]
'''Use with 512kByte file only. Checksum correction required!'''
[[File:TP_MS43_M3_Cluster_Warmuplights.PNG|320|M3 Cluster warmuplight maps]] [[File:TP_MS43_M3_Cluster_Shiftlights.PNG|320|M3 Cluster shiftlight maps]]
<youtube>jYAudhc02nQ</youtube>


== Map Reduction ==
== Map Reduction ==
[[File:Siemens MS43 Map Reduction.png|thumb|MS43 Map Reduction]]
[[File:Siemens MS43 Map Reduction.png|thumb|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.
The ecu is setup with cold(tco_1) and hot(tco_2) engine tables for the fuel, ignition and vanos functions which gives us a more fine grained control of the tuning throughout the engine operating range but it also leaves us with a lot of tables to keep track of.  


This is done by forcing the MS43 into using the cold engine injection, ignition and VANOS maps for cold enigne only.
If we want to reduce the number of tables that are used we can force the ecu into using the cold(tco_1) engine tables by setting the  
 
following cold/hot engine transition tables to "1.0":
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_is_ivvt
* ip_fac_pl_ivvt
* ip_fac_pl_ivvt
Line 1,957: Line 1,202:
* ip_fac_cam_sp_ex_pl
* ip_fac_cam_sp_ex_pl


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


* '''Injection'''
* '''Injection'''
Line 1,973: Line 1,218:




'''ATTENTION:''' Be aware that the following tables can be used if there is an active error in the ECU:
'''ATTENTION:''' Be aware that the following tables will still be used if there is an active error in the ecu so don't forget to tune them as well.
*ip_tib__n__maf
*ip_tib__n__maf
*ip_igab_is__n__maf
*ip_igab_is__n__maf
Line 2,061: Line 1,306:
[[File:vanos_tweak.jpg|DoCr VANOS Tweak]]
[[File:vanos_tweak.jpg|DoCr VANOS Tweak]]


===Explaination===
===Explanation===
For stock engine with stock exhaust and intake flow, above VANOS tune works best.
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.
For a modded engine, or stock with free flowing exhaust and cold air intake, valve overlap can help increase volumetric efficiency at middle engine speeds (~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
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
Line 2,082: Line 1,327:
Also, do changes for intake only, leave exhaust alone if you are on stock exhaust manifold.
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)
'''note'''  Theoretically, 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)
 
=Tuning For Turbocharged Applications=
 
Here is a list of most of the maps that need to be changed when tuning for turbo setups.
 
It may also apply to supercharged setups, however there may be slight differences here and there because of how the power is delivered.
 
Fuel maps are not listed here because there is a section dedicated to scaling for aftermarket injectors.
 
If only a single value is listed and the map is a table, that means fill the entire table with that single value.
 
You should also consider [[Siemens_MS43#Extending_Load_Filtration_For_Forced_Induction|Extending Load Filtration For Forced Induction]], [[Siemens_MS43#Aftermarket_Injector_Scaling|Aftermarket Injector Scaling]], and [[Forced Induction Upgrades]].
 
{| class="wikitable mw-collapsible mw-collapsed"
!rowspan="1"|Map
!colspan="2"|Value
 
|-
|c_abc_inc_vim
|0
|-
 
|-
|c_conf_cat
|0
|-
 
|-
|c_maf_max_diag
|2048
|-
 
|-
|ldpm_maf_8
|35
|75
|125
|175
|250
|325
|400
|450
|550
|700
|950
|1250
|-
 
|-
|ldpm_maf_iga_1
|50
|75
|125
|175
|250
|325
|400
|500
|600
|700
|950
|1350
|-
 
|-
|ldpm_maf_iga_2
|50
|75
|100
|125
|175
|250
|300
|325
|400
|500
|600
|700
|850
|1000
|1150
|1350
|-
 
|-
|ldpm_maf_mes_1
|76
|125
|272
|376
|523
|1002
|-
 
|-
|ldpm_map_1
|100
|200
|300
|600
|900
|1050
|1250
|2000
|-
 
|-
|ldpm_n_11
|600
|1000
|1200
|1500
|1600
|2000
|2500
|3000
|3500
|3900
|4100
|4500
|4800
|5500
|6300
|7000
|-
 
|-
|ldpm_n_14
|320
|600
|900
|1000
|1200
|1500
|1600
|2000
|2250
|2500
|3000
|3500
|3900
|4100
|4500
|4800
|5100
|5500
|6300
|7000
|-
 
|-
|ldpm_n_4
|600
|1000
|1200
|1500
|1600
|2000
|2500
|3000
|3500
|3900
|4100
|4500
|4800
|5500
|6300
|7000
|-
 
|-
|id_maf_tab
|Varies by maf
|-
 
|-
|ip_ti_fl__n
|0.016
|-
 
|-
|ip_iga_ron_91_pl_ivvt__n__maf
|Decrease above 500mg/stk
|-
 
|-
|ip_iga_ron_98_pl_ivvt__n__maf
|Decrease above 500mg/stk
|-
 
|-
|ip_maf_min_cop__n__iga_dif
|1389
|-
 
|-
|ip_maf_min_cop_ron__n__iga_dif
|1389
|-
 
|-
|ip_ti_cop_nr_1_1__n__maf
|0
|-
 
|-
|ip_ti_cop_nr_1_2__n__maf
|0
|-
 
|-
|ip_ti_cop_nr_2_1__n__maf
|0
|-
 
|-
|ip_ti_cop_nr_2_2__n__maf
|0
|-
 
|-
|ip_ti_cop_nr_3_1__n__maf
|0
|-
 
|-
|ip_ti_cop_nr_3_2__n__maf
|0
|-
 
|-
|ip_ti_cop_nr_4_1__n__maf
|0
|-
 
|-
|ip_ti_cop_nr_4_2__n__maf
|0
|-
 
|-
|ip_ti_cop_nr_5_1__n__maf
|0
|-
 
|-
|ip_ti_cop_nr_5_2__n__maf
|0
|-
 
|}

Latest revision as of 13:43, 24 February 2024

The Siemens MS43 engine control unit (ECU) uses an Infineon C167CR_SR CPU clocked at 24MHz 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 flash memory can be separated into three major sections, first comes the bootloader, then the program code, and lastly the calibration data.

See the following table for where the sections are located:

Start End Section Size
00000 0FFFF Bootloader & UIF 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

This section is 64 kilobytes in size and contains the boot code that initializes the ecu and verifies that everything is ok before control is handed over to the program code section. This section also contains one time writeable data such as immobilizer information and user information fields (UIF).

Program Code Section

This section is 384 kilobytes in size and contains the program code that operates the engine.

Calibration Data Section

This section is 64 kilobytes in size and contains the calibration data that the program code uses to operate the engine.

Checksums

The MS43 uses three CRC16 checksums that verifies the data integrity of the boot, program and calibration sections and two addition checksums that verifies the data integrity of the system monitoring (_mon) parameters. If any of the checksums are incorrect the ecu assumes that the data on flash has been corrupted and it won't allow the engine to start.

When correcting the checksum the 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

Note: It's not advised to disable the calibration checksums as the ecu looses the ability to verify the data integrity of the calibration data.

Disable CRC16 Checksum

To disable the CRC16 calibration checksum do the following.

Hexeditor
1. Set Word at 0x73FFE to 0xFFFF
2. Set Byte at 0x6FFB0 to 0xA8
3. Change the Byte in the table from 0x84 to 0x94
Firmware Location
430037 0x58999
430055 0x5B87D
430056 0x5B87F
430064 0x5FEB3
430066 0x63595
430069 0x63595

Disable Monitor Checksum

Warning: Disabling the calibration monitor checksum should be avoided as it's an important part of the drive by wire safety system. To disable the calibration monitor 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

As the MS43 ecu is used in many different chassis configurations it uses a combination of configuration switches and automatic learning routines to detect which features or behaviors should be enabled.

Switches

Configuration brake light test switch logic variant (c_conf_bts)

  • 0: Signal high corresponds to 'brake pedal pressed'
  • 1: Signal low corresponds to 'brake pedal pressed'

Configuration exhaust system variant (c_conf_cat)

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

After changing c_conf_cat you need to unplug all lambda sensors you won't be using and then clear the "learned variants" adaptation in the ecu. This will instruct the ecu to re-learn which lambda sensor configuration it should be using.

For example if you are removing the post-cat lambda sensors in a dual bank setup you need to set "c_conf_cat" to "1", unplug both post-cat lambda sensors and then clear the "learned variants" adaptation.

Note: CATV variant (SA199) corresponds to a vehicle with no oxygen sensors mounted in the exhaust.

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, function and diagnosis OFF
  • 1: DMTL module present, function and diagnosis ON

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 temperature sensor variant (c_conf_teg)

  • 0: Automatic learning of EGT sensors
  • 1: No EGT sensors
  • 2: Dual bank exhaust system with four EGT sensors

To re-do the exhaust gas temperature learning process the "learned variants" adaptation needs to cleared in the ecu.

Configuration torque limit first gear variant (c_conf_tq_lim_gear)

  • 0: First gear torque limiter not active
  • 1: First gear torque limiter active (E53)

Configuration SAP (Secondary Air Pump) variant (c_conf_sap)

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

To re-do the secondary air pump learning process the "learned variants" adaptation needs to cleared in the ecu.

Gearbox variant detection

To accommodate different gearbox configurations the ecu will monitor the CAN-bus for certain CAN messages.

  • If the EGS1 CAN message is detected then the gearbox variant will be set to automatic (at)
  • If the SSG1 CAN message is detected then the gearbox variant will be set to manual automatic (amt)
  • If neither of the above messages are detected the gearbox variant will be set to manual (mt)

When the detection is made the result is stored on the on-board EEPROM.

To re-do the gearbox variant learning process the "learned variants" adaptation needs to cleared in the ecu.

Air condition system detection

To detect if an air condition system is mounted the ecu will monitor the CAN-bus for the INSTR3 CAN message, if the message is detected the air condition system logic is activated.

When the detection is made the result is stored on the on-board EEPROM.

To re-do the air condition system learning process the "learned variants" adaptation needs to cleared in the ecu.

Steering angle sensor detection

To detect if steering angle sensor is mounted the ecu will monitor the CAN-bus for the LWS1 CAN message, if the message is detected the steering angle sensor logic is activated.

When the detection is made the result is stored on the on-board EEPROM.

To re-do the steering angle sensor learning process the "learned variants" adaptation needs to cleared in the ecu.

Ignition coil detection

Midways into the production cycle of the MS43 the 300g ignition coils was replaced with pencil ignition coils. To accommodate the different ignition coil configurations a new hardware revision Index 04 was introduced alongside a new detection logic where the ecu checks if pin X60002.12 is connected to terminal 87 (main relay output). If the pin is not connected then 300g coils are mounted and if it's connected then pencil coils are mounted. When the detection is made the result is stored on the on-board EEPROM.

To re-do the ignition coil learning process the "learned variants" adaptation needs to cleared in the ecu.

Note: If pencil coils are used with an older Index 03 MS43 or an Index 04 or newer MS43 without the X60002.12 jumper wire retrofitted the values from the _pc_ ignition coil tables can be copied over to their _300_ counterparts.

Pencil Coil Data

Ambient pressure sensor detection

Midways into the production cycle of the MS43 the Motorola ambient pressure sensor was replaced with a smaller Infineon version. To accommodate the different configurations a new detection logic was implemented where the ecu checks the voltage on one of the ambient pressure sensors input pins. If the voltage is less than c_v_var_amp a Motorola sensor is mounted and if the voltage is greater an Infineon sensor is mounted.

When the detection is made the result is written into the boot sector area at address 0x3EEC-0x3EF1. The ecu will fill this area with the values 0xA5 if a Motorola sensor was detected and 0x5A if an Infineon sensor was detected.

Due to the boot sector being used to store the detected variant the ambient sensor learning process can normally only be done once in the ecu's lifetime but if we use boot mode the learning process can be reset by filling the area at 0x3EEC-0x3EF1 with the values 0xFF.

Mass Air Flow Sensor

M54B30 MAF Scalar

The mass airflow sensor is one of the most important sensors as it allows the engine management system to measure how much air is entering the intake system and it's a key component for many calculations.

MS43 uses a MAF sensor that outputs a 0-5V signal that is then converted to a kg/h reading.

There is also provision for a secondary MAF sensor that was planned to be used to meter the air entering the secondary air pump system but is was never used in production.

The analog signals are converted to a MAF reading in kg/h by the following scalars.

  • id_maf_tab - MAF Sensor Scalar 1x256
  • id_saf_tab - Secondary Air MAF Sensor Scalar 1x256
  • id_maf_tab__v_maf_1__v_maf_2 - MAF Sensor Scalar 16x16
  • id_saf_tab__v_saf_1__v_saf_2 - Secondary Air MAF Sensor Scalar 16x16

An important note for the sensor definition tables is that there is no configurable voltage scale as the voltage scale is based upon the resolution of the ADC input and no interpolation is performed on the data in the tables.

For better visualization the voltage scale is only included in the 1x256 tables, the 16x16 tables are only numbered.

Input Monitoring

To diagnose the mass airflow sensor values the mass airflow sensor input is continuously monitors that the voltage is between the thresholds that are set by the following variables:

  • c_maf_max_diag - Maximum load threshold to trigger a short to positive fault
  • c_maf_min_diag - Minimum load threshold to trigger a short to ground fault

If the voltage falls outside these thresholds an error code will be set for the MAF sensor input and MAF failsafe mode will be activated.

When increasing the engine breathing capabilities c_maf_max_diag should be raised to a value just above the maximum load values that the engine can produce.

Failsafe Mode

In case of a mass airflow sensor failure or malfunction the MAF failsafe mode is activated and the MAF sensor load reading will be substituted with the values from the MAF diagnosis table.

  • ip_maf_1_diag__n__tps_av - MAF diagnosis table used as a load substitute if there is a MAF sensor error
    • X axis: throttle position sensor value (tps_av)
    • Y axis: engine speed (n)

The MAF diagnosis table is also used during normal operation to filter VANOS load and diagnosis purposes so if the engine is modified to consume more air it's advisable to re-tune the MAF sensor substitute table to keep the load values as accurate as possible.

When doing this it's good practice to data log MAF sensor load, accelerator pedal value and engine speed to create a histogram table that can be used as a base when modifying the MAF sensor substitute table.

Note: Be aware that the MAF sensor substitute table can not accurately model all factors that affects the engines breathing capabilities so it's not advisable to use it as a replacement for a real MAF sensor.

Engine Load

During operation several filtered engine load parameters are created with the most important ones for tuning being the following:

  • Injection load (maf_ti)
  • Ignition Load (maf_iga)
  • VANOS load (maf_ivvt)

Note: Many logging options only reports the engine load measured by the mass airflow sensor that can vary greatly from the filtered loads which can give an incorrect view on what is actually happening.

In boosted applications it's really important that the injection load is monitored and tuned correctly as otherwise the engine will run into a "lean-wall" when hitting positive manifold pressure. See Extending VO Tables For Forced Induction for tuning guidelines.

Injection Load

Intake Manifold Volume Model

The load filtering process for the injection load is used to account for changes in the engines volumetric efficiency due to the variable valve overlap induced by the variable valve timing. This filtration process is in short an optimized version of the speed density control strategy where several steps are pre-calculated and stored in tables which are retrieved at runtime.

Calculated Manifold Pressure

First the ecu calculates the manifold absolute pressure with the help of Clapeyrons ideal gas equation by taking the effective intake manifold volume, the engine speed, the current airflow reading from the mass airflow sensor and the volumetric efficiency of the engine defined by the vo tables into account.

So for example if the mass airflow sensor measured that 200 mg/stk of air entered the intake manifold and the vo tables defined that the engine at the current intake pressure and engine speed can only consume 100 mg/stk of air then the remaining 100 mg/stk of air must still be inside the intake manifold which increases the pressure inside the intake manifold.

The effective intake volume is different between increasing and decreasing load scenarios and is 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

The more accurate these models and the MAF sensor readings is, the more accurate the calculated manifold absolute pressure value will be that's used in the next step.

Volumetric Efficiency Calculation

After the current manifold pressure is calculated 8 volumetric efficiency lookup tables ip_maf_vo_[1-8]__map__n and a selection table ip_nr_ip_maf__vo selects the active vo table based on the current valve overlap.

The vo tables can be viewed as speed density lookup tables that contains the pre-calculated results of the speed density formula at different engine speed and intake pressures. The values represent how much air is able to enter the cylinders for a given valve overlap during an engine revolution.

  • ip_nr_ip_maf__vo - Active vo table for speed density calculation
  • ip_maf_vo_1__map__n - Engine volumetric effiency - Valve overlap step 1
  • ip_maf_vo_2__map__n - Engine volumetric effiency - Valve overlap step 2
  • ip_maf_vo_3__map__n - Engine volumetric effiency - Valve overlap step 3
  • ip_maf_vo_4__map__n - Engine volumetric effiency - Valve overlap step 4
  • ip_maf_vo_5__map__n - Engine volumetric effiency - Valve overlap step 5
  • ip_maf_vo_6__map__n - Engine volumetric effiency - Valve overlap step 6
  • ip_maf_vo_7__map__n - Engine volumetric effiency - Valve overlap step 7
  • ip_maf_vo_8__map__n - Engine volumetric effiency - Valve overlap step 8

As the current valve overlap will not always be exactly at the 8 different valve overlap breakpoints defined in the ip_nr_ip_maf table the ecu will interpolate the load value between the ip_maf_vo_[1-8] tables so for example if the current valve overlap is halfway between the ip_maf_vo_1 table and the ip_maf_vo_2 table then the ecu will combine half of the load value from the ip_maf_vo_1 table with half of the load value from the ip_maf_vo_2 table.

Note: In stock form these tables are setup to support manifold pressures between 50hPa and 1250hPa which gives some headroom to compensate for outside ambient pressure. In boosted applications the manifold pressure axis of these tables will need to be extended to allow higher pressures to be processed correctly. For boosted applications see Extending VO Tables For Forced Induction for tuning guidelines.

Coolant temperature correction

Due to the speed density calculation being pre-calculated with an assumed temperature of the air entering the cylinders the output from the ip_maf_vo_[1-8]__map__n tables is multiplied with a correction factor from the ip_maf_tco_cor__tco table to correct the output for the cooling/heating effect the engine temperature will have on the air entering the cylinders.

VANOS Load

The VANOS load is filtered with a simple weighting factor that blends between load measured by the MAF sensor and load read from the MAF sensor substitute table.

Siemens MS43 Maf Substitute.png

Vanos Load Weighting Factor.png

The blending factor is setup to mostly rely on the load measured by the MAF sensor during low load and as the load readings start to climb the factor start to gravitate more and more against the readings from the MAF sensor substitute table.

This is done to provide a more stable load reading for the VANOS control logic when MAF sensor readings are changing rapidly.

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

When the engine is modified to consume more air it's advisable to re-tune the MAF sensor substitute table to keep the VANOS load as accurate as possible. See MAF Failsafe Mode for tuning guidelines.

Extending VO Tables For Forced Induction

In stock form the VO tables are setup to support manifold pressures between 50hPa and 1250hPa which gives some headroom to compensate for outside ambient pressure. But a boosted applications can easily exceed 1250hPa of pressure so for the ecu to be able to correctly operate above this pressure we need to re-scale the pressure axis for the VO tables.

On an engine running stock cams the following values can be used as a guideline. We have also prepared an Excel sheet that can be used 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 that should get you in the ballpark so further tuning may be needed, ideally a real map sensor should be connected to the engine to verify that the calculated map values are correct.

After hundreds of 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.

When doing a M50 manifold conversions it could be a good idea to take a look at the intake models in the Alpina B3S binary, the Alpina manifold is pretty similar to the M50 so the intake model values should be closer than the M54 intake models.

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, enrichment and enleanment factors 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

During normal operation the ecu interpolates between the cold and warm injection tables. There are individual tables for each cylinder bank.

Cold Engine

  • ip_ti_tco_1_is_ivvt__n__maf - Injection time used during idle. Cold engine
  • ip_ti_tco_1_pl_ivvt_1__n__maf - Injection time used for bank 1 during part load. Cold engine
  • ip_ti_tco_1_pl_ivvt_2__n__maf - Injection time used for bank 2 during part load. Cold engine

Warm Engine

  • ip_ti_tco_2_is_ivvt__n__maf - Injection time used during idle. Warm engine
  • ip_ti_tco_2_pl_ivvt_1__n__maf - Injection time used for bank 1 during part load. Warm engine
  • ip_ti_tco_2_pl_ivvt_2__n__maf - Injection time used for bank 2 during part load. Warm engine

Axis Values

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

Important: With an active VANOS fault the ecu will fall back to using the base injection time table ip_tib__n__maf to derive the injection time, so don't forget to also update this table after tuning the part-load tables.

Transition between cold/warm engine operation

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)

Full load operation

During full load operation the part load injection time is multiplied by an enrichment factor defined by the ip_ti_fl table to produce a richer air fuel ratio to cool the combustion temperatures and prevent detonation.

Viewing full load enrichment table as Lambda/AFR

Full load injection converted to lambda and AFR

To make tuning of the full load operation easier, you can change the conversion factor of the ip_ti_fl__n table to display lambda or AFR depending on your preference.

Warning: Keep in mind, that to reach the lambda/AFR values in the table the part load injection tables needs to be properly tuned to deliver the correct amount of fuel for stochiometric 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

Cat preparation operation

If the ecu is in the "cat preparation"/CATV state i.e. there are no lambda sensors connected to the ecu then the part-load injection time will be leaned out by the ip_ti_cat_var__n__maf table.

Maximum Duty Cycle

Maximum Injection Time Calculator

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.

Note: The table on the right 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 injection 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.

The maps to scale are:

  • ip_tipr_cst__tco - Pre cold start injection time basic value
  • ip_ti_cst__n__tco - Cranking injection time basic value
  • ip_tib__n__maf - Basic injection time under VANOS fault condition
  • 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
  • ip_ti_slow_wf_thd_min__tco - Cylinder wall rewetting
  • ip_ti_fast_wf_thd_min__tco - Cylinder wall rewetting

After getting your base values for all these maps, you should log your lambda integrator to fine tune and get it as close as possible to +/- 0.

To fine tune starting and after start behavior, you can play with the following maps.

  • ip_ti_cast__tia__tco - Initialized value for post-start enrichment factor (After start enrichment)
  • ip_ti_cr_cst__cyc__tco - Gradual reduction of fuel enrichment at engine start
  • ip_ti_cr_cast__cyc__tco - Gradual reduction of fuel enrichment after engine start

DO NOT scale them to your injector like previous fuel maps, because these are factors, not injector pulse width in milliseconds!

Tip-In Enrichment / Cylinder Rewetting

An injection model with a fast and a slow deactivation of the compensation injection amount is used for the compensation of the wall film amount stored in the intake ports. To reduce air ratio fluctuations because of the updating error in the air path, a further wall film compensation amount is calculated from the change of the throttle angle, which is effective shortly after triggering a load jump.

For the load-dependent wall film compensation, the total wall film difference amount and the wall film difference amount to be compensated with high dynamic response between two sampling steps is quickly determined from the injection time difference (load difference) and a total wall film factor. The wall film difference amount to be compensated with lower dynamic response is calculated from the difference between these two variables.

The wall film difference amount for compensation of the updating error results from the difference between the map values IP_TI_PVS__PVS__N resulting from a map point change. This injection amount is corrected depending on the coolant temperature.

  • ip_ti_pvs__pvs__n - PVS angle-dependent wall film amount
  • ip_ti_tco_pos_wf__n__tco - Total wall film amount factor on acceleration
  • ip_ti_tco_pos_fast_wf__n__tco - Total wall film amount factor on acceleration (high dynamic)
  • ip_ti_tco_neg_wf__n__tco - Total wall film amount factor on deceleration
  • ip_ti_tco_neg_fast_wf__n__tco - Total wall film amount factor on deceleration (high dynamic)

The best way to scale the wall film table is rev the car then let off and see what AFR instantly appears. The goal is to achieve lambda 1.0 or gasoline AFR 14.7.

If the value is too rich, you need to decrease the wall film amount table. If the value is too lean, you need increase the wall film amount table.

Applying 5% steps to the whole table ip_ti_pvs__pvs__n in either direction shows good results soon.

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 correct fuel consumption readings.

Fine tuning should be made in the secret menu of your cluster (+- 25%). This is explained 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 behavior.

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:

Cold Engine

  • 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

Warm 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 Transition_between_cold/warm_engine_operation)

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.

Anti-jerk "_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 Current Feedback

MS43 uses a voltage divider (shunt resistor) in the primary coil circuit to measure spark duration on pin X60005.6. The 240Ohm shunt resistor for this is part of the ignition coil wiring loom and hidden in the plastic protecion tray.

When using aftermarket or upgrade coils, it is possible that this protection method falsely identifies a "spark duration too short" or "no spark" DTC.

Note: Some early M52TU heads have tighter tolerances for clearing the ignition coils causing the mantle to touch the head. This will short circuit the resistor and the ECU can no longer read spark duration. Isloating the coils with some Kapton tape will do the job here, or you grind away some of the aluminum.

  • c_tco_min_igcfb - Minimum coolant temperature for ignition diagnostic
  • id_t_igcfb_min_300__n__maf - Minimum spark burning duration - screw type ignition coils
  • id_t_igcfb_min_pc__n__maf - Minimum spark burning duration - pencil type ignition coils
  • c_n_max_igcfb_diag - Minimum engine speed for ignition current feedback diagnostic
  • c_cur_igc_max_diag - Maximum valid ignition current to detect a bad resistor
  • c_n_max_er - Maximum engine speed for misfire detection

VANOS

VANOS Min/Max Values

VANOS stands for "VAriable NOckenwellenSteuerung" and translates to adjustable 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 one hall sensor each on the intake and on the exhaust camshaft. Each of the sensors scans a toothed wheel with two 180° phases.

The intake CAM sensor serves for cylinder bank detection in the case of pre injection, for synchronisation, engine speed source in the case of crankshaft sensor errors and for position control of the intake camshaft (CAM).

To ensure correct pre injection, the intake CAM sensor has been designed as a static sensor, i.e. detection of the toothed wheel phase is even possible at 0 rpm.

The exhaust CAM sensor serves for position control of the exhaust CAM. Since it is designed as a dynamic sensor, a minimum engine speed is required to enable phase detection.

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 40°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 usage of cold maps and a factor of 0.0 means full usage 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)

Camshaft Parameters

In the initial position of VANOS (maximum spread), the edges of the exhaust CAM sensor are positioned at CRK tooth number 18/78 + C_COR_CAM_EX_REF °CRK, and the edges of the intake CAM sensor at CRK tooth number 42/102 + C_COR_CAM_IN_REF °CRK.

Plausibility limits have been defined for the non-adapted CAM edges; exceeding of these limits will result in an CAM diagnostic error:

  • Plausible range of intake cam: CRK teeth 31 - 46 and CRK teeth 91 - 106.
  • Plausible range of exhaust cam: CRK teeth 14 - 26 and CRK teeth 74 - 86.

If you want to change cams between engines or even go with aftermarket cams, you can use the following values to calibrate them.

Intake Camshaft:

  • c_cam_op_in - Intake camshaft duration in degrees
  • c_cam_adj_rng_max_in - Intake camshaft maximum VANOS adjustment range
  • c_cam_ini_in - Initialization value for intake camshaft refence angle adaptation
  • c_cor_cam_in_ref - CRK-correction for intake camshaft edges (aka intake lobe centerline)

Exhaust Camshaft:

  • c_cam_op_ex - Exhaust camshaft duration in degrees
  • c_cam_adj_rng_max_ex - Exhaust camshaft maximum VANOS adjustment range
  • c_cam_ini_ex - Initialization value for exhaust camshaft refence angle adaptation
  • c_cor_cam_ex_ref - CRK-correction for exhaust camshaft edges (aka exhaust lobe centerline)

Please make sure that the VANOS setpoint tables explained in the section prior to this are calibrated accordingly to the camshaft values.

Note: The B30 intake camshaft does not only have more lift and longer opening but its also 6° more advanced to support the engine in higher engine speeds compared to all other M52TU or M54 intake camshafts. Observations showed that tilting the intake camshaft by those 6° already made an improvement for top end power.

As a rule of thumb you can calculate a valid VANOS setpoint area for your cam setup as following. (B30 intake values for ease of calculation)

  • Upper Limit: c_cam_ini_in/ex (126°)
  • Lower Limit: c_cam_ini_in/ex - c_cam_adj_rng_max_in/ex (126° - 40° = 86°)

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 accelerator 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 Dashpot

To provide a smoother driving experience and lower emissions when the accelerator pedal is released the ecu will limit how fast the accelerator pedal sensor (pvs) input decreases.

To determine the scale of the dashpot the ecu first determines how fast the pvs input is decreasing by subracting the previous pvs input with the current pvs input. The resulting pvs input difference is then multiplied by the factors in ip_pvs_dif_neg_fac and ip_pvs_dif_cr_neg to create an initial dashpot correction value.

After this the dashpot correction result from the previous execution cycle is also multiplied by the ip_pvs_dif_cr_neg factor and it's then added to the newly calculated dashpot correction factor. This operation will make the dashpot correction decay over time which provides a smooth change of the correction.

The resulting dashpot correction is then subtracted from the requested pvs input to create a corrected pvs input which is further processed by the Drivers Wish Input Correction function.

If the corrected pvs input is smaller or equal to the requested pvs input the requested pvs input will be used instead.

The ecu also provides the option to disable the dashpot function when the clutch is pressed by setting lc_dhp_ltc to 1.

Drivers Wish Input Correction

To provide a smooth driving experience during part load the ecu actively controls how fast the accelerator pedal sensor input can increase.

ip_pvs_cor_max_rpl_[gear] is used by the ecu to decide if the 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 smoother driving experience the ecu will limit how fast the throttle can close based on the current engine load.

If the clutch is not pressed and the requested throttle setpoint is larger than the value specified in c_tps_req_ltc_min or smaller than the value specified in ip_tps_req_ltc_min_[gear] the throttle setpoint closing rate will be limited.

When the ecu starts limiting the throttle setpoint it will be decremented 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 limited throttle setpoint is smaller than the requested throttle setpoint.
  • 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 Operation

Full load tables shown in Tuner Pro

In full load operation the ecu will stop targeting a stoichiometric combustion and injection will be enriched to prevent knock and keep the combustion temperature under control.

During full load the closed loop lambda correction will be disabled but already learned fuel trims will still be applied.

Activation

To determine if the full load state should be activated the ecu performs a number of checks.

First it checks if the engine speed is greater than c_n_min_fl which is the lower engine speed limit for full load detection.

After that it checks if the current accelerator pedal position exceeds the values defined in the following tables are exceeded. If this is the case then 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

To prevent damage to the AC compressor and to extract every last bit of power out of the engine, the AC compressor will be disengaged if the accelerator pedal position exceeds the threshold set in c_pvs_fl_accin.

Additionally to prevent that the full load state is not activated to early after an engine start either one of the two following conditions has to be fulfilled before the ecu is able to activate the full load state. After either condition is achieved this check will be disabled until the engine is restarted again.

  • 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.

Effect On Operation

When the VANOS and DISA function enters full load they will switch over to separate full load tables, but for the injection function an enrichment factor will be applied to the injection amount.

This leaves us with the following tables that alter injection, VANOS and DISA behavior during full load.

  • 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

Time Limited Operation

Full load state maximum timers

This function doesn't seem to have been used in production but the full load function also has the capabilities to limit how long the full load state can be active in each gear.

When the gear dependent timer has counted down to zero the ecu will leave the full load operating state and the driver has to lift the accelerator pedal below the configured full load detection threshold before the ecu can re-enter the full load operating state again.

  • 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.
  • c_n_max_fl - Maximum engine speed for time limited full load
  • c_vs_max_fl - Maximum vehicle speed before time limited full load can be activated (This is set to 255km/h in production which disables this function)

Lambda Regulation

MS43 has a cylinder bank selective lambda regulation that is utilizing one narrow band O2 sensor per cylinder bank.

That means the ECU knows when a lean or rich condition occurs, but doesn't know HOW rich or lean it currently runs.

Due to this limitation the ECU continuously regulates the mixture to keep combustion exactly at lambda 1.0 (14.7 AFR / Stoichiometric) while in closed loop operating state.

Closed loop lambda regulation means that the O2 sensors or lambda probes provide feedback to the fuel injection routines which will then correct injection time accordingly.

Open loop means that the fuel injection time will solely depend on input quantities like air mass flow and ambient pressure without a feedback loop.


The MS43 has several requirements to be fulfilled to enter closed loop mode:

  • c_lam_n_min - Minimum engine speed to enable closed loop regulation
  • id_t_max_ls__tco_st - Minimum time after engine start to enable closed loop regulation
  • id_lam_tco_min__tco_st - Minimum coolant temperature after engine start to enable closed loop regulation

If every of these conditions is met, MS43 will enable closed loop feedback. Whilst active, there is a lower and upper limit to lean out or enrichen the air fuel mixture:

  • c_lam_min - Minimum lambda integrator value for leaning the mixture
  • c_lam_max - Maximum lambda integrator value for richening the mixture

Between these two values the ECU can regulate the air fuel mixture instantaneously. These are called lambda integrators or short time fuel trims (STFT).


Lambda Adaptation

Lambda Adaptation Scheme.png

The additive and multiplicative adaptation corrections are taken into account in the entire map for calculation of the injection time.

To avoid problems involving the mixture while the engine is not at operating temperature, the lambda adaptation values of TCO and their own values (determined with engine at service temperature) can be attenuated.

This is accomplished by weighting the multiplicative components with IP_TI_AD_FAC_FAC__TCO__TI_AD_FAC and the additive components with IP_TI_AD_ADD_FAC__TCO__TI_AD_ADD.

Main Conditions:

  • c_tco_ti_ad_min - Minimum coolant temperature for lambda adaptation
  • c_tia_ti_ad_max - Maximum intake air temperature for lambda adaptation
  • c_maf_ti_ad_max - Maximum air mass for lambda adaptation


Lambda Additive Corrections:

  • c_ti_ad_add_min - Minimum value of lambda adaptation additive factor
  • c_ti_ad_add_max - Maximum value of lambda adaptation additive factor
  • c_maf_ti_ad_add_max - Maximum air mass for additive lambda adaptation
  • c_n_ti_ad_add_max - Maximum engine speed for additive lambda adaptation

Lambda Multiplicative Corrections:

  • c_ti_ad_fac_min - Minimum value of lambda adaptation multiplicative factor
  • c_ti_ad_fac_max - Maximum value of lambda adaptation multiplicative factor
  • c_n_ti_ad_fac_min - Minimum engine speed for multiplicative lambda adaptation
  • c_maf_ti_ad_fac_min - Minimum air mass for multiplicative lambda adaptation
  • ip_maf_ti_ad_min__n - Minimum air mass for multiplicative lambda adaptation
  • ip_maf_ti_ad_max__n - Maximum air mass for multiplicative lambda adaptation

To temporary disable fuel learning trims (additive & multiplicative) you can simply set c_tco_ti_ad_min to something like 140°C. This will disable adaptation, but keeps short term regulation working.

MS43 also stores cylinder individual fuel trim adaptation values for all cylinders (-10% to +10%). This function is quite CPU heavy and only happens below engine speed threashold c_n_max_cyl_lam. With any other exhaust manifold than the factory ones this may lead to wrong adaptations and therefor wrong AFR. You can disable cylinder individual fuel trims by setting before mentioned constant to "0".

Diagnostic Trouble Codes (DTC)

During operation MS43 will perform a series of self diagnostic tests to ensure that everything is operating correctly.

To prevent an error from triggering too quickly the MS43 uses a debounce system where an error has to be detected a set number of times before the error can become active.

DTC To P-Code Translation

To translate the active DTCs to the equivalent OBD2 P code the ECU uses a set of variables c_dtc_[dtc name]_x that specifies the corresponding OBD2 P code.

The full list of DTCs and their corresponding OBD2 P code can be found here: Diagnostic Trouble Code Translation

Suppressing Diagnostic Trouble Codes

Not all DTCs can be suppressed but those who can be suppressed have an incrementation variable c_abc_inc_[dtc name] which defines how much the debounce counter should increment each time the error is detected and a threshold variable c_abc_max_[dtc name] which defines the maximum value for the debounce counter before the error is activated.

To suppress a DTC the corresponding c_abc_inc_[dtc name] variable needs to be set to zero. This prevents the debounce counter from incrementing which prevents the DTC from activating.

Note: Suppressing a DTC will not de-activate the functions associated with it so it's advised to correct the tune instead of suppressing any DTC.

Extra Features

This section describes extra functions or modification that where not intended by Siemens or BMW.

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

Electronic Coolant Fan Control

The cooling fan is controlled by MS43 via a PWM output signal. The fan speed depends on exhaust temperature, radiator ouput temperature, climate control requirement and vehicle speed.

  • ip_n_ecf__tco_ex - Electric coolant fan minimum speed stage depending on radiator outlet temperature
  • ip_n_ecf_temp_cat__temp_cat - Electric coolant fan minimum speed stage depending on catalyst temperature
  • id_n_ecf_min_accin__n_ecf - Electric coolant fan minimum speed stage CAN-bus request
  • ip_n_ecf_vs_cor__vs - Vehicle speed correction of electric coolant fan speed

Secondary Air Pump Removal

When removing the secondary air pump the ecu needs to be configured to ignore the removed sap equipment. To instruct the ecu that there is no secondary air pump installed set c_conf_sap to 1 and clear the "learned variants" adaptation in the ecu.

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 diameter 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 extensive testing, but the maximum engine load is still limited to 1389mg/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 dependent engine speed limiters, a soft-limiter and a hard-limiter for each gearbox type (manual or automatic transmission).

The soft-limiter works by cutting single injectors based on fuel-cut pattern, whereas the hard-limiter immediately cuts off all cylinders.

  • id_n_max_at: soft-limiter for AT gearbox
  • id_n_max_mt: soft-limiter for MT gearbox and SMG
  • id_n_max_max_at: hard-limiter for AT gearbox
  • id_n_max_max_mt: hard-limiter for MT gearbox and SMG

In addition to that, there is a maximum engine speed threashold for the soft limiter id_n_max_vs_max_at__gear or id_n_max_vs_max_mt__gear. If engine speed exceeds this value the soft limiter will be disabled.

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 maximum allowed vehicle speed is dependent on the transmission type and operates in two stages.

The first stage consist of a soft limiter where the ecu will shut down cylinders to prevent the vehicle speed from increasing. The activation point of the soft limiter is defined by the following variables:

  • c_vs_max_at_1 - Maximum vehicle speed automatic transmission
  • c_vs_max_mt_1 - Maximum vehicle speed manual transmission


The second stage consist of a hard limiter where the ecu will shut down the fuel pump to prevent the vehicle speed from increasing. The activation point of the hard limiter is calculated by adding c_vs_max_add to the soft limiter threshold. ov_vs_max_max = c_vs_max_[at/mt]_1 + c_vs_max_add

  • c_vs_max_add - Additive fuel cut hard limit for vehicle speed


By maxing out c_vs_max_[at/mt]_1 and c_vs_max_add the vehicle speed limit can be increased to 287km/h.

To completely disable the vehicle speed limiter set c_n_min_vs_max to 8160rpm.

  • c_n_min_vs_max - Minimum engine speed for activation of vehicle speed limiter


There is also some additional vehicle speed limits that will override in different scenarios:

  • c_vs_max_toil_max - Maximum speed when exceeding the max. oil temperature (c_toil_max)
  • c_vs_max_amt - Maximum speed with an active ssg error

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

The ECU samples the knock sensor voltage several times during the measurement window set by the id_knkwb_[0-5] and id_knkwe_[0-5] tables and the biggest reading is then selected for further processing to calculate the noise level for each cylinder nl_[0-5].

To determine the level 1 knock (light knock) threshold the nl_[0-5] data is multiplied with the ip_fac_knk_[0-5] tables and if the knock signal knks_[0-5] exceeds this threshold a level 1 knock event is signaled.

To determine the level 2 (heavy knock) knock threshold the level 1 knock threshold is multiplied by the id_fac_knks_thd__tia table.

If the multiplication factors in the ip_fac_knk_[0-5]/id_fac_knks_thd__tia tables is made smaller it will make the knock detection logic more sensitive and if they are made bigger the multiplication factor will make the knock detection logic less sensitive.

Ignition angle retards are specified in the following tables:

  • 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

Special Functions

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

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 acquisition and not the dashboard view, but its helpful for speed based parameters like LC config

Values can be fine tuned with a GPS based device to adjust for wheel/tire dimension 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 change that makes the ICV delete possible is the changes to the ip_pvs_isa_isapwm table. This table is used by the ecu to decide if any additional pvs input should be added to the drivers requested pvs input for a given idle control duty cycle.

In the stock setup the ecu will primarily try to use the idle control valve to alternate the air going into the engine during idle, but if the ecu encounters a scenario where it needs more air than what the idle control valve is capable of delivering at 100% duty cycle the ip_pvs_isa_isapwm table will help by translating the duty cycle to an additional pvs input that will be added to the drivers requested pvs input (which will be zero at idle as the driver isn't touching the throttle).

If take a look at the stock M54B30 ip_pvs_isa_isapwm table we will see that at 109% idle control duty cycle the table will add 17.5 degrees of pvs input and with an idle speed of 700 rpm the ip_tps_sp_pvs table would give us a throttle opening of 1.699 degrees.

If we then look at a scenario where ecu only needs a idle control duty cycle of 75% then the ip_pvs_isa_isapwm table will add 15 degrees of pvs input and with the same idle speed of 700 rpm the ip_tps_sp_pvs table would give us a throttle opening of 0 degrees which means the engine will only be receiving air from the idle control valve.

So when we remove the idle control valve we re-scale the ip_pvs_isa_isapwm table to emulate the idle control valve air flow with the help of the electronic throttle.

Copyable ICV Delete Tables M54B30 ONLY!.

The ip_pvs_isa_isapwm table 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 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 because 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

Map Reduction

MS43 Map Reduction

The ecu is setup with cold(tco_1) and hot(tco_2) engine tables for the fuel, ignition and vanos functions which gives us a more fine grained control of the tuning throughout the engine operating range but it also leaves us with a lot of tables to keep track of.

If we want to reduce the number of tables that are used we can force the ecu into using the cold(tco_1) engine tables by setting the following cold/hot engine transition tables 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

Doing this 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 will still be used if there is an active error in the ecu so don't forget to tune them as well.

  • 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

Explanation

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 middle engine speeds (~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 Theoretically, 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)

Tuning For Turbocharged Applications

Here is a list of most of the maps that need to be changed when tuning for turbo setups.

It may also apply to supercharged setups, however there may be slight differences here and there because of how the power is delivered.

Fuel maps are not listed here because there is a section dedicated to scaling for aftermarket injectors.

If only a single value is listed and the map is a table, that means fill the entire table with that single value.

You should also consider Extending Load Filtration For Forced Induction, Aftermarket Injector Scaling, and Forced Induction Upgrades.

Map Value
c_abc_inc_vim 0
c_conf_cat 0
c_maf_max_diag 2048
ldpm_maf_8 35 75 125 175 250 325 400 450 550 700 950 1250
ldpm_maf_iga_1 50 75 125 175 250 325 400 500 600 700 950 1350
ldpm_maf_iga_2 50 75 100 125 175 250 300 325 400 500 600 700 850 1000 1150 1350
ldpm_maf_mes_1 76 125 272 376 523 1002
ldpm_map_1 100 200 300 600 900 1050 1250 2000
ldpm_n_11 600 1000 1200 1500 1600 2000 2500 3000 3500 3900 4100 4500 4800 5500 6300 7000
ldpm_n_14 320 600 900 1000 1200 1500 1600 2000 2250 2500 3000 3500 3900 4100 4500 4800 5100 5500 6300 7000
ldpm_n_4 600 1000 1200 1500 1600 2000 2500 3000 3500 3900 4100 4500 4800 5500 6300 7000
id_maf_tab Varies by maf
ip_ti_fl__n 0.016
ip_iga_ron_91_pl_ivvt__n__maf Decrease above 500mg/stk
ip_iga_ron_98_pl_ivvt__n__maf Decrease above 500mg/stk
ip_maf_min_cop__n__iga_dif 1389
ip_maf_min_cop_ron__n__iga_dif 1389
ip_ti_cop_nr_1_1__n__maf 0
ip_ti_cop_nr_1_2__n__maf 0
ip_ti_cop_nr_2_1__n__maf 0
ip_ti_cop_nr_2_2__n__maf 0
ip_ti_cop_nr_3_1__n__maf 0
ip_ti_cop_nr_3_2__n__maf 0
ip_ti_cop_nr_4_1__n__maf 0
ip_ti_cop_nr_4_2__n__maf 0
ip_ti_cop_nr_5_1__n__maf 0
ip_ti_cop_nr_5_2__n__maf 0