Шановні друзі!
26 та 31 грудня магазин працюватиме до 16 години. 1 та 2 січня магазин працювати не буде.
Вітаємо всіх з Різдвом та Новим Роком!
Мобільна версія Форум Arduino Документація Гарантійні умови 0 0
UA RU
Графік роботи магазину:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Нд: вихідний
Каталог
Напиши статтю і отримай знижку!

Фільтруємо сигнал акселерометру

2021-06-18

Всі статті →

О. Чечин

Величезною технічною проблемою є те, що сигнал, який надходить з будь-якого датчика, є завжди випадковою величиною, яка коливається навколо реального значення.

Це пояснюється двома причинами. По-перше, чутливі елементи датчика це напівпровідникові або механічні пристрої, а вони не є ідеальними. Напівпровідники містять сторонні домішки, мають мікроскопічні дефекти і "шумлять" при роботі, а механічні пристрої теж мають недоліки: люфти, тертя та ін. По-друге, будь який рух датчика викликає вібрацію, кидки та інше динамічне неподобство. Тому на виході датчика ми маємо скоріше коливання, ніж плавну зміну величини що міряється.

Спробуємо підключити до Arduino акселерометр - пристрій який вимірює прискорення. Його назва походить від от латинского слова Ассеlего - прискорюю.

Акселерометр реєструє прискорення об'єкту на якому він стоїть, не розрізняючи, що стало причиною прискорення: сила гравітації або зовнішня сила прикладена до датчика. За допомогою акселерометру ми легко можемо дізнатися кути нахилу нерухомого об'єкту щодо поверхні землі.

Конструкція простішого акселерометру складається з маси та пружин. Величина відхилення маси від сталого положення буде пропорційна прискоренню.

Акселерометри використовуються в техніці давно і дуже широко. Вони стоять на літаках, кораблях, ракетах, космічних апаратах, мобільних телефонах і навіть в іграшках. Ось як виглядав механічний авіаційний акселерометр 70 років тому, він показував пілоту перевантаження під час маневрування:

  1. Інерційна маса.
  2. Пружина.
  3. Вал.
  4. Зубчатий сектор.
  5. Зубчате колесо.
  6. Стрілка.

Сучасні акселерометри вбудовуються в середину мікросхем. Наприклад, аналогова мікросхема ADXL335 містить три мікромеханічних акселерометра.

Принцип роботи таких акселерометрів доволі простий. Рух мікроскопічних мас міняє ємності конденсаторів, вони вимірюються вбудованою електронною схемою та видаються у вигляді напруг на виводи мікросхеми.

Технічні характеристики ADXL335:

  • Струм споживання - 350 мкА,
  • Діапазон вимірювань - ±3,6 g,
  • Чутливість - 300 мВ/g
  • Робоча напруга - 3,3 В

Схема підключення акселерометру ADXL335

Напишемо просту програму, яка читає дані з виходу "Х".

Текст програми:

Подивимся в "Плоттері по послідовному з'єднанню" на дані з акселерометру ADXL335, коли він нерухомо лежить на столі:

А ось як виглядає сигнал з акселерометру, який рухається:

Випадкові стрибки і коливання спотворюють реальний сигнал і збудувати на ньому якийсь корисний пристрій просто неможливо.

Для згладжування коливань фахівці застосовують спеціальні засоби - фільтри, які придушують небажані викиди сигналу та наближають його до реальної величини.

Розглянемо один з простих й найпоширеніших фільтрів - фільтр низьких частот (ФНЧ) або Low Pass Filter, який пропускає коливання тільки низьких частот і зменьшує амплітуду викидів сигналу.

З електричної точки зору фільтр НЧ реалізується такою схемою

Однак в епоху мікроконтролерів нас цікавить не схемна, а програмна реалізація такого фільтру. Вона будується на основі алгоритму, в якому на кожній ітерації циклу вимірювання потрібно обчислити наступний вираз:

fs = (1-К) * fs + К * S

де:

fs - відфільтрований сигнал;

S - сигнал з датчика;

К - коефіцієнт фільтру - число від 0 до 1.

Саме коефіцієнт K визначає, які коливання придушувати, а які слід пропустити з мінімальними змінами. Чим більше K - тим слабкіше фільтр, і тим більш високі коливання він пропускає. Чим меньше К - тим сильніше фільтр, тим гладше буде результат.

Для усунення шуму вихідного сигналу акселерометру скористаємося цим фільтром. Програма читає прискорення з акселерометра, фільтрує його та виводить в "Монітор порта" (fs). Для порівняння поруч виводиться і нефільтрований сигнал - S.

Відкриємо "Плоттер по послідовному з'єднанню" та подивимось на результат. Червона крива - сигнал після фільтрації, а синя - сигнал до фільтрації.

Вочевидь, що фільтр значно придушує небажані стрибки сигналу і покращує криву.

Покази акселерометра стали більш придатними для подальшого використання. Невеличка затримка, зсув по фазі між сигналами, пов'язана з інтегральною природою фільтра.

Нарешті можна братися за реальні проекти з використанням акселерометру.

Далі буде...

Ваша оцінка статті:

Відмінно
Добре
Задовільно
Погано
Дуже погано

Загальна оцінка:

Оцінка "Фільтруємо сигнал акселерометру"
4 з 5
зроблена на основі 4 оцінок 4 клієнтських відгуків.

Дякуємо Вам за звернення! Ваш відгук з'явиться після модерації адміністратором.
TeleX
03.07.2021 13:20:23
Дуже дякую. Використав Вашу технологію для фільтрації зчитаних з фоторезистора значень для керування яскравістю семисегментного дисплея на MAX7219. Раніше інколи виникало мерехтіння дисплея. Після дослідження з допомогою плоттера, виявилася величезна розбіжність зчитаної величини, особливо при штучному освітленні. Використання функції map (перерахування діапазону) тільки погіршувало ситуацію, бо 16 градацій керування яскравістю, це не так багато, як може здатися, особливо в нижній частині діапазону. Фільтрація повністю викоренила проблему, найкращий результат при коеффіціенті 0.01. Реакція системи з затримкою виключає мерехтіння корінним чином. Ще раз дякую за ідею та реалізацію.
akapulko
21.06.2021 11:51:53
* для адміністратора: fs =..... !!!!!!!!!!!!!!!!!!!!!!!!! (плюс рівно). Другого разу я точно ставив !
akapulko
19.06.2021 17:26:55
Перепрошую, в останньому виразі, звісно ж, мається на увазі: fs = (S >> 4) - (fs >> 4)
akapulko
19.06.2021 00:42:12
Використання float - невиправдано. А якщо так:uint16_t fs = 0;.....fs = (S >> 4) - (fs >> 4)?
оплата картами Visa і MasterCard