FanControl.Releases icon indicating copy to clipboard operation
FanControl.Releases copied to clipboard

Fan acceleration / deceleration unexpectedly not at constant rate

Open bluespresso opened this issue 3 years ago • 2 comments

Set: Step down = 0,1% / sec

When I quit a game and GPU temp is falling quickly with this setting the applied fan power lags quite a bit behind which is not bad for cool down. I would expect the fan power would decrease steadily with 0,1% / sec, e.g.: 35 34,9 34,8 34,7 34,6 34,5 ….

Instead I see something like this: 35 34,9 34,8 34,7 34,6 35 ! jumps up, not due to temperature because at this point it is already way down. 34,4 ! jumps back down. 34,3

The fan power seems to jitter somehow. Also rpm also does not go down steadily but seems to increase slightly when the jump up comes. I wonder if there is somewhere a bug causing this behaviour. Is there something in the code forcing the fan power to a whole number in regular intervals? I also realize that this is not as important as other stuff but somehow I imagine it would not let me rest easy if it was my programm.

bluespresso avatar Jun 10 '22 19:06 bluespresso

There is really only 8 bits, so 256 possible steps. That's why.

Rem0o avatar Jun 12 '22 01:06 Rem0o

Ok, that is interesting. Percent and 8 bit do not play together so well because the smallest difference would be 0.39215686%. When the fan power lags behind the power requested by fan curve (e.g. cool down) I assume you subtract [step down in %/sec] every 1000ms. Whenever it crosses a 1/255th of 100% you actually adjust the fan power and write back a rounded (to integer) value of the current power. I guess this is how the jumps in displayed number happen. I would suggest to only writing back actual changes in fan power, however with one decimal place. This way you would completely avoid the jumping numbers. Also on acceleration or deceleration you would still get an update at least every 4 seconds because the minimum step up / down can only be set to 0.1%/sec. Also I would internally use slightly altered step up / step down: Step_up_internal = step_up_usersetting * 1000 / (4255) Step_down_internal = step_down_usersetting * 1000 / (4255) This way the numbers would better agree with the 8 bit different states. Example: step_down_usersetting = 0.1 %/sec Step_down_internal = 0.0980392157%/sec This way on cool down you would change the state exactly every four steps, I assume every 4000ms. If you wanted to stay true to the user defined values you could set the step time to 980.4ms. This way you still would get true 0.1%/sec.

bluespresso avatar Jun 12 '22 19:06 bluespresso