Radiator Fan Control

As described much earlier on the Thermal Management page, getting rid of excess heat is done by means of a radiator for the engine coolant and by the condenser of the airconditioning system which is mounted in front of the radiator. Their heat removal capacity is increased by operating an electric radiator fan, which in the ex-factory configuration happens to be a 2-speed jobbie. aka impulse and warp drive. :-)

Frigair Fan AssemblyA Mk5 Golf repair job provided a pair of serviceable (after a simple fix) pair of cooling fans controlled by J293, as incorporated into the larger fan, V7. The smaller fan V177 is driven by J293, at a speed matched to V7.

Radiator with core 673 x 322 x 30Unfortunately, the Mk5 fan shroud that supports the fans won’t bolt straight into the Mk2, being about 60mm too tall.  So the fans need a special one; a design for which I’ve designed to be made out of aluminium (angle) extrusions and 0.8mm or 0.6mm sheet, simply folded and rolled.

Fan Shroud - Radiator side

Radiator side – Radiator core ghosted

Fan Shroud V7+V177

Engine side

The new shroud has a much lower profile than the deep fan shroud and fan motor originally in the Mk2, but the full width of the 675mm radiator’s core. Once the shroud’s dimensions have been checked for clearance using a cardboard mock-up in the engine bay, the metal can be made accordingly.

Alas, J293 knows nothing of low speed and high speed. It understands only KL_15 and PWM so a TinyTranslator has been devised so that the fans can be used without waiting for the Big Bang of Networked Electrics.

TinyTranslator is a simple controller that uses only the available electrical signals to operate the pair of new fans. Its interface to the car will be the factory fan motor connector and 2 cables into the J293’s 4-terminal plug, providing a signal that the fan ought to be running at the terminal labelled KL_15, and a pulse width modulated (PWM) signal to determine the speed. TinyTranslator will translate the car’s olde signals into what J293 understands.

Another motivation for TinyTranslator is that it is something that others could use if they suffer similar misfortune and fortune; and don’t want to go the whole hog in networked electrics.

The TinyTranslator of 2-Speed Fan to PWM

A Mk2 Golf’s cooling fan has a 2-speed radiator fan with hard-wired electrics and thermoswitches determining which motor connection has 12V applied from the battery. With the standard factory wiring, the electrics to the thermoswitches are always “hot”, effective wired to the battery.

In order to successfully replace the radiator fan with a fan pair from a Mk5 Golf, the J293 controller integrated into the larger of the Mk5’s fan motors must be provided with a PWM signal to set the required speed. Not only that; the J293 controller in the Mk5 Golf receives controller power only when the engine is running and not cranking. i.e. the X terminal so that it unloads the battery during cranking.

The J293 controller incorporates a failsafe mode where, should there not be a recognized PWM signal of between 5% and about 95% within 10 seconds after 12V is present on its engine alive KL_15 terminal, it runs the pair of fans at full speed. This is nice to have. For single-speed fan operation, the translation would require no more than a couple of diodes.

To provide a low (quieter) fan speed, the necessary PWM can be implemented simply with an ATtiny13A microcontroller, providing programmable speeds for both low and high speed, while not compromising the essential failsafe feature provided by J293.The inset board layout shows that all the “bits” fit into 33mm × 45mm footprint. Except the external connectors and sealed box.

Translated fan speed signals to PWMIf you’re squinting to see the details so that you can make your own one, save your eye-sight. This is only a “back of the envelope” layout until prototyping and programming have been completed.


Keep in mind that the engine’s thermostat regulates the engine coolant temperature by determining the mix ratio between coolant passing through and bypassing the radiator as it is drawn by the coolant pump.

The TinyTranslator will be located in the engine compartment between the radiator and the engine. Coolant in the radiator enters it at temperatures that often exceed 100⁰C. The nominal coolant operating temperature inside the engine is over 90⁰C. The factory thermoswitch inside the radiator nominally switches on the fan at low speed at 95⁰C.

So it’s going to be hot. The minimum operating temperature of components to be used in the “production” version of the translator is to be 125⁰C.

A temperature sensitive (NTC) resistor will be used in conjunction with one of the ATtiny’s analogue inputs to measure temperature; which may be useful in future firmware that could perhaps adapt the PWM once the fans are nominally running at low speed. As the sensor will be inside the TinyTranslator’s sealed enclosure, it’ll be a simple but very poor proxy for coolant temperature.

Radiator Temperature

Sensor AdaptorOne better option is to instead use an NTC sensor in the radiator at the location of the bi-metal switch (F18) and pretend that it’s e.g. a G68 of the later Mk4 Golf. An (expen$ive) adaptor is used by VW to allow the use of a clip-in coolant temperature sensor as per the rest of the engine. The adaptor 1J0 121 619 G screws into the thermoswitch location on the radiator “header” tank. After scouring the WWW for 2 days, there do NOT appear to be any M22×1.5 temperature sensors that screw directly into the radiator. Which is quite weird. And perhaps the reason why VW chose to convert brass into gold.

Additional wiring would be required for TinyTranslator between the factory vehicle harness and the newer fans; not only to sense the temperature but also to provide power whenever fan operation may be required. The low and high speed signals cannot be ignored because of airconditioning and post-run cooling. That, along with the mounting of the sensor in the radiator is more onerous and substantially more expensive than a simple plug-and-play.

The bright side is that the circuit board needs no changes at all except to replace the NTC resistor a lead-out for the sensor in the radiator. Changes to firmware can then continuously measure the temperature of coolant in the radiator and adjust the fan speed “steplessly”.

To keep it simple, the initial firmware will use only the fan speed inputs, nominally from F18.


The low- and high-speed fan voltages supplied to the unit are primarily “digital”. As they are scaled to the “logic level” of the μC, and tied into a pin that can also measure an analog(ue) voltage, the μC can also determine if running the fan would run the battery flat. Together, the fans at high speed consume over 500W; nominally over 40A for which even a 63Ah battery does not have much reserve.

Nominally, the only time when that is plausible is if heat soak in the engine compartment trips the 110⁰C switch on the cylinder head after the engine has been stopped and the battery is very weak. The nominal post-run trigger is to run the fan at low speed until the switch re-opens.

A battery-saver strategy, of running the fan at minimum speed for a short time, while observing the battery voltage; then turning the fan off after a minute and watching for the battery to “recover” some voltage before another fan “burst”. Of course only if the over-temperature condition persists. If the “bump” of cooler air is enough, then the unit’s power is cut off anyway.


J293 has a direct battery connection via a substantial fuse (50A minimum) and a separate chassis “ground” connection through which the heavy motor currents run.

The translator takes its power and chassis connection from at least the vehicle’s fan motor connection. +12V is supplied by the low and high-speed fan motor terminals; which are OR-ed using a pair of diodes to supply the microcontroller and feed out directly to the KL_15 terminal of J293. Failsafe engine cooling is therefore preserved, even if the ATtiny fails to operate as intended.

Under nominal conditions, 12V at the low speed terminal selects low speed. High speed, because of the way that thermoswitches work, would apply 12V at both high and low speed terminals.

The 12V for the old cooling fan isn’t 12V. It’s nominal. And, under ham-fisted operation of alternator diode failure, can produce substantially higher voltages: 60V protection is “industry standard”. Besides some RC filtering, a Transient Voltage Suppressor (TVS) can absorb substantial electrical energy to protect the μC from plausible faults.

As the TinyTranslator wakes up, it determines which speed is required via the levels of the protected inputs and produces a PWM signal of the correct frequency (25Hz) and programmed pulse length. That signal has to be modified for J293 which expects different (12V) logic voltage levels. In this case, it’s a logic-level FET.

If KL_50 (tapped off the 50 terminal on the nearby starter solenoid) is raised to 12V during normal operations, it means that the engine is cranking and the TinyTranslator reduces the PWM to “stopped”, below about 15%, until the cranking signal disappears.

Field-Programming of Speeds

A KL_50 connection on the ATtiny is also used for field programming. TinyTranslator must be disconnected from the vehicle’s starter solenoid and car harness fan connector for programming. Failing to disconnect can result in personal injury.

If the KL_50 is held to 12V for 2 seconds during powering up, successive toggling of the connection results in an increment of speed by approximately one eightth of its nominal range, cycling back to the minimum after having reached its maximum.

The nominal ranges are expressed as:
~15% ≤ low speed ≤ high speed ≤ ~95%

If KL_50 isn’t toggled for (nominally) 10 seconds or is held for more than 5 seconds, the new PWM value is written to non-volatile memory (EEPROM); to be used for subsequent fan operation.

The terminal at which 12V is applied selects which speed is being programmed. If both speed terminals have 12V applied and the programming connection held for more than 10 seconds, then the translator returns to “factory” (more accurately; kitchen table) defaults.

Each speed has to be programmed separately; power removed from all the terminals after each speed has been set.

A programming tool can be built to do almost all the right things. The following circuit is about as lavish as would ever be required.Field ProgrammingThe tool is attached at TinyTranslator’s external connector, automatically ensuring that e.g. the starter solenoid isn’t inadvertently engaged. A pair of cables is plugged into the 2-pin connector which breaks out J293’s control signals from the large 4-pin connector and another pair of leads is clipped, correctly polarised, to the battery.

The user selects the field setting for programming using the 4-position rotary switch; low-speed, high-speed, speed reset or temperature set-point, presses and holds the programming push-button and switches on 12V from the battery using the toggle switch.

A resistor (network) matching the desired NTC resistance must first be inserted into the two-terminal socket if the radiator set-point resistance is to be set. The fan will not spin at all while the set-point is being programmed so even J293 doesn’t have to be connected to the tool if only the set-point is being changed. Obviously; there must be no NTC resistor mounted inside the TinyTranslator and a corresponding wire brought to the internal connector for the radiator temperature sensing to have a snowball’s chance in hell of working.

If the NTC resistor is open-circuit during programming, then TinyTranslator will not try to maintain a set-point but rely on the low and high speed terminals signalling the required fan speed.

If the NTC goes open-circuit or short circuit with the TinyTranslator under set-point control, then it will fall back to running the fans at the high speed setting whenever KL_15 is at 12V and KL_50 is not, providing fail-over functionality.

If constructing the tool seems to be over the top for a once-off exercise, then a simpler tool, using just a few toggle switches and a push-button on a board with some wires should be more than enough for the careful dabbler who understands the risks and is taking the necessary and vital precautions.

Most simple is a set of patch leads with mating wire terminals shoved into the corresponding orifices of connectors; but holding it all together with two sets of fan blades churning up the air while using 500W of electricity and trying to set a speed could be inviting too much trouble.

10 thoughts on “Radiator Fan Control

  1. Felix says:

    You just saved my day! i need to get the fans running in another vehicle, and i was search crazy about any information! i just wonder how you got the information that it is just PWM and not K line or LIN or anything? and how you found out the frequency? But really cool that you publish this information here, many thanks again! My fans are running now because of you!

  2. Felix says:

    Wow ok, seems to be an insider writing in your link. But i found your page first, so my thankfulness belongs to you 🙂
    Well, as my fans are running now, i can add, that the amplitude of the signal must be above 4.2V, otherwise the fans start to malfunction (flickering on/off). Then up until 12V no problem. The current is zero to nothing, its really just a signal, so you even might be able to use the output from your attiny directly. The fans start running at 15% and have a current slope to avoid spikes. Then they switch back off with a small hysteresis at 13%.

  3. Jan Gijsberts says:

    I am very interested in the Tiny Translator 8 for my sportscar project with 2 PWM Audi A5 fans icw with a Audi V8 engine from 2000. Is the printplate available or have you manufactured only one.



    • Bernd Felsche says:

      So far, the circuit only “lives” on breadboard. There’s no copper made.

      I’ve been “distracted” by other things for a long time but I’ll post progress on the development soon with testing of the level-shift to the “12V” for the J293 controller. That has to work reliably. BTW: “Soon” means about a month because my schedule is overflowing.

      The firmware then needs completion. While it works in normal mode so far, the in-car programming of low and high speeds isn’t fully implemented. It detects programming mode but I haven’t even started on the step-wise speed setting because I wanted to see the fan turning and its speed changing in response to the stepping.

      I’ve done some copper circuit layouts (as you can see above) and I’ll make a working one available once it is working. Automotive-grade semiconductors (125°C/150°C) and other hardware are essential because it gets very hot in the engine compartment and I don’t want the controller to die prematurely as a result of the wrong grade of components.

  4. Hugo Zubieta says:

    Hi, I work in a similar project for a 1976 vw bug with audi engine swap, I made a “tester for PWM based motors and I’m able to made work BMW Fan motor, BMW Electric Water Pump for engine (Pierbutg CWA400), VW/Audi Water Pump for supercharger intercooler (Pierbutg CWA50), Volvo Fan motor.
    But I can’t made the VW fan controller to work, my controller can adjust the PWM frequency from 1Hz to 10,000 Hz and 1-100% duty cycle. here some video: https://www.youtube.com/watch?v=LVjKfw1m58Q
    Your controller it’s set to 25Hz and 15-95% duty cycle? any advice?

    • Bernd Felsche says:

      The frequency is set in software. Here’s an early draft:

      The choice of the microcontroller was determined by it being the smallest one likely to do the job (easily!) and one which is available in temperature ratings compatible with engine compartments (i.e. 125°C or more)

      As far as being programmable for any frequency, it’s not easy to figure out how a mechanic would be able to set it in the field without special tools.

      I’ve programmed ATtiny processors to produce PWM at just about any frequency from 1Hz up to 63kHz (theoretically; I’ve tested to 35kHz but see with 8-bit pulse width resolution for pump and fan speed control; with (e.g.) tacho feedback. They’re programmed (set and interrogated) using I²C and use a dedicated timer/counter within the microcontroller to directly produce the PWM signal;but such requires somewhat more facility than is readily available in the ATtiny13A.

      And anyway; I have only 2 speed signals available in the car as stock; demand for low and high speed.

      • Jan Gijsberts says:

        For my Mid Engine Sports car with an Audi V8 engine I cannot use the Fan with the Visco clutch, since the radiator is mounted in the front and the engine in the rear.
        I had the choice to use 2 electrical fan (example . Spal) with on/off switches or to use PWM fans. Increases the temperature the fan speed increases and decreases at lower temperatures. At recent engines the PWM signal is generated by the engine ECU. Unfortunately the ECU of my engine did not generate this signal.
        After I study I concluded that the fans of an Audi A5 V8 engine would be most suitable.
        I bought 2 Bosch radiator fan of an A5 (600W (diameter 400) and 4500m Watt (diameter 350). Both have an integrated controller with 4 connections. Pin1: (KL 30+) , Pin 2 (Kl 15 ingnition), Pin 3 (PWM signal) and Pin4 (Kl 31 Earth/ground) Mounted them on an Alucore frame of 10mm.
        Main question is: what PWM signal [Puls Width Modulation] and at what voltage. After measurements we concluded 25 Hz and 12 Volt.
        We also concluded that a temperature sensor the trigger should be for the PWM signal. We found the Bosch Sensor NTC M12-H with a temperature range of -40 – 150º C. is the best sensor
        The Steinhart and Hart Equation is an empirical expression that has been determined to be the best mathematical expression for resistance temperature relationship of NTC thermistors and NTC probe assemblies and we used this for programming an Arduino Uno board.
        Nu verkeer ik in de gelukkige omstandigheid dat ik een zoon heb die afgestudeerd is in Artificial Intelligence en voor mij de software heeft geschreven. Hierin heb ik de mogelijkheid om een aantal parameters aan te passen. Bijv de gewenste temperatuur.
        The PWM output signal was only 5 Volt and to low as signal for the fans. By using a Mosfet unit we could increase the PWM signal to 11-10 V.
        Through the USB connection we can read the actual resistance and corresponding temperature. By connection a Sparfun display we can read those figures real-time
        With a water cooker we have been able to test a lot static in the workshop. At about 90 º C the fans start to run slowly and at 100 º C the PWM signal is 100% and the fans rotate at full speed. Totally 66 Amp.
        For testing I use a second hand server power supply from IBM x3850/x3950 1300W with a constant voltage of 12,3 Volt and do not have to charge the battery constantly.
        Both fans are running parallel to have a more equal flow through the complete aluminum radiator.
        Temperature 99.8 º C. Resistance sensor 187 Ω. Total current 66.3 Amp.
        I still have to do track testing to fine tune the Arduino / PID-unit.
        (I had some pictures in this document but they dicappeared at pasting)

Leave a Reply to Bernd Felsche Cancel reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s