본문 바로가기
정나우/기타

BLDC모터 작동시켜 보기 (STM32, B59E)

by 정_나우 2023. 2. 15.

모터 제어 공부를 하기 시작하니 돌려볼 게 굉장히 많네요..

 

이번에는 BLDC모터를 작동시켜 보겠습니다.

 

BLDC모터는 브러쉬가 없는 모터로 DC모터에 비해 수명이 길다는 장점이 있습니다.

 

그리고 전원으로 들어가는 선이 3개인데

 

세 곳의 전자석으로 들어가는 전류의 방향을 바꿔가면서

중간의 영구자석을 회전시키는 방식입니다.

 

하지만 큰 틀에서 모터 드라이버에 전류를 공급해 돌린다는 것을 바뀌지 않습니다.

 

이제 모터를 돌려보겠습니다.


이번에 사용한 BLDC 모터는 누리로봇의 B59E입니다.

 

STORE :: 누리로봇 NURI ROBOT

반품배송비 : 초기배송비 2,500원 + 반품택배비 2,500원 총 5,000원 교환배송비 : 누리로봇으로 보내는 택배비 2,500원 + 고객님께 보내는 택배비 2,500원 총5,000원 * 교환시 꼭 상품 안에 교환에 관한 메

www.nurirobot.com

사이트 아래의 매뉴얼을 보고 모터 드라이버와 연결해줍니다.

U, V, W와 홀센서 연결

엔코더는 연결 안 해도 작동할 수 있음 (그대신 좀 부정확하게 회전할 수도 있음)

 

연결 사진

 

 

사용한 모터 드라이버 BLDM-400-P (BLDC용 / 정격출력400W / PWM 제어 방식)

 

BLDC모터 드라이버(제품상세보기) :: 누리로봇 NURI ROBOT

 

www.nurirobot.com

 

매뉴얼을 보면 모터는 24, 36, 48V 지원 가능하고,

모터 드라이버에 입력 가능한 전압은 11~35V이므로

SMPS를 통해 24V를 연결해줍니다.

 

SMPS를 연결할 때 L, N은 꼽는 순서가 중요하지 않지만 그라운드는 꼭 멀티미터기로 찍어보고 확인한 뒤 연결해줍니다.

 


전원 연결 배선은 끝이고 모터 드라이버 오른편의 PWM, Dir, Brk, GND를 컨트롤러와 연결합니다.

 

제가 사용한 컨트롤러는 STM32라는 MCU를 사용했고,

꼭 이게 아니더라도 아두이노나 다른 아날로그, 디지털 출력이 가능한 컨트롤러를 사용해도 무방합니다.

 

이전 미쓰비시 산업용 모터를 돌릴 때 포스트했던 글을 참조해서 STM32 설정을 해줍니다.

 

 

산업용 모터 작동을 위한 STM32 설정

MR-J2S-40A 서보앰프로 HC-KFS43 서보모터를 작동시키는데 지령장치로 STM32를 사용하고자 합니다. 이때 필요한 STM32 설정 방법에 대해 알아봅시다. 1-1. 우선 STM32 개발환경인 CubeIDE를 설치합니다. STM32Cu

kumoh-irl.tistory.com

 

PWM용 모터 드라이버를 사용하기 때문에 아날로그 출력은 DAC방식이 아닌 PWM 방식으로 설정해주고

Dir과 Brk를 사용하기 때문에 디지털 핀은 두 개를 만들어줍니다.

 

1. Cube IDE를 설치합니다.

(이전 버전을 사용하면 잘 안 되는 경우가 있습니다. 저는 현재기준 제일 최신 버전인 1.11.2를 사용했습니다.)

https://www.st.com/en/development-tools/stm32cubeide.html

 

2. 프로그램을 열어서 새 프로젝트를 열어줍니다. (File → New → STM32 Project)

 

3. Board Selector → F429ZI 검색 → Board list에서 더블 클릭 → Next

   STM32에서는 다양한 보드를 제공합니다. 

   그리고 자동으로 코드를 작성하고 핀을 배정하기 위해서는 사용자가 어떤 보드를 사용하는지 알려줘야 합니다.

   필자는 F429ZI 모델을 썼지만 다른 모델을 사용했다면 그 모델을 검색해서 똑같이 진행하면 됩니다.

 

4. Project 이름 설정 후 나머지는 다 기본값으로 설정 후 Next

 

5. Timers → TIM3 → Channel 1 → PWM Generation CH1 선택 → Prescaler 83, Counter Period 999로 설정

 

6. NVIC Settings에서 Enabled 체크

 

7. Ctrl + s를 눌러 코드 생성 후 main.c로 이동

 

8. PWM, Dir, Brk 변수 생성

처음 전원이 들어왔을 때 모터가 갑자기 돌아가는 것을 방지하기 위해 Brk를 1로 설정했습니다.

9. main문 안에 아래 내용 추가

HAL_TIM_Base_Start_IT(&htim3);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

 

10. 타이머3가 작동할 때 실행될 내용(PWM제어)을 main문 밖에 넣어줍니다.

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM3)
    {
    	if(PWM>999)
    		htim3.Instance -> CCR1 = 999;
    	else
    		htim3.Instance -> CCR1 = PWM;
    }
}

위에서 Counter Period를 999로 설정했기 때문에 PWM 입력 범위는 0~999입니다.

사용자가 999보다 큰 값을 입력했을 때 모터 드라이버에 999까지만 들어갈 수 있도록 코드를 작성해주었습니다.

 

11. ioc에서 생성된 PWM핀을 확인합니다. (PA5)

 

PWM 출력은 끝났고, 이제 디지털 출력을 설정하겠습니다.

 

12. 다시 ioc로 돌아가 사용 중이 아닌(Reset_state) 핀 두 개를 골라 GPIO_Output으로 설정

저는 PA_5 핀 근처에 있는 PD14,15를 선택했습니다.

 

13. 좌측 카테고리 System Core GPIO 설정한 핀 번호  GPIO Pull-up/Pull-down Pull-up

 

14. Ctrl + s로 코드를 생성 main 문 안에 위치한 while 문에 다음과 같은 명령어로 디지털 신호를 생성

  while (1)
  {
    /* USER CODE END WHILE */
	  if(Dir==0)
		  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
	  if(Dir==1)
		  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
	  if(Brk==0)
		  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET);
	  if(Brk==1)
		  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);
    /* USER CODE BEGIN 3 */
  }

 

15. PWM, Dir, Brk, GND핀 모터드라이버와 연결 전원ON

 

16. 디버그 실행 → Live Expressions에 변수 등록 → Resume → 변수를 바꿔가며 모터가 작동하는지 확인

 

잘 작동합니다 :)

댓글