#ifndef INC_STEPPER_H_
#define INC_STEPPER_H_
#include "main.h"
#include "delay_us.h"
#define STEPS_PER_REVOLUTION 4096
#define DIR_CW 0 // 시계 방향
#define DIR_CCW 1 // 반시계 방향
#define IN1_GPIO_Port GPIOB
#define IN1_Pin GPIO_PIN_1
#define IN2_GPIO_Port GPIOB
#define IN2_Pin GPIO_PIN_15
#define IN3_GPIO_Port GPIOB
#define IN3_Pin GPIO_PIN_14
#define IN4_GPIO_Port GPIOB
#define IN4_Pin GPIO_PIN_13
void stepMotor(uint8_t step);
void rotateSteps(uint16_t steps, uint8_t direction);
void rotateDegrees(uint16_t degrees, uint8_t direction);
#endif /* INC_STEPPER_H_ */
// stepper.c
#include "stepper.h"
// Stepper 회전을 위한 Half Step 방식 배열
static const uint8_t HALF_STEP_SEQ[8][4] = {
{1, 0, 0, 0},
{1, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 1, 1},
{0, 0, 0, 1},
{1, 0, 0, 1}
};
// Stepper 입력
void stepMotor(uint8_t step) {
HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, HALF_STEP_SEQ[step][0]);
HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, HALF_STEP_SEQ[step][1]);
HAL_GPIO_WritePin(IN3_GPIO_Port, IN3_Pin, HALF_STEP_SEQ[step][2]);
HAL_GPIO_WritePin(IN4_GPIO_Port, IN4_Pin, HALF_STEP_SEQ[step][3]);
}
// Stepper Step 단위 이동 함수
void rotateSteps(uint16_t steps, uint8_t direction) {
for (uint16_t i = 0; i < steps; i++) {
uint8_t step;
if (direction == DIR_CW) {
step = i % 8; // 시계 방향
}
else {
step = 7 - (i % 8); // 반시계방향
}
stepMotor(step);
delay_us(1000);
}
}
// Stepper 각도 단위 이동 함수
void rotateDegrees(uint16_t degrees, uint8_t direction) {
// 각도에 해당하는 Step 수 계산
uint16_t steps = (uint16_t)((uint32_t)(degrees * STEPS_PER_REVOLUTION / 360));
rotateSteps(steps, direction);
}