SMA Filter(Simple moving average) - Простое скользящее среднее или арифметическое скользящее среднее

preview_player
Показать описание
Простое скользящее среднее, или арифметическое скользящее среднее (англ. simple moving average, англ. SMA) численно равно среднему арифметическому значений исходной функции за установленный период. В данном видео применим фильтр и посмотрим, как он поможет нам с обработкой внутреннего шума АЦП микроконтроллера.

00:00 Вступление
01:32 Создание проекта
05:45 Написание примера по замеру АЦП + фильтрация сигнала
18:53 Вычисление напряжение на входе канала АЦП
Рекомендации по теме
Комментарии
Автор

Первое что бросилось в глаза:
SMA_Filter_Result = SMA_Filter_Result >> 5u;
Человек качает библиотеку и меняет
#define SMA_FILTER_ORDER 48
Всё. Приехали.

Во вторых - зачем долбать контроллер вызовами прерываний, если выдёргиваем данные только 1 из 300? Просто настраиваем время срабатывания прерывания по TIM4.

В третьих - что-то намудрили Вы в функции фильтрации. Нафига что-то смещать?
Просто пишем:
uint16_t SMA_FILTER_Get_Value(uint16_t *SMA_Filter_buffer, uint16_t *RAW_Data) {
static uint32_t SMA_Filter_Result;
static uint16_t index_raw_buff;

index_raw_buff++; if { index_raw_buff=0; }
= *RAW_Data;
SMA_Filter_Result = 0;
for (uint16_t i = 0; i < SMA_FILTER_ORDER; i++) {
SMA_Filter_Result += SMA_Filter_buffer[i];
}
return
}

sozdatelEd
Автор

Отлично, поздравляю за етот ролик. Буду пользовать в будушем проекте етот замечательный филтер.

edmelectronics
Автор

Взял на заметку. Спасибо!! Как раз сейчас буду использовать в проекте показания датчика давления жидкости. Сделал как раз схему по твоей наводке с ОУ и делителем.

dr.emmettbrown
Автор

можно еще сортировать буфер по возростанию, потом отбрасывать самые маленькие и самые большие значения (шум) остальное усреднять как у тебя на видео. Но будет медленнее из-за сортировки.

PastuhMedvedey
Автор

мы делаем весы, и с АЦП наморочились очень сильно. Единственное что важно сделать это опорное очень хорошее, есть специальные микры под опорку. MCP1725 что то там. И второе это правильно подобрать кондеры по входу измерения, тут не работает чем больше емкость тем лучше. Нужно правильно подобрать, чтоб не плыло и тд)
а так да, нужен только цифровой фильтр

openFrimeTv
Автор

Первое что бросилось в глаза:
SMA_Filter_Result = SMA_Filter_Result >> 5u;
Человек качает библиотеку и меняет
#define SMA_FILTER_ORDER 48
Всё. Приехали.



Во вторых - зачем долбать контроллер вызовами прерываний, если выдёргиваем данные только 1 из 300? Просто настраиваем время срабатывания прерывания по TIM4.



В третьих - что-то намудрили Вы в функции фильтрации. Нафига что-то смещать?
Просто пишем:
uint16_t SMA_FILTER_Get_Value(uint16_t *SMA_Filter_buffer, uint16_t *RAW_Data) {
static uint32_t SMA_Filter_Result;
static uint16_t index_raw_buff;

index_raw_buff++; if { index_raw_buff=0; }
= *RAW_Data;
SMA_Filter_Result = 0;
for (uint16_t i = 0; i < SMA_FILTER_ORDER; i++) {
SMA_Filter_Result += SMA_Filter_buffer[i];
}
return
}

sozdatelEd
Автор

хмм... странно... а куда комментарии пропадают с конструктивной критикой?
ведь библиотека не идеальна. зачем народ вводите в заблуждение?

sozdatelEd
Автор

привет. увидел у тебя pycharm установлен. не будели уроков по пайтону в связке с МК?

Жизньспаяльником
Автор

DMA у вас работает в циклическом режиме, как вы получаете 100 кГц. И зачем в прерывание стартуте DMA оно уже работает?

ОлегАсмолов-йн