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

teardown old stepper code

parent e716efe2
No related branches found
No related tags found
No related merge requests found
...@@ -40,7 +40,7 @@ UsedLibrary="C:/EAGLE 8.3.2/lbr/ltspice/sym.lbr" ...@@ -40,7 +40,7 @@ UsedLibrary="C:/EAGLE 8.3.2/lbr/ltspice/sym.lbr"
Type="Schematic Editor" Type="Schematic Editor"
Number=1 Number=1
File="mkstepper.sch" File="mkstepper.sch"
View="-21.652 1.07368 203.78 218.518" View="134.406 87.3199 359.838 304.764"
WireWidths=" 0.0762 0.1016 0.127 0.15 0.2 0.2032 0.254 0.3048 0.4064 0.508 0.6096 0.8128 1.016 1.27 2.54 0.1524" WireWidths=" 0.0762 0.1016 0.127 0.15 0.2 0.2032 0.254 0.3048 0.4064 0.508 0.6096 0.8128 1.016 1.27 2.54 0.1524"
PadDiameters=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 6.4516 0" PadDiameters=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 6.4516 0"
PadDrills=" 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.65 0.7 0.75 0.8 0.85 0.9 1 0.6" PadDrills=" 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.65 0.7 0.75 0.8 0.85 0.9 1 0.6"
...@@ -79,14 +79,14 @@ ArcDirection=0 ...@@ -79,14 +79,14 @@ ArcDirection=0
AddLevel=2 AddLevel=2
PadsSameType=0 PadsSameType=0
Layer=91 Layer=91
Views=" 1: -21.652 1.07368 203.78 218.518" Views=" 1: 134.406 87.3199 359.838 304.764"
Sheet="1" Sheet="1"
[Win_2] [Win_2]
Type="Board Editor" Type="Board Editor"
Number=2 Number=2
File="mkstepper.brd" File="mkstepper.brd"
View="7.50586 28.8374 36.9537 50.7777" View="0.139397 10.9565 61.2024 56.4519"
WireWidths=" 0.0762 0.1016 0.127 0.15 0.2 0.2032 0.254 0.3048 0.4064 0.508 0.6096 0.8128 1.016 1.27 2.54 0.1524" WireWidths=" 0.0762 0.1016 0.127 0.15 0.2 0.2032 0.254 0.3048 0.4064 0.508 0.6096 0.8128 1.016 1.27 2.54 0.1524"
PadDiameters=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 6.4516 0" PadDiameters=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 6.4516 0"
PadDrills=" 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.65 0.7 0.75 0.8 0.85 0.9 1 0.6" PadDrills=" 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.65 0.7 0.75 0.8 0.85 0.9 1 0.6"
...@@ -131,7 +131,7 @@ Type="Control Panel" ...@@ -131,7 +131,7 @@ Type="Control Panel"
Number=0 Number=0
[Desktop] [Desktop]
Screen="6000 2160" Screen="3840 1080"
Window="Win_1" Window="Win_1"
Window="Win_2" Window="Win_2"
Window="Win_3" Window="Win_3"
File added
...@@ -35,39 +35,24 @@ void apa_handle_packet(uint8_t *packet, uint8_t length){ ...@@ -35,39 +35,24 @@ void apa_handle_packet(uint8_t *packet, uint8_t length){
i ++; i ++;
break; break;
case DELIM_KEY_POSITION_STEPS: case DELIM_KEY_STEPS:
// should set 0 accel // take steps (int32_t) and speed (uint32_t) and dir (uint8_t) to step
if(i + 4 > length){ if(i + 8 > length){
i ++; // avoid hangup i ++; // avoid hangup, but give up on this
} else { } else {
int32_t steps = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb int32_t steps = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb
stepper_steps(&stepper, steps); uint32_t speed = (packet[i+5] << 24) | (packet[i+6] << 16) | (packet[i+7] << 8) | packet[i+8];
i += 5; // bring packet ptr to next key (should) stepper_steps(&stepper, steps, speed);
} i += 9; // bring packet ptr to next key (should)
break;
case DELIM_KEY_SPEED_STEPS:
// should set 0 accel
if(i + 4 > length){
i ++; // avoiding hangup
} else {
uint32_t speed = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb
stepper_speed(&stepper, speed);
i += 5; // bring packet ptr to next key (should)
} }
break; break;
case DELIM_KEY_SEGMENT: case DELIM_KEY_BLOCK:
if(i + 12 > length){ // confirm: not i + 12 >= ? if(i + 12 > length){ // confirm: not i + 12 >= ?
i ++; // avoid hangup i ++; // avoid hangup
} else { } else {
// in steps / s // in steps / s
uint32_t startspeed = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; //stepper_segment(&stepper, startspeed, accel, steps);
// in steps / s^2
int32_t accel = (packet[i+5] << 24) | (packet[i+6] << 16) | (packet[i+7] << 8) | packet[i+8];
// in steps
int32_t steps = (packet[i+9] << 24) | (packet[i+10] << 16) | (packet[i+11] << 8) | packet[i+12];
stepper_segment(&stepper, startspeed, accel, steps);
i += 13; // ? not 12 ? i += 13; // ? not 12 ?
} }
break; break;
......
...@@ -14,10 +14,9 @@ ...@@ -14,10 +14,9 @@
#define APA_HANDLER_OUTSIDE 0 #define APA_HANDLER_OUTSIDE 0
#define APA_HANDLER_INSIDE 1 #define APA_HANDLER_INSIDE 1
#define DELIM_KEY_TEST 128 // toggles a light, to test network #define DELIM_KEY_TEST 127 // toggles a light, to test network
#define DELIM_KEY_POSITION_STEPS 129 // is 32 bit int #define DELIM_KEY_STEPS 128 // steps (steps) uint32_t, speed (steps/s) uint32_t, dir uint8_t
#define DELIM_KEY_SPEED_STEPS 130 // is 32 bit int #define DELIM_KEY_BLOCK 129 // is 32 bit int
#define DELIM_KEY_SEGMENT 131
void apa_handle_packet(uint8_t *packet, uint8_t length); void apa_handle_packet(uint8_t *packet, uint8_t length);
void apa_return_packet(uint8_t *packet, uint8_t length); void apa_return_packet(uint8_t *packet, uint8_t length);
......
...@@ -24,13 +24,9 @@ pin_t stlb; ...@@ -24,13 +24,9 @@ pin_t stlb;
// PORTS // PORTS
pin_t up0_stlr;
pin_t up0_stlb;
pin_t up1_stlr; pin_t up1_stlr;
pin_t up1_stlb; pin_t up1_stlb;
ringbuffer_t up0_rbrx;
ringbuffer_t up0_rbtx;
ringbuffer_t up1_rbrx; ringbuffer_t up1_rbrx;
ringbuffer_t up1_rbtx; ringbuffer_t up1_rbtx;
...@@ -45,17 +41,6 @@ uartport_t *ups[NUM_UPS]; ...@@ -45,17 +41,6 @@ uartport_t *ups[NUM_UPS];
apaport_t apap0; apaport_t apap0;
apaport_t apap1; apaport_t apap1;
// TMC26x
spiport_t spi_tmc;
pin_t step_pin;
pin_t dir_pin;
pin_t en_pin;
pin_t sg_pin;
tmc26_t tmc;
// TIMERS // TIMERS
uint32_t overflows; uint32_t overflows;
...@@ -68,8 +53,23 @@ uint32_t blindcounter; ...@@ -68,8 +53,23 @@ uint32_t blindcounter;
#define TICKER_SYNC (TC0->COUNT32.CTRLBSET.reg = TCC_CTRLBSET_CMD_READSYNC) #define TICKER_SYNC (TC0->COUNT32.CTRLBSET.reg = TCC_CTRLBSET_CMD_READSYNC)
#define TICKER (TC0->COUNT32.COUNT.reg) #define TICKER (TC0->COUNT32.COUNT.reg)
// TMC26x
spiport_t spi_tmc;
pin_t step_pin;
pin_t dir_pin;
pin_t en_pin;
pin_t sg_pin;
tmc26_t tmc;
// STEPPER // STEPPER
stepper_t stepper; stepper_t stepper;
// DEBUG
pin_t tickuptx;
#endif /* HARDWARE_H_ */ #endif /* HARDWARE_H_ */
\ No newline at end of file
...@@ -173,50 +173,26 @@ int main(void) ...@@ -173,50 +173,26 @@ int main(void)
// ready interrupt system // ready interrupt system
__enable_irq(); __enable_irq();
NVIC_EnableIRQ(SERCOM4_0_IRQn); //up0tx
NVIC_EnableIRQ(SERCOM4_2_IRQn); //up0rx
NVIC_EnableIRQ(SERCOM5_0_IRQn); NVIC_EnableIRQ(SERCOM5_0_IRQn);
NVIC_EnableIRQ(SERCOM5_2_IRQn); NVIC_EnableIRQ(SERCOM5_2_IRQn);
NVIC_EnableIRQ(TC0_IRQn); NVIC_EnableIRQ(TC0_IRQn);
NVIC_EnableIRQ(TC2_IRQn); NVIC_EnableIRQ(TC2_IRQn);
// ringbuffers (for uart ports) // ringbuffers (for uart ports)
rb_init(&up0_rbrx);
rb_init(&up0_rbtx);
rb_init(&up1_rbrx); rb_init(&up1_rbrx);
rb_init(&up1_rbtx); rb_init(&up1_rbtx);
/*
pin_t testpin = pin_new(&PORT->Group[0], 12);
pin_output(&testpin);
pin_set(&testpin);
while(1){
pin_toggle(&testpin);
}
*/
// uarts (ports) // uarts (ports)
// there's some chance we should really be using one gclk channel for all of the peripherals // there's some chance we should really be using one gclk channel for all of the peripherals
// and running that at 100MHz or so // and running that at 100MHz or so
up0 = uart_new(SERCOM4, &PORT->Group[0], &up0_rbrx, &up0_rbtx, 12, 13, HARDWARE_IS_APBD, HARDWARE_ON_PERIPHERAL_D);
MCLK->APBDMASK.reg |= MCLK_APBDMASK_SERCOM4;
uart_init(&up0, 7, SERCOM4_GCLK_ID_CORE, 62675); // baud: 45402 for 921600, 63018 for 115200
up1 = uart_new(SERCOM5, &PORT->Group[1], &up1_rbrx, &up1_rbtx, 3, 2, HARDWARE_IS_APBD, HARDWARE_ON_PERIPHERAL_D); up1 = uart_new(SERCOM5, &PORT->Group[1], &up1_rbrx, &up1_rbtx, 3, 2, HARDWARE_IS_APBD, HARDWARE_ON_PERIPHERAL_D);
MCLK->APBDMASK.reg |= MCLK_APBDMASK_SERCOM5; MCLK->APBDMASK.reg |= MCLK_APBDMASK_SERCOM5;
uart_init(&up1, 7, SERCOM5_GCLK_ID_CORE, 62675); uart_init(&up1, 7, SERCOM5_GCLK_ID_CORE, 62675);
ups[0] = &up0; ups[0] = NULL;
ups[1] = &up1; ups[1] = &up1;
up0_stlr = pin_new(&PORT->Group[0], 19);
pin_output(&up0_stlr);
pin_set(&up0_stlr);
up0_stlb = pin_new(&PORT->Group[0], 17);
pin_output(&up0_stlb);
pin_set(&up0_stlb);
up1_stlr = pin_new(&PORT->Group[0], 21); up1_stlr = pin_new(&PORT->Group[0], 21);
pin_output(&up1_stlr); pin_output(&up1_stlr);
pin_set(&up1_stlr); pin_set(&up1_stlr);
...@@ -224,8 +200,6 @@ int main(void) ...@@ -224,8 +200,6 @@ int main(void)
pin_output(&up1_stlb); pin_output(&up1_stlb);
pin_set(&up1_stlb); pin_set(&up1_stlb);
apaport_build(&apap0, 0, &up0, &up0_stlr, &up0_stlb);
apaport_reset(&apap0);
apaport_build(&apap1, 1, &up1, &up1_stlr, &up1_stlb); apaport_build(&apap1, 1, &up1, &up1_stlr, &up1_stlb);
apaport_reset(&apap1); apaport_reset(&apap1);
...@@ -270,51 +244,28 @@ int main(void) ...@@ -270,51 +244,28 @@ int main(void)
stepper = stepper_new(&step_pin, &dir_pin); stepper = stepper_new(&step_pin, &dir_pin);
stepper_reset(&stepper); stepper_reset(&stepper);
tickuptx = pin_new(&PORT->Group[0], 13);
pin_output(&tickuptx);
uint8_t lpcnt = 0;
uint8_t stpcnt = 0;
while (1) while (1)
{ {
apaport_scan(&apap0, 2);
apaport_scan(&apap1, 2); apaport_scan(&apap1, 2);
/*
now: step timer should not accumulate error !
*/
/*
if(stepper.position_ticks_target == stepper.position_ticks){
stpcnt ++;
//pin_clear(&stlr);
//stepper_targetposition_steps(&stepper, 1000 * (stpcnt %2));
//stepper_targetspeed_steps(&stepper, 500);
//stepper_goto(&stepper, 360 * (stpcnt % 2), 1200);
} else {
//pin_set(&stlr);
}
*/
} }
} }
/* /*
next steps (haha) next steps (haha)
- do steps, steps/s speed checking, and direction - speed and timing: what the heck
- unit test all commands on all ports using mkterminal - reduce error accumulation in stepper: track proper last time
- segment command
- this quickly so that you can mods compose - steps @ speed command
further reading:
- quadratic interpolation for position @ time w/ velocity @ endpoint step commands
minors:
- bring baud rate to 1M, at least! what the heck, FTDI!
*/ */
void SysTick_Handler(void){ void SysTick_Handler(void){
// slow ticker // slow ticker
pin_toggle(&stlb); pin_toggle(&stlb);
//pin_toggle(&stlr);
//uart_sendchar_buffered(&up0, 120); //uart_sendchar_buffered(&up0, 120);
...@@ -351,8 +302,9 @@ void TC0_Handler(void){ // fires rarely, for counting overflows of time-ticker ...@@ -351,8 +302,9 @@ void TC0_Handler(void){ // fires rarely, for counting overflows of time-ticker
overflows ++; overflows ++;
} }
void TC2_Handler(void){ // fires every 16us, for step checking void TC2_Handler(void){ // fires every 8.3us, for step checking
TC2->COUNT32.INTFLAG.bit.MC0 = 1; TC2->COUNT32.INTFLAG.bit.MC0 = 1;
TC2->COUNT32.INTFLAG.bit.MC1 = 1; TC2->COUNT32.INTFLAG.bit.MC1 = 1;
pin_toggle(&tickuptx);
stepper_update(&stepper); stepper_update(&stepper);
} }
\ No newline at end of file
...@@ -29,41 +29,24 @@ void stepper_reset(stepper_t *stepper){ ...@@ -29,41 +29,24 @@ void stepper_reset(stepper_t *stepper){
stepper->dir_steps = 1; stepper->dir_steps = 1;
} }
void stepper_steps(stepper_t *stepper, int32_t position){ void stepper_steps(stepper_t *stepper, int32_t steps, uint32_t speed){
stepper->position_ticks_target = abs(position); // set new position information
stepper->position_ticks_target = abs(steps);
stepper->position_ticks = 0; stepper->position_ticks = 0;
if(position < 0){
// set direction
if(steps < 0){
stepper->dir_steps = 0; stepper->dir_steps = 0;
pin_clear(stepper->dir_pin); pin_clear(stepper->dir_pin);
} else { } else {
stepper->dir_steps = 1; stepper->dir_steps = 1;
pin_set(stepper->dir_pin); pin_set(stepper->dir_pin);
} }
}
// set speed period
void stepper_speed(stepper_t *stepper, uint32_t speed){ (speed < 1) ? speed = 1 : (0); // avoid 0 division, 1 step / s seems like reasonable lower bound step rate
// minimum of 1 step / s
// if speed is 0, we leave speed at minimum and set state to not step?
(speed < 1) ? speed = 1 : (0);
stepper->speed = speed; stepper->speed = speed;
// timing not accurate to real-world yet stepper->speed_period = 2683000 / speed;
// timer is 48MHz clock on a DIV16, so we have 3 000 000 ticks / s (333ns resolution, wow)
stepper->speed_period = 3000000 / speed;
}
void stepper_segment(stepper_t *stepper, uint32_t startspeed, int32_t accel, int32_t steps){
if(accel < 0){
stepper->dir_accel = 0;
} else {
stepper->dir_accel = 1;
}
stepper->accel_period = 3000000 / abs(accel); // should check for / by 0
stepper_speed(stepper, startspeed);
stepper_steps(stepper, steps);
TICKER_SYNC;
uint32_t now = TICKER;
stepper->last_accel = now;
stepper->last_step = now;
} }
void stepper_update(stepper_t *stepper){ void stepper_update(stepper_t *stepper){
...@@ -71,6 +54,7 @@ void stepper_update(stepper_t *stepper){ ...@@ -71,6 +54,7 @@ void stepper_update(stepper_t *stepper){
TICKER_SYNC; TICKER_SYNC;
uint32_t now = TICKER; uint32_t now = TICKER;
// check if it's time to accel // check if it's time to accel
/*
if(now - stepper->last_accel > stepper->accel_period){ if(now - stepper->last_accel > stepper->accel_period){
if(stepper->dir_accel){ if(stepper->dir_accel){
uint32_t newspeed = stepper->speed + 1; uint32_t newspeed = stepper->speed + 1;
...@@ -81,6 +65,7 @@ void stepper_update(stepper_t *stepper){ ...@@ -81,6 +65,7 @@ void stepper_update(stepper_t *stepper){
} }
stepper->last_accel = now; stepper->last_accel = now;
} }
*/
// check if it's time to step // 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); pin_toggle(stepper->step_pin);
......
...@@ -36,17 +36,10 @@ stepper_t stepper_new(pin_t *step_pin, pin_t *dir_pin); ...@@ -36,17 +36,10 @@ stepper_t stepper_new(pin_t *step_pin, pin_t *dir_pin);
void stepper_reset(stepper_t *stepper); void stepper_reset(stepper_t *stepper);
void stepper_steps(stepper_t *stepper, int32_t steps); void stepper_steps(stepper_t *stepper, int32_t steps, uint32_t speed);
void stepper_speed(stepper_t *stepper, uint32_t speed);
void stepper_segment(stepper_t *stepper, uint32_t startspeed, int32_t accel, int32_t steps);
void stepper_update(stepper_t *stepper); void stepper_update(stepper_t *stepper);
void stepper_current_position(stepper_t *steppper, float *position);
void stepper_current_speed(stepper_t *stepper, float *speed);
void stepper_currently(stepper_t *stepper, float *position, float *speed);
/* /*
step to-do step to-do
- everything is broken and untested - everything is broken and untested
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment