Skip to content
Snippets Groups Projects
Commit ac5971ce authored by Jake Read's avatar Jake Read
Browse files

does single blocks

parent db8b0996
No related branches found
No related tags found
No related merge requests found
......@@ -51,8 +51,18 @@ void apa_handle_packet(uint8_t *packet, uint8_t length){
if(i + 12 > length){ // confirm: not i + 12 >= ?
i ++; // avoid hangup
} else {
// in steps (discrete)
int32_t steps = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4];
// in steps/s
//stepper_segment(&stepper, startspeed, accel, steps);
uint32_t entryspeed = (packet[i+5] << 24) | (packet[i+6] << 16) | (packet[i+7] << 8) | packet[i+8];
// in steps/s/s
uint32_t accel = (packet[i+9] << 24) | (packet[i+10] << 16) | (packet[i+11] << 8) | packet[i+12];
// in steps/s
uint32_t accellength = (packet[i+13] << 24) | (packet[i+14] << 16) | (packet[i+15] << 8) | packet[i+16];
// in steps/s
uint32_t deccellength = (packet[i+17] << 24) | (packet[i+18] << 16) | (packet[i+19] << 8) | packet[i+20];
// do the business
stepper_block(&stepper, steps, entryspeed, accel, accellength, deccellength);
i += 13; // ? not 12 ?
}
break;
......
......@@ -14,63 +14,116 @@ stepper_t stepper_new(pin_t *step_pin, pin_t *dir_pin){
stepper.step_pin = step_pin;
stepper.dir_pin = dir_pin;
stepper.speed_period = 0;
stepper.position_ticks = 0;
stepper.position_ticks_target = 0;
stepper_reset(&stepper);
return stepper;
}
void stepper_reset(stepper_t *stepper){
stepper->one_minute = 160980000; // calib'd # for timer ticks per minute (speeds, accels all in steps/min or steps/min/s)
stepper->speed_period = 0;
stepper->accel_period = 0;
stepper->speed = 0;
stepper->last_step = 0;
stepper->last_accel = 0;
stepper->position_ticks = 0;
stepper->position_ticks_target = 0;
stepper->dir_steps = 1;
stepper->position_accel_to = 0;
stepper->position_deccel_from = 0;
stepper->position_ticks_end = 0;
}
void stepper_steps(stepper_t *stepper, int32_t steps, uint32_t speed){
// set speed period
(speed < 1) ? speed = 1 : (0); // avoid 0 division, 1 step / s seems like reasonable lower bound step rate
stepper->speed = speed;
stepper->speed_period = stepper->one_minute / stepper->speed;
// set direction
if(steps < 0){
pin_clear(stepper->dir_pin);
} else {
pin_set(stepper->dir_pin);
}
// set new position information
stepper->position_ticks_target = abs(steps);
stepper->position_ticks_end = abs(steps);
stepper->position_accel_to = 0;
stepper->position_deccel_from = stepper->position_ticks_end; // defines flat line block
stepper->position_ticks = 0;
// set direction
// reset times
TICKER_SYNC;
unsigned long now = TICKER;
stepper->last_accel = now;
stepper->last_step = now;
}
void stepper_block(stepper_t *stepper, int32_t steps, uint32_t entryspeed, uint32_t accel, uint32_t accellength, uint32_t deccellength){
// or, newblock: does maths and adds to queue
// enforce no div/0
(entryspeed < 1) ? entryspeed = 1 : (0);
// going to have to catch blocks which cause deceleration to 0 during deceleration phases !
stepper->speed = entryspeed;
// do starting speed period
stepper->speed_period = stepper->one_minute / stepper->speed;
stepper->accel_period = stepper->one_minute / accel;
// set dir
if(steps < 0){
stepper->dir_steps = 0;
pin_clear(stepper->dir_pin);
} else {
stepper->dir_steps = 1;
pin_set(stepper->dir_pin);
}
// set speed period
(speed < 1) ? speed = 1 : (0); // avoid 0 division, 1 step / s seems like reasonable lower bound step rate
stepper->speed = speed;
stepper->speed_period = 2683000 / speed;
// do lengths
stepper->position_ticks_end = abs(steps);
stepper->position_accel_to = accellength;
stepper->position_deccel_from = deccellength;
stepper->position_ticks = 0;
// reset times
TICKER_SYNC;
unsigned long now = TICKER;
stepper->last_accel = now;
stepper->last_step = now;
}
void stepper_update(stepper_t *stepper){
if(stepper->position_ticks_target > stepper->position_ticks){ // still have somewhere to go
if(stepper->position_ticks_end > stepper->position_ticks){ // still have somewhere to go
TICKER_SYNC;
uint32_t now = TICKER;
// check if it's time to accel
/*
unsigned long now = TICKER;
if(stepper->position_ticks < stepper->position_accel_to){
// we're accelerating!
if(now - stepper->last_accel > stepper->accel_period){
if(stepper->dir_accel){
uint32_t newspeed = stepper->speed + 1;
stepper_speed(stepper, newspeed);
} else {
uint32_t newspeed = stepper->speed - 1;
stepper_speed(stepper, newspeed);
stepper->speed += 1;
stepper->speed_period = stepper->one_minute / stepper->speed;
stepper->last_accel = now;
}
} else if(stepper->position_ticks > stepper->position_deccel_from){
if(now - stepper->last_accel > stepper->accel_period){
stepper->speed -= 1;
(stepper->speed < 1) ? stepper->speed = 1 : (0); // assert no 0's
stepper->speed_period = stepper->one_minute / stepper->speed;
stepper->last_accel = now;
}
*/
} else {
// no accel or deccel
}
// check if it's time to step
if(now - stepper->last_step > stepper->speed_period){
if(now - stepper->last_step >= stepper->speed_period){
pin_toggle(stepper->step_pin);
stepper->position_ticks ++;
stepper->last_step = now;
stepper->last_step = now; //stepper->last_step + stepper->speed_period; // last speed_period if accelerating
// not sure why that wasn't working: for now, take for granted that over the course of many steps,
// we tend do equal amounts undershooting speed on all motors
} // end step cycle
}// end step if not there cycle
......
......@@ -16,28 +16,35 @@ typedef struct {
pin_t *step_pin;
pin_t *dir_pin;
// currently.. why do we need so much state?
uint32_t speed_period;
uint32_t speed;
uint32_t accel_period;
uint32_t position_ticks;
uint32_t dir_steps; // 0 or 1
uint32_t dir_accel;
// tracking time periods
unsigned long one_minute;
unsigned long speed_period;
unsigned long accel_period;
// tracking time for updates
uint32_t last_step;
uint32_t last_accel;
unsigned long last_step;
unsigned long last_accel;
// have to track speed to update accel
uint32_t speed;
// targets
uint32_t position_ticks_target;
uint32_t position_ticks;
uint32_t position_accel_to;
uint32_t position_deccel_from;
uint32_t position_ticks_end;
}stepper_t;
stepper_t stepper_new(pin_t *step_pin, pin_t *dir_pin);
void stepper_reset(stepper_t *stepper);
// steps discrete, mm/min
void stepper_steps(stepper_t *stepper, int32_t steps, uint32_t speed);
// steps discrete, mm/min, mm/min/s (mm/s better but we want more discrete resolution)
void stepper_block(stepper_t *stepper, int32_t steps, uint32_t entryspeed, uint32_t accel, uint32_t accellength, uint32_t deccellength);
void stepper_update(stepper_t *stepper);
/*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment