summaryrefslogtreecommitdiff
path: root/tube-rotator
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2014-05-21 02:02:40 +0200
committerChristian Pointner <equinox@spreadspace.org>2014-05-21 02:02:40 +0200
commit943668711671cec5efa238daed28cfe0e2828d5c (patch)
tree9fc398f06796dcaf38298dabcb726b65034cd182 /tube-rotator
parentadded set speed in rpm (diff)
cleaned up stepper state
added rpm based inc speed commands
Diffstat (limited to 'tube-rotator')
-rw-r--r--tube-rotator/stepper.c36
-rw-r--r--tube-rotator/stepper.h10
-rw-r--r--tube-rotator/tube-rotator.c12
3 files changed, 46 insertions, 12 deletions
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_ENABLE_A_BIT) | (1<<STEPPER_ENABLE_B_BIT);
@@ -70,7 +70,7 @@ void stepper_start(void)
TCCR1A = 0; // prescaler 1:64, WGM = 4 (CTC)
TCCR1B = 1<<WGM12 | 1<<CS11 | 1<<CS10; //
TIMSK1 = 1<<OCIE1A;
- running = 1;
+ current_state = stepper_running;
}
void stepper_stop(void)
@@ -78,7 +78,7 @@ void stepper_stop(void)
STEPPER_PORT &= ~(0xF << STEPPER_FIRST_BIT | 1<<STEPPER_ENABLE_A_BIT | 1<<STEPPER_ENABLE_B_BIT);
TCCR1B = 0; // no clock source
TIMSK1 = 0; // disable timer interrupt
- running = 0;
+ current_state = stepper_stopped;
}
static inline void stepper_handle(void)
@@ -104,6 +104,20 @@ ISR(TIMER1_COMPA_vect)
stepper_handle();
}
+stepper_state_t stepper_get_state(void)
+{
+ return current_state;
+}
+
+const char* stepper_state_to_string(stepper_state_t state)
+{
+ switch(state) {
+ case stepper_running: return "running";
+ case stepper_stopped: return "stopped";
+ }
+ return "?";
+}
+
void stepper_set_speed(uint16_t new_speed)
{
if(new_speed <= STEPPER_SPEED_MIN && new_speed >= 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)