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.
- Obviously, at max load the same duty is needed on both the secondaries and the primaries (near 90%).
- at lower load (but big enough so both sets are on) the same duty is the best as well. Especially when duty gets near 2..3ms (it will not get lower with any reasonable ratio of primary and secondary flow), the same duty is better than a lower and a higher (the lower will get nonlinear due to injector opening and closing effects).
- at mid load, there is no reason to use a different duty
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.
- Don't forget to change any ..channel=70 or F0 (injFET 7 or i7) in config to something else (say 60 or E0, which is injFET 6 or i6).
- beware that if you have 8 primary injectors, and want to use staging, they must be configured in 4 banks, 2 injectors each.
- see GenBoard/Manual/Config/HwMap for details.
So\n
inj_stage2_rate=00 inj_stage2_start_tps=00 inj_stage2_start_map=78
and
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:\nÿ2ÿ
-Jörgen
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
- stage0: fuelcut
- stage1: only primary set of injectors (usually smaller and port injectors)
- stage12: primary AND secondary set of injectors
- stage2: only secondary set of injectors
questions:
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.\n
Example: Primary injectors: 300cc Secondary injectors: 450cc pri_plus_sec =750cc pri_const=450/pri_plus_sec=0.6 sec_const=300/pri_plus_sec=0.4 // 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 Enable_2nd_stage_inj=1; else Enable_2nd_stage_inj=0; If Enable_2nd_stage_inj{ pri_pw=calculated_pw*pri_const; sec_pw=calculated_pw*sec_const; } else{ pri_pw=calculated_pw; sec_pw=0; }
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:
- max allowed stage1 duty 50..100% (16 steps)
- ratio: how much of the fuel should go to second set (in stage12) - normally same pulsewidth for the 2 sets
- ratio of stage2 fuel_req compared to stage1. 1..ff. 00 means that staging is off. This should support at least stage2 flow = 3 * flow of stage one. Support also needed for stage2 flow < stage1 (even though it's uncommon).
- injopen (+battfac + injocfuel) for stage2: since stage2 is never used alone, and never with very short pulsewidth, these can be replaced by a simple constant (~offset).
- locking for the injector pw values: with stage12, this is not critical, but with stage2 a mode change could be dangerous if stage1 reads the old value while stage2 the new value (smooth transition helps of course)
Let's see the ideal solution. This is not from an implementation point of view, but from user's. We have some inputs:
- fuelamount to inject (from fuelcalc, so it contains lambda, and total enrichment..)
- battery voltage
- available fuel: if second set's tank is empty, decreasing fuel amount when reaching stage12 is dummy.
- fuel price (if using BiFuel)
- heat stress (fuel also cools). Fortunately this is in close relationship with fuelamount (actually fuelamount * RPM) We would like to not mix cooling into the fuel calc, since in the common case it is simply adjusted with the lambdacorr table. But BiFuel would at least desire 2 separate cooling-enrichment (lambdacorr table) and injecting 0 Joule water with the second set the proper way requires that cooling is considered here, not in the lambdacorr. (lambdacorr does not apply to water, while water really does cool).
we need:
- stage1 pw
- stage2 pw
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:
- RX7 injector staging method: http://www.wvinter.net/~flanham/wlanham/rx7/fuel/staging.html
- Rotary/RX7 injector upgrade: http://www.scuderiaciriani.com/rx7/injector_upgrade.html
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