mirror of
https://github.com/GOSTSec/sgminer
synced 2025-01-22 20:44:19 +00:00
Make the fan control on the avalon a simple PID controller with a target temperature of 45.
This commit is contained in:
parent
a7f9bf3c52
commit
6cc09aa1e9
@ -984,22 +984,60 @@ static inline void record_temp_fan(struct avalon_info *info, struct avalon_resul
|
|||||||
info->temp_max = info->temp2;
|
info->temp_max = info->temp2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void temp_rise(struct avalon_info *info, int temp)
|
||||||
|
{
|
||||||
|
if (temp >= AVALON_TEMP_TARGET + AVALON_TEMP_HYSTERESIS * 3) {
|
||||||
|
info->fan_pwm = AVALON_DEFAULT_FAN_MAX_PWM;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (temp >= AVALON_TEMP_TARGET + AVALON_TEMP_HYSTERESIS * 2)
|
||||||
|
info->fan_pwm += 10;
|
||||||
|
else if (temp > AVALON_TEMP_TARGET)
|
||||||
|
info->fan_pwm += 5;
|
||||||
|
else if (temp >= AVALON_TEMP_TARGET - AVALON_TEMP_HYSTERESIS)
|
||||||
|
info->fan_pwm += 1;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (info->fan_pwm > AVALON_DEFAULT_FAN_MAX_PWM)
|
||||||
|
info->fan_pwm = AVALON_DEFAULT_FAN_MAX_PWM;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void temp_drop(struct avalon_info *info, int temp)
|
||||||
|
{
|
||||||
|
if (temp <= AVALON_TEMP_TARGET - AVALON_TEMP_HYSTERESIS * 3) {
|
||||||
|
info->fan_pwm = AVALON_DEFAULT_FAN_MIN_PWM;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (temp <= AVALON_TEMP_TARGET - AVALON_TEMP_HYSTERESIS * 2)
|
||||||
|
info->fan_pwm -= 10;
|
||||||
|
else if (temp <= AVALON_TEMP_TARGET - AVALON_TEMP_HYSTERESIS)
|
||||||
|
info->fan_pwm -= 5;
|
||||||
|
else if (temp < AVALON_TEMP_TARGET)
|
||||||
|
info->fan_pwm -= 1;
|
||||||
|
|
||||||
|
if (info->fan_pwm < AVALON_DEFAULT_FAN_MIN_PWM)
|
||||||
|
info->fan_pwm = AVALON_DEFAULT_FAN_MIN_PWM;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void adjust_fan(struct avalon_info *info)
|
static inline void adjust_fan(struct avalon_info *info)
|
||||||
{
|
{
|
||||||
int temp_new;
|
int temp_new;
|
||||||
|
|
||||||
temp_new = info->temp_sum / info->temp_history_count;
|
temp_new = info->temp_sum / info->temp_history_count;
|
||||||
|
|
||||||
if (temp_new < 35) {
|
if (temp_new > info->temp_old)
|
||||||
info->fan_pwm = AVALON_DEFAULT_FAN_MIN_PWM;
|
temp_rise(info, temp_new);
|
||||||
info->temp_old = temp_new;
|
else if (temp_new < info->temp_old)
|
||||||
} else if (temp_new > 55) {
|
temp_drop(info, temp_new);
|
||||||
info->fan_pwm = AVALON_DEFAULT_FAN_MAX_PWM;
|
else {
|
||||||
info->temp_old = temp_new;
|
/* temp_new == info->temp_old */
|
||||||
} else if (abs(temp_new - info->temp_old) >= 2) {
|
if (temp_new > AVALON_TEMP_TARGET)
|
||||||
info->fan_pwm = AVALON_DEFAULT_FAN_MIN_PWM + (temp_new - 35) * 6.4;
|
temp_rise(info, temp_new);
|
||||||
info->temp_old = temp_new;
|
else if (temp_new < AVALON_TEMP_TARGET - AVALON_TEMP_HYSTERESIS)
|
||||||
|
temp_drop(info, temp_new);
|
||||||
}
|
}
|
||||||
|
info->temp_old = temp_new;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void avalon_update_temps(struct cgpu_info *avalon, struct avalon_info *info,
|
static void avalon_update_temps(struct cgpu_info *avalon, struct avalon_info *info,
|
||||||
|
@ -25,6 +25,8 @@
|
|||||||
#define AVALON_FAN_FACTOR 120
|
#define AVALON_FAN_FACTOR 120
|
||||||
#define AVALON_DEFAULT_FAN_MAX_PWM 0xA0 /* 100% */
|
#define AVALON_DEFAULT_FAN_MAX_PWM 0xA0 /* 100% */
|
||||||
#define AVALON_DEFAULT_FAN_MIN_PWM 0x20 /* 20% */
|
#define AVALON_DEFAULT_FAN_MIN_PWM 0x20 /* 20% */
|
||||||
|
#define AVALON_TEMP_TARGET 45
|
||||||
|
#define AVALON_TEMP_HYSTERESIS 3
|
||||||
|
|
||||||
#define AVALON_DEFAULT_TIMEOUT 0x2D
|
#define AVALON_DEFAULT_TIMEOUT 0x2D
|
||||||
#define AVALON_DEFAULT_FREQUENCY 282
|
#define AVALON_DEFAULT_FREQUENCY 282
|
||||||
|
Loading…
x
Reference in New Issue
Block a user