I have a cooling system that uses an external temperature sensor to turn on two HDF4020L-12HHB 12VDC fans and I need to use the locked rotor sensor outputs from the fans as inputs to a MCU (5V logic) to be able to detect when each fan fails. The problem is that when the fans are operating normally the sensor outputs are triggering making it difficult to distinguish between a locked rotor condition and normal operation.

The fan datasheet doesn't specify the type of sensor output but I am assuming it's an open collector output like most other fan alarm signals. I am also assuming that I will need to provide an external pull-up resistor.

Here is my updated circuit:

enter image description here

I built this circuit on a breadboard to test my design and I am having trouble interpreting the results. When the fans are switched on both sensor outputs drop to about half the supply voltage (6V) and, when either one of the fans are kept from spinning (locked rotor condition) the signal oscillates between 12V and GND. I don't have an oscilloscope to accurately measure the waveform on the fans sensor output but it appears to be oscillating at a 2/3 duty cycle where the signal is high for 2 seconds and low for 1 second.

The research I have found shows the sensor output going high and not oscillating except when using a "thermal speed controlled fan or a two-speed fan" which I am not using.

Output waveform from Sanyo Denki

enter image description here

Output Waveform from ADDA AD0412UB-C72GP(P) datasheet

enter image description here


  1. What is causing the fan sensor output to swing from 12V to GND? Answered in comments below.

  2. Why is the output voltage approximately half of the supply voltage when the fan is operating normally and is there a way to pull this signal high or low to prevent unpredictable behavior on the MCU input pin?


I updated the circuit to fix a mistake that I made by trying to source current from the open collector output on the fan. The updated circuit now sinks current when the open collector of the fan is activated which turns on the optocoupler and causes a state change on the MCU GPIO pin.

I also changed the value of the series resistor on the input of both optocouplers from 1k to 2.4k in order to limit the current through the transistor on the fan. I measured this current and noticed that the open collector is sinking about 2.4mA of current through the optocoupler when the rotor is not locked and 0.0mA/5.0mA (0V/12V respectively, as described above) when the rotor is locked.

I believe this is what is causing a false negative signal on the MCU. My guess is that the internal circuitry of the fan is switching the transistor on and off rapidly creating an averaging effect that is not visible on a miltimeter. Is this a reasonable explanation for this phenomenon? How can I mitigate this effect?

  • 1
    \$\begingroup\$ This seems to be a better diagram of the likely operation: nmbtc.com/dc-fans/engineering/sensor.html ...from this you can see the dependency of locked rotor and overcurrent since both elements are sent using the locked rotor signal. \$\endgroup\$ May 18, 2018 at 16:28
  • \$\begingroup\$ @JackCreasey Thanks for the link. This does appear to explain more about the output of the fan sensor but, I still don't understand why the signal drops to 6V when the fans are on. Shouldn't the open collector output remain high (via pull-up resistor) when the fan is running and not in a locked rotor condition? As a result of this drop in voltage, the MCU is receiving 2.42V on the input. This doesn't seem like a reliable digital signal for an input to a MCU. How can I find out what is causing this? Is it possible that the BJT inside the fan is switching on and off rapidly? \$\endgroup\$
    – kprince
    May 22, 2018 at 15:28

1 Answer 1


Here negative side of fans are not on ground(gnd/-) potential. output collector is relative to this voltage potential,not ground (0V) if fans are driven on low side: (like on some PC GPU 2pin fans) then Vmotor=Vcc-Vout Vtach=sink current from Vext(e.g.Vcc) to Vout.

if fan is driven on high side: (like on PC motherboards) then Vmotor=Vout-Vgnd Vtach=sink current from Vext(e.g.Vcc) to Vgnd.

Distinguish locked rotor signal by waiting for two succesive readings of high level spaced apart e.g. 0.75 seconds (>0.5s from specs)


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.