모터 제어 공부를 하기 시작하니 돌려볼 게 굉장히 많네요..
이번에는 BLDC모터를 작동시켜 보겠습니다.
BLDC모터는 브러쉬가 없는 모터로 DC모터에 비해 수명이 길다는 장점이 있습니다.
그리고 전원으로 들어가는 선이 3개인데
세 곳의 전자석으로 들어가는 전류의 방향을 바꿔가면서
중간의 영구자석을 회전시키는 방식입니다.
하지만 큰 틀에서 모터 드라이버에 전류를 공급해 돌린다는 것을 바뀌지 않습니다.
이제 모터를 돌려보겠습니다.
이번에 사용한 BLDC 모터는 누리로봇의 B59E입니다.
사이트 아래의 매뉴얼을 보고 모터 드라이버와 연결해줍니다.
U, V, W와 홀센서 연결
엔코더는 연결 안 해도 작동할 수 있음 (그대신 좀 부정확하게 회전할 수도 있음)
사용한 모터 드라이버 BLDM-400-P (BLDC용 / 정격출력400W / PWM 제어 방식)
매뉴얼을 보면 모터는 24, 36, 48V 지원 가능하고,
모터 드라이버에 입력 가능한 전압은 11~35V이므로
SMPS를 통해 24V를 연결해줍니다.
SMPS를 연결할 때 L, N은 꼽는 순서가 중요하지 않지만 그라운드는 꼭 멀티미터기로 찍어보고 확인한 뒤 연결해줍니다.
전원 연결 배선은 끝이고 모터 드라이버 오른편의 PWM, Dir, Brk, GND를 컨트롤러와 연결합니다.
제가 사용한 컨트롤러는 STM32라는 MCU를 사용했고,
꼭 이게 아니더라도 아두이노나 다른 아날로그, 디지털 출력이 가능한 컨트롤러를 사용해도 무방합니다.
이전 미쓰비시 산업용 모터를 돌릴 때 포스트했던 글을 참조해서 STM32 설정을 해줍니다.
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 변수 생성
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으로 설정
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 → 변수를 바꿔가며 모터가 작동하는지 확인
잘 작동합니다 :)
'정나우 > 기타' 카테고리의 다른 글
우분투 재설치 중 grub minimal bash like.. 오류 발생시 해결법 (0) | 2023.06.09 |
---|---|
리눅스용 무선랜카드 iptime A2000UA 사용법 (0) | 2023.06.08 |
Recurdyn(리커다인)에서 Translate joint를 이용한 병진운동 동역학 해석하기 (0) | 2023.02.22 |
미쓰비시 모터 시운전 작동 (0) | 2023.01.13 |
RPLIDAR A2 작동 (0) | 2021.12.06 |
댓글