IIUC, the tacho pin normally sends a voltage pulse when the hub passes a certain point, i.e. one (or possibly two) pulse(s) per revolution.
Assuming the alarm signal is supposed to go voltage-high if the fan stops spinning, your problem then is to create logic to turn 'fan has power AND fan tacho pulse is not frequent enough' into a signal. Because this will also alarm if the fan is spinning but not delivering the tacho signal, I don't think there's any way for it to give false negatives. The down-side is that it won't alarm until the fan has been not-spinning for some duration, but I think that's standard practice anyway and is
probably fine for your use. (I would even go so far as to guess that your existing fan behaves this way.)
If
I had to implement this, I might look at something like
this. (Click for simulation or see attached static image. The switches are for simulation purposes only and allow you to control whether the fan has power (top) and whether the tacho signal — simulated by the square-wave voltage source — is being received (bottom), i.e. whether or not the fan is spinning.)
The idea here is to slowly charge a cap when the fan has power, but to discharge the cap whenever you see a tacho pulse. As long as the fan is spinning, the cap won't be able to charge very much, but if it stops, you'll trip the alarm signal after a certain duration of not-spinning. (The resistances and capacitance should be tweaked to taste; the values here are somewhat arbitrary, but may be usable. As shown, this should alarm after ~360 ms, equivalent to fan speed dropping below ~165 RPM. For context, an
NF-A8 bottoms out at 450 RPM, while the simulation is showing a measly 300 RPM.)
This may or may not work, depending on whether the tacho pulses are long enough to discharge the cap. I'm sure there are ways to turn the MOSFET on for longer than the pulse duration, though this would obviously add components to the circuit. (That said, the simulation suggests that a 0.01% duty cycle, equivalent to 0.036° of rotation, is sufficient to prevent the capacitor from building up enough charge. That corresponds to a 20µs pulse at 5hz / 300 RPM, or 2µs at 50hz / 3,000 RPM. I suspect the hall sensor that drives the tacho signal is not so sensitive that it only trips within ±0.018° of perfect alignment. 🙂)
An alternative would be to use a counter, with the tacho pulse wired to reset the counter. Increment the counter based on a moderately slow clock (e.g. 10hz) and trip the alarm if the counter gets above some small value (e.g. 5). Ideally, you should arrange for the counter to saturate rather than rolling over. Adjust the clock and threshold values to taste. (Actually, a very high clock and very high threshold will work just as well, but I'm guessing e.g. a slower 8-bit counter is cheaper and/or smaller than a faster 32-bit counter.) I suspect this is essentially what the MCU version you linked is doing, and you could certainly implement this logic easily using an MCU. The code would look something like:
int counter = 0
function init()
gpio_mode(PIN_TACH, INPUT)
gpio_mode(PIN_ALARM, OUTPUT)
attach_interrupt(PIN_TACH, i_tach)
gpio_write(PIN_ALARM, LOW)
function i_tach()
counter = 0
function loop()
if counter > THRESHOLD
gpio_write(PIN_ALARM, HIGH)
else
++counter
gpio_write(PIN_ALARM, LOW)
delay(1)