본문 바로가기
-----ETC-----/C++ 임베디드 시스템 프로그래밍 시리즈

[C++ 임베디드 시스템 프로그래밍 시리즈] Day 12: 모터 제어 (PWM)

by cogito21_cpp 2024. 8. 1.
반응형

모터 제어의 개요

모터 제어는 임베디드 시스템에서 매우 중요한 역할을 합니다. 특히, PWM(Pulse Width Modulation) 신호를 사용하여 모터의 속도와 방향을 제어할 수 있습니다. 오늘은 PWM을 사용하여 DC 모터를 제어하는 방법을 학습하겠습니다.

1. PWM의 기본 개념

PWM은 펄스 폭 변조(Pulse Width Modulation)의 약자로, 디지털 신호의 듀티 사이클을 변경하여 평균 전력을 제어하는 방법입니다. 듀티 사이클은 펄스 신호가 HIGH 상태를 유지하는 시간의 비율을 나타냅니다.

  • 듀티 사이클: PWM 주기 동안 신호가 HIGH 상태인 시간의 비율(%)입니다. 예를 들어, 듀티 사이클이 50%이면 신호가 주기의 절반 동안 HIGH 상태를 유지합니다.

2. PWM을 사용한 모터 제어

PWM을 사용하여 DC 모터의 속도를 제어할 수 있습니다. 듀티 사이클을 변경하여 모터의 속도를 조절할 수 있습니다.

 

하드웨어 연결

  1. 모터 드라이버(L298N) 연결:
    • ENA: PWM 핀 (예: 9번 핀)
    • IN1: 디지털 핀 (예: 8번 핀)
    • IN2: 디지털 핀 (예: 7번 핀)
    • OUT1: 모터의 + 단자
    • OUT2: 모터의 - 단자
    • VCC: 12V 전원 (모터 전원)
    • GND: GND
    • 5V: 5V (아두이노 전원)

예제: PWM을 사용한 DC 모터 속도 제어

다음 예제는 PWM을 사용하여 DC 모터의 속도를 제어하는 방법을 보여줍니다.

const int enA = 9; // PWM 핀
const int in1 = 8; // 모터 제어 핀 1
const int in2 = 7; // 모터 제어 핀 2

void setup() {
    pinMode(enA, OUTPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);

    // 모터를 전진 방향으로 설정
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
}

void loop() {
    // 모터 속도 설정
    for (int speed = 0; speed <= 255; speed += 5) {
        analogWrite(enA, speed); // 모터 속도 증가
        delay(100); // 지연 시간
    }
    for (int speed = 255; speed >= 0; speed -= 5) {
        analogWrite(enA, speed); // 모터 속도 감소
        delay(100); // 지연 시간
    }
}

 

위 코드에서는 analogWrite 함수를 사용하여 PWM 신호를 생성하고, 모터의 속도를 제어합니다. 모터는 전진 방향으로 설정되어 있으며, 속도는 0에서 255까지 증가하고 감소합니다.

 

3. 방향 제어

모터의 방향을 제어하려면 IN1과 IN2 핀의 상태를 변경하면 됩니다. 다음 예제는 모터의 방향을 제어하는 방법을 보여줍니다.

 

예제: DC 모터의 속도 및 방향 제어

const int enA = 9; // PWM 핀
const int in1 = 8; // 모터 제어 핀 1
const int in2 = 7; // 모터 제어 핀 2

void setup() {
    pinMode(enA, OUTPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
}

void loop() {
    // 모터를 전진 방향으로 설정
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    analogWrite(enA, 200); // 속도 설정
    delay(2000); // 2초 대기

    // 모터를 후진 방향으로 설정
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    analogWrite(enA, 200); // 속도 설정
    delay(2000); // 2초 대기

    // 모터를 정지
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    analogWrite(enA, 0); // 속도 0 설정
    delay(2000); // 2초 대기
}

 

위 코드에서는 digitalWrite 함수를 사용하여 모터의 방향을 제어합니다. 모터는 2초 동안 전진하고, 2초 동안 후진하며, 2초 동안 정지합니다.

 

4. 서보 모터 제어

서보 모터는 정밀한 위치 제어가 필요한 애플리케이션에서 사용됩니다. 다음 예제는 서보 모터의 각도를 제어하는 방법을 보여줍니다.

 

하드웨어 연결

  1. 서보 모터 연결:
    • VCC: 5V
    • GND: GND
    • 신호 핀: 디지털 핀 (예: 9번 핀)

예제: 서보 모터 각도 제어

다음 예제는 Servo 라이브러리를 사용하여 서보 모터의 각도를 제어하는 방법을 보여줍니다.

#include <Servo.h>

Servo myServo; // 서보 객체 생성
const int servoPin = 9; // 서보 모터 핀

void setup() {
    myServo.attach(servoPin); // 서보 모터 핀에 연결
}

void loop() {
    // 서보 모터 각도 설정
    for (int angle = 0; angle <= 180; angle += 1) {
        myServo.write(angle); // 각도 설정
        delay(15); // 지연 시간
    }
    for (int angle = 180; angle >= 0; angle -= 1) {
        myServo.write(angle); // 각도 설정
        delay(15); // 지연 시간
    }
}

 

위 코드에서는 Servo 라이브러리를 사용하여 서보 모터의 각도를 제어합니다. 서보 모터는 0도에서 180도까지 회전하고 다시 0도로 돌아옵니다.

 

마무리

오늘은 PWM을 사용하여 모터의 속도와 방향을 제어하는 방법을 학습했습니다. DC 모터와 서보 모터를 제어하는 예제를 통해 PWM의 기본 개념과 활용 방법을 익혔습니다. 다음 날에는 서보 모터 제어에 대해 더 깊이 알아보겠습니다.

질문이나 추가적인 피드백이 있으면 언제든지 댓글로 남겨 주세요.

Day 13 예고

다음 날은 "서보 모터 제어"에 대해 다룰 것입니다. 서보 모터를 사용하여 정밀한 위치 제어를 구현하는 방법을 학습하고, 실습 예제를 통해 이해를 돕겠습니다.

반응형