CHIP KIDD

[ARM] 엘레베이터 프로젝트- Step Motor 회전속도 및 방향 제어 본문

전기전자/ARM

[ARM] 엘레베이터 프로젝트- Step Motor 회전속도 및 방향 제어

쑨야미 2021. 3. 16. 09:35

STM32F411RE :  ARM 코어중 Cortex M4를 사용하였습니다. 

현장에서는 Cortex M3(STM32F103계열)를 많이 사용함 : 가성비가 좋다. 싸고 고성능. 사용하는 사람이 많다(자료많음).

M4와 M3의 차이점은 FPU유무이다.  M4는 FPU를 제공하기 때문에, 곱셈, 나눗셈, 소수점 연산이 더 빠르게 해준다. 

 

컴파일러 Tool 로써 STM 사에서 제공하는 IDE Cube를 이용하여 컴파일 합니다. ( 많이 사용하는 tool로 Keil, IAR이 있습니다.)

 

*CubeMX는 초기화 코드를 생성하는 tool입니다.

 

이번 실습에서 제가 구현하고자 하는 것은 Step 모터와 버튼을 이용하여 스텝모터의 회전속도와 방향을 제어하고자 합니다.  

버튼 1번 : On / Off

버튼 2번 : 방향 변경

버튼 3번 : 회전 속도 UP

버튼 4번 : 회전 속도 Down

 

또한 회전속도는 ,Polling 방식이 아닌 Interrupt를 이용하여 제어하였습니다. 

사실, 메인함수에는 간단하게 구동 함수만 놓고, 모듈별로 폴더를 따로빼어 (전체를 제어하는 컨트롤러 폴더) 코딩하는게 적절하나, 이번에는 첫 시간이기도 하고, 제어할게 별로없기 때문에 메인함수에 전부를 넣었습니다. 

 

1. Step Motor 구현 코드

스텝모터는 자석에 전류를 넣어주는 (여자)방향에 의해 회전이 동작합니다. 

2. Interrupt 코드

enum{S_STEP_MOTOR_IDLE, S_STEP_MOTOR_CW, S_STEP_MOTOR_CCW};


uint8_t stepMotorState;
uint8_t stepMotorDirection;

void setstepMotorState(uint8_t state)
{
	stepMotorState = state;
}
uint8_t getstepMotorState()
{
	return stepMotorState;
}

__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim -> Instance == TIM3){
		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
		stepMotorRun(stepMotorDirection);
	}
}



/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
	setstepMotorState(S_STEP_MOTOR_IDLE);
  /* 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_TIM3_Init();
  /* USER CODE BEGIN 2 */
	//uint8_t stepMotorState = S_STEP_MOTOR_IDLE;

	StepMotorInit(&htim3);
	//HAL_TIM_Base_Start_IT(&htim3);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	while (1)
	{
		static uint16_t speed = 100;
		StepMotorSpeed(speed);

		switch (stepMotorState)
		{
		case S_STEP_MOTOR_IDLE:
			HAL_TIM_Base_Stop_IT(&htim3);

			if(getButtonState(&btnStart)) setstepMotorState(S_STEP_MOTOR_CW);

			break;

		case S_STEP_MOTOR_CW:
			stepMotorDirection = STEP_MOTOR_DIR_CW;
			HAL_TIM_Base_Start_IT(&htim3);

			if(getButtonState(&btnStart)) setstepMotorState(S_STEP_MOTOR_IDLE);
			else if(getButtonState(&btnDir)) setstepMotorState(S_STEP_MOTOR_CCW);
			else if(getButtonState(&btnUp))
			{
				speed = speed - 30;
				if(speed<40) speed = 600;
				StepMotorSpeed(speed);
			}
			else if(getButtonState(&btnDown))
			{
				speed = speed + 30;
				if((speed < 1) || (speed > 570)) speed = 40;
				StepMotorSpeed(speed);
			}

			break;

		case S_STEP_MOTOR_CCW:
			stepMotorDirection = STEP_MOTOR_DIR_CCW;
			HAL_TIM_Base_Start_IT(&htim3);

			if(getButtonState(&btnStart)) setstepMotorState(S_STEP_MOTOR_IDLE);
			else if(getButtonState(&btnDir)) setstepMotorState(S_STEP_MOTOR_CW);
			else if(getButtonState(&btnUp))
			{
				speed = speed - 30;
				if(speed<40) speed = 600;
				StepMotorSpeed(speed);
			}
			else if(getButtonState(&btnDown))
			{
				speed = speed + 30;
				if((speed < 1) || (speed > 570)) speed = 40;
				StepMotorSpeed(speed);
			}

			break;


		}
		// stepMotorRun(STEP_MOTOR_DIR_CW);
		//HAL_Delay(7);


    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	}
  /* USER CODE END 3 */
}

ledBlink2.zip
5.37MB