일반적인 ADC 필터링 알고리즘

오늘날 센서의 종류와 수는 점점 더 많아지고 있으며 이러한 센서 중 상당수는 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. 장점과 단점

  1. 중앙값과 평균의 장점을 결합

  2. 펄스 간섭 제거

  3. 계산 속도가 느리고 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;
 }
}

おすすめ

転載: blog.csdn.net/volval/article/details/127881521