This 555 timer based PWM
controller features almost 0..100% pulse width regulation using R1, while keeping the oscillator frequency relatively stable.
The frequency is dependent on values of R1 and C1, values shown will give a frequency range from about 170 to 200 Hz. Any 555 chip will do, CMOS is fine as well. Diodes are not critical, I used 1N4148. Total cost of parts is about $2. As the whole thing is quite trivial, it's very easy to build on prototyping board like I did.
R2, R3 and C3 form a kickstart circuit which keeps 555 in reset state for about 2 seconds. If you want to use this
circuit with V+ other than +12V, then it is a good idea to increase R2 value so that (V+ * R2)/( R2 + R3) is about 2, because the reset signal treshold is about 0.5..1V. If you do not do that, then the kickstart signal will probably stay too close to reset treshold.
Q output of 555 is used to drive the PWM cycle, so the discharge pin is used to drive output transistor instead. This is open collector output, and is used as active low signal, so that the kickstarter will work. D3 protects the output transistor from inductive loads. You may substitute any suitable transistor for Q1, BD140 is 1.5 amp and does not even get warm driving a 80 mm fan without heatsink.