0% found this document useful (0 votes)
51 views4 pages

Stepper Acceleration

The document defines functions for controlling a stepper motor on a microcontroller. It initializes GPIO and timer peripherals, then enters a loop that calls the motorMoveTo function to move the motor forward and backward. The motorMoveTo function controls the direction pin, calculates steps needed, and uses a for loop to pulse the step pin at varying delays to accelerate, run at max speed, and decelerate the motor over the specified distance.

Uploaded by

Sourabh Kumawat
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
51 views4 pages

Stepper Acceleration

The document defines functions for controlling a stepper motor on a microcontroller. It initializes GPIO and timer peripherals, then enters a loop that calls the motorMoveTo function to move the motor forward and backward. The motorMoveTo function controls the direction pin, calculates steps needed, and uses a for loop to pulse the step pin at varying delays to accelerate, run at max speed, and decelerate the motor over the specified distance.

Uploaded by

Sourabh Kumawat
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 4

/* Includes ------------------------------------------------------------------*/

#include "main.h"

/* Private variables ---------------------------------------------------------*/


TIM_HandleTypeDef htim1;

/* Private function prototypes -----------------------------------------------*/


void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM1_Init(void);

/* USER CODE BEGIN 0 */


#define DIR_PIN GPIO_PIN_1
#define DIR_PORT GPIOA
#define STEP_PIN GPIO_PIN_2
#define STEP_PORT GPIOA
int stepDelay = 1000; // 1000us more delay means less speed

void microDelay (uint16_t delay)


{
__HAL_TIM_SET_COUNTER(&htim1, 0);
while (__HAL_TIM_GET_COUNTER(&htim1) < delay);
}
void motorMoveTo(double distance, int direction, int SMAX);
/* USER CODE END 0 */

int main(void)
{
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration--------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */


SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */


MX_GPIO_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start(&htim1);
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
motorMoveTo(50.50,1,3400);
HAL_Delay(1000);
motorMoveTo(50.50,0,3400);
HAL_Delay(1000);
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */


}
/* USER CODE END 3 */
}

/* USER CODE BEGIN 4 */

void motorMoveTo(double distance, int direction, int SMAX) //(distância, direção,


tempo da largura do pulso em microssegundos (metade do tempo em nível alto, metade
em nível baixo))
{
int ACC = 15;
long SMIN = 20000;
int SPM = 800;

// digitalWrite(DIR, direction);
if (direction == 0)
{
HAL_GPIO_WritePin(DIR_PORT, DIR_PIN, GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(DIR_PORT, DIR_PIN, GPIO_PIN_RESET);
}

long accSpeed = SMIN;


long steps = distance*SPM;
long stepsToStop;
int flag = 1;

for(long i = 0; i < steps; i++){

if(i < (steps)/2){

if(accSpeed>SMAX){

if(direction == 0 || direction == 1){


HAL_GPIO_WritePin(STEP_PORT, STEP_PIN, GPIO_PIN_SET);
microDelay(accSpeed/2);
HAL_GPIO_WritePin(STEP_PORT, STEP_PIN, GPIO_PIN_RESET);
microDelay(accSpeed/2);
}
else{
microDelay(accSpeed);
}
accSpeed = accSpeed - ACC;
}

else
{
if(flag==1){
stepsToStop = i;
flag = 0;
}

if(direction == 0 || direction == 1){


HAL_GPIO_WritePin(STEP_PORT, STEP_PIN, GPIO_PIN_SET);
microDelay(SMAX/2);
HAL_GPIO_WritePin(STEP_PORT, STEP_PIN, GPIO_PIN_RESET);
microDelay(SMAX/2);
}
else{
microDelay(SMAX);
}
}

}
else
{
if(i < steps-stepsToStop){

if(direction == 0 || direction == 1){


HAL_GPIO_WritePin(STEP_PORT, STEP_PIN, GPIO_PIN_SET);
microDelay(SMAX/2);
HAL_GPIO_WritePin(STEP_PORT, STEP_PIN, GPIO_PIN_RESET);
microDelay(SMAX/2);
}
else{
microDelay(SMAX);
}
}
else
{
if(direction == 0 || direction == 1){
HAL_GPIO_WritePin(STEP_PORT, STEP_PIN, GPIO_PIN_SET);
microDelay(accSpeed/2);
HAL_GPIO_WritePin(STEP_PORT, STEP_PIN, GPIO_PIN_RESET);
microDelay(accSpeed/2);
}
else{
microDelay(accSpeed);
}
accSpeed = accSpeed + ACC;
}

}
}
}
/* USER CODE END 4 */

You might also like