From fab9f4436045f2fb1a7cda56efd57c7d4aac4074 Mon Sep 17 00:00:00 2001 From: Jake <jake.read@cba.mit.edu> Date: Sat, 17 Feb 2018 20:27:56 -0500 Subject: [PATCH] absolute barebones stepper wraps, ready to do network things --- README.md | 2 +- embedded/README.md | 1 + .../.vs/mkstepper-v011/v14/.atsuo | Bin 78336 -> 84480 bytes .../mkstepper-v011/Debug/Makefile | 7 ++ .../mkstepper-v011/Debug/makedep.mk | 2 + .../mkstepper-v011/mkstepper-v011/hardware.h | 11 +++ embedded/mkstepper-v011/mkstepper-v011/main.c | 64 +++++++-------- .../mkstepper-v011/mkstepper-v011.cproj | 6 ++ .../mkstepper-v011/mkstepper-v011/stepper.c | 73 ++++++++++++++++++ .../mkstepper-v011/mkstepper-v011/stepper.h | 48 ++++++++++++ 10 files changed, 181 insertions(+), 33 deletions(-) create mode 100644 embedded/mkstepper-v011/mkstepper-v011/stepper.c create mode 100644 embedded/mkstepper-v011/mkstepper-v011/stepper.h diff --git a/README.md b/README.md index 8f19ef4..be0ab31 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,6 @@ A-la [Mechaduino](http://tropical-labs.com/index.php/mechaduino) and many other # Currently -Working through firmware setup (and requisite firmware tools / libs for ATSAMD51, will be used on BLDC, etc). Nearly there! +Ready for MKXMods network integration.  \ No newline at end of file diff --git a/embedded/README.md b/embedded/README.md index 5ed8e37..b677671 100644 --- a/embedded/README.md +++ b/embedded/README.md @@ -525,3 +525,4 @@ void SysTick_Handler(void){ } ``` +OK, this is done now - both timers, and a step to position @ speed command. Next is networks for this board. \ No newline at end of file diff --git a/embedded/mkstepper-v011/.vs/mkstepper-v011/v14/.atsuo b/embedded/mkstepper-v011/.vs/mkstepper-v011/v14/.atsuo index 942319214ae661d3644c079192eaa8ffdf913868..67498951a442b8830a5ba5052d5010e5d141e173 100644 GIT binary patch delta 4138 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 delta 2683 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 diff --git a/embedded/mkstepper-v011/mkstepper-v011/Debug/Makefile b/embedded/mkstepper-v011/mkstepper-v011/Debug/Makefile index bf46e90..c1f9222 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/Debug/Makefile +++ b/embedded/mkstepper-v011/mkstepper-v011/Debug/Makefile @@ -44,6 +44,7 @@ C_SRCS += \ ../pin.c \ ../ringbuffer.c \ ../spiport.c \ +../stepper.c \ ../tmc26.c \ ../uartport.c @@ -61,6 +62,7 @@ main.o \ pin.o \ ringbuffer.o \ spiport.o \ +stepper.o \ tmc26.o \ uartport.o @@ -71,6 +73,7 @@ main.o \ pin.o \ ringbuffer.o \ spiport.o \ +stepper.o \ tmc26.o \ uartport.o @@ -81,6 +84,7 @@ main.d \ pin.d \ ringbuffer.d \ spiport.d \ +stepper.d \ tmc26.d \ uartport.d @@ -91,6 +95,7 @@ main.d \ pin.d \ ringbuffer.d \ spiport.d \ +stepper.d \ tmc26.d \ uartport.d @@ -127,6 +132,8 @@ LINKER_SCRIPT_DEP+= \ + + Device_Startup/%.o: ../Device_Startup/%.c @echo Building file: $< @echo Invoking: ARM/GNU C Compiler : 6.3.1 diff --git a/embedded/mkstepper-v011/mkstepper-v011/Debug/makedep.mk b/embedded/mkstepper-v011/mkstepper-v011/Debug/makedep.mk index 4599793..7dc1a30 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/Debug/makedep.mk +++ b/embedded/mkstepper-v011/mkstepper-v011/Debug/makedep.mk @@ -14,6 +14,8 @@ ringbuffer.c spiport.c +stepper.c + tmc26.c uartport.c diff --git a/embedded/mkstepper-v011/mkstepper-v011/hardware.h b/embedded/mkstepper-v011/mkstepper-v011/hardware.h index 6db8c08..5498bc4 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/hardware.h +++ b/embedded/mkstepper-v011/mkstepper-v011/hardware.h @@ -14,6 +14,7 @@ #include "spiport.h" #include "ringbuffer.h" #include "tmc26.h" +#include "stepper.h" pin_t stlr; pin_t stlb; @@ -37,4 +38,14 @@ tmc26_t tmc; uint32_t overflows; +uint32_t blindcounter; + +#define STEPTICKER_SYNC (TC2->COUNT32.CTRLBSET.reg = TCC_CTRLBSET_CMD_READSYNC) +#define STEPTICKER (TC2->COUNT32.COUNT.reg) + +#define TICKER_SYNC (TC0->COUNT32.CTRLBSET.reg = TCC_CTRLBSET_CMD_READSYNC) +#define TICKER (TC0->COUNT32.COUNT.reg) + +stepper_t stepper; + #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 3f20bb1..c605457 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/main.c +++ b/embedded/mkstepper-v011/mkstepper-v011/main.c @@ -106,9 +106,6 @@ void ticker_init(void){ overflows = 0; } -#define TICKER_SYNC (TC0->COUNT32.CTRLBSET.reg = TCC_CTRLBSET_CMD_READSYNC) -#define TICKER (TC0->COUNT32.COUNT.reg) - void stepticker_init(void){ // Timers: in 32 bit mode we pair two - obscure datasheet reading later, they pair in a predefined way: 0 with 1... // a word of warning: with the same code, a 16-bit timer was not working. I am mystified. @@ -123,8 +120,8 @@ void stepticker_init(void){ GCLK->PCHCTRL[TC2_GCLK_ID].reg = GCLK_PCHCTRL_CHEN | GCLK_PCHCTRL_GEN(11); GCLK->PCHCTRL[TC3_GCLK_ID].reg = GCLK_PCHCTRL_CHEN | GCLK_PCHCTRL_GEN(11); // turn on in mode, presync - TC2->COUNT32.CTRLA.reg = TC_CTRLA_MODE_COUNT32 | TC_CTRLA_PRESCSYNC_PRESC | TC_CTRLA_PRESCALER_DIV64 | TC_CTRLA_CAPTEN0;// | TC_CTRLA_CAPTEN1; - TC3->COUNT32.CTRLA.reg = TC_CTRLA_MODE_COUNT32 | TC_CTRLA_PRESCSYNC_PRESC | TC_CTRLA_PRESCALER_DIV64 | TC_CTRLA_CAPTEN0;// | TC_CTRLA_CAPTEN1; + TC2->COUNT32.CTRLA.reg = TC_CTRLA_MODE_COUNT32 | TC_CTRLA_PRESCSYNC_PRESC | TC_CTRLA_PRESCALER_DIV16 | TC_CTRLA_CAPTEN0;// | TC_CTRLA_CAPTEN1; + TC3->COUNT32.CTRLA.reg = TC_CTRLA_MODE_COUNT32 | TC_CTRLA_PRESCSYNC_PRESC | TC_CTRLA_PRESCALER_DIV16 | TC_CTRLA_CAPTEN0;// | TC_CTRLA_CAPTEN1; // do frequency match TC2->COUNT32.WAVE.reg = TC_WAVE_WAVEGEN_MFRQ; TC3->COUNT32.WAVE.reg = TC_WAVE_WAVEGEN_MFRQ; @@ -133,7 +130,7 @@ void stepticker_init(void){ TC2->COUNT32.INTENSET.bit.MC1 = 1; // don't know why, but had to turn this on to get the interrupts // set period while(TC2->COUNT32.SYNCBUSY.bit.CC0); - TC2->COUNT32.CC[0].reg = 11; + TC2->COUNT32.CC[0].reg = 10; // enable, sync for enable write TC2->COUNT32.CTRLA.bit.ENABLE = 1; while(TC2->COUNT32.SYNCBUSY.bit.ENABLE); @@ -141,9 +138,6 @@ void stepticker_init(void){ while(TC3->COUNT32.SYNCBUSY.bit.ENABLE); } -#define STEPTICKER_SYNC (TC2->COUNT32.CTRLBSET.reg = TCC_CTRLBSET_CMD_READSYNC) -#define STEPTICKER (TC2->COUNT32.COUNT.reg) - int main(void) { /* Initialize the SAM system */ @@ -221,18 +215,27 @@ int main(void) dir_pin = pin_new(&PORT->Group[1], 9); pin_output(&step_pin); pin_output(&dir_pin); - + + stepper = stepper_new(&step_pin, &dir_pin, 360.0, 64); + + stepper_goto(&stepper, 1800, 180); // should do 5 turns in 10 seconds + while (1) { - // still doin it - //tmc26_update(&tmc); - // delay - for(int i=0; i < 126; i++){ - pin_toggle(&stlr); - //pin_toggle(&en_pin); - } - // step - pin_toggle(&step_pin); + /* + next steps (haha) + - poll uart receive line, look for network packets + - on finding position / time period packets, parse, put into buffer of step moves + - roll through buffer of step moves, do them + + further reading: + - quadratic interpolation for position @ time w/ velocity @ endpoint step commands + + minors: + - inverting direction + - get up to 120MHz for very happy stepping + - bring baud rate to 1M, at least! what the heck, FTDI! + */ } } @@ -246,17 +249,15 @@ void SysTick_Handler(void){ uart_sendchar_buffered(&up1, rb_get(up1.rbrx)); } */ - STEPTICKER_SYNC; - uint32_t thecount = STEPTICKER; - uint8_t onemicro = thecount; - uint8_t twomicro = thecount >> 8; - uint8_t threemicro = thecount >> 16; - uint8_t fourmicro = thecount >> 24; - uart_sendchar_buffered(&up1, onemicro); - uart_sendchar_buffered(&up1, twomicro); - uart_sendchar_buffered(&up1, threemicro); - uart_sendchar_buffered(&up1, fourmicro); - uart_sendchar_buffered(&up1, overflows); + int32_t watch = stepper.position_ticks; + uint8_t w1 = watch >> 24; + uint8_t w2 = watch >> 16; + uint8_t w3 = watch >> 8; + uint8_t w4 = watch; + uart_sendchar_buffered(&up1, w1); + uart_sendchar_buffered(&up1, w2); + uart_sendchar_buffered(&up1, w3); + uart_sendchar_buffered(&up1, w4); } void SERCOM4_0_Handler(void){ @@ -283,6 +284,5 @@ void TC0_Handler(void){ // fires rarely, for counting overflows of time-ticker void TC2_Handler(void){ // fires every 16us, for step checking TC2->COUNT32.INTFLAG.bit.MC0 = 1; TC2->COUNT32.INTFLAG.bit.MC1 = 1; - overflows ++; - pin_toggle(&en_pin); + stepper_update(&stepper); } \ No newline at end of file diff --git a/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj b/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj index f691b7f..87125a9 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj +++ b/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj @@ -190,6 +190,12 @@ <Compile Include="spiport.h"> <SubType>compile</SubType> </Compile> + <Compile Include="stepper.c"> + <SubType>compile</SubType> + </Compile> + <Compile Include="stepper.h"> + <SubType>compile</SubType> + </Compile> <Compile Include="tmc26.c"> <SubType>compile</SubType> </Compile> diff --git a/embedded/mkstepper-v011/mkstepper-v011/stepper.c b/embedded/mkstepper-v011/mkstepper-v011/stepper.c new file mode 100644 index 0000000..df2466e --- /dev/null +++ b/embedded/mkstepper-v011/mkstepper-v011/stepper.c @@ -0,0 +1,73 @@ +/* + * stepper.c + * + * Created: 2/17/2018 5:39:34 PM + * Author: Jake + */ + +#include "stepper.h" +#include "hardware.h" + +stepper_t stepper_new(pin_t *step_pin, pin_t *dir_pin, float position_per_200_steps, uint32_t microsteps){ + stepper_t stepper; + + stepper.step_pin = step_pin; + stepper.dir_pin = dir_pin; + + stepper.position_per_200_steps = position_per_200_steps; + stepper.microsteps = microsteps; + + stepper.speed_period = 0; + stepper.position_ticks = 0; + stepper.position = 0; + stepper.speed = 0; + + stepper.position_ticks_target = 0; + + return stepper; +} + +void stepper_reset(stepper_t *stepper){ + stepper->speed_period = 0; + stepper->position_ticks = 0; + stepper->position = 0; + stepper->speed = 0; + + stepper->position_ticks_target = 0; +} + +// position and speed by position_per_100_steps +// speed is position units / s +void stepper_goto(stepper_t *stepper, float position, float speed){ + // in steps / second + uint32_t discrete_speed = (speed / (stepper->position_per_200_steps / 200)) * stepper->microsteps; + // in 3rds of microseconds (a result of timer settings) + stepper->speed_period = 3000000 / discrete_speed; + // in steps pulses + stepper->position_ticks_target = (position / (stepper->position_per_200_steps / 200)) * stepper->microsteps;; + + TICKER_SYNC; + stepper->last_time = TICKER; +} + +void stepper_update(stepper_t *stepper){ + if(stepper->position_ticks_target != stepper->position_ticks){ // still have somewhere to go + TICKER_SYNC; + uint32_t now = TICKER; + if(now - stepper->last_time > stepper->speed_period){ + int32_t gap = stepper->position_ticks_target - stepper->position_ticks; + if(gap < 0){ + pin_set(stepper->dir_pin); // step forwards + pin_toggle(stepper->step_pin); + stepper->position_ticks --; + } else if (gap > 0) { + pin_clear(stepper->dir_pin); + pin_toggle(stepper->step_pin); + stepper->position_ticks ++; + } else { + // nah + } + stepper->last_time = now; + } // end step cycle + } +} \ No newline at end of file diff --git a/embedded/mkstepper-v011/mkstepper-v011/stepper.h b/embedded/mkstepper-v011/mkstepper-v011/stepper.h new file mode 100644 index 0000000..63f31c2 --- /dev/null +++ b/embedded/mkstepper-v011/mkstepper-v011/stepper.h @@ -0,0 +1,48 @@ +/* + * stepper.h + * + * Created: 2/17/2018 5:39:45 PM + * Author: Jake + */ + + +#ifndef STEPPER_H_ +#define STEPPER_H_ + +#include "sam.h" +#include "pin.h" + +typedef struct { + pin_t *step_pin; + pin_t *dir_pin; + + // currently + uint32_t speed_period; + int32_t position_ticks; + + // updating + uint32_t last_time; + + // float conversions + float position_per_200_steps; // units (mm or deg, probably) moved per full rotation + uint32_t microsteps; + float position; + float speed; + + // targets + int32_t position_ticks_target; +}stepper_t; + +stepper_t stepper_new(pin_t *step_pin, pin_t *dir_pin, float position_per_200_steps, uint32_t microsteps); + +void stepper_reset(stepper_t *stepper); + +void stepper_goto(stepper_t *stepper, float position, float 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); + +#endif /* STEPPER_H_ */ \ No newline at end of file -- GitLab