From 4453156641754e510055ec5f405434a55794eabb Mon Sep 17 00:00:00 2001 From: Leon Krieg Date: Mon, 2 Sep 2024 23:12:19 +0200 Subject: [PATCH] Configure PWM timers for 25 KHz --- src/bus/usart.c | 1 - src/common.h | 5 ++--- src/main.c | 51 ++++++++++++++++++++++++++----------------------- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/bus/usart.c b/src/bus/usart.c index de92af8..9b08d16 100644 --- a/src/bus/usart.c +++ b/src/bus/usart.c @@ -3,7 +3,6 @@ #include #include -//#include #define USART_BAUDRATE 9600 #define USART_RXBUF_SIZE 512 diff --git a/src/common.h b/src/common.h index ba7ad6f..d410e90 100644 --- a/src/common.h +++ b/src/common.h @@ -3,15 +3,14 @@ #include -#define BIT(n) (0x1U << (n)) #define UNUSED(s) (void)(s) +#define BIT(n) (0x1U << (n)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define CLAMP(n, hi, lo) (MIN(hi, MAX(n, lo))) +#define CLAMP(n, hi, lo) (MIN((hi), MAX((n), (lo)))) void Info(const char *fmt, ...); void Error(const char *fmt, ...); -double Clamp(double n, double upper, double lower); #include #define Sleep(ms) _delay_ms(ms) diff --git a/src/main.c b/src/main.c index 4c669d7..54abbc5 100644 --- a/src/main.c +++ b/src/main.c @@ -6,8 +6,8 @@ #include // Minimum speed for Noctua fans is 20% -#define FAN_01_MIN_DUTY 255 / 100 * 20 -#define FAN_02_MIN_DUTY 255 / 100 * 20 +#define FAN_01_MIN_DUTY (320 / 100 * 20) +#define FAN_02_MIN_DUTY (320 / 100 * 20) #define HEATER_MIN_DUTY 0 // ADS1115 (ADC) @@ -44,12 +44,14 @@ int main(void) sei(); - Info("Initializing..."); - SetTWIChannel(0); + Info("Initializing PWM devices..."); - SetFan01Speed(51); - SetFan02Speed(51); - SetHeaterTemp(0); + SetFan01Speed(320); // PWM PB4 + SetFan02Speed(320); // PWM PB5 + SetHeaterTemp(0); // PWM PB7 + SetTWIChannel(0); // I2C MUX + + Info("Running update loop..."); for (;;) { Info("PING"); @@ -69,7 +71,7 @@ static void SetTWIChannel(int channel) // PCA9546 I2C Multiplexer // ======================= - Info("Switching TWI channel to %d...", channel); + Info("Switching I2C channel to %d...", channel); // Excerpts taken from the PCA9546A datasheet: // https://www.ti.com/lit/ds/symlink/pca9546a.pdf @@ -131,7 +133,7 @@ static void SetPinDefaults(void) // PB2: MOSFET #3 (Lights) DDRB |= BIT(PB2); // Out - PORTB &= ~BIT(PB2); // Low + PORTB &= ~BIT(PB2); // High // PD4: PWM Peltier Hot Side // PD5: PWM Peltier Cold Side @@ -139,19 +141,20 @@ static void SetPinDefaults(void) DDRD |= BIT(PD4) | BIT(PD5) | BIT(PD7); - // Fast mode, 8-bit, non-inverting, no prescaling - TCCR1A = BIT(WGM10) | BIT(COM1A1); - TCCR1B = BIT(WGM12) | BIT(CS10); + // Fast mode, non-inverting, no prescaling + TCCR1A = BIT(WGM11) | BIT(COM1A1) | BIT(COM1B1); + TCCR1B = BIT(WGM12) | BIT(WGM13) | BIT(CS10); TCCR2 = BIT(WGM20) | BIT(WGM21) | BIT(COM21) | BIT(CS20); + ICR1 = 320; // 8000 MHz / 25000 KHz - // PD4 OC1B (Timer/Counter1 Output CompareB Match Output) - OCR1A = 51; // Minimum speed for Noctua fans at 20% PWM + // PD4 OC1A Timer1 CompareA + OCR1A = FAN_01_MIN_DUTY; - // PD5 OC1A (Timer/Counter1 Output CompareA Match Output) - OCR1B = 51; // Minimum speed for Noctua fans at 20% PWM + // PD5 OC1B Timer1 CompareB + OCR1B = FAN_02_MIN_DUTY; - // PD7 OC2 (Timer/Counter2 Output Compare Match Output) - OCR2 = 0; // XXX: Set heater low to turn off? + // PD7 OC2 Timer2 Compare + OCR2 = HEATER_MIN_DUTY; // TODO: Update documentation below from ATMega32A sheet... // Had to skip the TCR0 timer and use TCR1 and TCR2 instead. @@ -195,24 +198,24 @@ static void SetPinDefaults(void) static void SetFan01Speed(int n) { - n = CLAMP(n, 0xFF, FAN_01_MIN_DUTY); - Info("Setting FAN01 to PWM %d.", n); + // n = CLAMP(n, 320, FAN_01_MIN_DUTY); + Info("Setting FAN01 to PWM %d...", n); OCR1B = (unsigned char) n; // PD4 } static void SetFan02Speed(int n) { - n = CLAMP(n, 0xFF, FAN_02_MIN_DUTY); - Info("Setting FAN02 to PWM %d.", n); + // n = CLAMP(n, 320, FAN_02_MIN_DUTY); + Info("Setting FAN02 to PWM %d...", n); OCR1A = (unsigned char) n; // PD5 } static void SetHeaterTemp(int n) { - n = CLAMP(n, 0xFF, HEATER_MIN_DUTY); - Info("Setting HEATER to PWM %d.", n); + // n = CLAMP(n, 320, HEATER_MIN_DUTY); + Info("Setting HEATER to PWM %d...", n); OCR2 = (unsigned char) n; // PD7 }