-
Notifications
You must be signed in to change notification settings - Fork 2
Home
Goals:
-
Manage exhaust cam timing on a dual-AVCS Subaru engine with a single-AVCS ECU. This was developed for use in a 2005 Legacy GT (intake AVCS) that had a motor built with 2008 STI heads (dual AVCS).
-
No connection to the factory ECU, just because the idea frightens me. This is by far the most complicated thing I've done with electronics, so I expected to make plenty of mistakes along the way, and didn't want to risk frying my ECU.
-
Use readily available, off-the-shelf components.
-
Vary exhaust cam retard with RPM. Perhaps with intake manifold pressure too, but that's not a high priority yet.
-
Monitor the state of the device from the driver's seat using a PLX DM-100. (This product is likely to be retired, which is unfortunate.)
-
Monitor the state of the device with a laptop using the same USB cable used to reprogram the Arduino.
Design:
-
The whole thing is built around an Arduino Due. I don't think the Uno has enough processing power to keep up with the timing requirements.
-
The crankshaft timing signal comes from an optical sensor mounted on a small circuit board that contains a TCRT 5000 op-amp for signal conditioning. These are readily available on Amazon and eBay for a few bucks each, often sold as a proximity sensor. A quarter of the driver's side intake cam pulley was painted white, and the sensor was mounted on the fan shroud. (A 3D model of the sensor mount is in the repository.) The signal is filtered by a 0.1uf ("104") capacitor, because the output from the op-amp oscillates during the transitions between high and low.
-
The camshaft timing signal comes from the stock sensors. They require 12 volts for power, and the output is pulled low for a brief period twice per cam revolution. The output goes through a 300 ohm resistor, then a 3v zener diode is used to bring the voltage down, then a 100 ohm resistor sits between the zener and the Arduino input. (A schematic will be added to the repository.)
-
The solenoid outputs are PWM signals, with Arduino output pins driving FQP50N06L transistors. 5A 60V diodes are used to limit reverse current back to the transistor outputs. (A schematic is in the repository.)
-
A PLX oil temperature sensor is used to prevent the device from activating until the engine comes up to temperature. This may or may not be necessary, but the stock ECU doesn't activate AVCS until the water temperature is up to roughly 150F, so I did something similar. Also, I wanted an oil temperature gauge anyway.
-
For sanity-checking purposes, the Arduino computes the RPM of the crank and both camshafts independently. (At some point it would be smart to add code to assert that they're similar.) The crank RPM is used to look up the desired amount of camshaft retard. The camshaft RPM values are not used, except for monitoring and debugging.
-
The Arduino starts a timer when the crankshaft sensor signal begins. When the signal from each cam sensor arrives, it computes the amount of camshaft rotation that elapsed between the two signals (based on the RPM and elapsed time).
-
The device can measure the cam angles with the solenoids at rest, and would calculate the amount of retard by subtracting the baseline angle from the measured angle. You can still do this by setting the useStaticBaseline flag to 0, and I recommend it for initial testing. However the baseline angle measurement must be taken when the engine is running at a constant speed, and the engine speed varies far too much during idle, so this wasn't very reliable. To get an accurate baseline measurement, rev the engine to 2500 or so for several seconds while logging the baseline angle with a laptop, average the values, put them in ExhaustCamState.cpp, and set the useStaticBaseline flag to 1.