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.
 
 ![fabbed](https://gitlab.cba.mit.edu/jakeread/mkstepper/raw/master/images/routed.png)
\ 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