The following circuit is a simple 555 timer based circuit for variable power delivery using pulse width modulation.
It is suitable for varying the power to resistive or inertial loads (like brushed DC motors and some brushless as well). It does this by delivering a square wave with a varying duty cycle to the load.
I have used this circuit to dim LED's and incandescent lamps (LED's obviously will have a ghosting effect if in a moving application), as well as implementing a simple way to vary the speed of DC motors and PC fans.
Normally, a 555 has a duty cycle somewhere between 50-100%, but by adding a diode to bypass the second half of the potentiometer during the high cycle, the duty cycle has a much wider range, for all intents and purposes, 0 to 100%.
The switching frequency with this setup is between 268 to 307 hertz. By replacing the pot with a 1k model, the switching frequency will be bumped up to between 2680 and 3069 hertz.
Here's some video of running a fan on the above circuit with a few modifications (a 2N3055 for power delivery and LED for flyback protection).
Using this method (although modified), I was able to create an even simpler 0-100% (nominally) PWM circuit using a couple of µA741 operational amplifiers. I am awaiting it's usage in a practical circuit to post circuit diagrams, but here is a quick video of it working.
In this circuit, I started plugging things onto a breadboard before the entire design was in my head so it uses two op-amps each as an inverting schmitt trigger. However, in actuality, future circuits only require one of the schmitt triggers and the other op-amp can be wired as a simple unity amplifier/buffer/voltage follower instead.