From 224a3cc9412d5bc139f157a4046bbc6e89b848b4 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Mon, 19 May 2014 01:34:31 +0200 Subject: spin up/down, set speed --- tube-rotator/stepper.h | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'tube-rotator/stepper.h') diff --git a/tube-rotator/stepper.h b/tube-rotator/stepper.h index 7fb70ec..ace7984 100644 --- a/tube-rotator/stepper.h +++ b/tube-rotator/stepper.h @@ -23,8 +23,16 @@ #ifndef R3TUBE_stepper_h_INCLUDED #define R3TUBE_stepper_h_INCLUDED +#define STEPPER_MIN_SPEED 800 +#define STEPPER_DEFAULT_SPEED 200 +#define STEPPER_MAX_SPEED 80 + void stepper_init(void); void stepper_start(void); void stepper_stop(void); +void stepper_set_speed(uint16_t new_speed); +void stepper_inc_speed(void); +void stepper_dec_speed(void); + #endif -- cgit v1.2.3 From adc04cbabe0773835ef2c83d132502ef87ce5a62 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Mon, 19 May 2014 02:01:08 +0200 Subject: introduced some default speeds --- tube-rotator/stepper.c | 17 +++++------------ tube-rotator/stepper.h | 11 ++++++++--- tube-rotator/tube-rotator.c | 25 ++++++++----------------- 3 files changed, 21 insertions(+), 32 deletions(-) (limited to 'tube-rotator/stepper.h') diff --git a/tube-rotator/stepper.c b/tube-rotator/stepper.c index 24ce37b..83b1026 100644 --- a/tube-rotator/stepper.c +++ b/tube-rotator/stepper.c @@ -27,13 +27,6 @@ uint8_t step_table [] = { - /* full steps */ - /* 6, // 0110 */ - /* 5, // 0101 */ - /* 9, // 1001 */ - /* 10, // 1010 */ - - /* half steps */ 2, // 0010 6, // 0110 4, // 0100 @@ -57,7 +50,7 @@ uint16_t current_speed; void stepper_init(void) { - target_speed = STEPPER_DEFAULT_SPEED; + target_speed = STEPPER_SPEED_DEFAULT; STEPPER_PORT &= ~(0xF << STEPPER_FIRST_BIT | 1<= STEPPER_MIN_SPEED && new_speed <= STEPPER_MAX_SPEED) + if(new_speed >= STEPPER_SPEED_MIN && new_speed <= STEPPER_SPEED_MAX) target_speed = new_speed; } void stepper_inc_speed(void) { - target_speed = (target_speed >= STEPPER_MAX_SPEED) ? target_speed : target_speed + 1; + target_speed = (target_speed >= STEPPER_SPEED_MAX) ? target_speed : target_speed + 1; } void stepper_dec_speed(void) { - target_speed = (target_speed <= STEPPER_MIN_SPEED) ? target_speed : target_speed - 1; + target_speed = (target_speed <= STEPPER_SPEED_MIN) ? target_speed : target_speed - 1; } diff --git a/tube-rotator/stepper.h b/tube-rotator/stepper.h index ace7984..2e95736 100644 --- a/tube-rotator/stepper.h +++ b/tube-rotator/stepper.h @@ -23,9 +23,14 @@ #ifndef R3TUBE_stepper_h_INCLUDED #define R3TUBE_stepper_h_INCLUDED -#define STEPPER_MIN_SPEED 800 -#define STEPPER_DEFAULT_SPEED 200 -#define STEPPER_MAX_SPEED 80 +#define STEPPER_SPEED_MIN 500 +#define STEPPER_SPEED_MAX 80 + +#define STEPPER_SPEED_60RPM 311 +#define STEPPER_SPEED_120RPM 155 +#define STEPPER_SPEED_180RPM 103 + +#define STEPPER_SPEED_DEFAULT STEPPER_SPEED_120RPM void stepper_init(void); void stepper_start(void); diff --git a/tube-rotator/tube-rotator.c b/tube-rotator/tube-rotator.c index 0e8195f..de2bd49 100644 --- a/tube-rotator/tube-rotator.c +++ b/tube-rotator/tube-rotator.c @@ -37,23 +37,14 @@ void handle_cmd(uint8_t cmd) { switch(cmd) { - case '!': - reset2bootloader(); - break; - case 'r': - led_on(); - stepper_start(); - break; - case 's': - stepper_stop(); - led_off(); - break; - case '+': - stepper_inc_speed(); - break; - case '-': - stepper_dec_speed(); - break; + case '!': reset2bootloader(); break; + case 'r': led_on(); stepper_start(); break; + 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; default: printf("Error(cmd): unknown command %02X '%c'\r\n", cmd, cmd); return; } } -- cgit v1.2.3 From e24ee0d13c7ad1671d2ce3d47bb601f4c1162dd1 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Mon, 19 May 2014 05:45:16 +0200 Subject: printing speed after successful command --- tube-rotator/stepper.c | 5 +++++ tube-rotator/stepper.h | 1 + tube-rotator/tube-rotator.c | 1 + 3 files changed, 7 insertions(+) (limited to 'tube-rotator/stepper.h') diff --git a/tube-rotator/stepper.c b/tube-rotator/stepper.c index 83b1026..80f4d8d 100644 --- a/tube-rotator/stepper.c +++ b/tube-rotator/stepper.c @@ -110,3 +110,8 @@ void stepper_dec_speed(void) { target_speed = (target_speed <= STEPPER_SPEED_MIN) ? target_speed : target_speed - 1; } + +uint16_t stepper_get_speed(void) +{ + return target_speed; +} diff --git a/tube-rotator/stepper.h b/tube-rotator/stepper.h index 2e95736..5b236b9 100644 --- a/tube-rotator/stepper.h +++ b/tube-rotator/stepper.h @@ -39,5 +39,6 @@ void stepper_stop(void); void stepper_set_speed(uint16_t new_speed); void stepper_inc_speed(void); void stepper_dec_speed(void); +uint16_t stepper_get_speed(void); #endif diff --git a/tube-rotator/tube-rotator.c b/tube-rotator/tube-rotator.c index de2bd49..b5a6bd6 100644 --- a/tube-rotator/tube-rotator.c +++ b/tube-rotator/tube-rotator.c @@ -47,6 +47,7 @@ void handle_cmd(uint8_t cmd) case '3': stepper_set_speed(STEPPER_SPEED_180RPM); break; default: printf("Error(cmd): unknown command %02X '%c'\r\n", cmd, cmd); return; } + printf("current speed: %d \r", stepper_get_speed()); } int main(void) -- cgit v1.2.3 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(-) (limited to 'tube-rotator/stepper.h') 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 From 31686afee01d0fa0c94307897b8f7a33b2cf2244 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Tue, 20 May 2014 03:13:40 +0200 Subject: added conversion from speed value to rpm --- tube-rotator/stepper.c | 6 ++++++ tube-rotator/stepper.h | 1 + tube-rotator/tube-rotator.c | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) (limited to 'tube-rotator/stepper.h') diff --git a/tube-rotator/stepper.c b/tube-rotator/stepper.c index 064db5a..a498b43 100644 --- a/tube-rotator/stepper.c +++ b/tube-rotator/stepper.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "stepper.h" @@ -125,3 +126,8 @@ uint16_t stepper_get_speed(void) { return target_speed; } + +uint8_t stepper_get_speed_rpm(void) +{ + return (uint8_t)lround( ( (double)F_CPU / (double)(51200 * (target_speed + 1) ) ) * 60.0 ); +} diff --git a/tube-rotator/stepper.h b/tube-rotator/stepper.h index 8412782..e48be30 100644 --- a/tube-rotator/stepper.h +++ b/tube-rotator/stepper.h @@ -46,5 +46,6 @@ void stepper_set_speed(uint16_t new_speed); void stepper_inc_speed(void); void stepper_dec_speed(void); uint16_t stepper_get_speed(void); +uint8_t stepper_get_speed_rpm(void); #endif diff --git a/tube-rotator/tube-rotator.c b/tube-rotator/tube-rotator.c index dbce87e..e0b0255 100644 --- a/tube-rotator/tube-rotator.c +++ b/tube-rotator/tube-rotator.c @@ -53,7 +53,7 @@ void handle_cmd(uint8_t cmd) 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()); + printf("target speed: %3d rpm\r", stepper_get_speed_rpm()); } int main(void) -- cgit v1.2.3 From 0b70b0e64a9e2681f81e26014e5978c16fb2838c Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Tue, 20 May 2014 03:56:14 +0200 Subject: better min/max values --- tube-rotator/stepper.c | 4 ++-- tube-rotator/stepper.h | 6 +++--- tube-rotator/tube-rotator.c | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) (limited to 'tube-rotator/stepper.h') diff --git a/tube-rotator/stepper.c b/tube-rotator/stepper.c index 2de1fc2..84bd666 100644 --- a/tube-rotator/stepper.c +++ b/tube-rotator/stepper.c @@ -132,7 +132,7 @@ uint16_t stepper_get_speed(void) return target_speed; } -uint8_t stepper_get_speed_rpm(void) +uint16_t stepper_get_speed_rpm(void) { - return (uint8_t)lround( ( (double)F_CPU / (double)(51200 * (target_speed + 1) ) ) * 60.0 ); + return (uint16_t)lround( ( (double)F_CPU / (double)(64.0 * 800.0 * (double)(target_speed + 1) ) ) * 60.0 ); } diff --git a/tube-rotator/stepper.h b/tube-rotator/stepper.h index e48be30..5f26fdf 100644 --- a/tube-rotator/stepper.h +++ b/tube-rotator/stepper.h @@ -23,8 +23,8 @@ #ifndef R3TUBE_stepper_h_INCLUDED #define R3TUBE_stepper_h_INCLUDED -#define STEPPER_SPEED_MIN 1000 -#define STEPPER_SPEED_MAX 150 +#define STEPPER_SPEED_MIN 950 +#define STEPPER_SPEED_MAX 149 #define STEPPER_SPEED_20RPM 936 #define STEPPER_SPEED_30RPM 624 @@ -46,6 +46,6 @@ void stepper_set_speed(uint16_t new_speed); void stepper_inc_speed(void); void stepper_dec_speed(void); uint16_t stepper_get_speed(void); -uint8_t stepper_get_speed_rpm(void); +uint16_t stepper_get_speed_rpm(void); #endif diff --git a/tube-rotator/tube-rotator.c b/tube-rotator/tube-rotator.c index e0b0255..88b2280 100644 --- a/tube-rotator/tube-rotator.c +++ b/tube-rotator/tube-rotator.c @@ -53,7 +53,7 @@ void handle_cmd(uint8_t cmd) case '0': stepper_set_speed(STEPPER_SPEED_100RPM); break; default: printf("Error(cmd): unknown command %02X '%c'\r\n", cmd, cmd); return; } - printf("target speed: %3d rpm\r", stepper_get_speed_rpm()); + printf("target speed: %4d rpm\r", stepper_get_speed_rpm()); } int main(void) -- cgit v1.2.3 From 79a8c06cd5f5f8d6ad887a5ca71d4464523a43e1 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Tue, 20 May 2014 04:02:33 +0200 Subject: added set speed in rpm --- tube-rotator/stepper.c | 9 +++++++-- tube-rotator/stepper.h | 4 +++- tube-rotator/tube-rotator.c | 20 ++++++++++---------- 3 files changed, 20 insertions(+), 13 deletions(-) (limited to 'tube-rotator/stepper.h') diff --git a/tube-rotator/stepper.c b/tube-rotator/stepper.c index 84bd666..3a08cd4 100644 --- a/tube-rotator/stepper.c +++ b/tube-rotator/stepper.c @@ -132,7 +132,12 @@ uint16_t stepper_get_speed(void) return target_speed; } -uint16_t stepper_get_speed_rpm(void) +void stepper_set_speed_rpm(uint8_t new_rpm) { - return (uint16_t)lround( ( (double)F_CPU / (double)(64.0 * 800.0 * (double)(target_speed + 1) ) ) * 60.0 ); + stepper_set_speed(( (uint16_t)( (double)(60.0 * F_CPU) / (double)(64.0 * 800.0 * (double)new_rpm) ) ) - 1); +} + +uint8_t stepper_get_speed_rpm(void) +{ + return (uint8_t)lround( ( (double)F_CPU / (double)(64.0 * 800.0 * (double)(target_speed + 1) ) ) * 60.0 ); } diff --git a/tube-rotator/stepper.h b/tube-rotator/stepper.h index 5f26fdf..a4c7557 100644 --- a/tube-rotator/stepper.h +++ b/tube-rotator/stepper.h @@ -46,6 +46,8 @@ void stepper_set_speed(uint16_t new_speed); void stepper_inc_speed(void); void stepper_dec_speed(void); uint16_t stepper_get_speed(void); -uint16_t stepper_get_speed_rpm(void); + +void stepper_set_speed_rpm(uint8_t new_rpm); +uint8_t stepper_get_speed_rpm(void); #endif diff --git a/tube-rotator/tube-rotator.c b/tube-rotator/tube-rotator.c index 88b2280..b1446b0 100644 --- a/tube-rotator/tube-rotator.c +++ b/tube-rotator/tube-rotator.c @@ -42,18 +42,18 @@ void handle_cmd(uint8_t cmd) case 's': stepper_stop(); led_off(); break; case '+': stepper_inc_speed(); break; case '-': stepper_dec_speed(); 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; + case '2': stepper_set_speed_rpm(20); break; + case '3': stepper_set_speed_rpm(30); break; + case '4': stepper_set_speed_rpm(40); break; + case '5': stepper_set_speed_rpm(50); break; + case '6': stepper_set_speed_rpm(60); break; + case '7': stepper_set_speed_rpm(70); break; + case '8': stepper_set_speed_rpm(80); break; + case '9': stepper_set_speed_rpm(90); break; + case '0': stepper_set_speed_rpm(100); break; default: printf("Error(cmd): unknown command %02X '%c'\r\n", cmd, cmd); return; } - printf("target speed: %4d rpm\r", stepper_get_speed_rpm()); + printf("target speed: %3d rpm\r", stepper_get_speed_rpm()); } int main(void) -- cgit v1.2.3 From 943668711671cec5efa238daed28cfe0e2828d5c Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Wed, 21 May 2014 02:02:40 +0200 Subject: cleaned up stepper state added rpm based inc speed commands --- tube-rotator/stepper.c | 36 +++++++++++++++++++++++++++++++----- tube-rotator/stepper.h | 10 ++++++++-- tube-rotator/tube-rotator.c | 12 +++++++----- 3 files changed, 46 insertions(+), 12 deletions(-) (limited to 'tube-rotator/stepper.h') diff --git a/tube-rotator/stepper.c b/tube-rotator/stepper.c index 3a08cd4..43e194f 100644 --- a/tube-rotator/stepper.c +++ b/tube-rotator/stepper.c @@ -49,7 +49,7 @@ uint8_t step_table [] = volatile uint16_t target_speed; uint16_t current_speed; -uint8_t running; +stepper_state_t current_state; void stepper_init(void) { @@ -61,7 +61,7 @@ void stepper_init(void) void stepper_start(void) { - if(running) return; + if(current_state == stepper_running) return; current_speed = STEPPER_SPEED_MIN; STEPPER_PORT |= (1<= STEPPER_SPEED_MAX) { @@ -134,10 +148,22 @@ uint16_t stepper_get_speed(void) void stepper_set_speed_rpm(uint8_t new_rpm) { - stepper_set_speed(( (uint16_t)( (double)(60.0 * F_CPU) / (double)(64.0 * 800.0 * (double)new_rpm) ) ) - 1); + stepper_set_speed(( (uint16_t)lround( (double)(60.0 * F_CPU) / (double)(64.0 * 800.0 * (double)new_rpm) ) ) - 1); } uint8_t stepper_get_speed_rpm(void) { return (uint8_t)lround( ( (double)F_CPU / (double)(64.0 * 800.0 * (double)(target_speed + 1) ) ) * 60.0 ); } + +void stepper_inc_speed_rpm(void) +{ + uint8_t rpm = stepper_get_speed_rpm(); + stepper_set_speed_rpm((rpm >= 255) ? 255 : rpm+1); +} + +void stepper_dec_speed_rpm(void) +{ + uint8_t rpm = stepper_get_speed_rpm(); + stepper_set_speed_rpm((rpm <= 1) ? 1 : rpm-1); +} diff --git a/tube-rotator/stepper.h b/tube-rotator/stepper.h index a4c7557..10f4900 100644 --- a/tube-rotator/stepper.h +++ b/tube-rotator/stepper.h @@ -23,10 +23,10 @@ #ifndef R3TUBE_stepper_h_INCLUDED #define R3TUBE_stepper_h_INCLUDED -#define STEPPER_SPEED_MIN 950 +#define STEPPER_SPEED_MIN 699 #define STEPPER_SPEED_MAX 149 +//#define STEPPER_SPEED_MAX 74 -#define STEPPER_SPEED_20RPM 936 #define STEPPER_SPEED_30RPM 624 #define STEPPER_SPEED_40RPM 468 #define STEPPER_SPEED_50RPM 374 @@ -38,9 +38,13 @@ #define STEPPER_SPEED_DEFAULT STEPPER_SPEED_60RPM +typedef enum { stepper_stopped = 0, stepper_running = 1 } stepper_state_t; + void stepper_init(void); void stepper_start(void); void stepper_stop(void); +stepper_state_t stepper_get_state(void); +const char* stepper_state_to_string(stepper_state_t state); void stepper_set_speed(uint16_t new_speed); void stepper_inc_speed(void); @@ -49,5 +53,7 @@ uint16_t stepper_get_speed(void); void stepper_set_speed_rpm(uint8_t new_rpm); uint8_t stepper_get_speed_rpm(void); +void stepper_inc_speed_rpm(void); +void stepper_dec_speed_rpm(void); #endif diff --git a/tube-rotator/tube-rotator.c b/tube-rotator/tube-rotator.c index b1446b0..065dd2f 100644 --- a/tube-rotator/tube-rotator.c +++ b/tube-rotator/tube-rotator.c @@ -40,9 +40,10 @@ void handle_cmd(uint8_t cmd) case '!': reset2bootloader(); break; case 'r': led_on(); stepper_start(); break; case 's': stepper_stop(); led_off(); break; - case '+': stepper_inc_speed(); break; - case '-': stepper_dec_speed(); break; - case '2': stepper_set_speed_rpm(20); break; + case '*': stepper_inc_speed(); break; + case '+': stepper_inc_speed_rpm(); break; + case '-': stepper_dec_speed_rpm(); break; + case '_': stepper_dec_speed(); break; case '3': stepper_set_speed_rpm(30); break; case '4': stepper_set_speed_rpm(40); break; case '5': stepper_set_speed_rpm(50); break; @@ -51,9 +52,10 @@ void handle_cmd(uint8_t cmd) case '8': stepper_set_speed_rpm(80); break; case '9': stepper_set_speed_rpm(90); break; case '0': stepper_set_speed_rpm(100); break; - default: printf("Error(cmd): unknown command %02X '%c'\r\n", cmd, cmd); return; + case '1': stepper_set_speed_rpm(110); break; + case '2': stepper_set_speed_rpm(120); break; } - printf("target speed: %3d rpm\r", stepper_get_speed_rpm()); + printf("state: %s, %3d rpm\r", stepper_state_to_string(stepper_get_state()), stepper_get_speed_rpm()); } int main(void) -- cgit v1.2.3 From ddf7cc0e82e33bc574967aa53a7d5bb97b7e5410 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Wed, 21 May 2014 04:23:54 +0200 Subject: improved acceleration --- tube-rotator/stepper.c | 52 ++++++++++++++++++++++----------------------- tube-rotator/stepper.h | 32 ++++++++++++++-------------- tube-rotator/tube-rotator.c | 28 ++++++++++++------------ 3 files changed, 55 insertions(+), 57 deletions(-) (limited to 'tube-rotator/stepper.h') diff --git a/tube-rotator/stepper.c b/tube-rotator/stepper.c index 43e194f..ee8518f 100644 --- a/tube-rotator/stepper.c +++ b/tube-rotator/stepper.c @@ -93,9 +93,9 @@ static inline void stepper_handle(void) if(step_idx != 0 && step_idx % 8) { if(current_speed > target_speed) - OCR1A = --current_speed; + OCR1A = (uint16_t)(STEPPER_SPEED_CONVERT_VALUE/(--current_speed)); else if(current_speed < target_speed) - OCR1A = ++current_speed; + OCR1A = (uint16_t)(STEPPER_SPEED_CONVERT_VALUE/(++current_speed)); } } @@ -120,7 +120,7 @@ const char* stepper_state_to_string(stepper_state_t state) void stepper_set_speed(uint16_t new_speed) { - if(new_speed <= STEPPER_SPEED_MIN && new_speed >= STEPPER_SPEED_MAX) { + if(new_speed >= STEPPER_SPEED_MIN && new_speed <= STEPPER_SPEED_MAX) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { target_speed = new_speed; } @@ -130,14 +130,14 @@ void stepper_set_speed(uint16_t new_speed) void stepper_inc_speed(void) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { - target_speed = (target_speed <= STEPPER_SPEED_MAX) ? STEPPER_SPEED_MAX : target_speed - 1; + target_speed = (target_speed >= STEPPER_SPEED_MAX) ? STEPPER_SPEED_MAX : target_speed + 1; } } void stepper_dec_speed(void) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { - target_speed = (target_speed >= STEPPER_SPEED_MIN) ? STEPPER_SPEED_MIN : target_speed + 1; + target_speed = (target_speed <= STEPPER_SPEED_MIN) ? STEPPER_SPEED_MIN : target_speed - 1; } } @@ -146,24 +146,24 @@ uint16_t stepper_get_speed(void) return target_speed; } -void stepper_set_speed_rpm(uint8_t new_rpm) -{ - stepper_set_speed(( (uint16_t)lround( (double)(60.0 * F_CPU) / (double)(64.0 * 800.0 * (double)new_rpm) ) ) - 1); -} - -uint8_t stepper_get_speed_rpm(void) -{ - return (uint8_t)lround( ( (double)F_CPU / (double)(64.0 * 800.0 * (double)(target_speed + 1) ) ) * 60.0 ); -} - -void stepper_inc_speed_rpm(void) -{ - uint8_t rpm = stepper_get_speed_rpm(); - stepper_set_speed_rpm((rpm >= 255) ? 255 : rpm+1); -} - -void stepper_dec_speed_rpm(void) -{ - uint8_t rpm = stepper_get_speed_rpm(); - stepper_set_speed_rpm((rpm <= 1) ? 1 : rpm-1); -} +/* void stepper_set_speed_rpm(uint8_t new_rpm) */ +/* { */ +/* stepper_set_speed(( (uint16_t)lround( (double)(60.0 * F_CPU) / (double)(64.0 * 800.0 * (double)new_rpm) ) ) - 1); */ +/* } */ + +/* uint8_t stepper_get_speed_rpm(void) */ +/* { */ +/* return (uint8_t)lround( ( (double)F_CPU / (double)(64.0 * 800.0 * (double)(target_speed + 1) ) ) * 60.0 ); */ +/* } */ + +/* void stepper_inc_speed_rpm(void) */ +/* { */ +/* uint8_t rpm = stepper_get_speed_rpm(); */ +/* stepper_set_speed_rpm((rpm >= 255) ? 255 : rpm+1); */ +/* } */ + +/* void stepper_dec_speed_rpm(void) */ +/* { */ +/* uint8_t rpm = stepper_get_speed_rpm(); */ +/* stepper_set_speed_rpm((rpm <= 1) ? 1 : rpm-1); */ +/* } */ diff --git a/tube-rotator/stepper.h b/tube-rotator/stepper.h index 10f4900..7c0eaa3 100644 --- a/tube-rotator/stepper.h +++ b/tube-rotator/stepper.h @@ -23,18 +23,18 @@ #ifndef R3TUBE_stepper_h_INCLUDED #define R3TUBE_stepper_h_INCLUDED -#define STEPPER_SPEED_MIN 699 -#define STEPPER_SPEED_MAX 149 -//#define STEPPER_SPEED_MAX 74 - -#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_MIN 150 +#define STEPPER_SPEED_MAX 700 +#define STEPPER_SPEED_CONVERT_VALUE (uint32_t)(105000) + +#define STEPPER_SPEED_30RPM 168 +#define STEPPER_SPEED_40RPM 224 +#define STEPPER_SPEED_50RPM 281 +#define STEPPER_SPEED_60RPM 336 +#define STEPPER_SPEED_70RPM 393 +#define STEPPER_SPEED_80RPM 451 +#define STEPPER_SPEED_90RPM 507 +#define STEPPER_SPEED_100RPM 561 #define STEPPER_SPEED_DEFAULT STEPPER_SPEED_60RPM @@ -51,9 +51,9 @@ void stepper_inc_speed(void); void stepper_dec_speed(void); uint16_t stepper_get_speed(void); -void stepper_set_speed_rpm(uint8_t new_rpm); -uint8_t stepper_get_speed_rpm(void); -void stepper_inc_speed_rpm(void); -void stepper_dec_speed_rpm(void); +//void stepper_set_speed_rpm(uint8_t new_rpm); +//uint8_t stepper_get_speed_rpm(void); +//void stepper_inc_speed_rpm(void); +//void stepper_dec_speed_rpm(void); #endif diff --git a/tube-rotator/tube-rotator.c b/tube-rotator/tube-rotator.c index 065dd2f..416e077 100644 --- a/tube-rotator/tube-rotator.c +++ b/tube-rotator/tube-rotator.c @@ -40,22 +40,20 @@ void handle_cmd(uint8_t cmd) case '!': reset2bootloader(); break; case 'r': led_on(); stepper_start(); break; case 's': stepper_stop(); led_off(); break; - case '*': stepper_inc_speed(); break; - case '+': stepper_inc_speed_rpm(); break; - case '-': stepper_dec_speed_rpm(); break; - case '_': stepper_dec_speed(); break; - case '3': stepper_set_speed_rpm(30); break; - case '4': stepper_set_speed_rpm(40); break; - case '5': stepper_set_speed_rpm(50); break; - case '6': stepper_set_speed_rpm(60); break; - case '7': stepper_set_speed_rpm(70); break; - case '8': stepper_set_speed_rpm(80); break; - case '9': stepper_set_speed_rpm(90); break; - case '0': stepper_set_speed_rpm(100); break; - case '1': stepper_set_speed_rpm(110); break; - case '2': stepper_set_speed_rpm(120); break; + case '+': stepper_inc_speed(); break; +// case '+': stepper_inc_speed_rpm(); break; +// case '-': stepper_dec_speed_rpm(); break; + case '-': stepper_dec_speed(); 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; } - printf("state: %s, %3d rpm\r", stepper_state_to_string(stepper_get_state()), stepper_get_speed_rpm()); + printf("state: %s, %3d rpm\r", stepper_state_to_string(stepper_get_state()), stepper_get_speed()); } int main(void) -- cgit v1.2.3 From 2b39db60e0a948e5109e345ad601f511d88d63db Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Wed, 21 May 2014 22:54:19 +0200 Subject: reimplemented rpm based speed setting --- tube-rotator/stepper.c | 46 ++++++++++++++++++++++----------------------- tube-rotator/stepper.h | 8 ++++---- tube-rotator/tube-rotator.c | 28 ++++++++++++++------------- 3 files changed, 42 insertions(+), 40 deletions(-) (limited to 'tube-rotator/stepper.h') diff --git a/tube-rotator/stepper.c b/tube-rotator/stepper.c index ee8518f..8b718ae 100644 --- a/tube-rotator/stepper.c +++ b/tube-rotator/stepper.c @@ -93,9 +93,9 @@ static inline void stepper_handle(void) if(step_idx != 0 && step_idx % 8) { if(current_speed > target_speed) - OCR1A = (uint16_t)(STEPPER_SPEED_CONVERT_VALUE/(--current_speed)); + OCR1A = (uint16_t)((STEPPER_SPEED_CONVERT_VALUE/(--current_speed)) - 1); else if(current_speed < target_speed) - OCR1A = (uint16_t)(STEPPER_SPEED_CONVERT_VALUE/(++current_speed)); + OCR1A = (uint16_t)((STEPPER_SPEED_CONVERT_VALUE/(++current_speed)) - 1); } } @@ -146,24 +146,24 @@ uint16_t stepper_get_speed(void) return target_speed; } -/* void stepper_set_speed_rpm(uint8_t new_rpm) */ -/* { */ -/* stepper_set_speed(( (uint16_t)lround( (double)(60.0 * F_CPU) / (double)(64.0 * 800.0 * (double)new_rpm) ) ) - 1); */ -/* } */ - -/* uint8_t stepper_get_speed_rpm(void) */ -/* { */ -/* return (uint8_t)lround( ( (double)F_CPU / (double)(64.0 * 800.0 * (double)(target_speed + 1) ) ) * 60.0 ); */ -/* } */ - -/* void stepper_inc_speed_rpm(void) */ -/* { */ -/* uint8_t rpm = stepper_get_speed_rpm(); */ -/* stepper_set_speed_rpm((rpm >= 255) ? 255 : rpm+1); */ -/* } */ - -/* void stepper_dec_speed_rpm(void) */ -/* { */ -/* uint8_t rpm = stepper_get_speed_rpm(); */ -/* stepper_set_speed_rpm((rpm <= 1) ? 1 : rpm-1); */ -/* } */ +void stepper_set_speed_rpm(uint8_t new_rpm) +{ + stepper_set_speed( (uint16_t)lround( ( (double)(64.0 * 800.0 * (double)STEPPER_SPEED_CONVERT_VALUE) / (double)(60.0 * (double)F_CPU) ) * (double)new_rpm) ); +} + +uint8_t stepper_get_speed_rpm(void) +{ + return (uint8_t)lround( ( (double)(60.0 * (double)F_CPU) / (double)(64.0 * 800.0 * (double)STEPPER_SPEED_CONVERT_VALUE) ) * (double)(target_speed) ); +} + +void stepper_inc_speed_rpm(void) +{ + uint8_t rpm = stepper_get_speed_rpm(); + stepper_set_speed_rpm((rpm >= 255) ? 255 : rpm+1); +} + +void stepper_dec_speed_rpm(void) +{ + uint8_t rpm = stepper_get_speed_rpm(); + stepper_set_speed_rpm((rpm <= 1) ? 1 : rpm-1); +} diff --git a/tube-rotator/stepper.h b/tube-rotator/stepper.h index 7c0eaa3..5b5a315 100644 --- a/tube-rotator/stepper.h +++ b/tube-rotator/stepper.h @@ -51,9 +51,9 @@ void stepper_inc_speed(void); void stepper_dec_speed(void); uint16_t stepper_get_speed(void); -//void stepper_set_speed_rpm(uint8_t new_rpm); -//uint8_t stepper_get_speed_rpm(void); -//void stepper_inc_speed_rpm(void); -//void stepper_dec_speed_rpm(void); +void stepper_set_speed_rpm(uint8_t new_rpm); +uint8_t stepper_get_speed_rpm(void); +void stepper_inc_speed_rpm(void); +void stepper_dec_speed_rpm(void); #endif diff --git a/tube-rotator/tube-rotator.c b/tube-rotator/tube-rotator.c index 416e077..065dd2f 100644 --- a/tube-rotator/tube-rotator.c +++ b/tube-rotator/tube-rotator.c @@ -40,20 +40,22 @@ void handle_cmd(uint8_t cmd) case '!': reset2bootloader(); break; case 'r': led_on(); stepper_start(); break; case 's': stepper_stop(); led_off(); break; - case '+': stepper_inc_speed(); break; -// case '+': stepper_inc_speed_rpm(); break; -// case '-': stepper_dec_speed_rpm(); break; - case '-': stepper_dec_speed(); 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; + case '*': stepper_inc_speed(); break; + case '+': stepper_inc_speed_rpm(); break; + case '-': stepper_dec_speed_rpm(); break; + case '_': stepper_dec_speed(); break; + case '3': stepper_set_speed_rpm(30); break; + case '4': stepper_set_speed_rpm(40); break; + case '5': stepper_set_speed_rpm(50); break; + case '6': stepper_set_speed_rpm(60); break; + case '7': stepper_set_speed_rpm(70); break; + case '8': stepper_set_speed_rpm(80); break; + case '9': stepper_set_speed_rpm(90); break; + case '0': stepper_set_speed_rpm(100); break; + case '1': stepper_set_speed_rpm(110); break; + case '2': stepper_set_speed_rpm(120); break; } - printf("state: %s, %3d rpm\r", stepper_state_to_string(stepper_get_state()), stepper_get_speed()); + printf("state: %s, %3d rpm\r", stepper_state_to_string(stepper_get_state()), stepper_get_speed_rpm()); } int main(void) -- cgit v1.2.3