Главная » Статьи » Полезная информация |
Как известно, при измерении чего-либо возникает погрешность, влияющая на результат измерений. Будь то температура, измеренная с помощью специализированного датчика, или же напряжение измеренное аналого-цифровым преобразователем. Ничего идеального не бывает и поэтому на выходе мы получаем прыгающие значения. В радиолюбительской практике, для избавления от подобного, чаще всего применяют простое сглаживание: берут результат нескольких измерений и находят среднее значение, на выходе получая данные без резких скачков. Этот алгоритм прост и понятен любому человеку, окончившему школьную программу по математике. Но в этом методе кроется куча недостатков, такие как необходимость делать большое количество измерений для приемлемого результата или же отсутствие связи между текущим результатом и предыдущими. Не так давно, открыл для себя один интересный метод фильтрации, который лишён этих недостатков. Этот метод носит имя американского математика Рудольфа Калмана и способен давать значение максимально приближенное к реальному. Такие результаты достигаются благодаря тому, что система может учитывать управляющее воздействие на систему, если известны свойства этого воздействия. К примеру, двигаясь в автомобиле и получая текущие координаты по GPS, мы сможем увеличить точность определения положения, если будем учитывать скорость и направление движения автомобиля, предугадывая где будет находится автомобиль в следующий момент времени. Скорость в свою очередь зависит от степени нажатия на педаль газа. И это все можно заложить в алгоритм фильтра, в конечном итоге получая более точные координаты, нежели полученные от одного GPS приемника. Подробней о реализации и о возможностях этого метода, советую прочитать здесь и вот здесь. Целью же этой статьи показать, как можно реализовать в bascom-avr фильтр Калмана, в упрощенном варианте. Очень упрощенном. Здесь не будет матриц и многоэтажных уравнений, способных нанести нормальному человеку травму мозга. А будет всего одна формула, которая выводится из всей горы матриц, при условии если мы пренебрежем расчетом управляющего воздействия. Формула в конечном итоге имеет следующий вид:
где - результирующее значение текущего вычисления, - коэффициент стабилизации, - исходное значение текущего измерения, - результирующее значение предыдущего вычисления. как видно, все что требуется подобрать это коэффициент стабилизации, он должен быть больше 0 и не больше 1. Чем меньше коэффициент, тем сильнее сглаживаются данные, но при этом увеличивается время стабилизации. Вот небольшой пример, показывающий поведение результирующей кривой, при разных коэффициентах:
Это все теория, теперь перейдем к практике. Для испытания я взял аналоговый акселерометр ADXL335 и подключил его к микроконтроллеру ATMega8, считывание данных идет через АЦП.
Тестовый код в Bascom-AVR
$regfile = "m8def.dat" 'микроконтроллер ATmega8
$crystal = 8000000 'частота работы 8МГц $baud = 9600 'скорость передачи 9600 бод $hwstack = 32 $swstack = 32 $framesize = 32 'конфигурируем АЦП Config Adc = Single , Prescaler = 128 , Reference = Internal Dim R As Word 'переменная R в которую будем записывать показания с АЦП declare sub kalman 'объявляем подпрограмму фильтрации 'переменные для фильтра dim Mn as single 'результирующее значение dim An as Single 'исходное значение dim Mn1 as Single 'результат вычисления в предыдущей интерации dim k as single 'коэффициент стабилизации k = 0.1 'устанавливаем коэффициент Start Adc Do R = Getadc(0) 'считывание данных с акселерометра An = R call Kalman 'вызываем подпрограмму фильтрации Print R ; ";" ; round (Mn) 'отправляем данные в терминал Waitms 50 Loop End 'подпрограмма фильтрации sub Kalman Mn = k * An An = 1 - k Mn1 = Mn1 * An Mn = Mn + Mn1 Mn1 = Mn end sub
Полученные данные отправляются в терминал и в экселе строятся графики. Чтобы искусственно ввести шум в систему, плату с датчиком прикрепил к двигателю своего сверлильного станка.
Вибрация от двигателя передалась акселерометру и вот что получилось в результате: синий - исходный сигнал, красный - после фильтрации Как видно, метод очень даже хорош. Конечно и здесь есть свои недостатки, но простота реализации делает его одним из самых популярных методов фильтрации.
| |
Просмотров: 24329 | Комментарии: 25
| Теги: |
Всего комментариев: 25 | ||||||||||||||||||
| ||||||||||||||||||
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |