RFC: calculating RPM from PWM for fan monitor

Alexander Amelkin a.amelkin at yadro.com
Wed Jan 24 01:42:08 AEDT 2018


Lei,

I'm quite new to openbmc and do not yet fully understand its internal 
mechanics, but from my previous experience with other BMC software and 
hardware, I can say that every fan has it's own characteristics that 
include the minimum and maximum RPM it is able to react to and some not 
necessarily linear function between those points.

As far as I remember, AST2500 is able to detect quite any RPM, no matter 
how low it is.
However, some fans just stop if PWM falls below some threshold and 
rotate at max RPM beyond some max PWM which may be quite less than from 
100% (255). I've seen Delta's fans that take about 70% PWM as a maximum 
and fully stop below like 20%.

Hence, assuming a single linear slope from 0% to 100% pwm is a bad idea.

Thus, IMO, the yaml file should define a piecewise linear function, and 
maybe jitter level to allow for RPM deviations.
I would also add a delay after detection of a changed pwm before rpm is 
checked to allow for acceleration/deceleration. From my experience large 
fans (like 100mm) may take up to 4 seconds to reach max rpm from full 
stop condition. This should be taken in account to avoid false alarms.

Alexander Amelkin,
Leading BMC Firmware Engineer
YADRO

23.01.2018 12:37, Lei YU wrote:
> phospohr-fan-monitor compares fan speed with target and determine if the fan
> is functional:
> https://github.com/openbmc/phosphor-fan-presence/blob/master/monitor/fan.cpp#L182-L185
>
> However, for systems using pwm as target, the logic does not work, because the
> fan speed is RPM but the target the PWM.
>
> So we probably need to have a conversion from PWM target to fan speed RPM.
>
> On Romulus, the observation is:
>
> | PWM | RPM  |
> | --- | ---- |
> | 64  | 3000 |
> | 96  | 3700 |
> | 128 | 4300 |
> | 160 | 4900 |
> | 192 | 5600 |
> | 224 | 6300 |
> | 255 | 7000 |
>
> And the linear fit becomes [RPM = 20.7147 * PWM + 1660.04][1]
>
> So how do we make fan-monitor to support this?
>
> My proposal is to define the parameters, e.g. slope, intercept in the config
> yaml, and add this support in phosphor-fan-monitor.
> E.g.
>      sensors:
>        - name: fan0
>          has_target: true
>          slope: 21
> intercept: 1600
>
> If the yaml config does not define slope/intercept, then the default value
> is set to 1 and 0 which matches the fan speed target.
>
> My question (and concern) is, the fan RPM can not be queried correctly when
> PWM is set to a low value, e.g. 32, and it means the fit function may not be
> linear fit.
>
> What do you think?
>
> [1]: http://m.wolframalpha.com/input/?i=linear+fit+%7B64%2C+3000%7D%2C%7B96%2C+3700%7D%2C%7B128%2C+4300%7D%2C%7B160%2C+4900%7D%2C%7B192%2C+5600%7D%2C%7B224%2C6300%7D%2C%7B255%2C7000%7D



More information about the openbmc mailing list