diff options
author | Christian Pointner <equinox@spreadspace.org> | 2021-09-13 19:37:01 +0200 |
---|---|---|
committer | Christian Pointner <equinox@spreadspace.org> | 2021-09-13 19:37:01 +0200 |
commit | 2895e2ee36b406d45c655a6986f0f5f3fb3435de (patch) | |
tree | c7496be44f3032eeaabf1e805f41270e7280f7e7 | |
parent | remove float since integer division precise enough (diff) |
move fan specific code seperate file
-rw-r--r-- | table-fan/Makefile | 2 | ||||
-rw-r--r-- | table-fan/fan.c | 93 | ||||
-rw-r--r-- | table-fan/fan.h | 33 | ||||
-rw-r--r-- | table-fan/table-fan.c | 76 |
4 files changed, 132 insertions, 72 deletions
diff --git a/table-fan/Makefile b/table-fan/Makefile index c41073f..36e971a 100644 --- a/table-fan/Makefile +++ b/table-fan/Makefile @@ -22,7 +22,7 @@ NAME := table-fan BOARD_TYPE := sparkfunProMicro -OBJ := $(NAME).o +OBJ := $(NAME).o fan.o LIBS := util led lufa-descriptor-usbserial usbio EXTERNAL_LIBS := lufa SPREADAVR_PATH := ../contrib/avr-utils diff --git a/table-fan/fan.c b/table-fan/fan.c new file mode 100644 index 0000000..daa33f4 --- /dev/null +++ b/table-fan/fan.c @@ -0,0 +1,93 @@ +/* + * spreadspace avr utils + * + * + * Copyright (C) 2021 Christian Pointner <equinox@spreadspace.org> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +#include <avr/io.h> +#include <avr/interrupt.h> + +#include <stdio.h> + + +#define PWM_VAL_MAX 160 + +void fan_init(void) +{ + // timer for tacho + DDRD &= ~(1<<PD4); + PORTD |= (1<<PD4); + TCCR1B = 0; // make sure timer is stopped + + TCCR1A = 0; + TCNT1 = 0; + TIMSK1 = (1<<ICIE1); + + TCCR1B = (1<<CS12); // start timer + + // PWM for speed control + DDRB |= (1<<PB6); + TCCR4B = 0; // make sure timer is stopped + + TCCR4A = (1<<COM4B1) | (1<<PWM4B); + TCCR4D = (1<<WGM40); + TCNT4 = 0; + OCR4C = PWM_VAL_MAX; + + OCR4B = PWM_VAL_MAX/2; // set duty cycle to 50:50 + TCCR4B = (1<<CS41); // start timer +} + +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--; +} + +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 new file mode 100644 index 0000000..125d7aa --- /dev/null +++ b/table-fan/fan.h @@ -0,0 +1,33 @@ +/* + * spreadspace avr utils + * + * + * Copyright (C) 2021 Christian Pointner <equinox@spreadspace.org> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +#ifndef TABLEFAN_fan_h_INCLUDED +#define TABLEFAN_fan_h_INCLUDED + +void fan_init(void); + +void fan_speed_set(uint8_t val); +uint8_t fan_speed_get(void); +void fan_speed_inc(void); +void fan_speed_dec(void); + +#endif diff --git a/table-fan/table-fan.c b/table-fan/table-fan.c index 6580b26..e3c3842 100644 --- a/table-fan/table-fan.c +++ b/table-fan/table-fan.c @@ -2,7 +2,7 @@ * spreadspace avr utils * * - * Copyright (C) 2013-2015 Christian Pointner <equinox@spreadspace.org> + * Copyright (C) 2021 Christian Pointner <equinox@spreadspace.org> * * This file is part of spreadspace avr utils. * @@ -21,7 +21,6 @@ */ -#include <avr/io.h> #include <avr/wdt.h> #include <avr/interrupt.h> #include <avr/power.h> @@ -31,80 +30,16 @@ #include "led.h" #include "usbio.h" -#define PWM_VAL OCR4B -#define PWM_MAX 160 - -void pwm_init(void) -{ - DDRB |= (1<<PB6); - TCCR4B = 0; // make sure timer is stopped - - TCCR4A = (1<<COM4B1) | (1<<PWM4B); - TCCR4D = (1<<WGM40); - TCNT4 = 0; - OCR4C = 160; - - OCR4B = 80; // set duty cycle to 50:50 - TCCR4B = (1<<CS41); // start timer -} - -inline void pwm_set(uint8_t val) -{ - PWM_VAL = val; -} - -inline void pwm_inc(void) -{ - if(PWM_VAL < PWM_MAX) - PWM_VAL++; -} - -inline void pwm_dec(void) -{ - if(PWM_VAL > 0) - PWM_VAL--; -} - - -void tacho_init(void) -{ - DDRD &= ~(1<<PD4); - PORTD |= (1<<PD4); - TCCR1B = 0; // make sure timer is stopped - - TCCR1A = 0; - TCNT1 = 0; - TIMSK1 = (1<<ICIE1); - - TCCR1B = (1<<CS12); // start timer -} - -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); -} - +#include "fan.h" void handle_cmd(uint8_t cmd) { switch(cmd) { - case '+': pwm_inc(); break; // printf("pwm = %d\r\n", PWM_VAL); break; - case '-': pwm_dec(); break; // printf("pwm = %d\r\n", PWM_VAL); break; + 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; } - } int main(void) @@ -117,8 +52,7 @@ int main(void) led_init(); usbio_init(); - pwm_init(); - tacho_init(); + fan_init(); sei(); // rotary encoder |