모터
모터 : 전기 에너지를 이용하여 운동 에너지를 만들어 내는 장치-> 보통 모터 드라이버를 통해 모터를 제어하며, 모터 드라이버 내부에는 H-Bridge 회로가 들어 있다.-> H-Bridge 회로를 통해서 모터가
dawon-project.tistory.com
PWM
PWM(Pulse Width Modulation) : 펄스 폭 변조 -> 듀티 비를 통해 PWM 값이 달라진다. -> 디지털 신호를 아날로그 신호처럼 흉내내는 것과 비슷하다. -> 일정한 주기 내에서 Duty의 비를 변화
dawon-project.tistory.com
STM Clock
*Clock : 일정한 시간 간격으로 0과 1의 값이 번갈아 나타난다. -> 내부 / 외부 또는 low / high speed의 분류에 따라 HSE, HSI, LSE, LSI로 분류 된다. *PRESCALER(분주기) : 카운터에 공급되는 클럭을 더 느리게
dawon-project.tistory.com
<사용한 제품>
인 휠 BLDC 모터 -> 48V 350W 10인치
<BLD-15 회로도 및 Spec>
=> PWM을 통한 컨트롤
DC 전압 : 12V ~ 50V
전류 : 15A
=> 풀업 방식
<제어 모드 2가지 >
- RV 모드 (Potentiometer 사용) : 고정 스피드 사용시 적합
-> RV 모드로 사용할때 DIP 스위치 2번 ON 세팅
-> 시계 방향으로 돌릴때 속도 점점 증가 - AVI 모드 : 속도 변화가 있는 경우 적합
-> DIP 스위치 2번을 OFF 세팅
-> 아날로그 신호를 통한 PWM을 만들어줘야함 (V(전압)이 높아질수록 변화폭이 증가)
-> 이거 사용!
< 모터 드라이버 핀마다의 기능 >
- ENBL 핀 : 모터의 Start/Stop 신호 제어 -> 항상 GND 연결
- F/R 핀 : 모터의 회전 방향 제어 -> GPIO 핀을 통한 제어
- BRK 핀 : 비상용 브레이크 기능 (긴급 정지모드로 속도를 0으로 한순간에 만듬)
-> GPIO 핀을 통한 제어(GPIO_OUTPUT) - SPEED 핀 : 모터의 속도를 조절하도록 신호를 모터에 보냄
-> PWM핀 -> TIM로 생성 - ALM 핀 : 드라이버가 과전류, 과전압, 상간 단락, 로터 구속 등 기타 오류가 발생하면 드라이버는 자동으로 보호 상태가 되어 모터를 정지시키고, 경보 신호를 ALM에 출력 -> 빨간불
-> GPIO_INPUT 핀을 통해 상태 읽음
BLDC모터드라이버 BLD-15 DC12-50V 15A 750W PWM컨트롤 스마트드라이버
모터뱅크
www.motorbank.kr
-> 해당 사이트에 Datasheet가 적혀 있다.
< STM32 PWM 설정 >
- ST에서 Duty rate(듀티비)는 CCR(Channel Capture Compare) 값에 의해 결정된다.
-> CCR : PWM 신호의 듀티 사이클(일정 시간 동안 신호가 활성화되어 있는 시간)을 설정하는 레지스터 - TIM3는 APB1을 통해서 클럭이 생성되고, 필자의 경우 아래의 그림처럼 84MHz로 세팅되어 있기 때문에 한 주기가 1μs로 세팅하기 위해서는 83으로 Prescaler를 세팅해야 한다.
-> "84 - 1" 을 해줘야한다 왜냐하면 ST에서는 0부터 숫자가 카운트되기 때문 - Counter Period 는 PWM 값의 범위를 몇 까지 줄 것인가를 결정하는 설정인데 필자는 0 ~ 2000 까지의 PWM 범위를 사용할 것이기 때문에 1999로 설정했다.
-> ARR(Auto-Reload Register) : 주기적인 PWM 신호의 주기를 결정하는 레지스터
-> Prescaler와 Counter Period를 통해 ARR 조절 - PWM Generation Channel 1에서 Pulse 옵션은 초기 PWM 값을 몇으로 설정할 것인지를 정하는 것이다 필자의 경우 초반에는 멈춘 상태를 유지하고 싶기 때문에 0 으로 세팅했다.
< PWM 코드 >
- Polling 방식일 경우 사용 함수
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) 함수를 사용
-> 첫번째 인자는 사용하는 타이머 번호, 두번째 인자는 해당 타이머에서 사용하는 채널
Main 함수의 while 문에서 "TIM3 -> CCR1 = value; "를 통해 CCR 레지스터에 직접 접근하여 값을 변경(duty비 변경)시킬 수 있다.
- Interrupt 방식일 경우 사용 함수
HAL_TIM_Base_Start_IT(&htim3) 함수를 사용
-> Interrupt의 경우 Callback 함수 내에서 처리 코드를 적어야한다.
-> 아래 코드 처럼 htim에 멤버 접근 연산자인 "->"를 통해서 htim3가 맞는지 확인 후 내부에 코딩
-> 추가로 NVIC에서 인터럽트 설정을 체크해줘야한다.
<작동 영상 및 후기>
-> 모터와 모터 드라이버 그리고 SRF08이라는 초음파 센서를 같이 적용하여 구동 시킨 영상이다.
문제 : 킥보드 용이라 그런지 속도가 많이 빠르다 그러나 BLDC 모터 내부에 ESC 나 토크가 거의 없어서 내리막길에서 속도를 많이 내지 않으면 잘 올라가지 못하고 경사도에서 전원이 꺼졌을 시에 뒤로 굴러가는 문제가 발생하였다.
-> ESC에서의 회생 제동 또는 모터 자체에 토크 값이 높아야 해결이 가능하다고 한다.
-> 다시 토크 값이 높은 BLDC 모터를 사거나 ESC를 직접 달기에는 어려움이 있기 때문에 U,V,W 값을 읽어와서 뒤로 속력이 가해질 때 속력을 더 주는 알고리즘을 구현하였다.
-> ESC에서의 회생 제동(Regenerative Braking) : 모터가 감속하거나 역방향 토크를 생성할 때 발생하는 운동 에너지를 전기 에너지로 변환해 배터리에 다시 저장하는 기술
'STM32 정리' 카테고리의 다른 글
Polling 과 Interrupt 그리고 DMA (0) | 2025.01.13 |
---|---|
IMU ( EBIMU ) (0) | 2025.01.13 |
3D Lidar (CygLidar) (0) | 2025.01.13 |
2D Lidar (Slamtec rplidar A1M8) (0) | 2025.01.13 |
라이다 (0) | 2025.01.13 |