STM32F1

STM32F1, STMCubeMx, Timer, Stepper Motor

CoyoteUgly 2018. 9. 29. 18:30

STM32F1, STMCubeMx, Timer, Stepper Motor



Timer를 이용하였으며 

360도 단위로 정방향 회전과 반대방향 회전을 반복합니다.


0. 참고 자료


1. 모듈

  • [SD02C] Stepper Driver 2 Ampere
  • 스테핑모터 A3K-M244 / 42각 유니폴라방식 2상 스테핑모터
  • DC 12V-2A

  • Motor 6선과 전원 연결 부분입니다.


  • Stepping 설정 핀과 UART 연결 핀입니다.


  • 1/1, 1/2, 1/4, 1/8 MicroStep를 지원


  • A3K-M244를 구입하면 사진처럼 구성되어 있습니다.


  • 시중에 있는 DC 12V-2A 어댑터를 구입한 다음 전원잭을 제거하여 사용하였습니다.


2. HW 구성


A 3라인을 X 3라인과 연결하고

B 3라인을 Y 3라인과 연결합니다.


그리고 A-Y, B-X로 교차 연결합니다.


모터 연결선                      Stepper Motor Driver


갈색 (A)                                         Y     

흑색 (COM A)                                 NC

주황색 (A')                                     X'


적색 (B)                                         X     

흰색 (COM B)                                 NC

노란색 (B')                                     Y'


3. RCC > HSE > Crystal/Ceramic Resonator


4. TIM1 > Clock Source > Internal Clock 


5. Motor pin 설정

  • S_MOTOR(PULSE) : PA6
  • EN : PC4
  • DIR : PB0


6. LED


7. Clock Configuration > 72MHz


8. TIM1 Configuration

  • Prescaler 36000-1
  • Counter Period : 10


9. Pin Configuration

  • User Label

10. SW 구성

  • 5ms pulse timer
  • 1.8도 단위로 정방향으로 360도 회전, 반대방향으로 360도 회전

volatile unsigned int sMotorCnt = 0;

volatile bool sMotorStop = false;


/*

360 / 1.8' = 200

360 / 0.9' = 400 (if motor driver assist 1/2 mocrostep)

*/

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

if (htim->Instance == TIM1)

{

sMotorCnt++;

if (sMotorCnt < 400) // 400 = 360' rotate

{

S_MOTOR_CTRL(GPIO_TOGGLE);

}

else

{

HAL_TIM_Base_Stop_IT(&htim1);

S_MOTOR_CTRL(GPIO_LOW);

//EN_CTRL(GPIO_LOW); // motor holding or not

sMotorStop = true;

}

}

}


int main(void)

{

/*

1) 72MHz System Clock, Prescaler 1MHz Timer Clock

Prescaler = 72MHz / 36000 - 1 = 2KHz - 1 = 0.5ms

2) 2KHz Timer Clock, 

Period = 10 => 5ms

*/


  while (1)

  {

S_MOTOR_CTRL(GPIO_LOW);

DIR_CTRL(GPIO_HIGH);

EN_CTRL(GPIO_HIGH);

sMotorCnt = 0;

sMotorStop = false;

HAL_TIM_Base_Start_IT(&htim1);

while(!sMotorStop) HAL_Delay(1);


HAL_Delay(1000);


S_MOTOR_CTRL(GPIO_LOW);

DIR_CTRL(GPIO_LOW);

EN_CTRL(GPIO_HIGH);

sMotorCnt = 0;

sMotorStop = false;

HAL_TIM_Base_Start_IT(&htim1);

while(!sMotorStop) HAL_Delay(1);


HAL_Delay(1000);

  }

}



11. 소스


12. 결과