From e01c4d41ad6ea001672e2c42f7aed68de10be938 Mon Sep 17 00:00:00 2001 From: Elp03 Date: Sat, 27 Apr 2024 17:26:35 +0200 Subject: [PATCH] add second fan --- prosjekt.X/fan_speeeed.c | 94 ++++++++++++++++++++++------------------ prosjekt.X/fan_speeeed.h | 6 ++- prosjekt.X/main.c | 5 ++- 3 files changed, 61 insertions(+), 44 deletions(-) diff --git a/prosjekt.X/fan_speeeed.c b/prosjekt.X/fan_speeeed.c index 6db2be2..474c9c6 100644 --- a/prosjekt.X/fan_speeeed.c +++ b/prosjekt.X/fan_speeeed.c @@ -5,26 +5,12 @@ uint16_t timer_period_ms = 1; uint16_t fan_speed; -volatile uint16_t falling_edge_counter = 0; +volatile uint16_t falling_edge_counter_1 = 0; +volatile uint16_t falling_edge_counter_2 = 0; #define MAX_PER 0x50 void init_TCA0() { - - //code - // PORTMUX.TCAROUTEA = PORTMUX_TCA0_PORTD_gc; - // port d ??? why - //PORTD.DIR = PIN0_bm; - //code - //TCA0.SINGLE.PERBUF = MAX_PER; - //TCA0.SINGLE.PERBUF = (F_CPU * (1 / timer_period_ms) / 1024); /* F_CPU * F_IRQ / TCA_prescaler */ - //TCA0.SINGLE.CMP0BUF = MAX_PER/2; - //TCA0.SINGLE.CTRLB = TCA_SINGLE_CMP0EN_bm | 0x03; - //TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV1_gc | TCA_SINGLE_ENABLE_bm; - - //TCA0.SINGLE.INTCTRL = TCA_SINGLE_OVF_bm; - //TCA0.SINGLE.CTRLA = TCA_SINGLE_ENABLE_bm | TCA_SINGLE_CLKSEL_DIV1024_gc; /* Sysclk /1024 */ - //TCA0_update_period_ms(); TCA0.SINGLE.INTCTRL = TCA_SINGLE_OVF_bm ; TCA0.SINGLE.CTRLA = TCA_SINGLE_ENABLE_bm | TCA_SINGLE_CLKSEL_DIV1024_gc ; /* Sysclk /1024 */ TCA0.SINGLE.PERBUF = 3906; @@ -35,50 +21,44 @@ void TCA0_update_period_ms() { TCA0.SINGLE.PERBUF = (F_CPU * (1 / timer_period_ms) / 1024); /* F_CPU * F_IRQ / TCA_prescaler */ } -uint16_t RPM_calculation(uint16_t time) { +uint16_t RPM_calculation(uint16_t fancounter, uint16_t time) { printf("time: %u", time); - fan_speed = (falling_edge_counter / time); + fan_speed = (fancounter / time); fan_speed = fan_speed/2; fan_speed = fan_speed * 60/5; - printf("falling edge: %u", falling_edge_counter); - falling_edge_counter = 0; - printf("falling edge: ", falling_edge_counter); + printf("falling edge: %u", fancounter); + fancounter = 0; + printf("falling edge: ", fancounter); printf("fanspeed %u \n", fan_speed); return fan_speed; } -void PORTB_init() { - PORTA.OUTSET |= PIN5_bm; - PORTA.DIRSET |= PIN5_bm; -} - -void init_ac0(){ +void init_fanports() { // CONFIGURE PINS AS ANALOG INPUTS PORTD.DIRSET &= ~PIN6_bm; PORTD.PIN6CTRL &= ~ PORT_ISC_gm; PORTD.PIN6CTRL = PORT_ISC_INPUT_DISABLE_gc; - PORTD.DIRSET &= ~PIN7_bm; + PORTD.DIRSET &= ~PIN4_bm; + PORTD.PIN4CTRL &= ~ PORT_ISC_gm ; + PORTD.PIN4CTRL = PORT_ISC_INPUT_DISABLE_gc; + + PORTD.DIRSET &= PIN7_bm; PORTD.PIN7CTRL &= ~ PORT_ISC_gm ; PORTD.PIN7CTRL = PORT_ISC_INPUT_DISABLE_gc; - - PORTD.DIRSET &= PIN3_bm; - PORTD.PIN3CTRL &= ~ PORT_ISC_gm ; - PORTD.PIN3CTRL = PORT_ISC_INPUT_DISABLE_gc; - +} + +void init_ac0_fan1(){ //Wincontroll disabled AC0.CTRLB = 0x00; //SELECT POSITIVE AND NEGATIVE INPUTS FOR COMPARRISON // FAN USE PD6 & PD7, COMPARE WITH PD3 - AC0.MUXCTRL = AC_MUXPOS_AINP3_gc | AC_MUXNEG_AINN0_gc; + AC0.MUXCTRL = AC_MUXPOS_AINP3_gc | AC_MUXNEG_AINN2_gc; //AC_MUXPOS_AINP1_gc - // OPTIONAL: ENABLE INNPUT PIN BY WRITING "1" TO OUTEN - //AC0.CTRLA = 0x40; // 0b01000000 // ENABLE AC BY WRITING 1 TO ENABLE BIT IN ACN.CTRLA - //AC0.CTRLA |= PIN0_bm; // 0b00000001 AC0.CTRLA = AC_ENABLE_bm | AC_INTMODE_NORMAL_POSEDGE_gc | AC_OUTEN_bm; // TURN ON INTERUPT @@ -86,17 +66,49 @@ void init_ac0(){ } +void init_ac1_fan2(){ + //Wincontroll disabled + AC1.CTRLB = 0x00; + + //SELECT POSITIVE AND NEGATIVE INPUTS FOR COMPARRISON + // FAN USE PD6 & PD7, COMPARE WITH PD3 + AC1.MUXCTRL = AC_MUXPOS_AINP2_gc | AC_MUXNEG_AINN2_gc; + + // ENABLE AC BY WRITING 1 TO ENABLE BIT IN ACN.CTRLA + AC1.CTRLA = AC_ENABLE_bm | AC_INTMODE_NORMAL_POSEDGE_gc | AC_OUTEN_bm; + + // TURN ON INTERUPT + AC1.INTCTRL = 0x01; +} + + ISR(AC0_AC_vect){ // AC0 vec flag cli(); - falling_edge_counter++; - AC0.STATUS |= 0x10; //CMP flag to 0. - //printf("yo"); + falling_edge_counter_1++; + printf("ac0"); + AC0.STATUS |= 0x10; //CMP flag to 0 sei(); } + +ISR(AC1_AC_vect){ // AC0 vec flag + cli(); + falling_edge_counter_2++; + printf("ac1"); + AC1.STATUS |= 0x10; //CMP flag to 0 + sei(); +} + + ISR (TCA0_OVF_vect) { cli(); - RPM_calculation(1); + + printf("fan1"); + RPM_calculation(falling_edge_counter_1,1); + printf("fan2"); + RPM_calculation(falling_edge_counter_2,1); + falling_edge_counter_1 = 0; + falling_edge_counter_2 = 0; TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm ; sei(); } diff --git a/prosjekt.X/fan_speeeed.h b/prosjekt.X/fan_speeeed.h index 53666c9..930b468 100644 --- a/prosjekt.X/fan_speeeed.h +++ b/prosjekt.X/fan_speeeed.h @@ -26,8 +26,10 @@ extern "C" { void init_TCA0(); void TCA0_update_period_ms (); - uint16_t RPM_calculation(uint16_t time); - void init_ac0(); + uint16_t RPM_calculation(uint16_t fancounter, uint16_t time); + void init_fanports(); + void init_ac0_fan1(); + void init_ac1_fan2(); #ifdef __cplusplus } diff --git a/prosjekt.X/main.c b/prosjekt.X/main.c index f403438..a8b60f7 100644 --- a/prosjekt.X/main.c +++ b/prosjekt.X/main.c @@ -36,7 +36,10 @@ int main(void) { init_uart((uint16_t)9600); stdout = &USART_stream; init_TCA0(); - init_ac0(); + init_fanports(); + init_ac0_fan1(); + init_ac1_fan2(); + sei(); /* Replace with your application code */