diff --git a/main/config.hpp b/main/config.hpp index aa7921a..fb1c0be 100644 --- a/main/config.hpp +++ b/main/config.hpp @@ -85,7 +85,7 @@ extern "C" { //----- stepper config ----- //-------------------------- //enable stepper test mode (dont start control and encoder task) -#define STEPPER_TEST +//#define STEPPER_TEST //pins #define STEPPER_STEP_PIN GPIO_NUM_18 //mos1 #define STEPPER_DIR_PIN GPIO_NUM_16 //ST3 diff --git a/main/guide-stepper.cpp b/main/guide-stepper.cpp index 43d9ffd..f077d3e 100644 --- a/main/guide-stepper.cpp +++ b/main/guide-stepper.cpp @@ -23,7 +23,7 @@ extern "C" #define STEPPER_TEST_TRAVEL 65 //mm #define MIN_MM 0 -#define MAX_MM 40 +#define MAX_MM 50 #define POS_MAX_STEPS MAX_MM * STEPPER_STEPS_PER_MM #define POS_MIN_STEPS MIN_MM * STEPPER_STEPS_PER_MM @@ -37,7 +37,7 @@ extern "C" //simulate encoder with reset button to test stepper ctl task //note STEPPER_TEST has to be defined as well -#define STEPPER_SIMULATE_ENCODER +//#define STEPPER_SIMULATE_ENCODER //---------------------- //----- variables ------ @@ -68,6 +68,7 @@ void travelSteps(int stepsTarget){ remaining = POS_MAX_STEPS - posNow; //calc remaining distance fom current position to limit if (stepsToGo > remaining){ //new distance will exceed limit stepper_setTargetPosSteps(POS_MAX_STEPS); //move to limit + //TODO wait for limit actually reached here? posNow = POS_MAX_STEPS; stepp_direction = false; //change current direction for next iteration stepsToGo = stepsToGo - remaining; //decrease target length by already traveled distance @@ -86,6 +87,7 @@ void travelSteps(int stepsTarget){ remaining = posNow - POS_MIN_STEPS; if (stepsToGo > remaining){ stepper_setTargetPosSteps(POS_MIN_STEPS); + //TODO wait for limit actually reached here? posNow = POS_MIN_STEPS; stepp_direction = true; stepsToGo = stepsToGo - remaining; @@ -110,21 +112,6 @@ void travelMm(int length){ } -//define zero/start position -//currently crashes into hardware limitation for certain time -//TODO: limit switch -void home() { - //TODO add function for this to stepper driver - ESP_LOGW(TAG, "auto-home..."); - //....step.setSpeedMm(100, 500, 10); - //....step.runInf(1); - vTaskDelay(1500 / portTICK_PERIOD_MS); - //....step.stop(); - //....step.resetAbsolute(); - ESP_LOGW(TAG, "auto-home finished"); -} - - //initialize/configure stepper instance void init_stepper() { //TODO unnecessary wrapper? @@ -233,7 +220,7 @@ void task_stepper_ctl(void *pvParameter) float potiModifier; init_stepper(); - home(); + stepper_home(MAX_MM); while(1){ #ifdef STEPPER_SIMULATE_ENCODER @@ -271,8 +258,8 @@ void task_stepper_ctl(void *pvParameter) } else { //TODO use encoder queue to only run this check at encoder event? - vTaskDelay(2); + vTaskDelay(5); } - vTaskDelay(10 / portTICK_PERIOD_MS); + vTaskDelay(5 / portTICK_PERIOD_MS); } } diff --git a/main/stepper.cpp b/main/stepper.cpp index 3f9232c..30fd750 100644 --- a/main/stepper.cpp +++ b/main/stepper.cpp @@ -131,6 +131,29 @@ void stepper_setTargetPosMm(uint32_t posMm){ +//====================== +//======== home ======== +//====================== +//define zero/start position +//run to limit and define zero/start position. +//Currently simply runs stepper for travelMm and bumps into hardware limit +void stepper_home(uint32_t travelMm){ + //TODO add timeout, limitswitch... + ESP_LOGW(TAG, "initiate auto-home..."); + posNow = travelMm * STEPPER_STEPS_PER_MM; + while (posNow != 0){ + //reactivate just in case stopped by other call to prevent deadlock + if (!timerIsRunning) { + stepper_setTargetPosSteps(0); + } + vTaskDelay(100 / portTICK_PERIOD_MS); + } + ESP_LOGW(TAG, "finished auto-home"); + return; +} + + + //======================== //===== init stepper ===== //======================== diff --git a/main/stepper.hpp b/main/stepper.hpp index 3c1947a..20317a6 100644 --- a/main/stepper.hpp +++ b/main/stepper.hpp @@ -2,12 +2,21 @@ //init stepper pins and timer void stepper_init(); + +//run to limit and define zero/start position. (busy until finished) +//Currently simply runs stepper for travelMm and bumps into hardware limit +void stepper_home(uint32_t travelMm = 60); + //set absolute target position in steps void stepper_setTargetPosSteps(uint64_t steps); + //set absolute target position in millimeters void stepper_setTargetPosMm(uint32_t posMm); + //set target speed in millimeters per second void stepper_setSpeed(uint32_t speedMmPerS); + + //task that periodically logs variables for debugging stepper driver void task_stepper_debug(void *pvParameter);