오늘날 센서의 종류와 수는 점점 더 많아지고 있으며 이러한 센서 중 상당수는 ADC와 분리할 수 없는 아날로그 수량을 사용합니다.
그러나 단일 칩 ADC에 의해 수집된 아날로그 데이터는 기본적으로 "필터링"되어 사용되기 전에 몇 가지 일반적인 ADC 필터링 알고리즘을 공유하겠습니다.
1. 제한 필터
1. 방법
-
경험에 따르면 두 샘플링에서 허용되는 최대 편차 값 A
-
새로운 값이 나올 때마다 판단: 현재값과 이전값의 차이 <= A이면 이번이 유효, 현재값과 이전값의 차이 > A이면 이번이 무효, 이 Second-rate 대신 이전 값이 사용됩니다.
2. 장점과 단점
-
펄스 간섭을 극복하고 주기적인 간섭을 억제할 수 없으며 매끄러움이 좋지 않습니다.
3. 코드
/* A值根据实际调,Value有效值,new_Value当前采样值,程序返回有效的实际值 */
#define A 10
char Value;
char filter()
{
char new_Value;
new_Value = get_ad(); //获取采样值
if( abs(new_Value - Value) > A) return Value; //abs()取绝对值函数
return new_Value;
}
2. 중앙값 필터링
1. 방법
-
연속 샘플링 N 회, 크기별로 정렬
-
이 시간의 유효 값으로 중간 값을 취하십시오.
2. 장점과 단점
-
변동 간섭을 극복하여 온도와 같이 느리게 변화하는 측정 매개변수에 대해 좋은 필터링 효과가 있으며 속도와 같이 빠르게 변화하는 매개변수에는 적합하지 않습니다.
3. 코드
#define N 11
char filter()
{
char value_buf[N];
char count,i,j,temp;
for(count = 0;count < N;count++) //获取采样值
{
value_buf[count] = get_ad();
delay();
}
for(j = 0;j<(N-1);j++)
for(i = 0;i<(n-j);i++)
if(value_buf[i]>value_buf[i+1])
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
return value_buf[(N-1)/2];
}
3. 산술 평균 필터링
1. 방법
-
연속적으로 N 번 샘플링하고 평균을 내십시오.
-
N이 크면 부드러움이 높고 감도가 낮습니다.
-
N이 작으면 평활도가 낮고 감도가 높다.
-
일반적으로 N=12
2. 장점과 단점
-
무작위 간섭이 있는 시스템에 적합하고 많은 RAM을 차지하며 느립니다.
3. 코드
#define N 12
char filter()
{
int sum = 0;
for(count = 0;count<N;count++)
sum += get_ad();
return (char)(sum/N);
}
4. 재귀 평균 필터링
1. 방법
-
N개의 샘플링 값을 받아 대기열을 형성합니다. 선입선출
-
평균
-
일반적으로 N=4~12
2. 장점과 단점
-
주기적인 간섭의 좋은 억제, 높은 매끄러움
-
고주파 진동 시스템에 적합
-
낮은 감도, 많은 RAM 사용량 및 심각한 펄스 간섭
3. 코드
/* A值根据实际调,Value有效值,new_Value当前采样值,程序返回有效的实际值 */
#define A 10
char Value;
char filter()
{
char new_Value;
new_Value = get_ad(); //获取采样值
if( abs(new_Value - Value) > A) return Value; //abs()取绝对值函数
return new_Value;
}
5. 중앙값 평균화 필터
1. 방법
-
N 값을 샘플링하고 최대값과 최소값을 제거합니다.
-
N-2의 평균 계산
-
N= 3~14
2. 장점과 단점
-
중앙값과 평균의 장점을 결합
-
펄스 간섭 제거
-
계산 속도가 느리고 RAM 사용량이 많습니다.
3. 코드
char filter()
{
char count,i,j;
char Value_buf[N];
int sum=0;
for(count=0;count<N;count++)
Value_buf[count]= get_ad();
for(j=0;j<(N-1);j++)
for(i=0;i<(N-j);i++)
if(Value_buf[i]>Value_buf[i+1])
{
temp = Value_buf[i];
Value_buf[i]= Value_buf[i+1];
Value_buf[i+1]=temp;
}
for(count =1;count<N-1;count++)
sum += Value_buf[count];
return (char)(sum/(N-2));
}
6. 제한 평균 필터
1. 방법
-
각 샘플링 데이터는 먼저 제한되고 대기열로 전송됩니다.
-
평균을 내다
2. 장점과 단점
-
클리핑, 평균 및 대기열의 장점 결합
-
펄스 간섭 제거, 더 많은 RAM 점유
3. 코드
#define A 10
#define N 12
char value,i=0;
char value_buf[N];
char filter()
{
char new_value,sum=0;
new_value=get_ad();
if(Abs(new_value-value)<A)
value_buf[i++]=new_value;
if(i==N)i=0;
for(count =0 ;count<N;count++)
sum+=value_buf[count];
return (char)(sum/N);
}
7. 1차 래그 필터
1. 방법
-
테이크 a=0~1
-
이 필터링 결과 = (1-a) * 현재 샘플링 + a * 마지막 결과
2. 장점과 단점
-
주기적인 간섭에 좋으며 변동 빈도가 높은 경우에 적합합니다.
-
낮은 감도, 위상 지연
3. 코드
/*为加快程序处理速度,取a=0~100*/
#define a 30
char value;
char filter()
{
char new_value;
new_value=get_ad();
return ((100-a)*value + a*new_value);
}
여덟, 가중 재귀 평균 필터
1. 방법
-
재귀 평균 필터링의 개선을 위해 데이터에 다른 시간에 다른 가중치를 추가합니다.일반적으로 데이터가 최신 데이터일수록 가중치가 커지므로 민감도는 높지만 평활도는 낮습니다.
2. 장점과 단점
-
지연 시정수가 크고 샘플링 주기가 짧은 시스템에 적합하며 지연 시정수가 작고 샘플링 주기가 길고 변화가 느린 신호의 경우 수신하는 간섭에 신속하게 대응할 수 없습니다.
3. 코드
/* coe数组为加权系数表 */
#define N 12
char code coe[N]={1,2,3,4,5,6,7,8,9,10,11,12};
char code sum_coe={1+2+3+4+5+6+7+8+9+10+11+12};
char filter()
{
char count;
char value_buf[N];
int sum=0;
for(count=0;count<N;count++)
{
value_buf[count]=get_ad();
}
for(count=0;count<N;count++)
sum+=value_buf[count]*coe[count];
return (char)(sum/sum_coe);
}
아홉, 디바운스 필터
1. 방법
-
필터 카운터 설정
-
샘플링된 값을 현재 rms 값과 비교
-
샘플링 값 = 현재 유효 값인 경우 카운터는 0으로 클리어됩니다.
-
샘플링 값이 현재 유효 값과 같지 않으면 카운터 +1
-
카운터가 오버플로되면 샘플링 값이 현재 유효 값을 대체하고 카운터는 0으로 지워집니다.
2. 장점과 단점
-
느리게 변화하는 신호에는 좋은 필터링 효과가 있지만 빠르게 변화하는 신호에는 좋지 않습니다.
-
임계 값 근처에서 점프하지 마십시오. 카운터가 오버플로되면 간섭 값이 수집되면 필터링할 수 없습니다.
3. 코드
#define N 12
char filter()
{
char count=0,new_value;
new_value=get_ad();
while(value!=new_value)
{
count++;
if(count>=N) return new_value;
new_value=get_ad();
}
return value;
}
10. 제한 및 디바운스 필터링
1. 방법
-
먼저 제한한 다음 디바운스
2. 장점과 단점
-
제한 및 디바운스의 장점 결합
-
빠르게 변화하는 신호에 적합하지 않은 간섭 값 도입 방지
3. 코드
#define A 10
#define N 12
char value;
char filter()
{
char new_value,count=0;
new_value=get_ad();
while(value!=new_value)
{
if(Abs(value-new_value)<A)
{
count++;
if(count>=N) return new_value;
new_value=get_ad();
}
return value;
}
}