Easyelectronics.ru • Просмотр темы - Как правильно усреднять значения полученные с датчика

Easyelectronics.ru

Электроника для всех
Текущее время: 19 авг 2018, 21:52

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Как правильно усреднять значения полученные с датчика
СообщениеДобавлено: 09 май 2018, 17:09 
Только пришел

Зарегистрирован: 07 фев 2018, 15:20
Сообщения: 21
Преподаватель в институте дал решить задачку просто ради интереса,не привязанную к какому то конкретному устройству. Предположим,у нас есть датчик с которого мы считываем значения ну или выходные данные АЦП. Нам нужно отлавливать изменения этих значений и если они есть то записывать их в долгосрочную память(ну например sd карту) вместе с данными с часов реального времени,чтоб знать когда значения меняются. Вот например есть выходное значение датчика : 10 плюс минус 2,то есть диапазон 8..12.Мы и должны ловить всё что выходит за эти границы.Проблема в том,что диапазон меняется в течение дня,то есть утром это 8..12,вечером 7..11,а ночью например 6..9. Поэтому прост записать в микропроцессор ловить значения больше 12 и меньше 8 нельзя,нужен какой-то универсальный алгоритм.Сказал что делать надо через усреднение. Но я не понимаю как можно усреднять значения с датчика,если при усреднении все выходы из диапазона меняются. Вот пример моего кода просто как первоначальная идея

Код:
const    int size = 10;   //число измерений
double  arr[size];        //массив для измерений
double   sum=0;         //сумма измерений
double   average;       //среднее значение

for (int i=0;i<size;i++)     //в цикле считываем значения.Функция getvalue это просто как пример
     arr[i] = getvalue();     

for (int i=0;i<size;i++)    //потом находим сумму
     sum += arr[i];

average = sum/size;   //находим среднее знаение

for (int i=0;i<size;i++)    //и тут если значение выходит выше за среднее то мы его запоминаем
     if (arr[i]>average)
     save(arr[i]);


но это не работает вообще,потому то если,например мы имеем
12 - 11 - 10 - 8 - 9 - 12 - 11.5 - 10 - 9 - 8
то их среднее будет 10.05
а всё что больше него будет 12 - 11 - 12 - 11.5
притом что в диапазоне вообще нет значений которые следовало бы записывать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно усреднять значения полученные с датчика
СообщениеДобавлено: 09 май 2018, 17:16 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 4676
Делайте среднее (сумма/N) за большой интервал (1 час) и от него ставьте границы +/-2. При этом, полученное "среднее" надо сглаживать с предыдущими "средними" - это даст огибающую изменения среднего в течении дня. При правильных к-тах сглаживания, вы получите то, как меняется величина в течении дня (у вас: 10-8-7).

Но, если делать плохо и быстро, можно всё упростить - скажем, есть отсчеты за последние 2 часа (много отсчетов). Считаете среднее, а потом всё, что выше +/-2 записываете в лог.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно усреднять значения полученные с датчика
СообщениеДобавлено: 09 май 2018, 17:22 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1919
Возможно ваш преподаватель имел в виду вот это: https://en.wikipedia.org/wiki/Moving_average
К слову, для экспоненциального варианта скользящего среднего реализация особенно проста и не требует никаких массивов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно усреднять значения полученные с датчика
СообщениеДобавлено: 09 май 2018, 19:16 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 3722
Откуда: г. Липецк
evsi писал(а):
...для экспоненциального варианта скользящего среднего реализация особенно проста и не требует никаких массивов.

Это не так, скользящее среднее расчитывается в массиве из N чисел. Массив при этом должен иметь структуру FIFO и обновляться перед расчетом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно усреднять значения полученные с датчика
СообщениеДобавлено: 09 май 2018, 19:24 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1919
anakost писал(а):
evsi писал(а):
...для экспоненциального варианта скользящего среднего реализация особенно проста и не требует никаких массивов.

Это не так, скользящее среднее расчитывается в массиве из N чисел. Массив при этом должен иметь структуру FIFO и обновляться перед расчетом.

Я ведь написал, что речь идет об одном из подвидов - экспоненциальном скользящем среднем. При желании вы легко можете прочитать это в вики, я даже линк привел.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как правильно усреднять значения полученные с датчика
СообщениеДобавлено: 21 май 2018, 22:06 
Заглядывает иногда

Зарегистрирован: 04 сен 2014, 12:44
Сообщения: 82
данные с датчиков адекватно усредняются методом наименьших квадратов, например МНК второго порядка будет достаточно, ну или методом сплайна, но погрешность будет больше.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB