Variable Speed PWM Fan Control under $25 or less DIY
Put a couple of zip ties around the wires going through the grommet, on the inside of the box, so they can't pull out and there is no pressure on any single wire.
BTW, Personal Preferance, I always solder directly the the board and never use screw terminals. I've had screw terminals loosen up on me before.
Nice Job!
BTW, Personal Preferance, I always solder directly the the board and never use screw terminals. I've had screw terminals loosen up on me before.
Nice Job!
Put a couple of zip ties around the wires going through the grommet, on the inside of the box, so they can't pull out and there is no pressure on any single wire.
BTW, Personal Preference, I always solder directly the the board and never use screw terminals. I've had screw terminals loosen up on me before.
Nice Job!
BTW, Personal Preference, I always solder directly the the board and never use screw terminals. I've had screw terminals loosen up on me before.
Nice Job!
I was also debating on making this project into its own thread since this one has grown so large, what do you think?
I leave it up to you, but I would just carry on as you are....
So as a follow up, would it be acceptable to have fans stay at 20% if it stabilizes ECT?
Mindset is used to on/off fan setup with on at 190, off when ECT drops to 180, not a constant low power on.
Mindset is used to on/off fan setup with on at 190, off when ECT drops to 180, not a constant low power on.
0 to 180, fan is off. 181 to 195 fan adjusts. Anything over 195 full blast. The engine might settle in at around 189 this way. If you find that your temp is higher or lower than you want, shift the range up or down to your liking. The engine and fan combo will reach an equilibrium. If that temp is to high, shift the range down.
This will give the engine a more constant temperature instead of with just on and off......engine gets hot, fan turns on full, so now it gets cold, fan turns off.... repeat...
For comparison, the OEM setting for the C6 (per a file I downloaded at HP Tuners) are as follows:
15% @ 199, 23% @ 203, 31% @ 206, 39% @ 210, 47% @ 214, 56% @ 217, 74% @ 221, and 100% over 224.
I have yet to collect data but will be interested to see how close my calculated values work. I suspect I'll be dialing some down, but since I'm in the south, the AC pressure will usually override ECT except in the winter. One other thing I noticed after I installed the Mercedes fan on my truck was how well it worked. I never saw it go over about 50% in the garage when the IAT was around 140 F.
BTW, I have different temperature ranges that automatically kick in for coolant, oil cooler, trans cooler and intercooler fans, depending on the driving mode (cruise mode, sport, burnout, drag mode). 7" touch screen selects driving mode.
Latest update- I ran the engine today using HP Tuners Scanner. My goal was to get it to operating temp to check fan operation. In summary, I need to lower the kick-in values, as it got to 220 and never came on (gauge was still around 210).
Other findings:
The fan does a great job maintaining AC pressure. I think I saw a maximum of around 250 PSI when I turned it on with a hot engine. The initial cycle was up to around 226 PSI. It then stabilized in the 180-190 PSI range.
When I turned on the AC at 220 degree ECT, the pressure spiked as noted above until the fan got up to speed. The pressure then dropped back to around 190-200 PSI. ECT dropped as well, and it bottomed out at 187. I checked specs, and the OEM thermostat here is 186-187, so that's pretty decent. While I can't monitor fan speed, by sound it was around 50%.
The next task is to drop the ECT settings and reflash the Nano. I'm satisfied with the AC pressure. For reference, the OEM setup cuts off the compressor @ 350 PSI and turns it back on @ 229. I want to also grab some data going down the road to compare numbers.
UPDATE- I found that I had reversed the ECT values. Since the resistance goes down as the temp goes up, the ADC here also decreases. I have updated the Arduino file that is attached to the earlier post. I also added some code to average the readings from both sensors for smoother operation.
I tested the ECT side with a warm engine and it kicked on right below the normal operating temp (did not have HPT connected). The fan ran at 25% and then shut off after it had cooled the engine.
Other findings:
The fan does a great job maintaining AC pressure. I think I saw a maximum of around 250 PSI when I turned it on with a hot engine. The initial cycle was up to around 226 PSI. It then stabilized in the 180-190 PSI range.
When I turned on the AC at 220 degree ECT, the pressure spiked as noted above until the fan got up to speed. The pressure then dropped back to around 190-200 PSI. ECT dropped as well, and it bottomed out at 187. I checked specs, and the OEM thermostat here is 186-187, so that's pretty decent. While I can't monitor fan speed, by sound it was around 50%.
The next task is to drop the ECT settings and reflash the Nano. I'm satisfied with the AC pressure. For reference, the OEM setup cuts off the compressor @ 350 PSI and turns it back on @ 229. I want to also grab some data going down the road to compare numbers.
UPDATE- I found that I had reversed the ECT values. Since the resistance goes down as the temp goes up, the ADC here also decreases. I have updated the Arduino file that is attached to the earlier post. I also added some code to average the readings from both sensors for smoother operation.
I tested the ECT side with a warm engine and it kicked on right below the normal operating temp (did not have HPT connected). The fan ran at 25% and then shut off after it had cooled the engine.
Last edited by V8 Supra Builder; Jul 23, 2021 at 01:09 PM.
*** UPDATE 7/25/21: The diagram has been updated to remove the Arduino resistor. This resistor caused a DTC error on the truck's sensor that caused a dash ECT gauge error. The sensor wire now runs straight to pin A1 on the Arduino.
No other programming changes were needed. ***
Operational update: I took the truck for a 60 mile round trip drive today in a mix of rural and urban driving, to include sitting at lights for a minute or two. The AC never warmed up, and I could hear the fan running if I turned the radio down. Ambient Florida temp was 89 degrees with high humidity. I'm going to call this a success for now. I'll post further if there are any hiccups. I also thought a parts/tips list may be handy. Prices are current as of July 2021. I did not post any links since AFAIK there is still a non-vendor link policy here.
Finally, I'll re-attach the code file and my wiring diagram as zip attachments so as to have all of this in one place. I still have not figured out the math error on my spreadsheet. I have ruled out the sensor resistance, as I found an actual table for my truck in the Service Information DVD I bought. It was within 1 ohm in the normal operating range to the GM one I used for the spreadsheet. As it stands, it's relatively simple to read the data coming from the Arduino and your vehicle via the OBD2 port and then set matching values for both pressure and temp. The values in the Arduino file will get you ballpark for many GM sensors.
No other programming changes were needed. ***
Operational update: I took the truck for a 60 mile round trip drive today in a mix of rural and urban driving, to include sitting at lights for a minute or two. The AC never warmed up, and I could hear the fan running if I turned the radio down. Ambient Florida temp was 89 degrees with high humidity. I'm going to call this a success for now. I'll post further if there are any hiccups. I also thought a parts/tips list may be handy. Prices are current as of July 2021. I did not post any links since AFAIK there is still a non-vendor link policy here.
- Arduino Nano (genuine), about $20. Clones are cheaper, but I have read about compatibility issues with them. I'm as cheap as most, but didn't think saving $10 on this component was worth the risk.
- Nano screw terminal boards, about $8 for 2. If you are good with a pencil soldering iron, you can wire direct to the legs of the Nano, but then you'll have to figure out how to mount it and it won't be easy to swap if you ever need to do so. As the prophet Harry Callahan said: Mini/micro soldering is one of mine.
- Plastic project box with mounting tabs on each side, about $6. The size is listed as 3.9 x 2.68 x 1.97 inch (100 x 68 x 50 mm).
- 12V to 9V power supply, 4 wire, about $10. If using the above box, get one that has all the wires going in/out the same end, otherwise it may be too wide.
- For the Metri-Pack 5-way terminal, it is PN MP150-5P and the mating connector is MP150-5S. You can get each side complete with terminals and seals for around $10 plus postage. It literally pays to shop here, as the prices vary widely for connectors. Keep in mind it is not just the connector, it is also the terminals, seals, and the protection piece that goes on the rear. Some vendors sell the entire set for a reasonable price.
- I used 22 gauge wire for most of the internal wiring, with some 18 gauge. Make sure it is automotive-grade wire such as TXL (thinnest wall). Parts store wiring is junk for under hood applications, it can't stand the heat. I used 18 gauge for the wiring outside the box. As with connectors, prices vary. Some places will only sell a minimum of 100 feet. The place I bought the connectors from (Google is your friend) sells wire both striped and plain for anywhere from 25 to 44 cents per foot.
- To protect the wiring, I have been using nylon mesh split loom, the brand was Alex Tech. It's easier to work with then corrugated nylon and gives a nice finished look. I used both 1/8 ID (single wires such as to the PWM connector) and 1/4 ID (multiple wires) on this project. You cut it to size with scissors and use a pocket lighter to cauterize the ends. These run about $8 each for a 10 foot length, which was more than enough for this project. If you do a lot of wiring work, it's cheaper to buy it in 25 foot lengths.
- Miscellaneous parts like zip ties, a screw to mount the board in the box, a bracket to hold the box, a ring terminal for ground, and a nylon standoff for the other end of the board.
- YMMV: I found that after operating this setup, my truck began to throw a "P1482" Code. In HP Tuners, this is called a catalyst temp code, however for the GMT360 platform (Rainier, Envoy, Trailblazer etc.), it relates to the cooling fan. I found that I needed to disable (no error reported) the several fan-related MIL codes using HPT. This won't affect anyone not using this in a GMT 360.
Finally, I'll re-attach the code file and my wiring diagram as zip attachments so as to have all of this in one place. I still have not figured out the math error on my spreadsheet. I have ruled out the sensor resistance, as I found an actual table for my truck in the Service Information DVD I bought. It was within 1 ohm in the normal operating range to the GM one I used for the spreadsheet. As it stands, it's relatively simple to read the data coming from the Arduino and your vehicle via the OBD2 port and then set matching values for both pressure and temp. The values in the Arduino file will get you ballpark for many GM sensors.
Last edited by V8 Supra Builder; Jul 27, 2021 at 06:45 PM.
The box I built has no MPH input, it is based only upon pressure and temp. When moving, those both drop so the fan is only scheduled to come on when sitting.
I know when I built the Supra and other Gen 3 cars based on the 1998 PCM, there was a setting for speed to cut off the fans. On the newer stuff like this E40 PCM in the 2005 Rainier there is no such setting. It is likewise based only on pressure and temp. I think the "411" (circa 2001) PCM in my Durango swap is the same as the E40.
I loaded a stock 1998 F-body tune and the fan cutoff (disable) speed was 35 MPH with an enable speed of 30.
I know when I built the Supra and other Gen 3 cars based on the 1998 PCM, there was a setting for speed to cut off the fans. On the newer stuff like this E40 PCM in the 2005 Rainier there is no such setting. It is likewise based only on pressure and temp. I think the "411" (circa 2001) PCM in my Durango swap is the same as the E40.
I loaded a stock 1998 F-body tune and the fan cutoff (disable) speed was 35 MPH with an enable speed of 30.
The update today is not so good... everything worked OK yesterday. I made a 30 mile trip, shut it off for about an hour and then drove it back OK. Today about 10 minutes into the trip, the check gauges icon came on and my temp gauge is not working. Every other gauge is fine. Shutting down and re-starting made no difference. After it cools off, I'll do some analysis. I suspect what is happening here is the Arduino's trying to send it's signal over the ECT sensor at the same time the PCM is doing so. I didn't think this through enough- the wiring I used would be fine for a standalone ECT sensor, but since the PCM already supplies 5V, I think all I needed to do was tap into the supply/signal wire like I did the AC sensor.
I'll update after I get some more info.
EDIT-
Collected some data:
Sensor & Arduino disconnected, key off, I get 4.164 K ohms and 0 V on the two coolant sensor wires.
Same, ignition on, I get infinity ohms and 5.0x V.
Plugging in the Arduino saw the ohms rise to 29.9 K.
Testing just the PCM connected sensor via the ECT wire on the disconnected Arduino plug with the other lead grounded, I saw 3.62V. This is consistent with the 0-5V range the Arduino pin A1 expects to see.
I started the engine and as it warmed up, the voltage dropped.
I then scanned for DTCs and sure enough got a coolant sensor code.
With the Arduino unplugged, I cleared the DTCs and restarted the engine. The gauge began working as normal, the dash icon was off.
The next step was to remove the resistor in the A1 pin circuit and disconnect the 5V output that made the voltage divider. I removed the MP 150 terminal and ran a new yellow 18G wire in to the board.
After doing that, I re-scanned using the same process as before, with my laptop connected to both the Arduino through it's Windows interface and the PCM via HPT scanner.
I collected ADC values at certain points and matched them to the temp in F shown on HPT. Here are some examples:
ADC-Temp F
626-151 (warm engine start)
537-170
475-183
460-187
430-192
418-196
390-200
385-205
356-212 (I shut off the engine at this point)
I then looked at my current programming:ECT (these decline as temp increases)
Above 450 should keep fan off
25% range should begin @ 449 and go to 415
50% range should begin @ 414 and go to 350
75% range should begin @ 349 and go to 300
100% range is anything under 299
Using the existing settings, it looks like nothing changed. The fan would have kicked on @ 25% between 187 and 192 degrees, and then sped up to 50% around 197. I know from previous testing that 50% gives enough air to maintain 187 degrees, so this should work as-is.
Next step is to update the diagram yet again.
Update 7/26:
I made a 30 mile round trip today and the controller and temp gauge both worked OK. As an unrelated matter, I had restored the original calibration from HPT with a modified fan quantity of 0. This ended up triggering a P1482 code via the MIL, for catalyst temp low. Apparently for the GMT360 this code has something to do with the clutch fan, which was removed. I reinstalled the former HPT stock calibration and also set the fan quantity as 0. That did away with the MIL for now anyway.
Update 7/27:
I am currently running the OEM tune with no mods to the fan settings. I have disabled the several fan-related MIL codes using HP Tuners, to include the stealth P1482. I made another 30 mile round trip today and no more MIL. Will update again if any more hiccups arise.
I'll update after I get some more info.
EDIT-
Collected some data:
Sensor & Arduino disconnected, key off, I get 4.164 K ohms and 0 V on the two coolant sensor wires.
Same, ignition on, I get infinity ohms and 5.0x V.
Plugging in the Arduino saw the ohms rise to 29.9 K.
Testing just the PCM connected sensor via the ECT wire on the disconnected Arduino plug with the other lead grounded, I saw 3.62V. This is consistent with the 0-5V range the Arduino pin A1 expects to see.
I started the engine and as it warmed up, the voltage dropped.
I then scanned for DTCs and sure enough got a coolant sensor code.
With the Arduino unplugged, I cleared the DTCs and restarted the engine. The gauge began working as normal, the dash icon was off.
The next step was to remove the resistor in the A1 pin circuit and disconnect the 5V output that made the voltage divider. I removed the MP 150 terminal and ran a new yellow 18G wire in to the board.
After doing that, I re-scanned using the same process as before, with my laptop connected to both the Arduino through it's Windows interface and the PCM via HPT scanner.
I collected ADC values at certain points and matched them to the temp in F shown on HPT. Here are some examples:
ADC-Temp F
626-151 (warm engine start)
537-170
475-183
460-187
430-192
418-196
390-200
385-205
356-212 (I shut off the engine at this point)
I then looked at my current programming:ECT (these decline as temp increases)
Above 450 should keep fan off
25% range should begin @ 449 and go to 415
50% range should begin @ 414 and go to 350
75% range should begin @ 349 and go to 300
100% range is anything under 299
Using the existing settings, it looks like nothing changed. The fan would have kicked on @ 25% between 187 and 192 degrees, and then sped up to 50% around 197. I know from previous testing that 50% gives enough air to maintain 187 degrees, so this should work as-is.
Next step is to update the diagram yet again.
Update 7/26:
I made a 30 mile round trip today and the controller and temp gauge both worked OK. As an unrelated matter, I had restored the original calibration from HPT with a modified fan quantity of 0. This ended up triggering a P1482 code via the MIL, for catalyst temp low. Apparently for the GMT360 this code has something to do with the clutch fan, which was removed. I reinstalled the former HPT stock calibration and also set the fan quantity as 0. That did away with the MIL for now anyway.
Update 7/27:
I am currently running the OEM tune with no mods to the fan settings. I have disabled the several fan-related MIL codes using HP Tuners, to include the stealth P1482. I made another 30 mile round trip today and no more MIL. Will update again if any more hiccups arise.
Last edited by V8 Supra Builder; Jul 27, 2021 at 06:48 PM. Reason: Update
The box I built has no MPH input, it is based only upon pressure and temp. When moving, those both drop so the fan is only scheduled to come on when sitting.
I know when I built the Supra and other Gen 3 cars based on the 1998 PCM, there was a setting for speed to cut off the fans. On the newer stuff like this E40 PCM in the 2005 Rainier there is no such setting. It is likewise based only on pressure and temp. I think the "411" (circa 2001) PCM in my Durango swap is the same as the E40.
I loaded a stock 1998 F-body tune and the fan cutoff (disable) speed was 35 MPH with an enable speed of 30.
I know when I built the Supra and other Gen 3 cars based on the 1998 PCM, there was a setting for speed to cut off the fans. On the newer stuff like this E40 PCM in the 2005 Rainier there is no such setting. It is likewise based only on pressure and temp. I think the "411" (circa 2001) PCM in my Durango swap is the same as the E40.
I loaded a stock 1998 F-body tune and the fan cutoff (disable) speed was 35 MPH with an enable speed of 30.
do you use a can module the nano or on your mega?
Also I’ve got a few Audi fan control modules that came from 2006 a4’s I’d like to get working. They are 600w dual fan controllers and only need power, ground, key on power, and a pwm signal. They are expensive new but can be found easily in junkyards. However I’ve found very little info online about the pwm scheme. Is there any way to tell if it’s 5v or 12v pwm by looking at the chip board inside? Pn 8E0 959 501R01.
Also I’ve got a few Audi fan control modules that came from 2006 a4’s I’d like to get working. They are 600w dual fan controllers and only need power, ground, key on power, and a pwm signal. They are expensive new but can be found easily in junkyards. However I’ve found very little info online about the pwm scheme. Is there any way to tell if it’s 5v or 12v pwm by looking at the chip board inside? Pn 8E0 959 501R01.
The CAN connects the Mega the AEM. There are 2 Nanos that are used as frequency translation slaves. My setup needs too many different PWM frequencies than 1 mega can provide, so I use the slaved Nanos to translate the default Mega PWM frequency the special frequency needs of various components. For example, the force motor in the transmission wants 614hz. the lock up solenoid 31hz. The alternator 128 hz and so on.
Looked up the part number and looks like it controls 2 fans.
Connect the 12V power lines and the ignition line. Then a voltmeter between the ground and the control wire. If it reads 12V, then it has an internal 12V pullup and odd are that all you need is a ground sourced pwm signal. If it's 5V, then a 5V pwm should do it. If it's zero, then try a 5V pwm first and then a 12V if it doesn't work. My gut feel says it just needs a ground based one. I use an inexpensive PWM generator to test them.
Also I’ve got a few Audi fan control modules that came from 2006 a4’s I’d like to get working. They are 600w dual fan controllers and only need power, ground, key on power, and a pwm signal. They are expensive new but can be found easily in junkyards. However I’ve found very little info online about the pwm scheme. Is there any way to tell if it’s 5v or 12v pwm by looking at the chip board inside? Pn 8E0 959 501R01.
Connect the 12V power lines and the ignition line. Then a voltmeter between the ground and the control wire. If it reads 12V, then it has an internal 12V pullup and odd are that all you need is a ground sourced pwm signal. If it's 5V, then a 5V pwm should do it. If it's zero, then try a 5V pwm first and then a 12V if it doesn't work. My gut feel says it just needs a ground based one. I use an inexpensive PWM generator to test them.
The CAN connects the Mega the AEM. There are 2 Nanos that are used as frequency translation slaves. My setup needs too many different PWM frequencies than 1 mega can provide, so I use the slaved Nanos to translate the default Mega PWM frequency the special frequency needs of various components. For example, the force motor in the transmission wants 614hz. the lock up solenoid 31hz. The alternator 128 hz and so on.
Looked up the part number and looks like it controls 2 fans.
Connect the 12V power lines and the ignition line. Then a voltmeter between the ground and the control wire. If it reads 12V, then it has an internal 12V pullup and odd are that all you need is a ground sourced pwm signal. If it's 5V, then a 5V pwm should do it. If it's zero, then try a 5V pwm first and then a 12V if it doesn't work. My gut feel says it just needs a ground based one. I use an inexpensive PWM generator to test them.
Looked up the part number and looks like it controls 2 fans.
Connect the 12V power lines and the ignition line. Then a voltmeter between the ground and the control wire. If it reads 12V, then it has an internal 12V pullup and odd are that all you need is a ground sourced pwm signal. If it's 5V, then a 5V pwm should do it. If it's zero, then try a 5V pwm first and then a 12V if it doesn't work. My gut feel says it just needs a ground based one. I use an inexpensive PWM generator to test them.
Anyways, with a meter on the pwm wire and ground, I got strange readings. Pwm wire voltage would pulse from 0v to 5v then 0v to 12v repeatedly is idk what pull-up it has yet. I did ask on a well known Audi page and it seems this controller does use a 5v pwm signal form what the standalone ecu guys are saying.
here’s the stats I have found so far-
-600w=300w per output
-input signal is 25hz.
-outputs are at 20,000hz
- less than 5% duty emergency modes starts. As soon as 10s
- 15%= low speed, 95%= high speed
- controller has 2 processors that use the same pwm signal
So until my pwm generator gets here I’m stuck. I believe the controller needs the pwm signal prior to the key on power to keep it out of emergency mode. I read where it self diagnoses anywhere from 10 to 1 second after power on.










