1
0
mirror of https://github.com/sjlongland/cluster-powerctl.git synced 2025-09-14 04:23:15 +10:00

fan PWM tweaks.

- Adjust the calculations so that we base our initial PWM at 0 then
  clamp to minimum PWM
- Implement a fan kick-start mode
- Start with fan off so kick-start mode works
This commit is contained in:
Stuart Longland 2016-09-04 06:16:06 +10:00
parent 882541392f
commit e62cbf497a
Signed by: stuartl
GPG Key ID: 4DFA191410BDE3B7

View File

@ -93,10 +93,13 @@ static volatile uint8_t led_timeout = 0;
/*
* Temperature ranges and fan PWM settings
*/
#define TEMP_MIN (275 << 6) /*!< ~20°C, approx ADC reading */
#define TEMP_MAX (295 << 6) /*!< ~30°C, approx ADC reading */
#define FAN_PWM_MIN (128) /*!< Minimum PWM value */
#define TEMP_MIN (270 << 6) /*!< ~20°C, approx ADC reading */
#define TEMP_MAX (300 << 6) /*!< ~30°C, approx ADC reading */
#define FAN_PWM_MIN (80) /*!< Minimum PWM value */
#define FAN_PWM_MAX (255) /*!< Maximum PWM value */
/*! Fan kick-start timeout */
static volatile uint8_t fan_timeout = 0;
#define FAN_TIMEOUT (5)
/*
* ADC Voltage divider settings
@ -190,8 +193,7 @@ int main(void) {
/* Configure Timer0: Fan PWM */
TCCR0A = (1 << COM0A1) | (1 << WGM01) | (1 << WGM00);
TCCR0B = (1 << CS00);
/* Half-speed fan until we know what to do */
OCR0A = 128;
OCR0A = 0;
/*
* Configure Timer1: 1.2kHz System tick timer
@ -438,15 +440,25 @@ int main(void) {
}
/* Fan control */
if (adc_temp > TEMP_MAX) {
if (fan_timeout) {
/* Kick-start mode */
OCR0A = FAN_PWM_MAX;
fan_timeout--;
} else if (adc_temp > TEMP_MAX) {
/* We're at the maximum temperature, FULL SPEED! */
OCR0A = FAN_PWM_MAX;
} else if (adc_temp > TEMP_MIN) {
/* Scale fan speed linearly with temperature */
OCR0A = (((adc_temp - TEMP_MIN)
* (FAN_PWM_MIN - FAN_PWM_MAX))
/ (TEMP_MAX - TEMP_MIN))
+ FAN_PWM_MIN;
uint8_t pwm = (((adc_temp - TEMP_MIN)
* FAN_PWM_MAX)
/ (TEMP_MAX - TEMP_MIN));
if (OCR0A < FAN_PWM_MIN)
/* Enter kick-start mode */
fan_timeout = FAN_TIMEOUT;
else if (pwm > FAN_PWM_MIN)
OCR0A = pwm;
else
OCR0A = FAN_PWM_MIN;
} else {
/* Turn fans off completely. */
OCR0A = 0;