PDA

View Full Version : IBPW {B4005} {B3701} correlation



5.7ute
April 8th, 2010, 09:53 AM
Finally had some spare time to "prove" the make up of the GM.IBPW pid. What I did was fit the roadrunner, start the car & let it idle. While monitoring the GM.IBPW pid I increased the values in the {B3701} voltage/manvac table while in emulation mode & noted a corresponding increase in the GM.IBPW pid.
So from this we can ascertain that IBPW is contrived from a calculated value plus the offset.
Next I zeroed out the {B4005} short pulse adder table. While once again monitoring GM.IBPW I started adding a value of 1.0ms starting from 1.8ms & working my way up the table. While the GM.IBPW pid was reading 3.1ms at idle, populating the 2.6ms cell in {B4005} caused a surge in the IBPW. Showing that the {B4005} table also runs from the calculated value BEFORE the offset is added.
While I have been stating for a while that this is the case, I am glad I have finally proven to myself that this is correct.
Also note that any transient fuelling addition (wall wetting etc) is also part of the GM.IBPW pid & must be removed if trying to solve backwards for airmass.

mr.prick
April 8th, 2010, 10:27 AM
Good work. http://smiliesftw.com/x/sherlock.gif

I know you've been talking about proving this for a while.
Your explanation makes it look easy why did this take so long? :music_whistling_1:

On a side not I've never noticed any changes in AFR with RTACS & {B4005}.
{B3701} is another story, in OL fueling can be controlled w/RATCS & BEN factor.

Now if only we could log PW w/o all the adders/offsets so we could build new offsets. :laugh:
I guess we could make a couple of lookup PIDs and spreadsheets. :sly:

5.7ute
April 8th, 2010, 10:54 AM
I already use a calc.pid for the IPW without the offsets/adders.
CALC.IPW=(GM.DYNCYLAIR_DMA/GM.AFR/GM.INJFLOW)*1000
This I then link to B4005 in the cal_link.txt file.
I was trying to prove this all with calculations, but the noise in the scanner could only get it close. Not close enough to prove though.
Marcin had suggested the low tech approach a while ago, but I got sidetracked with some .cax files I was working on. Luckily I didnt have much on in the last few days & worked out exactly how I would go about it.
Since by default B4005 is linked to IBPW, RTACS will be raising the wrong cells to show a rise in the AFR. Also I found that it tends to "bounce" the IBPW. I will be looking deeper into the cause of this.
EDIT: I also have to look at whether B4005 is added to a default pulsewidth value, which I am sure it is.

joecar
April 8th, 2010, 11:30 AM
Mick, good job researching this...:cheers:

mr.prick
April 8th, 2010, 12:24 PM
Can {CALC.CYLAIR} be used in place of {GM.DYNCYLAIR_DMA}?

Is {GM.INJFLOW} derived from the IFR table {B4001}?
Can a calc_pid be used in place of it, something based off fuel pressure?

It would be nice to be able to log more PIDs w/the RR.
I wonder if it's possible to log directly from the RR. :gossip:
:blahblah:

5.7ute
April 8th, 2010, 12:39 PM
Can {CALC.CYLAIR} be used in place of {GM.DYNCYLAIR_DMA}?

Is {GM.INJFLOW} derived from the IFR table {B4001}?
Can a calc_pid be used in place of it, something based off fuel pressure?

It would be nice to be able to log more PIDs w/the RR.
I wonder if it's possible to log directly from the RR. :gossip:
:blahblah:

Yes, {CALC.CYLAIR} can be used when using the maf, but only when you are over the dynair prediction value {B0120}. Otherwise there could be a small error if the values dont match.
As for the calc pid for injector flow related to fuel pressure it would not be usable, since you want to use the same values as the pcm is seeing. If however you were back solving airmass you would use this value & your wideband AFR to calculate it. (along with GM.IBPW- offsets)

joecar
August 11th, 2010, 04:04 AM
Mick,

So would this be how we think the PCM is calculating IPW and IBPW:



IFR = lookup(B4001);

IPW = airmass / AFR / IFR * 1000;

if IPW < B9021 then
IPW = B9021;

if IPW < B4003 then
IPW = B4004;

if IPW < B4006 then
IPW = IPW + B4005;

IBPW = IPW + B3701 + TF;
Did I get IPW and IBPW in the right places...?

See posts #6, #13: Injector-Base-Pulsewidth (http://forum.efilive.com/showthread.php?10179-Injector-Base-Pulsewidth)

Were there any other threads specifically on this topic, I'm trying to link them together...?

5.7ute
August 11th, 2010, 09:24 AM
That's right Joe, apart from the IPW needing to be turned into ms.
We can also now expand to

IFR = lookup(B4001);

IPW = airmass / AFR / IFR *1000;

if IPW < B9021 then
IPW = B9021;

if IPW < B4003 then
IPW = B4004;

if IPW < B4006 then
IPW = IPW + B4005;

IBPW = IPW + B3701 + TF;

redhardsupra
August 11th, 2010, 09:27 AM
guys, cant you post this in form that people that dont remember every table number can read?

5.7ute
August 11th, 2010, 09:42 AM
HaHaHa, I had a cheat sheet in front of me with table numbers & functions so I could follow it.
IFR = lookup(B4001);

IPW = airmass / AFR / IFR *1000;

if IPW < B9021(minimum transient pulsewidth) then
IPW = B9021;

if IPW < B4003(minimum pulsewidth) then
IPW = B4004(default pulsewidth);

if IPW < B4006(small pulse threshold) then
IPW = IPW + B4005(small pulse adder);

IBPW = IPW + B3701(voltage/manvac offset) + TF(transient fuelling modifiers);

5.7ute
August 11th, 2010, 09:56 AM
One thing to note is
if IPW = {B9021}(minimum transient pulsewidth)
IBPW = {B9021} + {B3701}(voltage,manvac offset)
Small pulse adjust at this time doesnt appear to be added to {B9021} when it is active. More testing to be done.

joecar
August 11th, 2010, 02:00 PM
One thing to note is
if IPW = {B9021}(minimum transient pulsewidth)
IBPW = {B9021} + {B3701}(voltage,manvac offset)
Small pulse adjust at this time doesnt appear to be added to {B9021} when it is active. More testing to be done.When which is active...? :) (I'm trying to be precise so I can write a line of pseudo-code for it)

So would this fit in here (is this the right place):



IFR = lookup(B4001)(injector flow rate);

IPW = airmass / AFR / IFR * 1000;

if IPW <= B9021(minimum transient pulsewidth) then
IPW = B9021;
else
if IPW < B4003(minimum pulsewidth) then
IPW = B4004(default pulsewidth);

if IPW < B4006(small pulse threshold) then
IPW = IPW + B4005(small pulse adder);
end

IPW = IPW + B3701(voltage/manvac offset) + TF(transient fueling modifiers);

IBPW = IPW;

Is there another if that I need to put in front of it...?

(Note how I separated out the last step, this makes it easier to edit later when other details are discovered)

Very interesting algorithm... GM obviously went to great length to get the injectors modelled correctly, we're learning from this. :)

joecar
August 11th, 2010, 02:11 PM
BTW: just wrap the pseudo-code in
tags to get the indents preserved.

joecar
August 11th, 2010, 02:12 PM
So are both the if's involving B9021 in the correct places...?

5.7ute
August 11th, 2010, 02:58 PM
I have trouble following code like that. That is what is making it all confusing.lol.
All I can tell you is that if the calculated fuelling portion of the pulsewidth or IPW is equal to or lesser than B9021, then the value of B9021 + the offsets is the final or IBPW. If the B9021 limit is not hit, then all the min, default pulsewidth, SPA tables etc come into play. Small pulse adjust didnt appear to be active in my tests of B9021 earlier this year.

joecar
August 11th, 2010, 03:22 PM
Ok, I want to make less confusing...

How about this:



IFR = lookup(B4001)(injector flow rate);

IPW = airmass / AFR / IFR * 1000;

if IPW <= B9021(minimum transient pulsewidth) then
IPW = B9021;
else
if IPW < B4003(minimum pulsewidth) then
IPW = B4004(default pulsewidth);

if IPW < B4006(small pulse threshold) then
IPW = IPW + B4005(small pulse adder);
end

IPW = IPW + B3701(voltage/manvac offset) + TF(transient fueling modifiers);

IBPW = IPW;

The block between else and end happens when IPW > B9021.


Ok, I get it... is this how it works:

if IPW is less than or equal to B9021, then the final value is B9021+B3701+TF;
otherwise B9021 is not used, and instead, B4004 and/or B4005 may be applied, and then B3701+TF are applied.

joecar
August 11th, 2010, 03:26 PM
I'm wondering if it should read like this:



IFR = lookup(B4001)(injector flow rate);
IPW = airmass / AFR / IFR * 1000;

if IPW <= B9021(minimum transient pulsewidth) then
IPW = B9021;
else if IPW < B4003(minimum pulsewidth) then
IPW = B4004(default pulsewidth);
else if IPW < B4006(small pulse threshold) then
IPW = IPW + B4005(small pulse adder);
end

IPW = IPW + B3701(voltage/manvac offset)
IPW = IPW + TF(transient fueling modifiers);

IBPW = IPW;

The if ... else if sequence selects only one statement to do and then jumps to end.

This is much simpler.

Are the < correct, should any of those be <= instead...?

5.7ute
August 11th, 2010, 03:46 PM
I'm wondering if it should read like this:



IFR = lookup(B4001)(injector flow rate);
IPW = airmass / AFR / IFR * 1000;

if IPW + TF<= B9021(minimum transient pulsewidth) then
IPW = B9021;
else if IPW < B4003(minimum pulsewidth) then
IPW = B4004(default pulsewidth);
else if IPW < B4006(small pulse threshold) then
IPW = IPW + B4005(small pulse adder);
end

IPW = IPW + B3701(voltage/manvac offset)
IPW = IPW + TF(transient fueling modifiers);

IBPW = IPW;

The if ... else if sequence selects only one statement to do and then jumps to end.

This is much simpler.

Are the < correct, should any of those be <= instead...?

Now your splitting hairs. lol.
Another question that needs answering is when TF or the transient fuelling modifiers are actually added to the equation. Are they added to the initial IPW calculation, so minimum pulsewidth or small pulse adder are in effect afterwards like I added in blue?

5.7ute
August 11th, 2010, 03:48 PM
I can see a lot more testing & calculating may need to be done to put this to bed.
Good work on the pseudo code Joe, That looks a lot easier to follow now.

joecar
August 11th, 2010, 05:41 PM
So the question is whether TF is applied first:



IFR = lookup(B4001)(injector flow rate);

IPW = airmass / AFR / IFR * 1000;

IPW = IPW + TF(transient fueling modifiers);

if IPW <= B9021(minimum transient pulsewidth) then
IPW = B9021;
else if IPW <= B4003(minimum pulsewidth) then
IPW = B4004(default pulsewidth);
else if IPW < B4006(small pulse threshold) then
IPW = IPW + B4005(small pulse adder);
end

IPW = IPW + B3701(voltage/manvac offset)

IBPW = IPW;

joecar
August 11th, 2010, 05:43 PM
Now your splitting hairs. lol.
Another question that needs answering is when TF or the transient fuelling modifiers are actually added to the equation. Are they added to the initial IPW calculation, so minimum pulsewidth or small pulse adder are in effect afterwards like I added in blue?Splitting hairs, maybe :hihi:... but understanding the model is the objective because this may help when editing those tables.

joecar
August 11th, 2010, 05:46 PM
You're pretty sure that B3701 is applied last, right...?

5.7ute
August 12th, 2010, 09:19 AM
You're pretty sure that B3701 is applied last, right...?

100% certain that all the other adders are referencing IPW.