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:
- Attiny45 or similar (I suggest using an arduino nano or esp32/esp8266 if you wan to add serial/wireless functionality)
@ -11,11 +12,16 @@ Required parts:
- 10~100k resistor (or potentiometer if you want to perform manual calibration of the thermocouple)
- some perfboard
- NTC thermocouple (10 or 100k, calibrate accordingly)
Useful resources when using thermistors/thermocouples:
- bulk capacitor (a few 10s of uF, value is non critical, if in doubt, use electrolytic, 10V 100uF)
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