Advanced fuel control options
#17
Evolved Member
iTrader: (8)
Great work, thank you for all you do on the stock ECU.
Is the AFRMAP value calculated in a seperate routine based on the low and high tables and the octane value (cam position as well on the IX)?
That's just amazing as I've been able to log, repetitively, a very distinct warm up AFR curve while running open loop. The car took about 5-7 minutes to fully warm up from 0C-15C range up to operating temperature and the AFR at a given temperature was very repeatable but not the 14.7:1 that was ran at the same conditions after ~70C was reached. This was at low loads, under 400Hz or so on the airflow.
Makes sense at higher loads though as you really don't want significant enrichment/enleanment on a cool motor.
Is the AFRMAP value calculated in a seperate routine based on the low and high tables and the octane value (cam position as well on the IX)?
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).
Makes sense at higher loads though as you really don't want significant enrichment/enleanment on a cool motor.
Last edited by 03whitegsr; Oct 22, 2009 at 07:52 AM.
#20
Great work, thank you for all you do on the stock ECU.
Is the AFRMAP value calculated in a seperate routine based on the low and high tables and the octane value (cam position as well on the IX)?
That's just amazing as I've been able to log, repetitively, a very distinct warm up AFR curve while running open loop. The car took about 5-7 minutes to fully warm up from 0C-15C range up to operating temperature and the AFR at a given temperature was very repeatable but not the 14.7:1 that was ran at the same conditions after ~70C was reached. This was at low loads, under 400Hz or so on the airflow.
Makes sense at higher loads though as you really don't want significant enrichment/enleanment on a cool motor.
Is the AFRMAP value calculated in a seperate routine based on the low and high tables and the octane value (cam position as well on the IX)?
That's just amazing as I've been able to log, repetitively, a very distinct warm up AFR curve while running open loop. The car took about 5-7 minutes to fully warm up from 0C-15C range up to operating temperature and the AFR at a given temperature was very repeatable but not the 14.7:1 that was ran at the same conditions after ~70C was reached. This was at low loads, under 400Hz or so on the airflow.
Makes sense at higher loads though as you really don't want significant enrichment/enleanment on a cool motor.
It surprised me as well when I realized that there are no tables that directly affect the base FPW vs coolant temp during warmup. There are a few unknowns still in the equation though, especially FFFF6B32. I've logged this, and it does continuously vary. I haven't logged it from a cold start though to see what its doing.
#21
EvoM Community Team
iTrader: (15)
I'm not sure if it helped completely, but for a temporary fix try lowering your lowest maf compensation cell slightly (or raise the other ones in the LTFT low area).... that is, unless you want to start testing these tables
I haven't logged STFT in a while. I know I have logs of it, but they would be impossible to find. If the condition comes up again I'll let you know
#22
Evolved Member
iTrader: (2)
Okay, a few initial findings before I post up what I have so far for 96530006:
- There appears to be only one Sync Load Accel Compensation vs Coolant Temp table.
- The Sync Load Change Idle Compensation logic doesn't appear to exist at all; or, if it does, the code is totally different.
- There doesn't appear to be an alternate "Async Accel vs Coolant Temp Adder", only a main table.
#23
Evolved Member
iTrader: (2)
For 96530006:
Edit: Updated with a bunch of missing tables from l2r99gst, plus a few more after I did a side-by-side comparison with mrfred's original two posts.
PHP Code:
<!-- 1. Cranking primer pulse -->
<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="58d0">
<table name="Coolant Temperature" type="Y Axis" elements="9" scaling="Temp" address="69d8"/>
</table>
<!-- 2. Cranking fuel pulse width -->
<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="5b3a" type="2D" level="2" scaling="TimeTCOMPCrankingHack">
<table name="Engine Temp" address="69f4" 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="382a">
<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 pulsewidth -->
<table name="Airflow/Hz Raw Scaling" category="Fuel" type="2D" level="2" scaling="uint8" address="3306">
<table name="MAF Hz" type="Y Axis" elements="21" scaling="MAFHz" address="67a0"/>
</table>
<table name="Airflow/Hz Offset Raw" category="Fuel" type="1D" level="2" scaling="uint16" address="1512"/>
<table name="MAF Compensation" category="Fuel" type="2D" level="2" scaling="uint8" address="3322">
<table name="MAF Hz" type="Y Axis" elements="21" scaling="MAFHz" address="67a0"/>
</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="3351">
<table name="Rel Air Volume (20C, 1 bar)" type="X Axis" elements="4" scaling="AirTempBaroFactor" address="6870"/>
<table name="MAF Hz" type="Y Axis" elements="9" scaling="MAFHz" address="6808"/>
</table>
<table name="Injector Size Scaling" category="Fuel" type="1D" scaling="InjectorScaling" address="1506"/>
<!-- 3A. Base fuel pulse -->
<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="3732" type="2D" level="2" scaling="Percent64(8-bit)">
<table name="Coolant Temp" address="69d8" type="Y Axis" elements="9" scaling="Temp"/>
</table>
<table name="BFPW Startup Comp vs Coolant Temp #2" category="Fuel" address="3742" type="2D" level="2" scaling="Percent64(8-bit)">
<table name="Coolant Temp" address="69d8" type="Y Axis" elements="9" scaling="Temp"/>
</table>
<table name="MAF Comp vs Coolant Temp #1" category="Fuel" address="3722" type="2D" level="1" scaling="uint8">
<table name="Coolant Temp" address="69d8" type="Y Axis" elements="9" scaling="Temp"/>
</table>
<table name="MAF Comp vs Coolant Temp #2" category="Fuel" address="3712" type="2D" level="1" scaling="uint8">
<table name="Coolant Temp" address="69d8" 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="36dc">
<table name="MAF Air Temp" type="Y Axis" elements="8" scaling="Temp" address="6af0"/>
</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="35E5" 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>
<!-- 3B. Sync Load Accel -->
<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="3864">
<table name="RPM" type="Y Axis" elements="15" scaling="RPM" address="6622"/>
</table>
<table name="Sync Load Accel Compensation vs Coolant Temp Table #1" category="Fuel" type="2D" level="2" scaling="Mult128" address="3856">
<table name="Coolant Temp" type="Y Axis" elements="8" scaling="Temp" address="69be"/>
</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="3888" 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="3895" 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 Sync Load Accel/Decel Contributions" category="Fuel" address="391e" type="2D" level="1" scaling="x54d16">
<table name="RPM" address="6576" type="Y Axis" elements="10" scaling="RPM"/>
</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="Sync Load Accel DeltaMasterLoadPos Ceiling Value" category="Fuel" address="163a" type="1D" level="1" scaling="LoadMaster16"/>
<!-- 3C. Sync Load Decel Subtractor -->
<table name="Decel IPW Subtraction Comp vs RPM" category="Fuel" address="393c" type="2D" level="2" scaling="Mult128">
<table name="RPM" address="6576" type="Y Axis" elements="10" scaling="RPM"/>
</table>
<table name="Decel IPW Subtraction Comp vs Load" category="Fuel" address="394c" type="2D" level="2" scaling="Mult128">
<table name="Load" address="66b6" type="Y Axis" elements="14" scaling="Load"/>
</table>
<table name="Decel IPW Subtraction Comp vs Coolant Temp" category="Fuel" address="392e" type="2D" level="2" scaling="Mult128">
<table name="Coolant Temp" address="69be" type="Y Axis" elements="8" scaling="Temp"/>
</table>
<table name="Sync Load Decel DeltaMasterLoadNeg Ceiling Value" category="Fuel" address="163c" type="1D" level="1" scaling="LoadMaster16"/>
<!-- 3D. Sync Load Change Idle: doesn't exist in 96530006! -->
<!-- 4. Async TPS Accel Enrichment -->
<table name="Async Accel Pause Period" category="Fuel" address="1654" type="1D" level="2" scaling="uint16"/>
<table name="Async Accel Min TPS Delta" category="Fuel" address="1656" 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="1658" 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="165A" type="1D" level="2" scaling="Mult128-16"/>
<table name="Async Accel Mult to Coolant Temp Adder During 5 Sec After Startup" category="Fuel" address="165c" type="1D" level="2" scaling="Mult128-16"/>
<table name="Async Accel Above TPS Enrichment Cutoff vs RPM" category="Fuel" address="38b2" type="2D" level="2" scaling="ThrottlePercentage8">
<table name="RPM" address="6622" type="Y Axis" elements="10" scaling="RPM"/>
</table>
<table name="Async Accel Multiplier vs TPS Delta" category="Fuel" address="38a2" 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="38d0" type="2D" level="2" scaling="uint8">
<table name="RPM" address="6622" type="Y Axis" elements="15" scaling="RPM"/>
</table>
<table name="Async Accel vs Coolant Temp Adder (Main)" category="Fuel" address="38c2" type="2D" level="2" scaling="uint8">
<table name="Coolant Temp" address="69be" type="Y Axis" elements="8" scaling="Temp"/>
</table>
Last edited by logic; Apr 13, 2010 at 11:51 AM. Reason: Add missing tables.
#25
Evolved Member
iTrader: (2)
You didn't miss it, because I don't think it was ever posted; I think it's a mrfred-ism.
I suspect it looks something like this:
That's just a guess, though, and there might need to be a "-128" in there.
I suspect it looks something like this:
PHP 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"/>
#26
Okay, a few initial findings before I post up what I have so far for 96530006:
- There appears to be only one Sync Load Accel Compensation vs Coolant Temp table.
- The Sync Load Change Idle Compensation logic doesn't appear to exist at all; or, if it does, the code is totally different.
- There doesn't appear to be an alternate "Async Accel vs Coolant Temp Adder", only a main table.
#27
Evolved Member
iTrader: (2)
I definitely need to update my eyeglass prescription now! Anyhow, I did verify that the tables you mentioned are indeed not present. There is a new flag in the 8859 ROM that chooses between the two tables. The 9653 ROM doesn't have that flag. And there is no sync load change idle subroutine, so that explains why there are no tables for that. I didn't verify any of the other tables though. I assume you've got those correct.
I've deleted the commented-out entries from my original post, since I'd rather someone didn't get confused by them.
#28
Good to know I'm not going crazy; I hunted for the sync load change idle stuff for quite a while before finally deciding it probably wasn't there. Thanks for checking those; I'm hoping someone else who cares about 9653 will double-check the rest.
I've deleted the commented-out entries from my original post, since I'd rather someone didn't get confused by them.
I've deleted the commented-out entries from my original post, since I'd rather someone didn't get confused by them.
#29
Evolved Member
iTrader: (2)
I did randomly compare a few of the tables in the 9653 that were clearly in the correct subroutines and noticed that some of the values were different between the 9653 tables and the corresponding 8859 tables, so it could be a challenge to verify the tables by any method except finding common code among subroutines.
By the way, did I get your scaling for Percent64(8-bit) right above?