# 고정 각도 제어

BLDC 모터의 고정 각도 제어(Fixed Angle Control)는 회전자의 특정 위치에서 스위칭 신호를 고정된 각도에서 발생시켜 모터를 제어하는 방법이다. 이 방법은 일반적으로 간단하며 구현이 쉬운 편이지만, 최적의 효율을 보장하지는 않는다. 이 절에서는 고정 각도 제어의 기본 원리, 구현 방법, 그리고 그 장단점에 대해 다루겠다.

**기본 원리**

고정 각도 제어는 모터의 홀 센서 또는 엔코더로부터 얻은 회전자의 위치 정보를 사용하여 스위칭 신호를 고정된 각도로 발생시킨다. 이 방법에서는 모터의 위치에 따라 전류를 특정 시점에만 공급하여 회전자를 회전시키는 방식이다.

스위칭 타이밍은 보통 전기 각도로 표현된다. 예를 들어, 60도, 120도, 180도 등의 고정된 각도에서 스위칭이 이루어질 수 있다. 이는 회전자의 위치에 따라 정해진 각도에서 스위칭 신호를 발생시키는 것이다.

**구현 방법**

고정 각도 제어를 구현하기 위해서는 다음의 단계를 따른다:

1. **위치 감지**: 홀 센서나 엔코더를 사용하여 회전자의 현재 위치를 감지한다.
2. **스위칭 신호 생성**: 감지된 위치에 따라 미리 정해진 고정 각도에서 스위칭 신호를 생성한다.
3. **전류 공급**: 생성된 스위칭 신호에 따라 전류를 공급하여 회전자를 회전시킨다.

이 과정을 보다 구체적으로 살펴보면 다음과 같다:

1. **위치 감지**:
   * 홀 센서나 엔코더로부터 회전자의 현재 위치 $\theta$를 감지한다.
   * 이 값은 전기 각도로 변환되어 사용된다.
2. **스위칭 신호 생성**:
   * 고정된 각도 $\alpha$에서 스위칭 신호를 발생시킨다.
   * 예를 들어, $\theta$가 특정 각도 $\alpha$에 도달하면, 해당 시점에 스위칭 신호를 생성한다.
3. **전류 공급**:
   * 생성된 스위칭 신호에 따라 전류를 공급하여 회전자를 회전시킨다.
   * 이때, 스위칭 신호는 각 상의 전류를 제어하여 회전자가 원하는 방향으로 회전하도록 한다.

**예제 코드**

다음은 간단한 고정 각도 제어의 예제 코드이다. 이 예제는 특정 각도에서 스위칭 신호를 생성하여 전류를 공급하는 방법을 보여준다.

```c
#include <stdio.h>

// 고정된 스위칭 각도
#define FIXED_ANGLE 60

// 홀 센서 값 읽기 함수 (예제)
int read_hall_sensor() {
    // 실제 구현에서는 센서 값을 읽어와야 한다.
    return 30;  // 예제에서는 30도 위치로 가정
}

// 스위칭 신호 생성 함수
void generate_switching_signal(int current_angle) {
    if (current_angle == FIXED_ANGLE) {
        // 스위칭 신호 생성
        printf("스위칭 신호 생성: %d 도\n", current_angle);
    }
}

// 메인 함수
int main() {
    int current_angle = read_hall_sensor();  // 현재 각도 읽기
    generate_switching_signal(current_angle);  // 스위칭 신호 생성
    return 0;
}
```

이 예제에서는 `read_hall_sensor` 함수로 현재 각도를 읽어오고, `generate_switching_signal` 함수에서 고정된 각도에서 스위칭 신호를 생성한다. 이 코드는 실제 구현에서는 센서 값과 모터 제어를 위한 구체적인 로직으로 대체되어야 한다.

#### 장단점

고정 각도 제어의 장점과 단점은 다음과 같다:

**장점**:

* 구현이 간단하고 직관적이다.
* 추가적인 복잡한 알고리즘이나 계산이 필요 없다.

**단점**:

* 최적의 효율을 보장하지 않는다.
* 부하나 속도 변화에 대한 대응이 어렵다.
* 고정된 각도에서만 제어하기 때문에 정밀한 제어가 어려울 수 있다.

#### 벡터 제어

벡터 제어(Vector Control)는 BLDC 모터 제어에서 매우 중요한 개념으로, 고정 각도 제어의 단점을 극복할 수 있는 고급 제어 방법이다. 벡터 제어는 모터의 전류 벡터를 조정하여 모터의 토크와 속도를 정확하게 제어할 수 있게 해준다. 이 절에서는 벡터 제어의 기본 원리, 구현 방법, 그리고 그 장단점에 대해 설명하겠다.

**기본 원리**

벡터 제어는 모터의 전류와 자속을 벡터로 표현하고, 이를 통해 모터의 동작을 제어하는 방법이다. 이를 통해 모터의 토크와 속도를 독립적으로 제어할 수 있다. 벡터 제어는 일반적으로 공간 벡터 변환(Space Vector Transformation)과 디큐 변환(dq Transformation)을 사용한다.

**공간 벡터 변환**

공간 벡터 변환은 3상 전류를 2차원 공간 벡터로 변환하는 방법이다. 이는 복잡한 3상 전류를 단순한 2차원 벡터로 표현하여 제어를 쉽게 한다. 변환된 벡터는 모터의 자속과 토크를 직접적으로 제어할 수 있게 한다.

**디큐 변환 (dq Transformation)**

디큐 변환은 회전 좌표계에서 정지 좌표계로 변환하는 방법이다. 이를 통해 모터의 자속과 토크를 독립적으로 제어할 수 있다. 디큐 변환은 다음과 같이 이루어진다:

* **d축 (Direct axis)**: 자속을 제어하는 축
* **q축 (Quadrature axis)**: 토크를 제어하는 축

이 변환을 통해 모터의 전류를 d축과 q축으로 분리하여 제어할 수 있다.

**구현 방법**

벡터 제어를 구현하기 위해서는 다음의 단계를 따른다:

1. **전류 측정**: 모터의 3상 전류를 측정한다.
2. **공간 벡터 변환**: 3상 전류를 2차원 공간 벡터로 변환한다.
3. **디큐 변환**: 공간 벡터를 dq 좌표계로 변환한다.
4. **PI 제어기**: d축과 q축 전류를 제어하기 위한 PI 제어기를 사용한다.
5. **역 디큐 변환**: dq 좌표계의 제어 신호를 다시 공간 벡터로 변환한다.
6. **PWM 생성**: 변환된 공간 벡터 신호로 PWM 신호를 생성하여 모터를 제어한다.

**예제 코드**

다음은 간단한 벡터 제어의 예제 코드이다. 이 예제는 3상 전류를 측정하고, 이를 통해 dq 좌표계로 변환하여 제어하는 방법을 보여준다.

```c
#include <stdio.h>
#include <math.h>

// PI 제어기 구조체
typedef struct {
    double kp;  // 비례 이득
    double ki;  // 적분 이득
    double integral;  // 적분 값
} PI_Controller;

// PI 제어기 초기화
void init_pi_controller(PI_Controller *controller, double kp, double ki) {
    controller->kp = kp;
    controller->ki = ki;
    controller->integral = 0.0;
}

// PI 제어 함수
double pi_control(PI_Controller *controller, double error) {
    controller->integral += error;
    return controller->kp * error + controller->ki * controller->integral;
}

// 전류 측정 함수 (예제)
void measure_currents(double *ia, double *ib, double *ic) {
    // 실제 구현에서는 센서 값을 읽어와야 한다.
    *ia = 1.0;  // 예제 값
    *ib = -0.5; // 예제 값
    *ic = -0.5; // 예제 값
}

// dq 변환 함수
void dq_transform(double ia, double ib, double ic, double *id, double *iq) {
    *id = ia;
    *iq = (ib - ic) * sqrt(3.0) / 3.0;
}

// 역 dq 변환 함수
void inverse_dq_transform(double id, double iq, double *ia, double *ib, double *ic) {
    *ia = id;
    *ib = -0.5 * id + sqrt(3.0) / 2.0 * iq;
    *ic = -0.5 * id - sqrt(3.0) / 2.0 * iq;
}

// 메인 함수
int main() {
    double ia, ib, ic;
    double id, iq;
    double vd, vq;
    PI_Controller d_controller, q_controller;

    // PI 제어기 초기화
    init_pi_controller(&d_controller, 1.0, 0.1);
    init_pi_controller(&q_controller, 1.0, 0.1);

    // 전류 측정
    measure_currents(&ia, &ib, &ic);

    // dq 변환
    dq_transform(ia, ib, ic, &id, &iq);

    // PI 제어
    vd = pi_control(&d_controller, 0.0 - id); // d축 전류 제어
    vq = pi_control(&q_controller, 1.0 - iq); // q축 전류 제어

    // 역 dq 변환
    inverse_dq_transform(vd, vq, &ia, &ib, &ic);

    // 결과 출력
    printf("변환된 전류: ia = %f, ib = %f, ic = %f\n", ia, ib, ic);
    return 0;
}
```

이 예제에서는 간단한 PI 제어기를 사용하여 d축과 q축 전류를 제어하고, 이를 통해 역 dq 변환 후 PWM 신호를 생성하는 과정을 보여준다.

**장단점**

벡터 제어의 장점과 단점은 다음과 같다:

**장점**:

* 모터의 토크와 속도를 정확하게 제어할 수 있다.
* 높은 효율과 성능을 제공한다.
* 부하나 속도 변화에 대해 빠르게 대응할 수 있다.

**단점**:

* 구현이 복잡하고 계산량이 많다.
* 센서와 제어기의 정확성이 요구된다.
* 비용이 상대적으로 높다.
