|
|
  |
STM32F4: цифровой фильтр АЦП |
|
|
|
Dec 29 2014, 04:12
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Цитата(kovigor @ Dec 26 2014, 16:30)  Делается. Если со схемотехникой и разводкой все в порядке, то этот метод вполне применим. Рискну спросить. А антиалиасный фильтр перед АЦП имеется ? Хотя бы простейшая RC - цепочка ? И насколько сложно будет исправить некорректно разведенную плату ? На входе АЦП простой резистивный делитель + кондер на GND На входе Vref рекомендуемая схема от ST Схема будет переделана в следующих ревизиях устройства, как только будут найдены источники помех и способы их устранения. Сейчас задача - улучших характеристики АЦП уже эксплуатируемых устройств (т.е. программно) Цитата(scifi @ Dec 26 2014, 17:02)  Вот простейший фильтр: CODE #define SHIFT 4 // filter time constant is T*2^SHIFT
static int acc;
// seed filter with initial value void filter_init(int a) { acc = a << SHIFT; }
// call this periodically and supply filter with input data void filter_advance(int a) { acc += a - (acc >> SHIFT); }
// filter output int filter_result(void) { return acc >> SHIFT; }
спасибо за пример. еще бы допереть как его использовать. можно в 2х словах?
|
|
|
|
|
Dec 29 2014, 06:58
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата спасибо за пример. еще бы допереть как его использовать. можно в 2х словах? идея в том что вы вызываете void filter_init(int a) с первым полученным от АЦП значением или 0 а далее каждое новое значение пихаете в void filter_advance(int a), и когда вам надо отфильтрованный результат, берете его в int filter_result(void) это обычная экспонента
|
|
|
|
|
Dec 29 2014, 09:21
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Цитата(adnega @ Dec 29 2014, 11:26)  Общеизвестно, что на сопротивление такого делителя накладываются ограничения. У вас R не больше предельного значения? В противном случае АПЦ превращается в показометр. плата разведена довольно неплохо, а вот схема питания устройства ( ... -> 5В -> 3.3В) так себе, соответственно Vref получается довольно шумным не смотря на фильтр. на самом деле железной частью устройства занимаюсь не я. я больше по программной части. Применил вышеописанный фильтр. Без подключенного измеряемого напряжения (на входе АЦП 0В): до применения показания были 0 - 0.3В после применения (результат берется из 100 измерений) 0.07-0.12В т.е. 0В никогда не бывает. В общем делаю вывод, что частота помехи слишком высокая и в измерения слишком часто попадают броски. Будь частота помехи пониже, от фильтра было бы больше пользы. Быть может у кого то еще появятся мысли о том, как мне победить помеху программным способом... Цитата(Golikov A. @ Dec 29 2014, 09:58)  идея в том что вы вызываете void filter_init(int a) с первым полученным от АЦП значением или 0
а далее каждое новое значение пихаете в void filter_advance(int a), и когда вам надо отфильтрованный результат, берете его в int filter_result(void)
это обычная экспонента спасибо. а чем такой способ отличается от медианного фильтра (в 2х словах, если не сложно) ?
|
|
|
|
|
Dec 29 2014, 09:30
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(k000858 @ Dec 29 2014, 12:21)  Применил вышеописанный фильтр. Без подключенного измеряемого напряжения (на входе АЦП 0В): до применения показания были 0 - 0.3В после применения (результат берется из 100 измерений) 0.07-0.12В т.е. 0В никогда не бывает. Можно предположить, что помеха настолько велика, что среднеквадратичное отклонение имеет порядок 0.1В, что и даёт такое среднее значение около 0 (потому что отрицательные значения на входе АЦП заменяются нулём, а положительные остаются). Это предположение нужно подтвердить. Оцифруйте 100...1000 отсчётов при ненулевом входе и посчитайте статистические показатели: среднее, мин., макс., среднеквадратичное отклонение. Если предположение подтвердится, то можно приподнять сигнал на входе АЦП ещё одним резистором (к Vref, например), чтобы сигнал на входе АЦП никогда не опускался ниже 0 даже в присутствии шумов. Ну а потом эту поправку от резистора учесть в расчётах, естественно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|