к. т. н., доцент кафедры
программного обеспечения
Исмаилов А. О.
магистрант специальности «ТМиО (по отраслям)»
Нуркин С. А.
Костанайский государственный университет имени
А. Байтурсынова
Казахстан, г. Костанай.
Цифровой
фильтр для работы с Arduino
Аннотация:
в
данной статье описывается способ построения фильтрации данных с датчиков
давления. В качестве управляющего элемента был использован инструмент для
проектирования электронных устройств Arduino.
Ключевые
слова: Arduino,
фильтр, цифровой фильтр, датчик, давление.
Фильтрация
призвана сделать работу вашего устройства более стабильной так как она
фильтрует фоновые шумы измерений, а также способна отфильтровать ложные
показания с датчика [1].
В
качестве источника плохого, сильно шумящего сигнала используется датчик
атмосферного давления на чипе BMP180.
В
данной работе, мы написали скетч в программе ArduinoIDE, который получает
значения с датчика, записывает их в переменную alt, а затем эту же переменную x выводит в порт, но выводит
специальным образом, чтобы мы могли построить по полученным данным график в
реальном времени. График мы строим с помощью программы SerialPortPlotter. Для того чтобы
пользоваться данной программой нужно соблюдать специальный синтаксис. Синтаксис
подробно описан в Help,
панель меню.
Далее
мы покажем, как фильтровать данные значения. Для фильтрации значении лучше
всего использовать фильтр Калмана. В программе ArduinoIDE мы написали скетч
упрощенного фильтра Калмана. В данном скетче у нас
описаны переменные, обеспечивающие работу фильтра.
Для
работы с данным фильтром необходимо вставить переменные в начало скетча, а
функцию фильтрации нужно вставить в конец скетча. Среднее отклонение значении
мы можем найти при помощи Excel,
для этого нужно получить нефильтрованные значения, вывести их в COMport, скопировать и
вставить в Excel.
Для этого мы должны загрузить в микроконтроллер скетч, но в этот раз удаляем
строчки отвечающие за построение графика в реальном времени (Serial.print("&");Serial.print(";");). Загружаем скетч
в микроконтроллер и включаем COMport[2].
Полученные
значения копируем и вставляем в блокнот, заменяем точки на запятые с помощью ctrl+f, это нужно потому что Excelне читает точки, а в COMport, дробные числа
разделены точкой. После того, как мы заменили все точки на запятые, вставляем
значения в Excelв
столб А1. В отдельной ячейке записываем формулу среднего отклонения =СТАНДОТКЛОН.Г(A:A),
среднего значения =СРЗНАЧ(A:A), максимальное значение =МАКС(A:A) и минимальное
значение =МИН(A:A).
Полученное
значение среднего отклонения записываем в функцию floatvarVolt. Функция floatvarProcess
– скорость реакции на изменение, подбирается вручную в процессе работы фильтра
с датчиком.Далее мы должны вывести график фильтрованных
значении и график нефильтрованных значений. Конечный
скетч выглядит таким образом
floatvarVolt = 0.25;
floatvarProcess = 0.05;
floatPc = 0.0;
float G = 0.0;
float
P = 1.0;
float
Xp = 0.0;
float
Zp = 0.0;
float
Xe = 0.0;
int baseline;
float
alt;
Adafruit_BMP085
bmp;
void
setup() {
Serial.begin(9600);
bmp.begin();
baseline=bmp.readAltitude();}
void
loop() {
alt=bmp.readAlttitude()-baseline;
float.filtered_x = filter(alt);
Serial.print("$");
Serial.print(alt);
Serial.print(" ");
Serial.print(filtered_x);
Serial.print(";");
}
{ float filter(float val)
Pc = P + varProcess;
G = Pc/(Pc + varVolt);
P = (1-G)*Pc;
Xp = Xe;
Zp = Xp;
Xe = G*(val-Zp)+Xp;
return(Xe);}
Скетч 1. Фильтрация значении датчика атмосферного
давления
Загружаем
скетч, запускаем SerialPortPlotter, в flotcontrole
ставим
2 графика и нажимаем подключится. Красным цветом, вы можете видеть, не фильтрованные
значения и желтым цветом фильтрованные значения.
При
заданных значениях графики не имеют особых различии. Для того чтобы наш
отфильтрованный сигнал выглядит более гладким, в написанном скетче мы должны
изменить функцию floatvarProcess – скорость реакции
на изменение. Изначально в функции floatvarProcess мы
установили скорость реакции равной 0,05. График покажет,
как измениться фильтрованный сигнал если в функции floatvarProcess
скорость реакции установить 0,005.
Шумы,
практически, полностью пропали. Острых пиков мы на результирующем графике не
наблюдаем. Мы имеем желтый график, который представляет собой отфильтрованный
красный график. На желтом графике отсутствуют резкие пики и сигнал выглядит
сглаженным. В данном методе есть проблема, а именно то что реакция на резкое
изменение довольно медленная, поэтому если красный график резко подскочит вверх
желтый график за ним подняться не успеет.
Если
вы хотите использовать данный фильтр в своем проекте, то необходимо обязательно
испытывать датчик в реальных условиях и функцию floatvarProcess
подбирать вручную. В данной работе мы использовали датчик давления BMP180, для этого датчик подойдет и
низкое значение функции floatvarProcess, так как
коэффициент изменяется довольно медленно. Он подойдет для измерения давления в
течении всего дня. Но если нам нужно зафиксировать вспышку давления, то
заданное нами значение floatvarProcess слишком мало,
то есть скорость измерения реакции должно быть намного выше.
Литература:
1.
http://www.poprobot.ru/theory/low_pass_filter Фильтр низких частот;
2.http://arduino.ru/forum/apparatnye-voprosy/filtratsiya-pomekh-impulsnogo-bpФильтрация
помех импульсного БП