• Hello Guest, welcome to the initial stages of our new platform!
    You can find some additional information about where we are in the process of migrating the board and setting up our new software here

    Thank you for being a part of our community!

Fuel/Spark tuning for LH 2.4/EZK with TunerPro!

Well, guys, I have a problem and can't resolve it.

Problem with data tracing for wideband controller.

I'll cut it, because there will be a lot of screenshots.


What I want: I want to measure AFR in every block of fuel table.
What I have: Innovate LC2 and adx for it, 962 xdf, adapted 962 bin.
What I'd already do:

1. Prepare ADX, create new values: RPM and load, you can see data type and other settings on screenshots..
LtzUi3_sm4XBrhmEJOINCucLDuk-960.jpg

1Or08K-0DBgwmIU2AgXTYhElOJE-960.jpg

bj03zG0C7aNu-M33UEV87HsFw9s-960.jpg

pmrzUo3fCIYogxeql6OlI6IHZ2I-960.jpg


You can see - AFR value already exist and works correct, AFR reading from TunerPro and from Innovate LogWorks - same.

2. Then I create history table, where Z object is AFR, X and Y - RPM and LOAD values, which I created earlier.

_UwtHCDIxjGLNGZNoI7PeKBSWzo-960.jpg


bwUWWlZ6Y1S1p12pknWrpfTXCkU-960.jpg


EsCveUd_4ba_GgeLmEa3owggQLE-960.jpg


3. Then I prepare my XDF to work with ADX

wOTWPTdj4dGwf_PLto7Cgf-EgoU-960.jpg


Prepare values in fuel map - floating point, that's all stuff, you can see on screenshots

F1_PvIGj38m4kLJHnboW1IHHkys-960.jpg


JIG9DwzwE1rkw2pPXXtJdO3-u1I-960.jpg


Then I linked rows and colums with ADX

dBQnLMowz0lmE9JR_dQn_pPQ0hM-960.jpg


4. And finally! I have some shit:

EQ1dBMYoWi8zJMcx7uqU1m4mnA8-960.jpg


Tracing fuel table keep working fine, but adx tracing goes to hell and fill just one value in wrong place.



Can anyone tell me what I do wrong??
when i link my xdf to my adx my xdf dosent open in tunerpro rt anymore have you had the same problem?
 
LH2.4 ECU Adaptation (aka Relearn)

The LH2.4 ECU only has 2 learned values for air/fuel mixture adjustment - an additive value for idle fuel trim and a multiplicative value for cruise fuel trim. These are lost when the battery is disconnected. The TP31354 greenbook has some details on these trim values:

The adaptive functions are of two types, an additive factor (±1.0 ms on the injection times) Tadd,adap working in the idle range and a multiplicative factor (±25% of the injection times) Fmult,adap working in the part load range.

Corrections with the additive factor correspond to the basic setting, which was previously set manually using potentiometers on the air mass meter. The additive adaptations are rapid and give corrections to the right value within a few minutes.

Corrections with the multiplicative function compensate for long-term changes in the engine or its control system. In contrast to the additive adaptations, it is slow and needs some hours to compensate fully for a fault.

While uploading some of my files to the new ^^^ github repository, I ran across an interesting page in the Saab 9000 LH2.4 Manual that gives a simple procedure to get the Saab LH2.4 ECU to relearn after the battery has been disconnected. I'd think that it would work for the Volvo LH2.4 ECUs as well, but maybe Volvo wanted a slower (aka longer) adaptation process for the multiplicative cruise trim?

What are everyone's experiences with Volvo LH2.4 relearn after disconnecting the battery? Does it really take hours of driving???

I've attached the relevant page from the Saab 9000_2_3_LH_Fuel_Injection_system_M1985-93_359323ENG.pdf
downloaded from http://findingsaabparts.com/9000/ under "refer to the PDFs" --> Engine --> Fuel and Air
 

Attachments

Can someone recap how to use the injector constants? I've just started poking around .bin's with TunerPro and it's a lot to take in.
 
My current understanding of the 4 constants:
Code:
1: coarse injector size
2: center point of the main correction map
     128 here makes it so values below 128 on the main 16x16 correction map subtract fuel and above add fuel.
3: calculated cylinder load load offset
4: calculated cylinder load load slope
     3 and 4 scale the absolute cylinder load like a slope intercept equation. y = mx + b, where m is constant 4 and b is constant 3. 
     Changes to these change where in the correction map (well, all maps with a load scale) is being accessed for a given rpm/load point. 
     Also affect ignition timing/ignition load.
Most people should only ever touch 1 IMO.
 
Injector constant #4 is approximately 750,000 / injector_flow_rate_in_cc_per_min. For example, 300cc/min injectors would have a constant #4 value of 2500. The actual value used in the factory '937 .bin for the factory greentop injectors is 2443, or ~2.5% off.

The injector offset or deadtime is included in the "System Voltage Compensation" table, but I don't think anyone changes the factory values.
 
So 804's that flow (Data from injectorplanet.com) 337cc/min would yield an IC 4 value of 2225?
 
I couldn't figure out an equation that exactly matches the various factory injector sizes and .bin values, but the 750000/inj_size is a good starting point. Turn off lambda adaption and see if it's generally running rich or lean. If rich, reduce constant #4; if lean, increase constant #4.

See this old post from @turbotankshane for some examples from his testing - link.
 
At the end of the day, 3 and 4 can scale for injectors but it does it in a way that affects a bunch other things which is why I avoid it. It scales how the ECU turns airflow into cylinder load, which changes the calculated load everywhere and the result of every map and constant that follows.
 
Note: I'm using the constant 1,2,3,4 order from TunerPro; esmth is using a different order:
TunerPro '937 ECU injector constants.png

In more detail, here's my current guess for the fueling equation (before lambda trims) and the main injector constants:

The AMM sensor reading is used to calculate a base "load" value, which is the injector pulsewidth needed to give a 14.7 AFR. The main fueling table is a rpm/load based correction added to the base load.
load = K * cur_rpm_period_H:M:L * InjConst4 * AMM_AVG_H:L = injector pw in 2us timer ticks for 14.7 AFR
fueling = (InjConst1 * 2/256) * (load * (1 + (fuel_table[]-InjConst2)/512))

InjConst1 (8bit K_92 0x383c) - overall fueling multiplier *2/256
InjConst2 (8bit K_94 0x383e) - correction table offset (above offset is positive, below offset is negative)
InjConst3 (16bit K_da 0x3884) - min injector open time
InjConst4 (16bit K_dc 0x3886) - K/injector_flow_rate, K is approx 750,000

The pulse width of the ECU-to-EZK Tq signal, in 2us steps, is calculated as the 12-bit load value times a Tq scaling constant (8bit K_93 0x383d), with a hardcoded min limit of 0x13 (aka 38us min Tq) and a max limit from the constants table (8bit K_97 0x3841).
 
I think we're saying basically the same thing, just an interpretive discrepancy about the blurry line between cylinder load and injection load.

The fact is that 3 and 4 scale more than just injection time. I believe the OEM used 3 and 4 for load scaling, to map the expected cylinder load range to the available table resolution. Turbo cars got a smaller number because there is more load range compressed into the same table sizes. Yes, they got proportionally larger injectors, too. But for us cobbling the wrong parts (injectors) into the car and trying to tune the ECU for them, whilst trying to keep as much stock behavior/mapping as possible, the constant 1 knob fixes JUST the target injector open time.
 
  • Like
Reactions: Led
Hi, does anyone know how to convert the rpm signal on pin 17 ezk to 0-5 volt analog output so it can be used in tunerpro, I have tested with this but it was not linear, for example 1000 rpm = 0.20 volts and 2000 rpm = 0.40 volts and then 3000 rpm = 0.70 volts, so it is not possible to use a special formula in tunerpro. https://a.co/d/3i02lnD
 
6000 rpm is 100 revs per second. The EZK-to-ECU tach signal is a ~12v square wave with 2 pulses per rev, so 200Hz @ 6000rpm. You may be able to adjust that frequency-to-voltage board to have a 0-to-5volt output for a 0-to-250Hz input range. The response time of that board is sort of slow.

What are you trying to do, and what are you using with TunerPro to sample the analog voltage? If you have the ability to burn ECU chips and aren't in a hurry, I'm working on a much better setup, but I'm not quite ready to release it. There are some TP issues, and fake-vs-real FTDI chip issues I need to resolve first.

Teaser:
trial2_dash_example.png
 
6000 rpm is 100 revs per second. The EZK-to-ECU tach signal is a ~12v square wave with 2 pulses per rev, so 200Hz @ 6000rpm. You may be able to adjust that frequency-to-voltage board to have a 0-to-5volt output for a 0-to-250Hz input range. The response time of that board is sort of slow.

What are you trying to do, and what are you using with TunerPro to sample the analog voltage? If you have the ability to burn ECU chips and aren't in a hurry, I'm working on a much better setup, but I'm not quite ready to release it. There are some TP issues, and fake-vs-real FTDI chip issues I need to resolve first.

Teaser:
View attachment 35838
im using cobra rtp r6 and i want rpm to datalog
 
I've been working on TunerPro .adx monitoring/logging extensions that use the factory serial port code on a '937 LH2.4 ECU. It's a work in progress but here's a preview.

To use this, you need a FTDI usb-to-serial adapter cable. (I think I now have it working with the more common fake FTDI parts too.) To connect to the ECU, you need to cut one trace (top side) and solder in 3 wires (Tx, Rx, Ground). To add AFR monitoring using a WBO2, you need to replace 1 resistor (bottom side) and connect the WBO2 wire to ECU pin 32.

I've attached my working files and a couple ~10minute logs. You can play with this yourself on your desktop by selecting the .bin/.xdf/.adx/.xdl files in TunerPro and doing a log playback. Table tracing works in playback mode too. Note: set the playback speed to Custom 2000x to begin with. I've also included .csv files exported from TunerPro, and a reduced version that can be viewed with MegaLogViewer (much easier to use/navigate).

Here's what playback looks like for the ~10minute minimal rpm/load/afr/mph log, showing Monitors and a couple Histogram screens:

TunerPro_LHserial_afr_min_11_24_2025-Monitors.png

TunerPro_LHserial_afr_min_11_24_2025-AFR_histogram_avg.png

TunerPro_LHserial_afr_min_11_24_2025-AFR_histogram_counts.png

I need to clean/prep for tomorrow's guests, but will be working on this more next week.
 

Attachments

Hello.

I noticed people was looking for the jetronic bins. I dont know if they ever found it, but here are a link to my dropbox account.
I'm not sure if it is complete, but i tried to grab all of the LH 2.4 stuff.


edit: Added EZK archive and some other stuff.
 
Last edited:
@bobxyz That tuning dashboard looks really cool!
I've always been very against tuning OEM ecus just due to the lack of control/influence over the tables. Recently one of the race series I compete in has been talking about only allowing OEM ecus in the class I race in. This would help keep my old Volvos competitive against civics with k-series swaps and Fiesta STs with custom ECUs.

So now, I'm slightly curious to see what you're cooking up.
 
Back
Top