From 7e4f02dd4e72e97b8f5335876142b5bd6179cee1 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Mon, 13 Sep 2021 19:58:57 +0200 Subject: add average for fan tacho --- table-fan/fan.c | 45 +++++++++++++++++++++++++++++---------------- table-fan/fan.h | 2 ++ table-fan/table-fan.c | 2 +- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/table-fan/fan.c b/table-fan/fan.c index daa33f4..a843924 100644 --- a/table-fan/fan.c +++ b/table-fan/fan.c @@ -54,6 +54,35 @@ void fan_init(void) TCCR4B = (1< tacho_last_ts) { + tacho_data[tacho_data_idx] = current - tacho_last_ts; + } else { + tacho_data[tacho_data_idx] = (UINT16_MAX - tacho_last_ts) + current; + } + tacho_last_ts = current; + tacho_data_idx = (tacho_data_idx >= (TACHO_DATA_LEN-1)) ? 0 : tacho_data_idx+1; +} + +uint16_t fan_get_rpm(void) +{ + uint32_t sum = 0; + cli(); + for(uint8_t i = 0; i < TACHO_DATA_LEN; i++) { + sum += tacho_data[i]; + } + sei(); + + return (1875000 / (sum / TACHO_DATA_LEN)); +} + void fan_speed_set(uint8_t val) { OCR4B = (val > PWM_VAL_MAX) ? PWM_VAL_MAX : val; @@ -75,19 +104,3 @@ void fan_speed_dec(void) if(OCR4B > 0) OCR4B--; } - -ISR(TIMER1_CAPT_vect) -{ - static uint16_t tacho_last_ts = 0; - uint16_t current = ICR1; - uint16_t diff = 0; - if(current > tacho_last_ts) { - diff = current - tacho_last_ts; - } else { - diff = (UINT16_MAX - tacho_last_ts) + current; - } - tacho_last_ts = current; - - uint16_t rpm = 1875000 / diff; - printf("\rspeed: %6d rpm", rpm); -} diff --git a/table-fan/fan.h b/table-fan/fan.h index 125d7aa..111c947 100644 --- a/table-fan/fan.h +++ b/table-fan/fan.h @@ -25,6 +25,8 @@ void fan_init(void); +uint16_t fan_get_rpm(void); + void fan_speed_set(uint8_t val); uint8_t fan_speed_get(void); void fan_speed_inc(void); diff --git a/table-fan/table-fan.c b/table-fan/table-fan.c index e3c3842..1f0cf4f 100644 --- a/table-fan/table-fan.c +++ b/table-fan/table-fan.c @@ -38,8 +38,8 @@ void handle_cmd(uint8_t cmd) case '+': fan_speed_inc();/* printf("pwm = %d\r\n", fan_speed_get()); */ break; case '-': fan_speed_dec();/* printf("pwm = %d\r\n", fan_speed_get()); */ break; case 'r': reset2bootloader(); break; - default: return; // printf("error\r\n"); return; } + printf("\rspeed: %5d rpm", fan_get_rpm()); } int main(void) -- cgit v1.2.3