스탭모터 제어 시 진동 감쇄를 위한 ‘전동 제어 필터’ 와 예제 코드
스텝모터 제어 시 진동이나 불필요한 떨림을 방지하기 위해 **진동 제어 필터(Vibration Control Filter)**를 도입할 수 있습니다. 이는 특히 고정밀 마이크로스텝 제어에서 중요한 역할을 합니다. 다음은 일반적으로 사용되는 진동 제어 필터와 코드에 통합하는 방법입니다:
1. 저역 통과 필터 (Low-Pass Filter)
저역 통과 필터는 고주파 잡음을 제거하고 안정적인 제어 신호를 제공합니다. 간단한 구현으로는 1차 저역 통과 필터를 사용할 수 있습니다.
필터 공식:
- : 현재 입력 값 (control signal)
- : 필터된 출력 값
- : 필터 계수 (0 < ≤ 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)
스텝모터의 속도나 가속도를 제한하여 진동을 줄이는 방법입니다. 일정 시간 간격에서 신호 변화율(가속도)을 제한합니다.
필터 공식:
- 과 : 신호의 최소/최대 변화율
코드 통합:
// 가속도 제한 필터 함수
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)
여러 샘플의 평균값을 사용하여 신호를 매끄럽게 만듭니다.
필터 공식:
- : 평균에 포함할 샘플 수
코드 통합:
#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 출력 신호를 안정적으로 필터링한 후 스텝모터 제어 함수에 전달하면 됩니다. 필요한 경우, 특정 필터를 복합적으로 사용하여 시스템의 진동 및 잡음을 더욱 효과적으로 제어할 수 있습니다.