УСРЕДНЕНИЕ – извечная проблема, кода данные на входе пляшут и надо выделить среднее значение.
Классически такая задача решается когда, в каком то массиве накапливаются данные, а потом находиться среднее из полученных данных. Но наличие массива может быть ограниченно размерам памяти микроконтроллера. поэму я в Инете нашел новый принцип и доработал его для этой задачи.
Суть заключается в чем:
Мы получаем данные, затем берем, например 1,5 часть. Из переменной СРЕДНЕЕ мы также вычитаем из нее её 1,5 часть, а затем прибавляем к СРЕДНЕЕ 1,5 измеренного из нового параметра. получается маленький компактный код, который можно применить на 8 битных контроллерах даже где нет операции аппаратного деления, для этого можно использовать функции сдвига.
в СИ он будет выглядеть такт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//====================================================================================== // 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; }// |
ну не забудь добавить константу (чаще всего константы достаточно)
1 |
#define INTEG 10 // глубина интеграции |
Вариант вычисление среднего для микроконтроллеров с малым объемов памяти например PIC10.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void averaging (void) { /*уменьшаем базовому уровень на 2^avdepth*/ avtemp=average; // divide(); // average-=avtemp; // /*получаем часть от freq 2^avdepth* и добавляем его к базовому уровню*/ avtemp=freq; // текущая частота divide(); // average+=avtemp; // } |
1 2 3 4 5 6 7 8 9 |
/*деление 2^n*/ void divide (void) { char a; for(a=0;a<avdepth;a++) { avtemp>>=1; } } |
где average – средняя величина которая вычисляется от переменной freq. степень усреднения зависит от константы avdepth
чем больше avdepth – тем медленнее будет расти average от изменения freq. Но не стоит её выбирать очень большой в пределе от 2 до 5 вполне приемлемо для многих проектов, где необходимо сгладить, усреднить, какие то данные например, с АЦП или с емкостного сенсора.
Это может быть интересно
ch-4000 – универсальная печатная плата
На смену устаревшей плате ch-3000, пришла новая ch-4000. Плату уже можно приобрести в магазине Ворон. Схема. Плата позволяет создавать таймеры, часы реального времени, регуляторы температуры, регуляторы влажности, вольтметры, дистанционное управление …Простой цифровой вольтметр ch-c3200
В этой статье рассмотрен пример создания простого вольтметра постоянного тока на основе печатной платы ch-c0030pcb, а при возможности использования внешнего делителя и вольтметр переменного тока. Дан краткий принцип построения цифровых …VU Meter Tower ART – part 2
Проект – VU Meter Tower ART получил продолжение в своем развитии. Теперь можно заказать набор деталей из акрила для самостоятельной сборки. В проект корпуса внесено целый ряд доработок, позволяющие улучшить …ch-4060 – регулятор температуры и влажности на датчике DHT11/DHT22/AM2302
На плате ch-4000 очень легко собрать устройство регулятора температуры и влажности. Датчик DHT11 самый недорогой вариант для создания такого устройства, правда точность его не велика, но для бытовых устройств он даже …Применение typedef, struct и union
Полезные описания переменных Часто необходимо в памяти расположить последовательно разные виды данных, что бы потом можно было их использовать. Полезные ссылки Взято и переработано с сайта http://www.butovo.com/~zss/cpp/struct.htm http://cppstudio.com/post/9172/ Синтаксис структур. …Обновление ESP8266 c ESPFlashDownloadTool_v3.6.3
Технология обновления следующая: Загружаем программу со страницы espressif.com. Разархивируем. Где находятся файлы, для прошивки? Заходим в каталоги Подключаем по схеме в статье WiFi ESP8266 (замыкаем BT2, перемычка). Запускаем программу, откроется два …Гаджеты для домашней автоматики – Датчик движения
Управление светодиодным освещением – Датчик движения. Данный гаджет предназначен для управления освещением рабочих столов (кухонных столов), освещение прихожих, освещение зеркал в прихожих, автоматическое включение света в коридорах. Датчик позволяет определить наличие …MPLAB® Code Configurator
MPLAB ® Code конфигуратор (MCC) является свободно распространяемым плагином, это графическая среда программирования, которая генерирует бесшовный, легкий для понимания кода на Cи, чтобы вставить его в свой проект. Метки:MPLAB® Code …Бегущие огни (ch-bo-36)
Проект на PIC-микроконтроллере PIC16F648A. Количество каналов 36. Для индикации используется подключение по матрице 6х6. Расположение светодиодов в одну линию. Все эффекты написаны для возможности увеличения количества светодиодов. Рекомендуется увеличивать кратно …Audio-bluetooth modules F-6188 (BK8000L)
Следующий модуль на чипе BK8000L. Заводское обозначение F-6188 также основным производителем не выпускается и отдан на тиражирование. с нижней стороны имеет маркировку В этом варианте мне попалась вроде полноценная прошивка. …
В записи нет меток.