Using an Arduino to manually control a Haldex axial solenoid (0.4 - 1.38A range)

[tt]I'm trying to figure out whether an Arduino can be used to manually control the axial solenoid of my Haldex Gen2 AWD. Because the car was converted to AWD, the factory CAN High/Low control signals do not operate the controller as it was designed.[/tt]

The factory (Volvo) spec indicates the solenoid is controlled with a PWM signal (no data available)

What I do know is that the amperage must be kept in a range from 0.4A (open) to 1.38A (locked), with varying degrees of engagement based on amperage values in-between. Others have verified that data with resistor-based manual controllers.

I used a VW-based software tool to lock the diff in test mode, and this is the maximum value needed:

What has been done by others is simply to bypass the supply circuitry in the controller module for the solenoid, and insert varying resistors to drop the amperage to the required value for lock, varying degrees of partial lock and off. All the ones I am aware of are quite cumbersome. My plan would be to use the Arduino, however I don't know how to calculate appropriate values.

One of the VW guys said "... supply 3.2 volts and regulate the current to open or close it from 0.4 amp to 1.3 amp."

The solenoid feed is via a bypass supply that uses a vacant terminal in the main connector, that part I have wired

So, that would be the general plan. I can't find any examples of controlling axial solenoids in general searches, and the only one I found on here was apparently for a type of solenoid requiring a custom controller. Input voltage would be standard 13-14V. I don't

Any suggestions as to how to proceed?

What's the DCR (DC resistance) of that solenoid?

Is it spring-loaded (i.e. a PWM signal will hold it open against the return spring force; increased duty-cycle means further displacement; decreased duty cycle means spring "closes" valve)?

Do you have one on the bench you can experiment with? Apply varying PWM signals and observe/characterize its displacement? That will involve (typically) a low-side N-channel MOSFET controlled from the Arduino and a 14V bench supply with current limiting to protect the solenoid until you fully understand it.

Do you have a bench supply on which you can vary the current delivered (i.e. CC mode)? If so, can you supply the solenoid 0.4A up to 1.38A current and measure it's displacement and then use that to help characterize the PWM duty cycles required to achieve equivalent displacements?

In my previous experience with automotive ECM reverse engineering automotive solenoids like this (e.g. idle-air control (IAC) or older exhaust-gas recirculation (EGR) valves come to mind) a PWM frequency of ~32Hz was typical though the electrical characteristics of the solenoid (most notably the time constant.) But frequencies can be quite a bit higher -- 200Hz or more.

If you don't have published solenoid specs you'll need to experiment a bit to "reverse engineer" the solenoid enough to be able to control the Haldex clutches.

Thank you for your detailed response.

I will measure the resistance of the solenoid.

It is spring loaded, N373 in diagram. Activation closes the passage, solenoid pushing against return spring

I have a spare to test. I do not have a test bed/bench. I can hook up a voltage supply, I will have to add resistors to limit the current.

screenshot-vwpress.files.wordpress.com-2020.10.22-10_57_31.png

screenshot-vwpress.files.wordpress.com-2020.10.22-10_57_31.png

A couple of possible ways to control it are linearly and with PWM.

In the linear model, you have an adjustable constant-current source like this (very crude):

Suppose Rsense = 0.1-ohm. If you wanted 1.38A of current through the Haldex, you'd set up the Arduino to adjust the DAC to put 138mV on the '+' input of the opamp. The opamp will do what it can to get the difference between the '+' and '-' input to zero. Since the '+' terminal is higher than the '-' terminal, the output voltage will rise. This will turn on the transistor and current will start to flow. With current flowing in the Haldex solenoid (and thus Rsense), a voltage drop develops across Rsense. The top-side is connected to the '-' input of the opamp.

As the current reaches 1.38A the voltage seen at the opamp '-' pin approaches 138mV. At this point, the '+' and '-' pins are equal and the transistor will begin to shut off. But then the current will drop so the transistor will turn on again and so on. In this way, the system can give a pretty decent approximation of a constant current source. Its performance -- transient response, over/undershoot etc -- will depend on tuning things like Rfb and Cfb but it can be done.

Because the transistor is acting as a variable resistor here it is subject to power dissipation. A "ballast" resistor to drop the voltage passively will take away some of the heat from the pass transistor but things will still need some heatsinking to a metal enclosure.

The other way is to simply switch a low-side FET into saturation and off rapidly so that the average coil current in the Haldex solenoid approaches the desired current. The Pd in the FET is much lower since it's in saturation and the Rds on is very small. Assuming the switching frequency is fairly low switching losses will be pretty low too. You just need to characterize the solenoid's response to PWM, which may change over temperature (e.g.) To know the required frequency you'll probably just need to experiment; the inductance of the coil will matter here (--> time constant) but I think you'd be safe to start at, say, 30Hz and work up to 1kHz in search of the sweet spot.

Thank you again for you help! I like the sound of the PWM option - it would appear to be more straightforward.

Looks like some experimentation is in order.

I will post back with my findings.