DIY fan controller for ThinkPads (should be adaptable to other laptops/desktops).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

2.7 KiB

DIY fan controller for ThinkPads (should be adaptable to other laptops/desktops).

Introduction/Rationale: Newer ThinkPads are dumb, their fan controllers use an obscure method of communication with the kernel, that does not give direct access to PWM frequency. The fan(s) is(are) either off, or on in one of 2 or 3 levels, making for very jarring transitions that are clearly audible.

This project aims to replace the built-in PWM controller with an attiny or other arduino compatible board containing a custom fan curve. The controller reads a temperature value from a thermocouple and sets the fan accordingly, proportionally to the given temperature. WARNING: the PWM wire must be cut/desoldered from the fan so that we can inject our signal and drive the fan; it is also useful to crimp/solder 5V and GND for the microcontroller from the fan's connector directly, so that our chip/board will turn on/off with the laptop.

Required parts:

Quirks:

  • arduino and other 8-bit AVRs usually generate 1KHz PWM, but computer fans run on 25KHz (will usually spin with anything from about 20 to 30KHz, but different ones may have other tolerances). Access to the individual hardware timers is needed to circumvent this problem and the "analogWrite" command cannot be used. Read more here: https://docs.arduino.cc/tutorials/generic/secrets-of-arduino-pwm
  • desired PWM value is calculated in real time, but is averaged over the last 10 values to dampen "noise" (spikes and dips in temperature would otherwise lead to abrupt speed changes).
  • some fans operate on a reversed PWM logic, with speed following an inverse relation to duty cycle

Future goals:

  • add serial/usb communication
  • add buttons/switch to choose between fan curves
  • add software control mode (with fallback to default built-in curve when serial is down)