스탭모터 제어 시 진동 감쇄를 위한 ‘전동 제어 필터’ 와 예제 코드

스텝모터 제어 시 진동이나 불필요한 떨림을 방지하기 위해 **진동 제어 필터(Vibration Control Filter)**를 도입할 수 있습니다. 이는 특히 고정밀 마이크로스텝 제어에서 중요한 역할을 합니다. 다음은 일반적으로 사용되는 진동 제어 필터와 코드에 통합하는 방법입니다:


1. 저역 통과 필터 (Low-Pass Filter)

저역 통과 필터는 고주파 잡음을 제거하고 안정적인 제어 신호를 제공합니다. 간단한 구현으로는 1차 저역 통과 필터를 사용할 수 있습니다.

필터 공식:

y(t)=αx(t)+(1α)y(t1)y(t) = \alpha \cdot x(t) + (1 – \alpha) \cdot y(t-1)

  • x(t)x(t): 현재 입력 값 (control signal)
  • y(t)y(t): 필터된 출력 값
  • α\alpha: 필터 계수 (0 < α\alpha ≤ 1, 작은 값일수록 필터링 강도 증가)

코드 통합:

// 저역 통과 필터 함수
double LowPassFilter(double input, double *prev_output, double alpha) {
    double filtered_output = alpha * input + (1 - alpha) * (*prev_output);
    *prev_output = filtered_output;
    return filtered_output;
}

메인 루프에서 다음과 같이 호출합니다:

double filtered_signal = LowPassFilter(control_signal, &prev_filtered_signal, 0.1);
StepMotor_Control(filtered_signal);

2. 가속도 제한 필터 (Acceleration Limiter)

스텝모터의 속도나 가속도를 제한하여 진동을 줄이는 방법입니다. 일정 시간 간격에서 신호 변화율(가속도)을 제한합니다.

필터 공식:

xfiltered=min(max(x,xmin),xmax)x_{filtered} = \min(\max(x, x_{min}), x_{max})

  • xminx_{min}xmaxx_{max}: 신호의 최소/최대 변화율

코드 통합:

// 가속도 제한 필터 함수
double AccelerationLimiter(double input, double prev_output, double max_acceleration, double dt) {
    double delta = input - prev_output;
    double max_delta = max_acceleration * dt;

    if (delta > max_delta) {
        input = prev_output + max_delta;
    } else if (delta < -max_delta) {
        input = prev_output - max_delta;
    }

    return input;
}

메인 루프에서 다음과 같이 호출합니다:

double limited_signal = AccelerationLimiter(control_signal, prev_filtered_signal, 10.0, dt);
StepMotor_Control(limited_signal);

3. 이동 평균 필터 (Moving Average Filter)

여러 샘플의 평균값을 사용하여 신호를 매끄럽게 만듭니다.

필터 공식:

y(t)=1Ni=0N1x(ti)y(t) = \frac{1}{N} \sum_{i=0}^{N-1} x(t-i)

  • NN: 평균에 포함할 샘플 수

코드 통합:

#define FILTER_SIZE 5
double MovingAverageFilter(double input, double *buffer, int *index) {
    buffer[*index] = input;
    *index = (*index + 1) % FILTER_SIZE;

    double sum = 0.0;
    for (int i = 0; i < FILTER_SIZE; i++) {
        sum += buffer[i];
    }
    return sum / FILTER_SIZE;
}

메인 루프에서 다음과 같이 호출합니다:

double filtered_signal = MovingAverageFilter(control_signal, filter_buffer, &filter_index);
StepMotor_Control(filtered_signal);

통합 방법

위의 필터 중 하나 또는 여러 개를 사용하여 PID 출력 신호를 안정적으로 필터링한 후 스텝모터 제어 함수에 전달하면 됩니다. 필요한 경우, 특정 필터를 복합적으로 사용하여 시스템의 진동 및 잡음을 더욱 효과적으로 제어할 수 있습니다.