Nice. I've always wanted to do this. It'll be interesting to compare methods and perhaps we can start a ignition timing thread too.
Here's a rough step-by-step of what I do.
Disclaimer: adjust fuel at your own risk. This method worked for me but may not work for others. You can cause catastrophic damage if adjusting improperly.
I've found MLV to be essential in this process.
I start with the stock fuel table and set my axis. I interpolate the stock values for my new axis.
If you run stock injectors, you can skip the dead time and scaling steps.
I also 00 out the WOT enrichment and vanos correction tables as I run fuel table only. This is a personal preference.
I find the dead time on the Internet for the appropriate fuel pressure and set that. I do the scaling method shown by pazi = stock ipw(old flow rate/new flow rate). This helps sort of get close but is no where near perfect as latency is different between injectors. I do this for the cranking fuel maps as well.
If I experience weird dips and surging immediately after start, I manually adjust with the cranking fuel tables to get a solid start. I find the above method usually makes things a bit too rich.
I then 00h out the maximum temperature for lambda adaptations so that there will only be STFT and LTFT will be disabled.
Log idle for several minutes (gauge this based on how well it is idling)
I then load my log into MLV and go to the histogram/table viewer. You will need to manually set your axis points. I always set a filter to filter out transient conditions. I use the following but there might be a more ideal method:
Code:
(abs([* Engine Speed] - [* Engine Speed-4]) > ([* Engine Speed] * 0.10) ) || (abs([* Throttle Position] - [* Throttle Position-4]) > 5 ) || (abs([* Engine Load] - [* Engine Load-4]) > ([* Engine Load] * 0.15) )
Then I set lambda integrator as the Z axis and I get the following:
Attachment:
mlv_idle.png
Sorry for people using 2 banks. You will need to average your two fuel trim banks in your log before loading it into MLV.
Now I can see my fuel trims for each cell on my fuel table.
I don't worry about the lowest RPM row. I manually fill that in with the same value as 850.
I have a spreadsheet set up that allows me to paste in my current fuel table and then I paste in this table next to it, and it pumps out a new fuel table for me.
Attachment:
fuel_spreadsheet1.png
The formula I use for the multiplier table is x/100+1. This will give the value that the current ipw setting must be multiplied by to get it to what the DME is requesting and if the DME is requesting 0% change or it is a cell that you haven't hit, it will pump out the value of 1 thus not changing the value for that cell.
I then multiply the values in the table on the right with my current fuel table and it will pump out a new fuel table for me.
I repeat this step until I end up at +/- 2% in my logs. It can get tedious.
Once start and idle are all good to go, I use the same method for dialing in idle as i do for part throttle.
Personally I do not use the WOT multiplier map or vanos fuel correction. I do everything in the main fuel table with the other two 00'd out. This is a personal preference.
So I start logging and drive around PT as I usually would. Get lots of data here. The longer the log, the better. Start easy, then get more aggressive as your logs smooth out.
Here's a random log of me part throttling around town
Attachment:
mlv_pt.png
Apologies, I have no idea what I was doing in this log or when it was from so the values may look a bit off. But anyway..I follow the same method as I do with dialing idle in. Drive around, log, apply to spreadsheet, generate new table, rinse, repeat with 1 exception. I set a filter so that it will only display values where lambda integrator is turned on.
Code:
[* Lambda Integrator Bank 1] = 0.00
Once I'm happy with the part throttle fuel trims being +/- 3ish, I do a compare to my original file and manually fill in the areas that were unachievable. I use best judgement here. I'm sure there's a proper way to go about doing this.
Next comes WOT. And since I don't use the WOT table multiplier..you guessed it- It's similar to my above method with a few changes.
You will obviously need to have a wideband integrated into RR logger.
I leave LTFT disabled because it doesn't really matter for WOT. I disable the primary o2 sensor so that the engine is running off of pure tables and lambda integrator will always be 0. Before this, I made sure all of my values were safe. Use best judgement here.
I go out and log pulls from various TPS >= WOT mode TPS setting all the way to redline. So here we will assume I have WOT enrichment set to 50% tps. This will be when the o2 sensor are turned off in the real world.
Load that log into MLVand I apply the following filter:
Code:
([* Throttle Position] < 50.00) || ([* Lambda Integrator Bank 1] != 0.00)
Attachment:
mlv_wot.png
I have another spreadsheet set up similar to my part throttle spreadsheet but with some changes.
I paste my current fuel table. Paste my MLV WOT table output. I create a table with my desired AFR. It then calculates a parts fuel table and a multiplier table based on reported parts fuel and my desired AFR. It then multiplies my current fuel table by the multiplier table which gives me my new fuel table. I repeat this method until I am comfortable with the wideband reported readings.
Attachment:
fuel_wot1.png
Attachment:
fuel_wot2.png
Then multiple fuel table by the above table on the right.
I then re-enable LTFT and primary o2 sensors and the car is good to go fuel-wise.
As far as the values go in my screen shots, both the fuel table and logs are all random from who knows when. I just picked archived files that showed decent data. They are displayed only to show the method I used.
I also want to add that since I'm boosted, I maxed out the final load value and I scale it to dump fuel in the event of over boosting.