/* * spreadspace avr utils * * * Copyright (C) 2021 Christian Pointner * * This file is part of spreadspace avr utils. * * spreadspace avr utils is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * spreadspace avr utils is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with spreadspace avr utils. If not, see . */ #include #include #include "fan.h" #define PWM_VAL_MAX 160 void fan_init(void) { // timer for tacho DDRD &= ~(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; } uint8_t fan_speed_get(void) { return OCR4B; } void fan_speed_inc(void) { if(OCR4B < PWM_VAL_MAX) OCR4B++; } void fan_speed_dec(void) { if(OCR4B > 0) OCR4B--; }