Skip to main content

Cylinder Angle Offset Configuration

This firmware has three unrelated angle controls. Use each for one purpose:

ControlPurposeRuntime effect
globalTriggerAngleOffsetCalibrate the trigger's synchronization point to TDCShifts the complete trigger-to-engine phase
timing_offset_cylinder[]Correct unequal firing intervals or mechanical phaseShifts an individual cylinder's event angle
ignTrims[]Correct combustion timing between cylindersAdds BTDC ignition advance per cylinder

Mechanical cylinder phase​

Open Ignition > Cylinder offsets. Despite the menu's wording, timing_offset_cylinder[cylinder] is not added to the ignition table's advance. OneCylinder::getAngleOffset() returns:

engineCycle * firingOrderIndex / cylinderCount + timing_offset_cylinder

The firing-order index is the cylinder's position in the configured order. Positive offsets move the scheduled event later; negative offsets move it earlier, matching the TunerStudio note that positive retards and negative advances. The offset is consumed when computing injection opening angle, primary spark angle, per-cylinder MAP sampling start, and instantaneous-RPM measurement position. It therefore describes where events occur in the engine cycle, not how much advance is commanded.

A nonzero offset also marks the engine as odd fire. Unless the engine is two-stroke or pairedOddFireWastedSpark is enabled, wasted-spark mode can use the odd-fire +360-degree re-fire path. Do not use this field to trim a cylinder's combustion advance.

Global trigger and advance controls​

TriggerCentral::toEngPhase() converts trigger phase with trgPhase.angle - triggerShape.tdcPosition - globalTriggerAngleOffset + m_phaseAdjustment; toTrgPhase() performs the reverse conversion by adding the TDC position and global offset. The global offset is therefore subtracted on trigger-to-engine conversion, not universally added as a positive phase shift. It moves every cylinder together and cannot correct unequal firing intervals. Establish this value with all per-cylinder offsets zero.

Normal ignition-table advance is a BTDC target. getCylinderIgnitionTrim() reads each cylinder's ignTrims table, then firmware calculates untrimmedAdvance + ignitionTrim. A positive trim therefore increases advance; a negative trim reduces advance. This sign is opposite the Cylinder offsets menu's positive-retards convention.

Setup and diagnostics​

Start with zero cylinder offsets and trims, fixed timing enabled, and verify trigger phase with a timing light. Then set mechanical offsets from the actual firing geometry, and use ignition trims only for small combustion-timing corrections. Ign: Timing Cyl (ignitionAdvanceCyl) reports final primary advance after the timing clamp but before the mechanical angle offset, so use event/trigger diagnostics to verify phase. An angle-range assertion can identify offsets that move an event outside the valid engine cycle.

Sources​