diff --git a/src/bus/pwm.c b/src/bus/pwm.c index 7b60a9d..3ef678c 100644 --- a/src/bus/pwm.c +++ b/src/bus/pwm.c @@ -80,6 +80,8 @@ int PWM_Init(void) TCCR1A = BIT(WGM11) | BIT(COM1A1) | BIT(COM1B1); TCCR1B = BIT(WGM12) | BIT(WGM13) | BIT(CS10); ICR1 = PWM_CYCLE_TOP; // 8000 MHz / 25000 KHz + + // TIMER3: Fast mode, non-inverting, top=ICR3, prescale /1 TCCR3A = BIT(WGM31) | BIT(COM3A1) | BIT(COM3B1); TCCR3B = BIT(WGM32) | BIT(WGM33) | BIT(CS30); @@ -100,7 +102,8 @@ void PWM_SetValue(int port, int value) if (port != FAN01 && port != FAN02 && port != FAN03) return; // Invalid port - n = CLAMP(value, 100, 0) * (PWM_CYCLE_TOP / 100.0f); + // Workaround: Missing third 16-bit timer output + n = CLAMP(value, 100, 0) * PWM_CYCLE_TOP / 100.0f; Info("Setting duty cycle for %s to %d/%d...", (port == FAN01) ? "FAN01" : diff --git a/src/bus/pwm.h b/src/bus/pwm.h index 9a8f68f..e0deaf2 100644 --- a/src/bus/pwm.h +++ b/src/bus/pwm.h @@ -11,7 +11,7 @@ #define PWM_CYCLE_TOP (F_CPU / 25000 - 1) // 8 MHz / 25 KHz #define FAN01_MIN_DUTY (PWM_CYCLE_TOP * 0.2f) #define FAN02_MIN_DUTY (PWM_CYCLE_TOP * 0.2f) -#define FAN03_MIN_DUTY (PWM_CYCLE_TOP * 0.2f) +#define FAN03_MIN_DUTY (0xFF * 0.2f) int PWM_Init(void); void PWM_SetValue(int port, int value);