Cam Control

Elite Software Programmer › ESP - Main setup › FunctionsUpdated Sep 2026

Variable cam timing can add real torque across the rev range, but only if the ECU can hold each cam exactly where you ask. Here's how we set up Cam Control on Haltech Elite ECUs in ESP, from picking inputs and outputs to finding base duty and taming the PID loop.

What Cam Control actually does

On a continuously variable cam system, each cam gear has an oil chamber inside it. A solenoid meters engine oil into or out of that chamber, and that rotates the cam relative to the crank. The Elite ECU drives the solenoid with a pulsed signal and reads a cam position sensor to see where the cam ended up. It can handle up to two intake cams and two exhaust cams, which covers everything from a single-cam four cylinder to a quad-cam V engine.

The key idea is the hold duty, which ESP calls Base Duty. Somewhere in the solenoid's range is a duty that neither advances nor retards the cam; it just keeps it parked. Push duty above that point and the cam moves one way. Pull it below and the cam moves back.

That hold point isn't fixed. It shifts with oil temperature, oil viscosity, oil pressure and wear. If you just picked one duty and left it, the cam would slowly creep off target. That's why Cam Control on the Elite always runs closed loop: the ECU watches actual cam angle, compares it to the target, and keeps adjusting duty to stay there.

Wiring tab: telling the ECU what's on the engine

Options

  • Number of Banks: one for an inline engine, two for a V or boxer engine. This sets how many intake and exhaust cams the ECU expects.
  • Mode: choose Intake Only, Exhaust Only, or both. Match it to the cams that actually have phasers. Plenty of engines only have variable intake timing.
  • Solenoids Per Camshaft: 1 or 2. Most factory systems use one solenoid per cam, but check your engine before assuming.

Connections

Every variable cam needs two things wired: a position sensor so the ECU can see it, and a solenoid so the ECU can move it.

  • Cam inputs: usually the Home input or an SPI (Synchronised Pulsed Input), connected to that cam's position sensor. If your cam sensors aren't reading cleanly, sort that out first with our guide to checking crank and cam angle sensors.
  • Cam outputs: usually a DPO (Digital Pulsed Output) to each cam control solenoid.
  • Active State: Low (the default) grounds the output when it's on. High inverts that, so the wire is grounded when the output is off. Leave it on Low unless you know your solenoid needs the opposite.

Cam Control tab settings

The intake and exhaust sides have their own copies of most settings, so you can treat each set of cams independently.

SettingWhat it doesOur advice
Target Angle Max Delta RateCaps how quickly the target is allowed to change, so the cams aren't chasing a jumpy or oscillating targetStart at the default of 40 and only lower it if cam movement looks nervous in logs
Intake / Exhaust FrequencyHow fast the solenoid is pulsed (default 500)Lower frequency gives more usable duty range but can make the solenoid rattle; higher frequency narrows the range. Keep the default unless you have a reason to change it
Duty Cycle MinThe lowest duty the controller can commandSet it just below the point where the solenoid starts doing anything
Duty Cycle MaxThe highest duty the controller can commandSet it just above the point where extra duty stops moving the cam. Check this is not left at zero, or the controller has no room to work
Cam DirectionWhether the controller moves that cam toward advance or retardIntake is normally Advance (the default); exhaust is normally Retard (the default)
Enable Overall CorrAdds an Overall Correction table that shifts the whole target angle mapTurn it on while you experiment on the dyno, then fold the result back into the target table

The min and max duty limits exist for the same reason on any solenoid: there's a dead band at the bottom and a point near the top where more duty changes nothing. Keeping the controller inside the band that actually moves the cam makes it respond faster and stops integral wind-up at either end.

The tables you'll tune

Target Angle

This is the cam angle you want at each operating point, and it supports up to 4D mapping. As a general pattern, intake cams often like more advance in the midrange and less at the very bottom and top of the rev range. Exhaust cams often carry more retard down low, less in the midrange and a bit more again near redline. Those are shapes to start experimenting from, not numbers to copy. The best targets come from back-to-back dyno pulls, because the right overlap depends on the cam profile, the head, the exhaust and the intake.

Base Duty Cycle

There's one base duty table per cam (Intake 1, Intake 2, Exhaust 1, Exhaust 2), each with up to 3D mapping. The more accurately this table predicts the hold duty, the less work the PID loop has to do, and the faster and cleaner the cam responds.

How we find it:

  1. Warm the engine up fully so the oil is at normal temperature.
  2. Hold it steady somewhere around 2000 to 3000 rpm so there's full oil pressure feeding the phasers.
  3. Command a non-zero target angle for the cam you're working on.
  4. Log the matching Cam Control output channel, for example the Intake Bank 1 output. Once the cam has reached the target and settled, note the duty it's sitting at.
  5. Enter that duty into the matching base duty table, then repeat for the other cams.

If the base duty is too low, the cam is slow to reach its target. If it's too high, it tends to overshoot. Either one is a sign to revisit this table before touching the PID gains.

PID gains

Each side has Proportional, Integral and Derivative tables, all mappable in up to 3D. In plain terms:

  • Proportional reacts to how far the cam is from target right now. Bigger error, bigger push.
  • Integral adds up the error that's left over time and keeps nudging until it's gone.
  • Derivative watches how fast the cam is moving and eases off as it approaches, which keeps an aggressive proportional term from overshooting.

As a rough guide, cam control proportional values commonly land somewhere between 150 and 1000, with integral around half the proportional value and a small derivative of roughly 5 to 20 to stop overshoot. Every engine is different, so treat those ranges as a place to start testing and let the logs decide. For a deeper look at how the three terms interact, see our PID tuning guide.

Target Scalar

This table scales the cam control output, typically against coolant temperature, although you can put any channel on the axis. It's how you keep the cams parked on a cold engine and bring control in as it warms up.

Upgrading an older map?

When ESP upgrades a map from an older firmware, it fills this table in automatically to copy the old behavior: 100% at the previous turn-on temperature and 0% just one degree Celsius below it. That's an on/off switch, not a blend. We recommend reshaping it so control fades in over at least 5 °C (9 °F).

Long term trim

The Long Term Trim tab lets the ECU learn corrections to your base duty tables as the car is driven. It's useful because hold duty drifts with oil temperature and anything else that affects oil flow, so the learned trim table is normally mapped against oil or coolant temperature.

  • Enable Long Term Trim: switches learning on.
  • Long Term Trim Gain: how quickly the ECU learns. Values around 20 to 30 tend to work well.
  • Reset: clears everything learned back to zero.
  • Apply to base Table: writes the learned trim into your base duty tables, so the next map starts from a better baseline.

Our routine is to get base duty close by hand, let long term trim learn over a few drives at different oil temperatures, apply it to the base table, then reset the trim and let it keep refining.

Troubleshooting cam control

SymptomUsually
Cam never movesOutput not assigned, wrong Active State, Duty Cycle Max left too low, target scalar at 0%, or the engine isn't warm enough yet
Cam angle reading is jumpy or missingCam sensor wiring or input assignment; check the sensor before touching the control settings
Cam moves the wrong way and pins against a stopCam Direction set wrong for that cam
Slow to reach targetBase duty too low, or proportional gain too low
Overshoots, then settlesBase duty too high, proportional too high, or not enough derivative
Oscillates around targetToo much proportional or integral, or a target that changes faster than the cams can follow
Accurate warm, sloppy coldBase duty doesn't account for oil temperature; add that axis or let long term trim learn it

Cam control FAQ

Why can't I run cam control in open loop?

Because the duty that holds a phaser still keeps changing with oil conditions. A fixed duty that's even slightly off would let the cam drift until it hits a stop. Closed loop is the only way to keep it on target.

Do I need a dyno to tune cam targets?

To get the most from it, yes. You can set up the control loop so the cams follow a target accurately on the street, but choosing the best target at each load and rpm takes back-to-back testing on a dyno.

What's the difference between this and switched cam control?

Continuous cam control holds any angle in the phaser's range. Engines with simple on/off cam changeover use Cam Control Switched instead. Running a Nexus? See the NSP version of Cam Control. If you'd like us to set up or tune your VVT engine, book a free consultation.