diff --git a/circuit/mkstepper/eagle.epf b/circuit/mkstepper/eagle.epf index 8fea37c60d10de81aa0e519538c6f50532f05d60..8e793532199848b0232e688e2402b18609c28f73 100644 --- a/circuit/mkstepper/eagle.epf +++ b/circuit/mkstepper/eagle.epf @@ -40,7 +40,7 @@ UsedLibrary="C:/EAGLE 8.3.2/lbr/ltspice/sym.lbr" Type="Schematic Editor" Number=1 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" 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" @@ -79,14 +79,14 @@ ArcDirection=0 AddLevel=2 PadsSameType=0 Layer=91 -Views=" 1: -21.652 1.07368 203.78 218.518" +Views=" 1: 134.406 87.3199 359.838 304.764" Sheet="1" [Win_2] Type="Board Editor" Number=2 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" 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" @@ -131,7 +131,7 @@ Type="Control Panel" Number=0 [Desktop] -Screen="6000 2160" +Screen="3840 1080" Window="Win_1" Window="Win_2" Window="Win_3" diff --git a/embedded/mkstepper-v011-incl-all.zip b/embedded/mkstepper-v011-incl-all.zip new file mode 100644 index 0000000000000000000000000000000000000000..f2a423103e7e4317d9ec06af23d8351cb9b8b2f9 Binary files /dev/null and b/embedded/mkstepper-v011-incl-all.zip differ diff --git a/embedded/mkstepper-v011/mkstepper-v011/apahandler.c b/embedded/mkstepper-v011/mkstepper-v011/apahandler.c index a0ecb21e48373a41e8b7514132cdb5f32438d8b2..34ea0356a7d8ef9f13b6bac61cfef0d072ae00cc 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/apahandler.c +++ b/embedded/mkstepper-v011/mkstepper-v011/apahandler.c @@ -35,39 +35,24 @@ void apa_handle_packet(uint8_t *packet, uint8_t length){ i ++; break; - case DELIM_KEY_POSITION_STEPS: - // should set 0 accel - if(i + 4 > length){ - i ++; // avoid hangup + case DELIM_KEY_STEPS: + // take steps (int32_t) and speed (uint32_t) and dir (uint8_t) to step + if(i + 8 > length){ + i ++; // avoid hangup, but give up on this } else { int32_t steps = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb - stepper_steps(&stepper, steps); - i += 5; // 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) + uint32_t speed = (packet[i+5] << 24) | (packet[i+6] << 16) | (packet[i+7] << 8) | packet[i+8]; + stepper_steps(&stepper, steps, speed); + i += 9; // bring packet ptr to next key (should) } break; - case DELIM_KEY_SEGMENT: + case DELIM_KEY_BLOCK: if(i + 12 > length){ // confirm: not i + 12 >= ? i ++; // avoid hangup } else { // in steps / s - uint32_t startspeed = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; - // 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); + //stepper_segment(&stepper, startspeed, accel, steps); i += 13; // ? not 12 ? } break; diff --git a/embedded/mkstepper-v011/mkstepper-v011/apahandler.h b/embedded/mkstepper-v011/mkstepper-v011/apahandler.h index 2b3da4c5b0e3e9d329a39013c4e696996f0d56f9..32c7104a4ef2549c51740733681ddcd109d16e5b 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/apahandler.h +++ b/embedded/mkstepper-v011/mkstepper-v011/apahandler.h @@ -14,10 +14,9 @@ #define APA_HANDLER_OUTSIDE 0 #define APA_HANDLER_INSIDE 1 -#define DELIM_KEY_TEST 128 // toggles a light, to test network -#define DELIM_KEY_POSITION_STEPS 129 // is 32 bit int -#define DELIM_KEY_SPEED_STEPS 130 // is 32 bit int -#define DELIM_KEY_SEGMENT 131 +#define DELIM_KEY_TEST 127 // toggles a light, to test network +#define DELIM_KEY_STEPS 128 // steps (steps) uint32_t, speed (steps/s) uint32_t, dir uint8_t +#define DELIM_KEY_BLOCK 129 // is 32 bit int void apa_handle_packet(uint8_t *packet, uint8_t length); void apa_return_packet(uint8_t *packet, uint8_t length); diff --git a/embedded/mkstepper-v011/mkstepper-v011/hardware.h b/embedded/mkstepper-v011/mkstepper-v011/hardware.h index d78aa628b6968844a5e650885254de729cd6fc75..b53743569eb4c1ee6fe8f2e50a3a9f3060c68ae5 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/hardware.h +++ b/embedded/mkstepper-v011/mkstepper-v011/hardware.h @@ -24,13 +24,9 @@ pin_t stlb; // PORTS -pin_t up0_stlr; -pin_t up0_stlb; pin_t up1_stlr; pin_t up1_stlb; -ringbuffer_t up0_rbrx; -ringbuffer_t up0_rbtx; ringbuffer_t up1_rbrx; ringbuffer_t up1_rbtx; @@ -45,17 +41,6 @@ uartport_t *ups[NUM_UPS]; apaport_t apap0; 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 uint32_t overflows; @@ -68,8 +53,23 @@ uint32_t blindcounter; #define TICKER_SYNC (TC0->COUNT32.CTRLBSET.reg = TCC_CTRLBSET_CMD_READSYNC) #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_t stepper; +// DEBUG + +pin_t tickuptx; + #endif /* HARDWARE_H_ */ \ No newline at end of file diff --git a/embedded/mkstepper-v011/mkstepper-v011/main.c b/embedded/mkstepper-v011/mkstepper-v011/main.c index 9edbe8f66d74e6100ac867da6b64a09475ccb137..6bb6548f30aa11b88dc11e834eff91b328ca15dd 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/main.c +++ b/embedded/mkstepper-v011/mkstepper-v011/main.c @@ -173,50 +173,26 @@ int main(void) // ready interrupt system __enable_irq(); - NVIC_EnableIRQ(SERCOM4_0_IRQn); //up0tx - NVIC_EnableIRQ(SERCOM4_2_IRQn); //up0rx NVIC_EnableIRQ(SERCOM5_0_IRQn); NVIC_EnableIRQ(SERCOM5_2_IRQn); NVIC_EnableIRQ(TC0_IRQn); NVIC_EnableIRQ(TC2_IRQn); // ringbuffers (for uart ports) - rb_init(&up0_rbrx); - rb_init(&up0_rbtx); rb_init(&up1_rbrx); 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) // there's some chance we should really be using one gclk channel for all of the peripherals // 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); MCLK->APBDMASK.reg |= MCLK_APBDMASK_SERCOM5; uart_init(&up1, 7, SERCOM5_GCLK_ID_CORE, 62675); - ups[0] = &up0; + ups[0] = NULL; 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); pin_output(&up1_stlr); pin_set(&up1_stlr); @@ -224,8 +200,6 @@ int main(void) pin_output(&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_reset(&apap1); @@ -270,51 +244,28 @@ int main(void) stepper = stepper_new(&step_pin, &dir_pin); stepper_reset(&stepper); + + tickuptx = pin_new(&PORT->Group[0], 13); + pin_output(&tickuptx); - uint8_t lpcnt = 0; - uint8_t stpcnt = 0; - while (1) { - apaport_scan(&apap0, 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) -- do steps, steps/s speed checking, and direction -- unit test all commands on all ports using mkterminal - -- this quickly so that you can mods compose - -further reading: -- quadratic interpolation for position @ time w/ velocity @ endpoint step commands +- speed and timing: what the heck +- reduce error accumulation in stepper: track proper last time +- segment command +- steps @ speed command -minors: -- bring baud rate to 1M, at least! what the heck, FTDI! */ void SysTick_Handler(void){ // slow ticker pin_toggle(&stlb); - //pin_toggle(&stlr); //uart_sendchar_buffered(&up0, 120); @@ -351,8 +302,9 @@ void TC0_Handler(void){ // fires rarely, for counting overflows of time-ticker 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.MC1 = 1; + pin_toggle(&tickuptx); stepper_update(&stepper); } \ No newline at end of file diff --git a/embedded/mkstepper-v011/mkstepper-v011/stepper.c b/embedded/mkstepper-v011/mkstepper-v011/stepper.c index 8b2034d5d26120f54b66c38667da3d76b0605bfb..a9b8976db8cf683216153cec42fb335e1ca74b26 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/stepper.c +++ b/embedded/mkstepper-v011/mkstepper-v011/stepper.c @@ -29,41 +29,24 @@ void stepper_reset(stepper_t *stepper){ stepper->dir_steps = 1; } -void stepper_steps(stepper_t *stepper, int32_t position){ - stepper->position_ticks_target = abs(position); +void stepper_steps(stepper_t *stepper, int32_t steps, uint32_t speed){ + // set new position information + stepper->position_ticks_target = abs(steps); stepper->position_ticks = 0; - if(position < 0){ + + // set direction + if(steps < 0){ stepper->dir_steps = 0; pin_clear(stepper->dir_pin); } else { stepper->dir_steps = 1; pin_set(stepper->dir_pin); } -} - -void stepper_speed(stepper_t *stepper, uint32_t speed){ - // 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); + + // set speed period + (speed < 1) ? speed = 1 : (0); // avoid 0 division, 1 step / s seems like reasonable lower bound step rate stepper->speed = speed; - // timing not accurate to real-world yet - // 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; + stepper->speed_period = 2683000 / speed; } void stepper_update(stepper_t *stepper){ @@ -71,6 +54,7 @@ void stepper_update(stepper_t *stepper){ TICKER_SYNC; uint32_t now = TICKER; // check if it's time to accel + /* if(now - stepper->last_accel > stepper->accel_period){ if(stepper->dir_accel){ uint32_t newspeed = stepper->speed + 1; @@ -81,6 +65,7 @@ void stepper_update(stepper_t *stepper){ } stepper->last_accel = now; } + */ // check if it's time to step if(now - stepper->last_step > stepper->speed_period){ pin_toggle(stepper->step_pin); diff --git a/embedded/mkstepper-v011/mkstepper-v011/stepper.h b/embedded/mkstepper-v011/mkstepper-v011/stepper.h index e7811a1cd462e51f5b2a5e82dd626042434f7320..ea55413247a516f588318ca375262d30e6995b20 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/stepper.h +++ b/embedded/mkstepper-v011/mkstepper-v011/stepper.h @@ -36,17 +36,10 @@ stepper_t stepper_new(pin_t *step_pin, pin_t *dir_pin); void stepper_reset(stepper_t *stepper); -void stepper_steps(stepper_t *stepper, int32_t steps); -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_steps(stepper_t *stepper, int32_t steps, uint32_t speed); 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 - everything is broken and untested