Ми фільтруємо виміряний сигнал

Привіт програмісти. Я підготував статтю про фільтрацію сигналів. Я не хочу говорити занадто багато про фільтрацію на початку, тому ми негайно перейдемо до дії.
Що станеться або що я побачу на осцилографі, коли пропущу ШІМ (прямокутний) сигнал у схему на рис. 1а, відповідно. Рис.1b?
Я подивився на відповідь безпосередньо на осцилографі. Я генерував сигнал з частотою 50 Гц з ШІМ. R1 = R2 = 50 Ом. C1 = 133nF.

мікрокомп


Рис.2 Результат підключення без конденсатора (згідно з рис. 1а)


Рис.3 Результат підключення з конденсатором (згідно з рис. 1b)

Отож коротко:
Конденсатор в ланцюзі діє як фільтр для більш високих частот. Опір конденсатора зменшується зі збільшенням частоти. Простіше кажучи, конденсатор з’являється на більш високих частотах, ніж коротке замикання. Згладжує гострі краї прямокутного сигналу. Чому? Якщо хтось чув про Фур'є, йому прийде в голову, що прямокутний сигнал можна простежити за допомогою непарних гармонічних синусоїдальних сигналів. Таким чином, прямокутний сигнал насправді являє собою скупчення синусоїд, при цьому частота першої гармоніки є частотою прямокутного сигналу. Швидкість заряджання конденсатора до постійного значення напруги залежить від параметрів R1 і C. Постійну часу ланцюга можна розрахувати за параметрами R1 і C. Постійна часу ланцюга - це час, протягом якого конденсатор заряджається до 63,2% від постійного значення. Постійна часу в три рази - це час, необхідний конденсатору, щоб зарядитися до 95,0% стаціонарного стану. Резистор R2 в ланцюзі служить лише дільником напруги. Це не впливає на RC-фільтр, утворений R1 і C.


Рис.4 Хід напруги на конденсаторі в RC-ланцюзі (експоненціальний хід)

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

Рис.4 Фільтр низьких частот, відповідно високі частоти та їх частотні характеристики

Докладніше про фільтри можна знайти де завгодно в Інтернеті. Знову ж таки, лише коротко, частотою відсікання є словацька частота відсікання фільтра. Частота розриву фільтра - це частота сигналу, при якій відношення амплітуди сигналу на виході до амплітуди сигналу на вході дорівнює 0,707 (затухання 3 дБ). Частота відсікання комірки RC обчислюється згідно наступного співвідношення: f0 = 1/(2πRC)

Отже, в моєму випадку, де R = 10 кОм і C = 133 нФ, частота відсічення становить f0 = 120 Гц.
Ви ще могли б багато про це писати, але я кажу про інше. Що робити, якщо у мене немає правильного значення конденсатора сигнального фільтра? Якщо у мене достатня обчислювальна потужність, я можу відфільтрувати прямокутний сигнал за допомогою програмного забезпечення. Як це зробити?
Перш за все, нам потрібно знати передавальну функцію фільтра низьких частот 1-го порядку. Хтось знає це з голови, а хтось знаходить в Інтернеті. Функцією передачі фільтра низьких частот 1-го порядку є:
H (s) = wc/(s + wc),
де wc - частота відсікання фільтра, wc = 2πf0.
Спочатку ми маємо дискредитувати цю функцію передачі. Я застосую білінійне перетворення та ту саму процедуру, що і в цьому документі на сторінці 13. Результатом є рівняння фільтра низьких частот 1-го порядку в дискретному вигляді.
y (n) = x (n) * b1 + x (n-1) * b2 - y (n-1) * a2
y (n) - поточне значення або вибірка на виході фільтра
x (n) - поточне вхідне значення або вибірка на вході фільтра
x (n-1) - попередній вхідний зразок
y (n-1) - попередній вихідний зразок
b1, b2 і a2 - коефіцієнти фільтра, які розраховуються відповідно до співвідношень, наведених у згаданому документі на сторінці 13.
Коли ми знаємо коефіцієнти фільтра, ми можемо перейти до програмування та тестування самого фільтра.

Опис програми:

Використовуючи таймер, я генерую ШІМ-сигнал з частотою 50 Гц і класом 0,5. Я подаю цей ШІМ-сигнал на дільник напруги R1 = R2 = 10 кОм без конденсатора. Я зчитував сигнал з дільника напруги перетворювачем АЦП. Датчик АЦП відбирає зразки на частоті 10 кГц. Під час переривання з кінця перетворення я зберігаю виміряне значення в полі, а також вдається обчислити поточне значення на виході фільтра. Коли я вимірюю та фільтрую 150 зразків таким чином, я надсилаю їх послідовним рядком на ПК і відображаю виміряний та відфільтрований сигнал у Excel.

Зразок коду:

Опис функції "фільтр":
Функція фільтра фільтрує виміряний сигнал точно відповідно до припису фільтра першого порядку, тобто наступним чином:
y (n) = x (n) * b1 + x (n-1) * b2 - y (n-1) * a2
Поточне вихідне значення дорівнює поточному виміряному значенню, помноженому на коефіцієнт B1 плюс попереднє вхідне значення, помножене на коефіцієнт B2, мінус попереднє вихідне значення, помножене на коефіцієнт A2.

Результат програми:

Рис.5 Вихід програмного фільтра

Висновок:

Використовуючи цифровий фільтр, мені вдалося відфільтрувати вхідний прямокутний сигнал так само, як за допомогою аналогового RC-фільтра. Я зміг просто розрахувати обчислення однієї ітерації фільтра на ATMEGE8 з тактовою частотою 8 МГц на 100us (10kHz), тобто на час між двома вибірками. Звичайно, весь розрахунок фільтра можна додатково оптимізувати. Є кілька варіантів. Можливо, у майбутньому я повернусь до цього прикладу і спробую трохи оптимізувати розрахунок, пришвидшити. У цій статті я хотів показати, хоча і трохи від швидкості, що виміряний сигнал можна дуже легко фільтрувати і на стороні MCU.

Переваги цифрового фільтра:

  • Незалежно від температури навколишнього середовища (і віку фільтра), що неможливо для аналогових компонентів
  • Його можна легко переналаштувати (перенастроїти) на інші частоти, просто змінивши коефіцієнти. Немає необхідності шукати відповідні значення та комбінації R і C.
  • Легко розробити цифрові фільтри вищого порядку або фільтри з характеристиками, які було б дуже складно створити за допомогою аналогових компонентів (потрібні лише основи математики, регулювання дробів).
  • Звичайно, цифрові фільтри також мають свої недоліки чи обмеження, наприклад, більше для тих, хто цікавиться тут

  • R1 = 10kΩ, R2 = 10kΩ, C1 = 133nF і пара кабелів
  • Дошка розробки Atmega 8.
  • Перетворювач USB в RS232
  • AVR STK500 як програміст

Стільки про цю статтю. Створюючи цю статтю, я дійшов висновку, що Atmega8 занадто короткий для деяких моїх ідей. Тому я, мабуть, найближчим часом перейду на інший MCU. Краще вже 32 біт. Я спробую пограти з деякими комунікаційними модулями і спробувати закрутити двигун постійного струму за допомогою Atmega8, а потім перейти на якийсь 32-розрядний MCU.