2014-11-06 2 views
2

Я использую ПОС и датчик приближения для считывания расстояния в см от объекта.Показания фильтра PIC

Результат сохраняется в

Расстояние = Rf_Rx_Buff [6].

В основном вместо этого результата я хочу реализовать фильтр, который принимает 10 показаний, усредняет их и позволяет только среднему считывать в Rf_Rx_Buff [6].

Может ли кто-нибудь помочь мне в реализации этого.

+0

А в чем проблема? Прочитайте значение 10 раз и вычислите скользящую среднюю. –

+0

Да, но это то, с чем я борюсь, как реализовать код – NewLook

ответ

1

По крайней мере, 3 подхода:

  1. Read 10 значений и возвращает среднее (легкий)

    unsigned Distance1(void) { 
        unsigned Average_Distance = 0; 
        for (int i=0; i<10; i++) { 
        Average_Distance += Rf_Rx_Buff[6]; 
        } 
        Average_Distance = (Average_Distance + 5)/10; // +5 for rounding 
        return Average_Distance; 
    } 
    
  2. Прочитано раз, но возвращает среднее значение последних 10 гласит:

    unsigned Distance2(void) { 
        static unsigned Distance[10]; 
        static unsigned Count = 0; 
        static unsigned Index = 0; 
        Distance[Index++] = Rf_Rx_Buff[6]; 
        if (Index >= 10) { 
        Index = 0; 
        } 
        Count++; 
        if (Count > 10) { 
        Count = 10; 
        } 
        unsigned long Average_Distance = 0; 
        for (int i=0; i<10; i++) { 
        Average_Distance += Distance[i]; 
        } 
        Average_Distance = (Average_Distance + Count/2)/Count; 
        return Average_Distance; 
    } 
    
  3. Прочитайте один раз, но возвращайте среднее значение (digital low pass filter):

    unsigned Distance3(void) { 
        static unsigned long Sum = 0; 
        static int First = 1; 
        if (First) { 
        First = 0; 
        Sum = Rf_Rx_Buff[6] * 10; 
        } else { 
        Sum = Rf_Rx_Buff[6] + (Sum*9)/10; 
        } 
        return (Sum + 5)/10; 
    } 
    

Другие упрощений и подходы возможно,

+0

Спасибо Num 1 работает отлично – NewLook

0

Вы могли бы сделать это таким образом:

1.) разработать функцию, которая вычисляет среднее значение.

int calc_average(int *sensor_values, int number_sensor_values) { 
    int result = 0; 
    for(char i = 0; i < number_sensor_values; ++i) { 
     // calculate average 
     result += *sensor_values++... 
     .... 
    } 
    .... 
    return result; 
} 

2.) Read 10 данные датчика и хранения данных в массиве (sensor_values).

3.) Позвоните в свою calc_average и передайте массив sensor_values, чтобы получить результат.

Смежные вопросы