//// ПРОГРАММНЫЙ АНАЛОГ RC ФИЛЬТРА
// Два варианта:
// с целыми значениями (быстрее)
// с действительными значениями (Понятнее)
#define INT_KOEFF 16
#define FLOAT_KOEFF 20.0
int int_RC; // В INT_KOEFF большее от read_adc значения
float float_RC;
void calc_RC (void)
{
int tmp;
tmp = read_adc(ADC_IN);
float_RC += (tmp - float_RC) / FLOAT_KOEFF;
int_RC += tmp - ((int_RC + INT_KOEFF/2) >> 4); // Деление на 16 сдвигом
}
//// ОПРЕДЕЛЕНИЕ СКОЛЬЗЯЩЕГО СРЕДНЕГО
#define ARRAY_SIZE 20
#define ADC_IN 2
// В кольцевом массиве содержаться отдельные значения
int Array[ARRAY_SIZE];
// Индекс элемента массива, в котор будет записано очередное значение
signed char index;
// Значение суммы отдельных значений, Правильное значение бывает только
// после суммирования ARRAY_SIZE значений
int summ;
// Скользящее значение суммы ARRAY_SIZE отдельных значений, всегда правильное значение
int skolz_summ;
// Скользящее среднее ARRAY_SIZE отдельных значений, всегда правильное значение
int skolz_sred;
void calc_skolz_sred (void)
{
int tmp;
tmp = read_adc(ADC_IN);
summ += tmp; // вычисляем временную сумму
// находим очередное значение индекса
if (--index < 0) {
index = ARRAY_SIZE - 1; // Закольцовываем
skolz_summ = summ; // Юстируем скольз сумму
summ = 0;
} else {
// К правильному значению суммы последних ARRAY_SIZE отдельных значений
// прибавляем самое свежее и вычитаем самое старое
skolz_summ += tmp - Array[index];
}
// заменяем самое старое значение самым свежим
Array[index] = tmp;
// вычисляем скользящее среднее
skolz_sred = skolz_summ / ARRAY_SIZE;
}