From fbc7b65a6ef8e43378bb03fe64bfe1b5b2735434 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Tue, 20 May 2014 02:43:59 +0200 Subject: added new speeds make access to target_speed atomic --- tube-rotator/stepper.c | 28 +++++++++++++++++++--------- tube-rotator/stepper.h | 18 ++++++++++++------ tube-rotator/tube-rotator.c | 12 +++++++++--- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/tube-rotator/stepper.c b/tube-rotator/stepper.c index 675be26..064db5a 100644 --- a/tube-rotator/stepper.c +++ b/tube-rotator/stepper.c @@ -22,6 +22,7 @@ #include #include +#include #include "stepper.h" @@ -45,7 +46,7 @@ uint8_t step_table [] = #define LENGTH_STEP_TABLE (sizeof(step_table)/sizeof(uint8_t)) #define STEPPER_OUTPUT_BITMASK (~(0xF << STEPPER_FIRST_BIT )) -uint16_t target_speed; +volatile uint16_t target_speed; uint16_t current_speed; void stepper_init(void) @@ -84,10 +85,12 @@ static inline void stepper_handle(void) step_idx++; step_idx %= LENGTH_STEP_TABLE; - if(current_speed > target_speed) - OCR1A = --current_speed; - else if(current_speed < target_speed) - OCR1A = ++current_speed; + if(step_idx != 0 && step_idx % 8) { + if(current_speed > target_speed) + OCR1A = --current_speed; + else if(current_speed < target_speed) + OCR1A = ++current_speed; + } } ISR(TIMER1_COMPA_vect) @@ -97,18 +100,25 @@ ISR(TIMER1_COMPA_vect) void stepper_set_speed(uint16_t new_speed) { - if(new_speed <= STEPPER_SPEED_MIN && new_speed >= STEPPER_SPEED_MAX) - target_speed = new_speed; + if(new_speed <= STEPPER_SPEED_MIN && new_speed >= STEPPER_SPEED_MAX) { + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + target_speed = new_speed; + } + } } void stepper_inc_speed(void) { - target_speed = (target_speed <= STEPPER_SPEED_MAX) ? STEPPER_SPEED_MAX : target_speed - 1; + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + target_speed = (target_speed <= STEPPER_SPEED_MAX) ? STEPPER_SPEED_MAX : target_speed - 1; + } } void stepper_dec_speed(void) { - target_speed = (target_speed >= STEPPER_SPEED_MIN) ? STEPPER_SPEED_MIN : target_speed + 1; + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + target_speed = (target_speed >= STEPPER_SPEED_MIN) ? STEPPER_SPEED_MIN : target_speed + 1; + } } uint16_t stepper_get_speed(void) diff --git a/tube-rotator/stepper.h b/tube-rotator/stepper.h index 5b236b9..8412782 100644 --- a/tube-rotator/stepper.h +++ b/tube-rotator/stepper.h @@ -23,14 +23,20 @@ #ifndef R3TUBE_stepper_h_INCLUDED #define R3TUBE_stepper_h_INCLUDED -#define STEPPER_SPEED_MIN 500 -#define STEPPER_SPEED_MAX 80 +#define STEPPER_SPEED_MIN 1000 +#define STEPPER_SPEED_MAX 150 -#define STEPPER_SPEED_60RPM 311 -#define STEPPER_SPEED_120RPM 155 -#define STEPPER_SPEED_180RPM 103 +#define STEPPER_SPEED_20RPM 936 +#define STEPPER_SPEED_30RPM 624 +#define STEPPER_SPEED_40RPM 468 +#define STEPPER_SPEED_50RPM 374 +#define STEPPER_SPEED_60RPM 312 +#define STEPPER_SPEED_70RPM 267 +#define STEPPER_SPEED_80RPM 233 +#define STEPPER_SPEED_90RPM 207 +#define STEPPER_SPEED_100RPM 187 -#define STEPPER_SPEED_DEFAULT STEPPER_SPEED_120RPM +#define STEPPER_SPEED_DEFAULT STEPPER_SPEED_60RPM void stepper_init(void); void stepper_start(void); diff --git a/tube-rotator/tube-rotator.c b/tube-rotator/tube-rotator.c index e1c84ce..dbce87e 100644 --- a/tube-rotator/tube-rotator.c +++ b/tube-rotator/tube-rotator.c @@ -42,9 +42,15 @@ void handle_cmd(uint8_t cmd) case 's': stepper_stop(); led_off(); break; case '+': stepper_inc_speed(); break; case '-': stepper_dec_speed(); break; - case '1': stepper_set_speed(STEPPER_SPEED_60RPM); break; - case '2': stepper_set_speed(STEPPER_SPEED_120RPM); break; - case '3': stepper_set_speed(STEPPER_SPEED_180RPM); break; + case '2': stepper_set_speed(STEPPER_SPEED_20RPM); break; + case '3': stepper_set_speed(STEPPER_SPEED_30RPM); break; + case '4': stepper_set_speed(STEPPER_SPEED_40RPM); break; + case '5': stepper_set_speed(STEPPER_SPEED_50RPM); break; + case '6': stepper_set_speed(STEPPER_SPEED_60RPM); break; + case '7': stepper_set_speed(STEPPER_SPEED_70RPM); break; + case '8': stepper_set_speed(STEPPER_SPEED_80RPM); break; + case '9': stepper_set_speed(STEPPER_SPEED_90RPM); break; + case '0': stepper_set_speed(STEPPER_SPEED_100RPM); break; default: printf("Error(cmd): unknown command %02X '%c'\r\n", cmd, cmd); return; } printf("current speed: %4d \r", stepper_get_speed()); -- cgit v1.2.3