Усреднение

Views: 825


УСРЕДНЕНИЕ – извечная проблема, кода данные на входе пляшут и надо выделить среднее значение.

Классически такая задача решается когда, в каком то массиве накапливаются данные, а потом находиться среднее из полученных данных. Но наличие массива может быть ограниченно размерам памяти микроконтроллера. поэму я в Инете нашел новый принцип и доработал его для этой задачи.

Суть заключается в чем:

Мы получаем данные, затем берем, например 1,5 часть. Из переменной СРЕДНЕЕ мы также вычитаем из нее её 1,5 часть, а затем прибавляем к СРЕДНЕЕ 1,5 измеренного из нового параметра. получается маленький компактный код, который можно применить на 8 битных контроллерах даже где нет операции аппаратного деления, для этого можно использовать функции сдвига.

в СИ он будет выглядеть такт:

//======================================================================================
// subroutine: среднее число
// входные данные		staroe - старое значение переменой,
//				novoe - новое измеряемое значение
// старое значение уменьшается на коэффициент INTEG
// а затем увеличивается на величину нового/INTEG
signed int averageg (signed int staroe, signed int novoe)
{
    if(staroe<=INTEG && staroe>0)
    {
        staroe=staroe-1;
    }
    else   staroe=staroe-staroe/INTEG;
    staroe=staroe-(staroe/INTEG);
    staroe=staroe+(novoe/INTEG);
return staroe;
}//

ну не забудь добавить константу (чаще всего константы достаточно)

#define INTEG 10	// глубина интеграции

 


Вариант вычисление среднего для микроконтроллеров с малым объемов памяти например PIC10.

void averaging (void)
{
        /*уменьшаем базовому уровень на 2^avdepth*/
        avtemp=average;             //
        divide();                   //
        average-=avtemp;            //

        /*получаем часть от freq 2^avdepth* и добавляем его к базовому уровню*/
        avtemp=freq;                // текущая частота
        divide();                   //
        average+=avtemp;            //

}
/*деление 2^n*/
void divide (void)
{
char a;
    for(a=0;a<avdepth;a++)
    {
        avtemp>>=1;
    }
}

где average – средняя величина которая вычисляется от переменной freq. степень усреднения зависит от константы avdepth

чем больше avdepth – тем медленнее будет расти average от изменения freq. Но не стоит её выбирать очень большой в пределе от 2 до 5 вполне приемлемо для многих проектов, где необходимо сгладить, усреднить, какие то данные например, с АЦП или с емкостного сенсора.



Это может быть интересно


  • Проект с использованием MCC часть 02Проект с использованием MCC часть 02
    Views: 2464 Когда мы запустили конфигуратор, самое главное понять, что с этим делать и как проверить, то что мы делаем работает или нет. Для начала настроим регистры конфигурации микроконтроллера и настроем …
  • Проблемы классической светомузыкиПроблемы классической светомузыки
    Views: 2200 Светомузыка – что это такое? Определение: Светомузыка  (жаргонное: цветомузыка)  — вид искусства, основанный на способности человека ассоциировать звуковые ощущения со световыми восприятиями. Такое явление в неврологии получило название …
  • MPLAB® Harmony – или как это просто! Часть 3.MPLAB® Harmony – или как это просто! Часть 3.
    Views: 2282 Часть третья – копнём немного глубже. Вы наверное заметили, что во второй главе, вроде сначала все шло как по маслу, а потом, что бы заморгали светики, я вставил …
  • Регулятор влажностиРегулятор влажности
    Views: 1385 Регулятор ILLISSI-CH-1000 предназначен для контроля и регулировки относительной влажности в диапазоне от 0 до 100%. Регулятор позволяет работать как в режиме осушения, так и увлажнения. Для измерения возможно …
  • DS18B20 – удаленный контроль температурыDS18B20 – удаленный контроль температуры
    Views: 3248 Контроль температуры с использованием датчиков температуры DS18B20 и платы ILLISSI-4B-09-primum Проект позволяет подключать к плате ILLISSI-4B-09-primum до 16 датчиков температуры DS18B20, удаленных более 300 метров,  и выводить информацию …
  • ESP8266  процедура получение данных даты и времени от серверов точного времени.ESP8266 процедура получение данных даты и времени от серверов точного времени.
    Views: 6271 Эта функция доступна уже в версии 1.6.1. Для многих приложений, необходимо часы реального времени,  если в вашем проекте есть модуль WiFI ESP8266, то легко можно сделать следующим образом. …
  • LCD индикаторы на драйвере ML1001LCD индикаторы на драйвере ML1001
    Views: 2056  ML1001 – статический LCD GOG (чип в стекле) драйвер для 40-сегментного LCD в позолоченном противоударном исполнении. На них можно каскадно строить цельные из 80 или 120 сегментов LCD индикаторы. …
  • Сенсорный выключатель светаСенсорный выключатель света
    Views: 16550 Хотя в настоящий момент актуальны системы управления освещением с передачей данных по электросети, но я думаю, что проекты такого рода тоже имеют право на жизнь. Анонс Три вида …
  • TM1650 драйвер LED семисегментного индикатораTM1650 драйвер LED семисегментного индикатора
    Views: 18499 UPDATES 2025/10/10 Китайский производитель Shenzhen Titan Micro Electronics Co., Ltd.  Выпускает широкую линейку драйверов управления светодиодными дисплеями, которые позволяют разгрузить микроконтроллер для основной работы, главная особенность этих драйверов …
  • CAN – Controller Area NetworkCAN – Controller Area Network
    Views: 1264 Controller Area Network (CAN) первоначально был создан немецким поставщиком автомобильных систем Робертом Бош в середины 1980-х для автомобильной промышленности как метод для обеспечения возможности надежной последовательной связи. Целью было сделать автомобили более надежными, …



Поделись этим!