Усреднение

Views: 822


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

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

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

Мы получаем данные, затем берем, например 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 вполне приемлемо для многих проектов, где необходимо сгладить, усреднить, какие то данные например, с АЦП или с емкостного сенсора.



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


  • Оптосимистор и его применениеОптосимистор и его применение
    Views: 20206 Эрве Кадино “Цветомузыкальные установки” Ответ на вопрос – управление мощным тиристором или симистором, от терморегулятора. Статья в pdf[wpdm_file id=129 template=”link-template-calltoaction3.php”] Оптосимистор принадлежат к классу оптронов и обеспечивают очень хорошую …
  • Защита датчиков температуры DS18B20 от статического электричестваЗащита датчиков температуры DS18B20 от статического электричества
    Views: 1987 Статья перепечатана с сайта http://svetomuzyka.narod.ru При удалении датчика на большие расстояния возникает опасность наведения импульсов высокого напряжения на кабель, который соединяет датчик с контролером. Если не принимать меры защиты, …
  • Customs codes for exportCustoms codes for export
    Views: 378   Митні коди (HS Code) для надсилання посилок за кордон. Для відправки товару за кордон на сьогодні необхідно зазначати митні коди. Часто визначення коду займає багато часу. Для …
  • Просто о структурах и объединениях в СиПросто о структурах и объединениях в Си
    Views: 2360 Какие задачи нам позволяют решать структуры и объединения? Для разработчика встроенных систем эффективность и компактность кода всегда на первом месте. Если программировании на Ассемблере ты сам определяешь как …
  • Проект с использованием MCC часть 11Проект с использованием MCC часть 11
    Views: 1013 Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость …
  • MPLAB® Code ConfiguratorMPLAB® Code Configurator
    Views: 1820 MPLAB ® Code конфигуратор (MCC) является свободно распространяемым плагином, это графическая среда программирования, которая генерирует бесшовный, легкий для понимания кода на Cи, чтобы вставить его в свой проект.
  • Проект с использованием MCC часть 04Проект с использованием MCC часть 04
    Views: 1319 Теперь простого горения светиков нам не достаточно, заставим их мигать. Для начала используем первобытно простой способ, но достаточно простой. Используем функции delay, напрягаться откуда они берутся не будем, самое …
  • Проект с использованием MCC часть 05Проект с использованием MCC часть 05
    Views: 2195 Эту часть назовем так как избавься от delay, там где а это реально не надо. Для это нам потребуется научиться использовать прерывания и работать с таймерами. Что такое …
  • Просто о внешних переменныхПросто о внешних переменных
    Views: 944  Часто возникает задача когда необходимо предавать данные между модулями программы. Например, передать данные между файлами, или управлять работой модулей. Для этого создаем заголовочный файл и описываем наши переменные как …
  • Altium Designer – подготовка документации для производства и сборки печатных платAltium Designer – подготовка документации для производства и сборки печатных плат
    Views: 3998 В процессе освоения Altium Designer много возникает вопросов по подготовке документации для производства плат, а также для её сборки. Altium Designer позволяет сделать все требуемые документы, хотя скажем …



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