Notices
ECU Flash

Advanced fuel control options

Thread Tools
 
Search this Thread
 
Old Oct 21, 2009, 11:21 AM
  #1  
EvoM Guru
Thread Starter
iTrader: (50)
 
mrfred's Avatar
 
Join Date: Mar 2006
Location: Tri-Cities, WA // Portland, OR
Posts: 9,675
Received 128 Likes on 96 Posts
Advanced fuel control options

Advanced fuel control options

Updates

June 15, 2010 - Spent a little more time on analyzing variables. I have replaced "FFFF6F32" with "evap purge compensation". This variable adjusts the fuel pulse width based on the status of the evap purge solenoid. Not important to open loop response.

December 16, 2009 - Fixed errors in the Mult128 and Mult128-16 scaling definitions.

December 7, 2009 - Have made two updates to the fuel pulse description:
1) Added info on the minimum load change required for there to be a SyncLoadAccel/Decel contribution.
2) Determined that LTFTs are used in the BFPW calculation.

December 1, 2009 - This post has been split up into two posts. Added information on load range where SyncLoadAccel and SyncLoadDecel are active. Also added info on ceiling values for LoadMasterDeltaPos and LoadMasterDeltNeg. Also added info about how the load scaling value for the BFPW is calculated.

October 21, 2009 - Initial post

Overview

This summarizes my efforts to flush out all the remaining key tables associated with fuel control. My original intent was simply to work out the tables that affect IPW during startup, but it turned out that I had to work out everything to understand the startup IPW stuff. So as usual, this effort morphed from a few day effort into a month long effort. Some of this has already been covered by jcsbanks, Bez, and Mattjin. I've put it all in one place, added detail, and made some corrections to what appear to be a few inaccuracies in the interpretation of the code.

Before going into the gory detail, I'll briefly describe the four different fuel pulse widths (FPWs) that are generated in the ROM code.

1) Cranking primer pulse - This is a single async pulse that is generated when the starter is engaged.
2) Cranking fuel pulse width - This is fuel pulse width that controls sync IPW while the starter is cranking
3) Main sync fuel pulse width - It is made up of four components. The two important ones are the base sync fuel pulse width contribution previously described by jcsbanks and a sync accel fuel pulse with contribution. The sync accel contribution keys off of an increasing load.
4) Async accel fuel pulse width - This is the async accel fuel pulse width previously described by Bez. It is a tip-in enrichment that keys off of a change in TPS.

I intend to write a patch that allows each of these contributions to be logged. This will allow a much better understanding of how all these contributions affect the final calculated IPW. In the mean time, each of the fuel pulse widths are described below. I have also included the tables for all these items for the 88590015 ROM. As usual, I hope people can help in getting these translated to other ROMs. (Note that some of these tables are listed in other threads and may or may not be accurately represented in the other threads.) Eventually, I will see to it that these tables get incorporated into a future version of ECUFlash.

Lastly, there are a few aspects of the fuel control routines that I want to study further that may result in the interpretation of a few of these tables changing a bit. It should be nothing drastic though.


1) Cranking primer pulse

This is a single pulse that is generated when the starter is engaged. The value is calculated from a 2D table vs coolant temperature and is the "Startup Enrichment IPW Adder" that I posted on EvoM a while ago. The value from this table is added to the injector latency and then sent to the injectors. For completeness, I'll list the table and scaling here, but with an updated name:

Code:
<scaling name="TimeInjCranking" units="ms" toexpr="x*0.008" frexpr="x/0.008" format="%.1f" min="0" max="500" inc="1" storagetype="uint16" endian="big"/>
<table name="Cranking Primer Initial Pulse" category="Fuel" type="2D" level="2" scaling="TimeInjCranking" address="52b2">
  <table name="Coolant Temperature" type="Y Axis" elements="9" scaling="Temp" address="6ff8"/>
</table>

2) Cranking fuel pulse width

Two different cranking FPWs are calculated. One is used while the starter is engaged, and the other appears to be momentarily used just after the starter is disengaged. I will only cover the value that is used while the starter is engaged. The formula for the cranking FPW while the starter is engaged is:

CFPW = constant*(TCOMP/128)*(CRANKINGTIMECOMP/128)*(UCOMP/128)*Baro + InjectorLatency

* TCOMP = 2D compensation table vs coolant temp
* CRANKINGTIMECOMP = 2D compensation table vs the length of time that the starter has been engaged
* UCOMP = 2D compensation vs an unknown time interval. A measure of the number of times a specific subroutine has been called. Probably shouldn't be adjusted, so I am not including a definition for this table.
* Baro = barometric pressure.

The coolant temp compensation and cranking time compensation for the 88590015 ROM are:

Code:
<scaling name="TimeTCOMPCrankingHack" units="Approximate ms" toexpr="x*0.9" frexpr="x/0.9" format="%.1f" min="0" max="500" inc="1" storagetype="uint8" endian="big"/>
<table name="Initial Cranking IPW vs Coolant Temp" category="Fuel" address="6040" type="2D" level="2" scaling="TimeTCOMPCrankingHack">
  <table name="Engine Temp" address="7014" type="Y Axis" elements="11" scaling="Temp"/>
</table>

<scaling name="Percent (128)" units="Percent (%)" toexpr="x/1.28" frexpr="x*1.28" format="%.0f" min="0" max="100" inc="1" storagetype="uint8" endian="big"/>
<table name="Cranking IPW Compensation vs Time" category="Fuel" type="2D" level="2" scaling="Percent (128)" address="323E">
  <table name="Time Since Engaging Starter (sec)" type="Static Y Axis" elements="20">
    <data>0.000</data>
    <data>0.022</data>
    <data>0.044</data>
    <data>0.066</data>
    <data>0.088</data>
    <data>0.110</data>
    <data>0.132</data>
    <data>0.154</data>
    <data>0.176</data>
    <data>0.198</data>
    <data>0.220</data>
    <data>0.242</data>
    <data>0.264</data>
    <data>0.286</data>
    <data>0.308</data>
    <data>0.330</data>
    <data>0.352</data>
    <data>0.374</data>
    <data>0.396</data>
    <data>0.418</data>
  </table>
</table>

3) Main synchronous fuel pulse width

This is the main fuel pulse. There are four contributions to this FPW (plus injector latency). The main fuel pulse is calculated from:

MFPW = BFPW + SyncLoadAccel - SyncLoadDecel + SyncLoadChangeIdle + InjectorLatency

Each of the four contributions are calculated from a base value that I call "injector flow per Hz". This is given by:

IFPHz = MAFScale*MAFComp*AirDensTweak*InjScale*InjMult

* MAFScale = the 2D MAF scaling table that everyone knows. This is the ideal raw airflow rate vs MAF Hz table taken from the MAF data sheet.
* MAFComp = the 2D MAF compensation table that everyone knows. Its just another multiplier based on MAF Hz (like the MAF scaling table) and is meant to be used to tweak the airflow rate values due to real world effects (e.g. non-ideal airflow distribution going into MAF).
* AirDensTweak = 3D table vs MAF Hz and relative air volume. Mislabeled in early versions of ECUFlash. It appears to be there to handle potential MAF misbehavior at low airflow rates.
* InjScale = the 1D injector scaling table that everyone knows
* InjMult = a 1D table that Mitsubishi probably intended to be used to compensate for fuels that have different AFR requirements (e.g. gasoline vs E85). The built-in map switching code can select between an array of different values.

The tables associated with this base value are all listed in ECUFlash for the 88590015 ROM, but for completeness, I'll include them here again:

Code:
<table name="Airflow/Hz Raw Scaling" category="Fuel" type="2D" level="2" scaling="uint8" address="2d06">
  <table name="MAF Hz" type="Y Axis" elements="21" scaling="MAFHz" address="6da4"/>
</table>

<table name="Airflow/Hz Offset Raw" category="Fuel" type="1D" level="2" scaling="uint16" address="1112"/>

<table name="MAF Compensation" category="Fuel" type="2D" level="2" scaling="uint8" address="2d22">
  <table name="MAF Hz" type="Y Axis" elements="21" scaling="MAFHz" address="6da4"/>
</table>

<scaling name="AirTempBaroFactor" units="Fraction" toexpr="x/48" frexpr="x*48" format="%.2f" min="0" max="2" inc="0.02" storagetype="uint16" endian="big"/>
<scaling name="AirTempBaroCorrection" units="Fraction" toexpr="x/128" frexpr="x*128" format="%.2f" min="0" max="2" inc="0.02" storagetype="uint8" endian="big"/>

<table name="Airflow/Hz Baro and Air Temp Compensation" category="Fuel" type="3D" level="2" swapxy="true" scaling="AirTempBaroCorrection" address="2d51">
<table name="Rel Air Volume (20C, 1 bar)" type="X Axis" elements="4" scaling="AirTempBaroFactor" address="6d92"/>
  <table name="MAF Hz" type="Y Axis" elements="9" scaling="MAFHz" address="6dd8"/>
</table>

<table name="Injector Size Scaling" category="Fuel" type="1D" scaling="InjectorScaling" address="1106"/>
The four contributions

A) Base fuel pulse - This is the contribution that jcsbanks has described. It takes over after the starter has been disengaged. The equation for this contribution is given by:

BFPW = constant*[(STFT/256 + X + LTFTCurrent + 128)/512]*(MAFCompW/128)*
[(MasterLoad {+/- K*DeltaMasterLoad})/2048]*(AFRMAP/128)*(CAM/128)*
[(PurgeComp+384)/512]*[(2*Startup_Mult+128)/128]*
(Z/128)*Baro*AirDensityFactor*(BFPW_Mult/128)*IFPHz

* STFT = STFT, 0 during open loop driving
* X = To be worked out, 128 during open loop driving
* LTFTCurrent = Either low, medium, or high LTFT per LTFT vs MAF Hz table defined below. This shows that LTFTs are used during open loop fueling, however, with the stock mid/high crossover, LTFT high, which is always 128 (null value), is used above 1597 Hz.
* AFRMAP = AFRMAP from fuel table lookup routine
* MAFCompW = MAF signal compensation vs coolant temp, 128 at normal operating temperature.
* MasterLoad = master load variable, calculated from MAF signal
* DeltaMasterLoad = absolute value of the change in master load, only used when load < 70 and when weighting parameter for the master load running average is > 205, +/- based on accel/decel.
* K is either 2 or 3 depending on a flag.
* CAM = some factor related to camshaft timing, always 128 when engine is at full temperature.
* PurgeComp = Evap purge flow compensation. Logging shows it to mostly be 128 (including during open loop), but can vary between ~100 and ~150.
* Startup_Mult = an average of two BFPW startup enrichment tables. These add a bit of enrichment for the first few moments after the engine has fired up. Decays to zero over a period of a few seconds after starter is disengaged.
* Z = to be worked out, always 128.
* Baro = barometric pressure
* AirDensityFactor = 2D relative air density vs IAT table
* BFPW_Mult = 128 under normal conditions, details to be worked out
* IFPHz = see equation above

The additional tables for the BFPW contribution for the 88590015 ROM are:

Code:
<scaling name="Percent64(8-bit)" units="%" toexpr="100*x/64" frexpr="64*x/100" format="%.0f" min="0" max="400" inc="1" storagetype="uint8" endian="big"/>  

<table name="BFPW Startup Comp vs Coolant Temp #1" category="Fuel" address="3146" type="2D" level="2" scaling="Percent64(8-bit)">
  <table name="Coolant Temp" address="6ff8" type="Y Axis" elements="9" scaling="Temp"/>
</table>

<table name="BFPW Startup Comp vs Coolant Temp #2" category="Fuel" address="3156" type="2D" level="2" scaling="Percent64(8-bit)">
  <table name="Coolant Temp" address="6ff8" type="Y Axis" elements="9" scaling="Temp"/>
</table>

<table name="MAF Comp vs Coolant Temp #1" category="Fuel" address="3136" type="2D" level="1" scaling="uint8">
  <table name="Coolant Temp" address="6ff8" type="Y Axis" elements="9" scaling="Temp"/>
</table>

<table name="MAF Comp vs Coolant Temp #2" category="Fuel" address="3126" type="2D" level="1" scaling="uint8">
  <table name="Coolant Temp" address="6ff8" type="Y Axis" elements="9" scaling="Temp"/>
</table>

<scaling name="AirDensComp" units="Air Density Correction" toexpr="x/129" frexpr="x/129" format="%.3f" min="0" max="2" inc="0.01" storagetype="uint8" endian="big"/>

<table name="Air Density Compensation for Load And IPW" category="Misc" type="2D" level="2" scaling="AirDensComp" address="30fe">
  <table name="MAF Air Temp" type="Y Axis" elements="8" scaling="Temp" address="714a"/>
</table>

<scaling name="LT Trim Hz" units="Hz" toexpr="x*6.29" frexpr="x/6.29" format="%.0f" min="0" max="1610" inc="6.29" storagetype="uint8" endian="big"/>
<table name="Closed Loop - LT Trim Control Ranges" category="Fuel" address="3021" type="2D" level="1" scaling="LT Trim Hz">
  <table name="Conditions" type="Static Y Axis" elements="4">
  <data>Low -> Mid</data>
  <data>Mid -> Low</data>
  <data>Mid -> High</data>
  <data>High -> Mid</data>
  </table>
</table>
B) Sync Load Accel - This is a synchronous acceleration enrichment adder that is driven by an increasing load. The contribution is designed to rapidly decay out after load is no longer increasing. The equation for this contribution is:

SyncLoadAccel = constant*(DeltaMasterLoadPos/2048)*(TCOMP/128)*(RPMCOMP/128)*Baro*IFPHz

* DeltaMasterLoadPos = increase in master load, zero when load is steady or decreasing
* TCOMP = 2D table vs coolant temp, scaling is x/128. There are two tables. Factors that control when each table is used have not been determined.
* RPMCOMP = 2D table vs RPM, scaling is x/128
* Baro = barometric pressure
* IFPHz = see description above

SyncLoadAccel only contributes continually to the fuel pulse width when uncompensated load is below a ceiling value defined by a table described below. When the uncompensated load rises above the value in the table, the SyncLoadAccel contribution is quickly decayed to zero even if load is still increasing. DeltaMasterLoadPos must exceed a threshold value before a SyncLoadAccel contribution is generated. There is a table of threshold values for steady throttle and another table for increasing throttle. The steady throttle threshold values are replaced with a constant when a flag is set. There is also a table that limits the maximum value for DeltaMasterLoadPos. The tables affecting the SyncLoadAccel adder for the 88590015 ROM are:

Code:
<scaling name="Mult128" units="Factor" toexpr="x/128" frexpr="x*128" format="%.2f" min="0" max="5" inc="0.02" storagetype="uint8" endian="big"/>

<table name="Sync Load Accel Compensation vs RPM" category="Fuel" type="2D" scaling="Mult128" level="2" address="3278">
  <table name="RPM" type="Y Axis" elements="15" scaling="RPM" address="6c26"/>
</table>

<table name="Sync Load Accel Compensation vs Coolant Temp Table #1" category="Fuel" type="2D" level="2" scaling="Mult128" address="6566">
  <table name="Coolant Temp" type="Y Axis" elements="8" scaling="Temp" address="6fde"/>
</table>

<table name="Sync Load Accel Compensation vs Coolant Temp Table #2" category="Fuel" type="2D" level="2" scaling="Mult128" address="326a">
  <table name="Coolant Temp" type="Y Axis" elements="8" scaling="Temp" address="6fde"/>
</table>

<scaling name="LoadUncompDelta" units="Uncomp Load Change" toexpr="x*0.1862" frexpr="x/0.1862" format="%.1f" min="0" max="160" inc="1" storagetype="uint8" endian="big"/>
<table name="Min Uncomp Load Change at Steady Throttle for SyndLoadAccel/Decel Contribution" category="Fuel" address="329c" type="2D" level="1" scaling="LoadUncompDelta">
<table name="Uncompensated Load" type="Static Y Axis" elements="13">
<data>0</data>
<data>24</data>
<data>48</data>
<data>72</data>
<data>95</data>
<data>119</data>
<data>143</data>
<data>167</data>
<data>191</data>
<data>215</data>
<data>238</data>
<data>262</data>
<data>286</data>
</table>
</table>

<table name="Min Uncomp Load Change at Changing Throttle for SyncLoadAccel/Decel Contribution" category="Fuel" address="32a9" type="2D" level="1" scaling="LoadUncompDelta">
<table name="Uncompensated Load" type="Static Y Axis" elements="13">
<data>0</data>
<data>24</data>
<data>48</data>
<data>72</data>
<data>95</data>
<data>119</data>
<data>143</data>
<data>167</data>
<data>191</data>
<data>215</data>
<data>238</data>
<data>262</data>
<data>286</data>
</table>
</table>

<scaling name="x54d16" units="Uncomp Load" toexpr="x*54/16*0.1862" frexpr="x/(54/16*0.1862)" format="%.0f" min="0" max="160" inc="1" storagetype="uint8" endian="big"/>
<table name="Ceiling Load vs RPM for SyncLoadAccel/Decel Contributions" category="Fuel" type="2D" level="1" scaling="x54d16" address="3332">
  <table name="RPM" type="Y Axis" elements="10" scaling="RPM" address="6b7a"/>
</table>

<scaling name="LoadMaster16" units="Uncomp Load" toexpr="x*0.1862" frexpr="x/0.1862" format="%.0f" min="0" max="160" inc="1" storagetype="uint16" endian="big"/>
<table name="SyncLoadAccel DeltaMasterLoadPos Ceiling Value" category="Fuel" address="123a" type="1D" level="1" scaling="LoadMaster16"/>
C) Sync Load Decel Subtractor - Subtracts fuel during rapid load reduction. I believe that its purpose is to transition to a fuel cut mode. The equation for this contribution is:

SyncLoadDecel = constant*DeltaMasterLoadNeg/2048)*LCOMP*TCOMP*(RPMCOMP/128)*Baro*IFPHz

* DeltaLoadMasterNeg = decrease in master load, zero when load is steady or increasing
* LCOMP = 2D table vs load
* TCOMP = 2D table vs coolant temp
* RPMCOMP = 2D table vs RPM,
* Baro = barometric pressure
* IFPHz = see description above

DeltaMasterLoadNeg can only be non-zero when the uncompensated load is below the ceiling load in the "Ceiling Load vs RPM for Sync Load Accel/Decel Contributions" table described in the SyncLoadAccel section. When uncompensated load is below this ceiling value, then there are two tables that establish threshold load change values that must be reached before a DeltaMasterLoadNeg value can be used in the SyncLoadDecel calc. These tables are listed in the SyncLoadAccel section. There is a 1D table that limits the maximum value of DeltaMasterLoadNeg. The tables that affect the SyncLoadDecel subtractor value for the 88590015 ROM are:

Code:
<table name="Decel IPW Subtraction Comp vs RPM" category="Fuel" address="3350" type="2D" level="2" scaling="Mult128">
  <table name="RPM" address="6b7a" type="Y Axis" elements="10" scaling="RPM"/>
</table>

<table name="Decel IPW Subtraction Comp vs Load" category="Fuel" address="3360" type="2D" level="2" scaling="Mult128">
  <table name="Load" address="6cba" type="Y Axis" elements="14" scaling="Load"/>
</table>

<table name="Decel IPW Subtraction Comp vs Coolant Temp" category="Fuel" address="3342" type="2D" level="2" scaling="Mult128">
  <table name="Coolant Temp" address="6fde" type="Y Axis" elements="8" scaling="Temp"/>
</table>

<table name="Sync Load Decel DeltaMasterLoadNeg Ceiling Value" category="Fuel" address="123c" type="1D" level="1" scaling="LoadMaster16"/>

CONTINUED IN NEXT POST ...

Last edited by mrfred; Jun 15, 2010 at 10:34 PM.
Old Oct 21, 2009, 11:23 AM
  #2  
EvoM Guru
Thread Starter
iTrader: (50)
 
mrfred's Avatar
 
Join Date: Mar 2006
Location: Tri-Cities, WA // Portland, OR
Posts: 9,675
Received 128 Likes on 96 Posts
... CONTINUED FROM FIRST POST


D) Sync Load Change Idle - It appears that the purpose of this contribution is to transition from a fuel cut mode to the target IPW when rpms drop below 1000 rpm. Increasing and decreasing load can affect the contribution and after a set period of time, the contribution goes away regardless of whether load is changing. The contribution appears to be very small and is definitely not important for performance tuning. The equation for it is:

SyncLoadChangeIdle = constant*(DeltaMasterLoad/2048)*UCOMP*TCOMP*IFPHz

* DeltaMasterLoad = Different than other DeltaLoad variables. Don't fully understand this yet
* UCOMP = 2D table vs a RAM variable that I do not yet understand
* TCOMP = 2D table vs coolant temp, scaling is x/128
* IFPHz = see description above

The tables for these items in the 88590015 ROM are:

Code:
<table name="Sync Load Change Idle Compensation vs Time Below 1000 rpm" category="Fuel" type="2D" level="2" scaling="Mult128" address="6b3e">
  <table name="Unknown" type="Y Axis" elements="21" scaling="uint16" address="8246"/>
</table>

<table name="Sync Load Change Idle Compensation vs Coolant Temp" category="Fuel" type="2D" level="2" scaling="Mult128" address="6b30">
  <table name="Coolant Temp" type="Y Axis" elements="8" scaling="Temp" address="6fde"/>
</table>

4) Async TPS Accel Enrichment

This is the async accel that Bez and jcsbanks have mentioned many times, and as most people know, it is an async throttle tip-in enrichment adder to the fuel contribution. After finding a few inaccuracies in what Bez had posted, I decided to work out more accurate scalings. The equation for the async accel contribution is:

AsyncAccel = constant*TPSDeltaMULT*(AAStartupMult*TCOMP + RPMCOMP) + InjectorLatency

* TPSDeltaMULT = 2D table vs TPSDelta
* TCOMP = 2D table vs coolant temp compensation. There are two tables.
* RPMCOMP = 2D table vs RPM compensation.

The definitions for these tables plus the other items that control async accel for the 88590015 ROM are listed below.

Code:
<table name="Async Accel Pause Period" category="Fuel" address="1254" type="1D" level="2" scaling="uint16"/>

<table name="Async Accel Min TPS Delta" category="Fuel" address="1256" type="1D" level="2" scaling="ThrottlePercentage"/>

<scaling name="AsyncAccelMaxFPW" units="ms" toexpr="x*32*0.008" frexpr="x/(32*0.008)" format="%.2f" min="0" max="20" inc="0.02" storagetype="uint16" endian="big"/>
<table name="Async Accel Max Pulsewidth" category="Fuel" address="1258" type="1D" level="2" scaling="AsyncAccelMaxFPW"/>

<scaling name="Mult128-16" units="Multiplication Factor" toexpr="x/128" frexpr="x*128" format="%.2f" min="0" max="5" inc="0.02" storagetype="uint16" endian="big"/>
<table name="Async Accel Max Total Contribution During Accel Period" category="Fuel" address="125A" type="1D" level="2" scaling="Mult128-16"/>

<table name="Async Accel Mult to Coolant Temp Adder During 5 Sec After Startup" category="Fuel" address="125c" type="1D" level="2" scaling="Mult128-16"/>

<table name="Async Accel Above TPS Enrichment Cutoff vs RPM" category="Fuel" address="32c6" type="2D" level="2" scaling="ThrottlePercentage8">
<table name="X" address="6c26" type="Y Axis" elements="10" scaling="RPM"/>
</table>

<table name="Async Accel Multiplier vs TPS Delta" category="Fuel" address="32b6" type="2D" level="2" scaling="Mult128">
<table name="TPS Delta" type="Static Y Axis" elements="9">
<data>0.0%</data>
<data>1.6%</data>
<data>3.1%</data>
<data>4.7%</data>
<data>6.3%</data>
<data>7.8%</data>
<data>9.4%</data>
<data>11.0%</data>
<data>12.5%</data>
</table>
</table>

<table name="Async Accel vs RPM Adder" category="Fuel" address="32e4" type="2D" level="2" scaling="uint8">
<table name="RPM" address="6c26" type="Y Axis" elements="15" scaling="RPM"/>
</table>

<table name="Async Accel vs Coolant Temp Adder (Main)" category="Fuel" address="32d6" type="2D" level="2" scaling="uint8">
<table name="Coolant Temp" address="6fde" type="Y Axis" elements="8" scaling="Temp"/>
</table>

<table name="Async Accel vs Coolant Temp Adder (Alt)" category="Fuel" address="6558" type="2D" level="2" scaling="uint8">
<table name="Coolant Temp" address="6fde" type="Y Axis" elements="8" scaling="Temp"/>
</table>

Last edited by mrfred; Dec 16, 2009 at 09:23 PM.
Old Oct 21, 2009, 11:28 AM
  #3  
Evolving Member
iTrader: (4)
 
Deepnine's Avatar
 
Join Date: Apr 2008
Location: Germany
Posts: 186
Likes: 0
Received 0 Likes on 0 Posts
Great explanation for heavy stuff.
Old Oct 21, 2009, 11:42 AM
  #4  
Evolved Member
iTrader: (17)
 
Jack_of_Trades's Avatar
 
Join Date: Jun 2007
Location: Opelika,AL
Posts: 3,523
Likes: 0
Received 2 Likes on 1 Post
Jeeze, I'll have to incorportae these in the V7 XML's
Old Oct 21, 2009, 11:48 AM
  #5  
Account Disabled
iTrader: (8)
 
GST Motorsports's Avatar
 
Join Date: Sep 2007
Location: Hayward
Posts: 3,366
Likes: 0
Received 0 Likes on 0 Posts
mrfred,

you forgot to put your paypal address.

- Bryan
Old Oct 21, 2009, 12:12 PM
  #6  
EvoM Guru
Thread Starter
iTrader: (50)
 
mrfred's Avatar
 
Join Date: Mar 2006
Location: Tri-Cities, WA // Portland, OR
Posts: 9,675
Received 128 Likes on 96 Posts
Originally Posted by GST Motorsports
mrfred,

you forgot to put your paypal address.

- Bryan
Still too dizzy from looking at code...
Old Oct 21, 2009, 12:54 PM
  #7  
Evolved Member
iTrader: (6)
 
tkklemann's Avatar
 
Join Date: Jul 2005
Location: Charleston, SC
Posts: 1,228
Likes: 0
Received 0 Likes on 0 Posts
My head exploded after reading all that. Yipes..
Old Oct 21, 2009, 01:56 PM
  #8  
EvoM Community Team
iTrader: (15)
 
fostytou's Avatar
 
Join Date: Sep 2006
Location: Aurora, IL
Posts: 3,143
Received 6 Likes on 6 Posts
Amazing, you guys are really geniuses in a very special way to all of us. I hope I can dig into these, it looks like a few of them might explain the interesting situation I have before my ECU re-learns with a hard intake pipe.

RPM falls to idle, holds idle for a split second then goes rich and rpms fall, ECU blips RPMS to ~1200 (ISCV?) and bounces up and down for no set amount of time or iterations.
After a few iterations blip up to ~1600 RPM, slowly fall to proper idle with perfect AFR.


Here is a copy of all of the tables for an easy copy paste. There are enough that a seperate #include file might be smart. (MrFred just let me know if you want me to remove this)

Code:
	 <!-- MrFred Fuel System Dissassembly tables -->

      <scaling name="Percent64(8-bit)" units="%" toexpr="100*x/64" frexpr="64*x/100" format="%.0f" min="0" max="400" inc="1" storagetype="uint8" endian="big"/>  
      <scaling name="TimeInjCranking" units="ms" toexpr="x*0.008" frexpr="x/0.008" format="%.1f" min="0" max="500" inc="1" storagetype="uint16" endian="big"/>
      <table name="Cranking Primer Initial Pulse" category="Fuel" type="2D" level="2" scaling="TimeInjCranking" address="52b2">
        <table name="Coolant Temperature" type="Y Axis" elements="9" scaling="Temp" address="6ff8"/>
      </table>
      
      <scaling name="TimeTCOMPCrankingHack" units="Approximate ms" toexpr="x*0.9" frexpr="x/0.9" format="%.1f" min="0" max="500" inc="1" storagetype="uint8" endian="big"/>
      <table name="Initial Cranking IPW vs Coolant Temp" category="Fuel" address="6040" type="2D" level="2" scaling="TimeTCOMPCrankingHack">
        <table name="Engine Temp" address="7014" type="Y Axis" elements="11" scaling="Temp"/>
      </table>
      
      <scaling name="Percent (128)" units="Percent (%)" toexpr="x/1.28" frexpr="x*1.28" format="%.0f" min="0" max="100" inc="1" storagetype="uint8" endian="big"/>
      <table name="Cranking IPW Compensation vs Time" category="Fuel" type="2D" level="2" scaling="Percent (128)" address="323E">
        <table name="Time Since Engaging Starter (sec)" type="Static Y Axis" elements="20">
          <data>0.000</data>
          <data>0.022</data>
          <data>0.044</data>
          <data>0.066</data>
          <data>0.088</data>
          <data>0.110</data>
          <data>0.132</data>
          <data>0.154</data>
          <data>0.176</data>
          <data>0.198</data>
          <data>0.220</data>
          <data>0.242</data>
          <data>0.264</data>
          <data>0.286</data>
          <data>0.308</data>
          <data>0.330</data>
          <data>0.352</data>
          <data>0.374</data>
          <data>0.396</data>
          <data>0.418</data>
        </table>
      </table>
      
      <table name="Airflow/Hz Raw Scaling" category="Fuel" type="2D" level="2" scaling="uint8" address="2d06">
        <table name="MAF Hz" type="Y Axis" elements="21" scaling="MAFHz" address="6da4"/>
      </table>
      
      <table name="Airflow/Hz Offset Raw" category="Fuel" type="1D" level="2" scaling="uint16" address="1112"/>
      
      <table name="MAF Compensation" category="Fuel" type="2D" level="2" scaling="uint8" address="2d22">
        <table name="MAF Hz" type="Y Axis" elements="21" scaling="MAFHz" address="6da4"/>
      </table>
      
      <scaling name="AirTempBaroFactor" units="Fraction" toexpr="x/48" frexpr="x*48" format="%.2f" min="0" max="2" inc="0.02" storagetype="uint16" endian="big"/>
      <scaling name="AirTempBaroCorrection" units="Fraction" toexpr="x/128" frexpr="x*128" format="%.2f" min="0" max="2" inc="0.02" storagetype="uint8" endian="big"/>
      
      <table name="Airflow/Hz Baro and Air Temp Compensation" category="Fuel" type="3D" level="2" swapxy="true" scaling="AirTempBaroCorrection" address="2d51">
      <table name="Rel Air Volume (20C, 1 bar)" type="X Axis" elements="4" scaling="AirTempBaroFactor" address="6d92"/>
        <table name="MAF Hz" type="Y Axis" elements="9" scaling="MAFHz" address="6dd8"/>
      </table>
      
      <table name="Injector Size Scaling" category="Fuel" type="1D" scaling="InjectorScaling" address="1106"/>
      
      <table name="BFPW Startup Comp vs Coolant Temp #1" category="Fuel" address="3146" type="2D" level="2" scaling="Percent64(8-bit)">
        <table name="Coolant Temp" address="6ff8" type="Y Axis" elements="9" scaling="Temp"/>
      </table>
      
      <table name="BFPW Startup Comp vs Coolant Temp #2" category="Fuel" address="3156" type="2D" level="2" scaling="Percent64(8-bit)">
        <table name="Coolant Temp" address="6ff8" type="Y Axis" elements="9" scaling="Temp"/>
      </table>
      
      <scaling name="AirDensComp" units="Air Density Correction" toexpr="x/129" frexpr="x/129" format="%.3f" min="0" max="2" inc="0.01" storagetype="uint8" endian="big"/>
      
      <table name="Air Density Compensation for Load And IPW" category="Misc" type="2D" level="2" scaling="AirDensComp" address="30fe">
        <table name="MAF Air Temp" type="Y Axis" elements="8" scaling="Temp" address="714a"/>
      </table>
      
      <scaling name="Mult128" units="Factor" toexpr="x/128" frexpr="x/128" format="%.2f" min="0" max="5" inc="0.02" storagetype="uint8" endian="big"/>
      
      <table name="Sync Load Accel Compensation vs RPM" category="Fuel" type="2D" scaling="Mult128" level="2" address="3278">
        <table name="RPM" type="Y Axis" elements="15" scaling="RPM" address="6c26"/>
      </table>
      
      <table name="Sync Load Accel Compensation vs Coolant Temp Table #1" category="Fuel" type="2D" level="2" scaling="Mult128" address="6566">
        <table name="Coolant Temp" type="Y Axis" elements="8" scaling="Temp" address="6fde"/>
      </table>
      
      <table name="Sync Load Accel Compensation vs Coolant Temp Table #2" category="Fuel" type="2D" level="2" scaling="Mult128" address="326a">
        <table name="Coolant Temp" type="Y Axis" elements="8" scaling="Temp" address="6fde"/>
      </table>
      
      <table name="Decel IPW Subtraction Comp vs RPM" category="Fuel" address="3350" type="2D" level="2" scaling="Mult128">
        <table name="RPM" address="6b7a" type="Y Axis" elements="10" scaling="RPM"/>
      </table>
      
      <table name="Decel IPW Subtraction Comp vs Load" category="Fuel" address="3360" type="2D" level="2" scaling="Mult128">
        <table name="Load" address="6cba" type="Y Axis" elements="14" scaling="Load"/>
      </table>
      
      <table name="Decel IPW Subtraction Comp vs Coolant Temp" category="Fuel" address="3342" type="2D" level="2" scaling="Mult128">
        <table name="Coolant Temp" address="6fde" type="Y Axis" elements="8" scaling="Temp"/>
      </table>
      
      
      <table name="Sync Load Change Idle Compensation vs Time Below 1000 rpm" category="Fuel" type="2D" level="2" scaling="Mult128" address="6b3e">
        <table name="Unknown" type="Y Axis" elements="21" scaling="uint16" address="8246"/>
      </table>
      
      <table name="Sync Load Change Idle Compensation vs Coolant Temp" category="Fuel" type="2D" level="2" scaling="Mult128" address="6b30">
        <table name="Coolant Temp" type="Y Axis" elements="8" scaling="Temp" address="6fde"/>
      </table>
      
      <table name="Async Accel Pause Period" category="Fuel" address="1254" type="1D" level="2" scaling="uint16"/>
      
      <table name="Async Accel Min TPS Delta" category="Fuel" address="1256" type="1D" level="2" scaling="ThrottlePercentage"/>
      
      <scaling name="AsyncAccelMaxFPW" units="ms" toexpr="x*32*0.008" frexpr="x/(32*0.008)" format="%.2f" min="0" max="20" inc="0.02" storagetype="uint16" endian="big"/>
      <table name="Async Accel Max Pulsewidth" category="Fuel" address="1258" type="1D" level="2" scaling="AsyncAccelMaxFPW"/>
      
      <scaling name="Mult128-16" units="Multiplication Factor" toexpr="x/128" frexpr="x/128" format="%.2f" min="0" max="5" inc="0.02" storagetype="uint16" endian="big"/>
      <table name="Async Accel Max Total Contribution During Accel Period" category="Fuel" address="125A" type="1D" level="2" scaling="Mult128-16"/>
      
      <table name="Async Accel Mult to Coolant Temp Adder During 5 Sec After Startup" category="Fuel" address="125c" type="1D" level="2" scaling="Mult128-16"/>
      
      <table name="Async Accel Above TPS Enrichment Cutoff vs RPM" category="Fuel" address="32c6" type="2D" level="2" scaling="ThrottlePercentage8">
        <table name="X" address="6c26" type="Y Axis" elements="10" scaling="RPM"/>
      </table>
      
      <table name="Async Accel Multiplier vs TPS Delta" category="Fuel" address="32b6" type="2D" level="2" scaling="Mult128">
        <table name="TPS Delta" type="Static Y Axis" elements="9">
          <data>0.0%</data>
          <data>1.6%</data>
          <data>3.1%</data>
          <data>4.7%</data>
          <data>6.3%</data>
          <data>7.8%</data>
          <data>9.4%</data>
          <data>11.0%</data>
          <data>12.5%</data>
        </table>
      </table>
      
      <table name="Async Accel vs RPM Adder" category="Fuel" address="32e4" type="2D" level="2" scaling="uint8">
        <table name="RPM" address="6c26" type="Y Axis" elements="15" scaling="RPM"/>
      </table>
      
      <table name="Async Accel vs Coolant Temp Adder (Main)" category="Fuel" address="32d6" type="2D" level="2" scaling="uint8">
        <table name="Coolant Temp" address="6fde" type="Y Axis" elements="8" scaling="Temp"/>
      </table>
      
      <table name="Async Accel vs Coolant Temp Adder (Alt)" category="Fuel" address="6558" type="2D" level="2" scaling="uint8">
        <table name="Coolant Temp" address="6fde" type="Y Axis" elements="8" scaling="Temp"/>
      </table>
edit:added extra scaling

Last edited by fostytou; Oct 25, 2009 at 10:32 AM.
Old Oct 21, 2009, 03:21 PM
  #9  
EvoM Guru
iTrader: (6)
 
tephra's Avatar
 
Join Date: Feb 2007
Location: Melbourne, Australia
Posts: 9,486
Received 66 Likes on 42 Posts
mammoth effort
Old Oct 21, 2009, 06:16 PM
  #10  
Evolved Member
iTrader: (26)
 
travman's Avatar
 
Join Date: Oct 2005
Location: Pittsburgh
Posts: 1,712
Likes: 0
Received 0 Likes on 0 Posts
Great job mrfred

I have been messing with these new start up tables for a few days now.......and finally the puzzle makes sense (or starting too for me).

We could zero out the ipw adder table which is now found to be the first pulse table and the car would still start.

Well I zero'd out the initial IPW table and the car would not start and in the log the IPW is all zero's....so those 2 tables are def. accurate in how they function. Although the IPW first pulse table still doesn't match up on logs - I think the first pulse happens so fast the logger cant pick it up completely so your only seeing a portion of it, especially on the cold start.

BUT my cranking IPW does match fairly close to the initial IPW table + latency while the car is cranking and cranking to start....i am still working on this "warm" starting issue after the car sits anywhere from 15min-3hrs - I am one of the unlucky ones who has the starting issues and hoping with some more play with these tables and understanding how it all works I will be able to get this weird issue tuned out.

I will be working more on it tomorrow.....
Old Oct 21, 2009, 06:45 PM
  #11  
Registered User
 
rolly1818's Avatar
 
Join Date: Nov 2007
Location: Trinidad
Posts: 1,507
Likes: 0
Received 2 Likes on 2 Posts
if i wasn't confused at first about all these new tables

thanks - subscribed!

i will need to reveiw this closely tomorrow!
Old Oct 21, 2009, 06:48 PM
  #12  
Evolved Member
 
merlin.oz's Avatar
 
Join Date: Jun 2008
Location: Sydney
Posts: 824
Likes: 0
Received 23 Likes on 19 Posts
absolutely fabulous!

does this mean that BFPW does not have an enrichment v temp?
ie the only water temperature enrichments are:
primer,
cranking (key on)
post cranking (key off) for a short time
Old Oct 21, 2009, 07:52 PM
  #13  
Evolved Member
iTrader: (22)
 
Appauldd's Avatar
 
Join Date: Nov 2003
Location: Northern KY near Cincy
Posts: 2,408
Likes: 0
Received 6 Likes on 6 Posts
Frosty.....I noticed the same thing....

RPM falls to idle, holds idle for a split second then goes rich and rpms fall, ECU blips RPMS to ~1200 (ISCV?) and bounces up and down for no set amount of time or iterations.
After a few iterations blip up to ~1600 RPM, slowly fall to proper idle with perfect AFR.
I just left it as the ECU doing its thing. Could it be from the injectors rather than the hard pipes affecting the MAF....maybe both?
Old Oct 22, 2009, 02:57 AM
  #14  
EvoM Guru
Thread Starter
iTrader: (50)
 
mrfred's Avatar
 
Join Date: Mar 2006
Location: Tri-Cities, WA // Portland, OR
Posts: 9,675
Received 128 Likes on 96 Posts
Originally Posted by merlin.oz
absolutely fabulous!

does this mean that BFPW does not have an enrichment v temp?
ie the only water temperature enrichments are:
primer,
cranking (key on)
post cranking (key off) for a short time
Yeah, I'm a bit surprised too. jcsbanks indicated in his analysis that mafmultiwarmup is used. The code shows that it is used, but in the denominator and only after the engine has reached full operating temperature. Strange. The CAM value can be looked up from a table versus coolant temp, but its not a smooth progression from cold to hot as you might expect, and there is a conditional on whether the value from the table is used (versus using a set value of 128).
Old Oct 22, 2009, 03:19 AM
  #15  
Evolved Member
iTrader: (50)
 
Fast_Freddie's Avatar
 
Join Date: Jun 2007
Location: Lexington Park, MD
Posts: 2,706
Received 12 Likes on 11 Posts
Originally Posted by fostytou
RPM falls to idle, holds idle for a split second then goes rich and rpms fall, ECU blips RPMS to ~1200 (ISCV?) and bounces up and down for no set amount of time or iterations.
After a few iterations blip up to ~1600 RPM, slowly fall to proper idle with perfect AFR.
Originally Posted by Appauldd
Frosty.....I noticed the same thing....
Fosty & Applaudd... what is your O2 Feedback (STFT) doing when the car goes rich? Is is pegged at +25 or what?

As you both know I have the same scenario...

Last edited by Fast_Freddie; Oct 22, 2009 at 03:22 AM.


Quick Reply: Advanced fuel control options



All times are GMT -7. The time now is 09:03 AM.