STM32 RC카 프로젝트(1)

황윤성·2024년 9월 26일

STM32

목록 보기
1/3

STM32보드를 사용해 RC카를 제작하는 프로젝트를 진행해보겠습니다.

이번 프로젝트의 최종 목적은 블루투스 모듈을 사용해 핸드폰과 RC카를 연결하여 전진, 후진, 좌회전, 우회전 동작을 수행하는 것이 목표입니다. 하지만, 이번 글에서는 모터를 PWM으로 제어하며 모터를 2초 동안 전진, 2초 동안 후진시키는 간단한 동작을 수행하는것을 목표로 하겠습니다.

우선

1. 초기 설정

RCC

SYS

TIMER

PWM은 우선 하나만 사용할 예정이지만 나중을 위해 2개의 채널을 열어두었습니다.
클럭 세팅

핀 오버뷰

좌,우 모터가 따로 동작하게 각각 PB0,1 / PB2,3 은 모터의 high, low로 모터의 방향을 결정합니다.

코드 제레이터

2. PWM으로 모터 제어해보기

우선적으로 PWM을 사용하여 단순히 모터를 구동시켜보겠습니다.
코드 설명

#define MOTOR_A_IN1_PIN GPIO_PIN_0
#define MOTOR_A_IN2_PIN GPIO_PIN_1
#define MOTOR_B_IN3_PIN GPIO_PIN_2
#define MOTOR_B_IN4_PIN GPIO_PIN_3

모터 제어를 위해 GPIOB포트의 0,1,2,3번 핀을 각각 모터의 IN핀으로 정의 하겠습니다.

모터 제어 함수

/* 모터 A 제어 함수 (방향 및 속도 제어) */
void MotorA_Control(int speed, int direction) {
    if (direction == 1) {
        HAL_GPIO_WritePin(MOTOR_GPIO_PORT, MOTOR_A_IN1_PIN, GPIO_PIN_SET);
        HAL_GPIO_WritePin(MOTOR_GPIO_PORT, MOTOR_A_IN2_PIN, GPIO_PIN_RESET);
    } else {
        HAL_GPIO_WritePin(MOTOR_GPIO_PORT, MOTOR_A_IN1_PIN, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(MOTOR_GPIO_PORT, MOTOR_A_IN2_PIN, GPIO_PIN_SET);
    }
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, speed);
}
/* 모터 B 제어 함수 (방향 및 속도 제어) */
void MotorB_Control(int speed, int direction) {
    if (direction == 1) {
        HAL_GPIO_WritePin(MOTOR_GPIO_PORT, MOTOR_B_IN3_PIN, GPIO_PIN_SET);
        HAL_GPIO_WritePin(MOTOR_GPIO_PORT, MOTOR_B_IN4_PIN, GPIO_PIN_RESET);
    } else {
        HAL_GPIO_WritePin(MOTOR_GPIO_PORT, MOTOR_B_IN3_PIN, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(MOTOR_GPIO_PORT, MOTOR_B_IN4_PIN, GPIO_PIN_SET);
    }
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, speed);
}

MotorA_Control과 MotorB_Control 함수는 각각 모터A와 모터B를 제어합니다.
두 함수는 모터의 방향(전진/후진)과 속도(PWM 신호의 듀티 사이클)를 설정합니다.

  • direction == 1인 경우 전진, direction == 0인 경우 후진합니다.

  • 속도는 PWM 신호의 듀티 사이클로 조정되며, __HAL_TIM_SET_COMPARE 함수를 통해 설정됩니 다. 이 함수는 htim3의 해당 채널에 PWM 값을 업데이트합니다.

    HAL_Init();
     SystemClock_Config();
    
     MX_GPIO_Init();
     MX_TIM3_Init();
    
     HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // 모터 A용 PWM
     HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); // 모터 B용 PWM

    HAL_Init(), SystemClock_Config(), MX_GPIO_Init(), MX_TIM3_Init() 함수들은 STM32의 기본 시스템 설정과 타이머, GPIO 초기화를 담당합니다.

HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // 모터 A PWM
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); // 모터 B PWM

HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 500); // 50% 듀티
HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 750); // 75% 듀티

두 모터의 속도를 제어하기 위해 PWM을 사용하며, 타이머 3(TIM3)의 두 채널에서 PWM신호가 생성됩니다.

  • HAL_TIM_PWM_Start 함수로 PWM 신호를 TIM3 채널 1 (모터 A)과 채널 2 (모터 B)에 시작합니다.
  • 초기 듀티 사이클은 각각 50%(500/1000)와 75%(750/1000)로 설정되어 있습니다.
while (1)
{
    // 전진
    MotorA_Control(500, 1);
    MotorB_Control(500, 1);
    HAL_Delay(2000);

    // 후진
    MotorA_Control(500, 0);
    MotorB_Control(500, 0);
    HAL_Delay(2000);
}

메인 루프에서 두 모터를 2초 동안 전진(50% 속도)한 뒤, 다시 2초 동안 후진하는 동작을 반복합니다.

3. 하드웨어 구성


A와 B에 좌 우 모터를 각각 2개씪 총 4개를 연결해 줍니다.


한쪽을 보여주기 위해 사진을 찍어 봤습니다. 이런 식으로 모터 드라이버의 한쪽에 2개씩 반대편에도 똑같이 연결해줍니다.
DC모터의 특성상 +, -극은 따로 존재하지 않지만 low, high 신호를 줄때 구분하기 위해 전선 색을 검정과 빨강으로 맞추어주었습니다.

모터 드라이버 연결

사진 하단에 표시한것 처럼PB1,2,3,4 순서로 연결하였습니다.
그 좌우의 ENA,ENB에는 모터 A, B의 PWM 입력 핀을 연결하였습니다.

ENA, ENB: 각각 모터 A, B의 속도 제어를 위한 PWM 입력 핀.
IN1, IN2: 모터 A의 방향 제어 입력 핀
IN3, IN4: 모터 B의 방향 제어 입력 핀
OUT1, OUT2: 모터 A의 출력 핀
OUT3, OUT4: 모터 B의 출력 핀

4. 모터 구동 영상


링크텍스트

4개의 바퀴가 좌우로 반복하며 잘 돌아가는 모습을 확인할 수 있습니다.

profile
하드웨어 엔지니어 꿈나무

0개의 댓글