我的粉丝有24个速度步。它认为热关断是105°C。空闲温度约为75°C。是一个很好的算法,采取温度下限和温度更高的界限,并将其除以n个速度步骤?
编辑:ATM我使用2个循环和85°C的up_threshold,但那是在我知道24个速度步骤之前:
error |= ec_read(EC_RTMP, &ec_rtmp);
if ( ( ec_rtmp < FAN_UPTHRESHOLD_TEMP && sloop < 0 ) ||
( ec_rtmp < FAN_UPTHRESHOLD_TEMP && sloop == FAN_LOOP ) ||
( ec_rtmp < FAN_UPTHRESHOLD_TEMP && speed_switch == 1 )
)
{
speed_switch = 1;
sloop = FAN_LOOP; // 20 * 10 sec
printk("Temp %dC: disabling fan\n", ec_rtmp);
set_fan_disabled();
queue_delayed_work( my_workqueue, &work_object, FAN_JIFFIES_MS*HZ );
} else
{
speed_switch = 0;
printk("Temp %dC: enable fan\n", ec_rtmp);
set_fan_enable();
queue_delayed_work( my_workqueue, &work_object, 2*FAN_JIFFIES_MS*HZ );
}
编辑:我找到了一个很好的源代码:http://code.google.com/p/eeepc-fancontrol/wiki/Formular
答案 0 :(得分:4)
您需要考虑很多因素,首先您不希望风扇在两个不同步骤之间不断反弹,因此常见的诀窍是仅在基于时间的间隔内更改风扇速度,或者如果它跨越两个高于当风扇速度上次改变时。
如果您的目标只是让笔记本电脑变得更热,那么使用速度表的表将是最合适的,但它不是理想的,并且可能让笔记本电脑变得比其他明智的需要更热是。想象一下,如果你的风扇对于当前的热量输出总是比它需要的设置慢一两个。我得到的是风扇速度应该与温度变化有关而不是与温度直接相关,但同时不要完全拒绝温度,你还需要有一个阈值表当温度超过Y时,风扇必须至少为速度X.
因此,在一段时间内,根据温度增益/损失(delta)设计您的系统,而不是在给定时间点的温度。
另外还要考虑的另一件事是风扇通常不会随着RPM的冷却而线性增加,它们通常会按照钟形曲线提高效率,然后逐渐达到峰值冷却效率(相对于RPM),然后随着转速提高它们在冷却方面效率不高。您可能会发现最后10%的风扇转速增加了几个DB,但在消除热量方面可能做得不多。我建议使用最低风扇速度,使其低于您在正常安静条件下通常喜欢的风扇运行速度。而不是仅仅是10%,20%,30%.. 90%,100%风扇转速,我会说开始时为40%(或者对你来说最合适),然后以这个速度看看你的新怠速温度是多少,然后使用它作为增加风扇速度剩余部分的基点。
对于这个问题,没有完美的通用解决方案,与目前对噪声成本高的解释相比,您将获得基于热量输出总能得到改善的东西。因此,您应该为quiet
,office
或gaming
配置文件实现不同的设置集(基于您在给定情况下的重要性和系统负载)。与具有sports mode
或off road
设置的汽车非常相似。