Injector Staging

The basic staging where people use two small sets of injectors will support injectors with different opening characteristics. The secondaries will be turned on based on the duty of the primaries. When the Primaries reach 90-94% duty the secondaries are turned on and help share the load.

Old implementation (since Aug 21, 2004)

It will fire the configured injector FET's above a given throttle position and/or MAP value.

config.inj_stage2_rate - Secondary injectors firing pulsewidth rate. Give it in 0.4 percents relative to primaries. 0x00 means 100%, 0xFF means 200%. (plans are to change to 50..250% range or sg. like that)

config.inj_stage2_start_tps - Secondary injectors will fire only above this engine.tps value

config.inj_stage2_start_map - Secondary injectors will fire only above this manifold pressure (given in kPas)

Define INJECTOR_STAGING in my_make, and (optionally) SECONDARY_INJ_CHANNELS_NUM (default: 1).

Adjust the last SECONDARY_INJ_CHANNELS_NUM element (in standard case the last element in the h[0] table to the output FET of the second-stage injectors.




h[0] = xx xx xx xx xx xx xx 02

Will fire the secondary injectors at Injector channel "B" above (0x78=) 120kPa (0.2 bar boost) with the same pw as the primaries.

Note: Use at your own risk! Off engine-tests revealed a bug in the implementation, which cause the secondary channels "lockup" (FETs never switched off) sometimes under extreme conditions. Believed fixeded.

Proposed future changes

We also want to be able to switch the primaries and the secondaries role based on RPM and MAP. This is not related to the staging other then that it will be done in the same segment of code. This is useful when using different fuel for the primaries and secondaries or when using different injector placements.

For the same reason as the above I think that we should add the variables needed for mappable injector end angle now. This isn't related to staging either but as we are adding fuel parameters to the firmware and tuning software now we can just as well add these to avoid one more incompatibility between mt and fw.

Yet an other important feature is per cylinder mapping, with our high aim we should look at Motec and Autronic. Both use small maps for each injector where the axes are load and rpm and the parameter is a percentage. Both affect the air distribution.

Note that the injector end angle and the per cylinder correction both need about the same size maps. 4X4 or something like that.

Settings needed for the two sets:

H[0] table
Injector end angle table (deg vs rpm and load)

H[x] table
Injector end angle is common with the primaries.


What is staging?

Staging is a method to control fuel flow into engine separating the existing injectors into two sets. Primary injectors are used all the time when the engine is running, and the secondary set used only when the engine needs more fuel. The secondary set of injectors can be run in batch mode (but PWM-ing is often useful).

Staging also can be used in common turbocharged engine configurations to achieve finer fuel control in vacuum mode (stage 1).

Special and rare staging setups

An advanced setup with one injector that spray the valve and one that spray the throat would benefit from a full sequential configuration where the balance between the injectors can be mapped. It would even benefit from different timing on the two injectors!

But 99% of all staged setups is only built to be able to use cheap injectors that is already available, some is built to improve resolution for old engine management systems with bad injector control.

I definitely think that it is overkill to spend time on the mega advanced configurations, AFAIK only high end engine management systems support this. High end starts at around 10000euro.

It's definitely no design target for any board: they can later be supported with 2 (networked) controllers and some software, of course.

Discussion terminology - shorthands


stage2 is not allowed in many setups, and it's a question if it needs to be supported at all.

For stage12 the question is if there is a point for different pulsewidth for the 2 sets. They have to max out simultaneously (obviously) and IMHO the pulsewidth better be the same for both sets; otherwise the shorter pulsewidth would tend to have injector opening issues, and would also mean more config variables. But if different fuel is used in 2nd set... or stage1 is determined by alien ECU...

transition requires special consideration in any case. Maybe insert 1 cycle with special transition pulsewidths ? Hysteresys can be used to decrease the frequency of transitions. Proper transition between stage1 and stage2 would be extremely hard (for the end user to configure precisely, according to his engine-aerodynamics).

The most tough case

A 15000 RPM engine will still have 8ms to inject. Let's examine the switching threshold between stage1 and stage12: if stage1 duty is 80% the stage12 pw would be appr 3 msec (assuming slightly bigger 2nd set): this probably cannot be split to 4 shorter squirts.

Primary injectors: 300cc
Secondary injectors: 450cc
pri_plus_sec =750cc

// calculated_pw is what we call pw today.
// pri_pw is the primary injectors pw
// sec_pw is the secondary injectors pw.

If calculated_pw>75  //75% duty of course

If Enable_2nd_stage_inj{

Surely, the current code requires rework (eg. remove compile-time condition).

The rest of the comments is about the cvs version (August 22nd, 2004)

The tps condition is useless. The kpa is better, but it should be based on stage1 duty. Like stage2 should activate when stage1 would be > 80..85% duty.

config variables:

However if one has alcohol in the 2nd set, flexible strategy is nice. Also, pri_pw might be the measured pw an alien ECU...

Let's see the ideal solution. This is not from an implementation point of view, but from user's. We have some inputs:

we need:

it is obvious, that we need to do simplifications, as 3-dimension table is hard to store or tune. As the battery voltage only effects opening (and closing), that is already implemented.

If we have 2 req_fuels (which is in msec dimension, so it also involves AFR of the given fuel mix) and 2 cooling-variables, a userspace routine could optimize to have 2 pw-s that has exact fuel and close to required cooling effect.

A few words about duty

Injectors could be driven by standard square pulse signal, or PWM signal. Open it all in the same time, alternating or sequentially. But how to define duty?

duty = topentime * 100% / ttotal.

Where ttotal is the time between two injector activation events (RPM and injector configuration dependent). Duty should be always under 100% because the injectors aren't planned to being open continously for a long period of time.

Calculate injector duty from the following formula (correct it, if you found mistakes):

duty = (calc_pw * squirts_number * 100%) / crank_time.

Where the squirts_number is the number of activations of a specific injector port in one crank rotation (crank_time).

I suggest to use the calc_pw independent pw_stagelimit:

pw_stagelimit = crank_time * stage1_maxduty / squirts_number.

Where the stage1_maxduty and squirts_number are both tuner configurable constants. Can we put these in one, wisely selected config variable?

External sites dealing with the subject:

Currently (up to 1.1.87) on Alpha-N ITBs we can trigger secondary injectors only from TPS position.

It lead to undriveability at low Rpms. Because air flow trough trumpets is way too low. Using only WOT TPS values for trigering can lead to lean condition at high rpms/partial throttle when primaries are maxed out. Moreover secondaries at low rpms and WOT are unwanted.

Developers, please make duty cycle triggering. I have two cars with this problem. GintsK?