Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Ответ:

Отправлено leon 08 октября 2008 г. 11:32
В ответ на: Подскажите кто нибудь как найти среднее значение в массиве рез-татов АЦП отправлено Frensis 07 октября 2008 г. 21:42


//// ПРОГРАММНЫЙ АНАЛОГ RC ФИЛЬТРА

// Два варианта:
// с действительными значениями
// с целыми значениями (быстрее)

#define FLOAT_KOEFF 20.0

float calc_filtr_RC_float (float tmp)
{
static float float_RC;

float_RC += (tmp - float_RC) / FLOAT_KOEFF;
return float_RC;
}


#define INT_KOEFF 16

int calc_filtr_RC_int (int tmp)
{
static int int_RC;

//int_RC += (tmp - int_RC + INT_KOEFF/2) / INT_KOEFF;
int_RC += (tmp - int_RC + INT_KOEFF/2) >> 4;
// Деление на 16 сдвигом, правильное округление при делении
return int_RC;
}

// Функция возвращает значение в INT_KOEFF
// больше (и точнее) чем входное значения
int calc_filtr_RC_int (int tmp)
{
static int int_RC;

//int_RC += tmp - ((int_RC + INT_KOEFF/2) / INT_KOEFF);
int_RC += tmp - ((int_RC + INT_KOEFF/2) >> 4);
// Деление на 16 сдвигом, правильное округление при делении
return int_RC;
}

//////////////////////////////////////////////////////////////////////////////
//// ОПРЕДЕЛЕНИЕ СКОЛЬЗЯЩЕГО СРЕДНЕГО

#define ARRAY_SIZE 20

int calc_skolz_sred (int tmp)
{
// В кольцевом массиве содержаться отдельные значения
static int Array[ARRAY_SIZE];

// Индекс элемента массива, в который будет записано очередное значение
static signed char index;

// Значение суммы отдельных значений
// (правильное значение бывает только один раз за цикл,
// после суммирования ARRAY_SIZE значений)
// (необходимо для периодической юстировки skolz_summ)
static int summ;

// Скользящее значение суммы ARRAY_SIZE отдельных значений
// (каждый раз правильное значение)
static int skolz_summ;


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;

//return (skolz_summ + ARRAY_SIZE/2) / ARRAY_SIZE;
return skolz_summ;
// Лучше пусть функция возвращает значение в ARRAY_SIZE
// больше (и точнее) чем входное значения
}




Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 12:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru