@@ -116,17 +116,22 @@ RESULT ArduinoFanControl::setPWMForAll(const uint16_t dutyCycle)
116116 return res;
117117}
118118
119- /* *
120- * Get tachcount per fan
121- */
122- RESULT ArduinoFanControl::getTachCount (const uint8_t fanid, uint16_t &tachCount)
123- {
119+ RESULT ArduinoFanControl::getTachHz (const uint8_t fanid, uint16_t & tachHz) {
124120 ASSERT_RANGE_FAN_ID (fanid, getFanCount ());
125-
121+
126122 unsigned long tachTime = 750 ; // ms
127123 measureTach (fanid, tachTime);
128- float f = getTach (fanid, tachTime);
129- tachCount = round (f);
124+ float tHz = readTach (fanid, tachTime);
125+ tachHz = round (tHz);
126+ return RES_OK;
127+ }
128+
129+ RESULT ArduinoFanControl::getRPM (const uint8_t fanid, uint16_t & rpm) {
130+ uint16_t tachHz;
131+ getTachHz (fanid, tachHz);
132+ // Div 2 since TACH returns 2 pulses per revolution:
133+ // https://noctua.at/media/wysiwyg/Noctua_PWM_specifications_white_paper.pdf
134+ rpm = (tachHz * 60.0 ) / 2 ;
130135 return RES_OK;
131136}
132137
@@ -157,10 +162,11 @@ void ArduinoFanControl::measureTach(const uint8_t fanid, unsigned long msWait)
157162 } while ((millis () - t1) < msWait);
158163}
159164
160- float ArduinoFanControl::getTach (const uint8_t fanid, unsigned long ms)
165+ float ArduinoFanControl::readTach (const uint8_t fanid, unsigned long ms)
161166{
162167 // See https://www.pjrc.com/teensy/td_libs_TimerOne.html Interrupt Context Issues
163168 // noInterrupts();
169+
164170 uint16_t tach = 0 ;
165171 switch (fanid) {
166172 case 1 :
@@ -178,9 +184,7 @@ float ArduinoFanControl::getTach(const uint8_t fanid, unsigned long ms)
178184 }
179185 // interrupts();
180186
181- float r = (float )(60 * tach) / ((float )ms / 1000 );
182- // Divide by 4: since TACH returns 2 pulses per revolution AND
183- // interrupt is CHANGE: H-L and L-H for accuracy.
184- // https://noctua.at/media/wysiwyg/Noctua_PWM_specifications_white_paper.pdf
185- return r / 4 ;
187+ // Divide by 2: since interrupt is CHANGE: H-L and L-H for accuracy.
188+ float tachHz = (tach * 1000.0 ) / (2 * ms);
189+ return tachHz;
186190}
0 commit comments