Филтрираме измерения сигнал
Здравейте програмисти. Подготвих статия за филтриране на сигнала. Не искам да говоря твърде много за филтриране в началото, така че веднага ще преминем към действието.
Какво ще се случи или какво ще видя на осцилоскопа, когато пусна ШИМ (правоъгълен) сигнал във веригата на фиг. 1а, респ. Фиг. 1б?
Погледнах отговора директно на осцилоскопа. Генерирах сигнал с честота 50Hz с ШИМ. 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 dB затихване). Честотата на прекъсване на RC клетката се изчислява съгласно следната връзка: f0 = 1/(2πRC)
Така че в моя случай, където R = 10kΩ и C = 133nF, граничната честота е f0 = 120Hz.
Все още бихте могли да пишете много за това, но аз говоря за нещо друго. Какво ще стане, ако при мен няма точната стойност на кондензатора на сигнален филтър? Ако имам достатъчна изчислителна мощност, мога да филтрирам правоъгълния сигнал чрез софтуер. Как да го направя?
На първо място, трябва да знаем предавателната функция на нискочестотния филтър от 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 Hz и клас 0,5. Подавам този ШИМ сигнал на делител на напрежение R1 = R2 = 10 kΩ без кондензатор. Четох сигнала от делителя на напрежението от преобразувателя ADC. ADC преобразувателят взема проби с честота 10 kHz. В прекъсването от края на преобразуването запазвам измерената стойност в полето и също успявам да изчисля текущата стойност на изхода на филтъра. Когато измервам и филтрирам 150 проби по този начин, ги изпращам чрез серийна линия към компютър и показвам измерения и филтриран сигнал в Excel.
Пример за код:
Описание на функцията "филтър":
Функцията на филтъра филтрира измерения сигнал точно според предписанието на филтъра от първи ред, т.е. както следва:
y (n) = x (n) * b1 + x (n-1) * b2 - y (n-1) * a2
Текущата изходна стойност е равна на текущата измерена стойност, умножена по коефициента B1 плюс предишната входна стойност, умножена по коефициента B2 минус предишната изходна стойност, умножена по коефициента A2.
Резултат от програмата:
Фиг.5 Изход на софтуерен филтър
Заключение:
Използвайки цифров филтър, успях да филтрирам входния правоъгълен сигнал по същия начин, както при използване на аналогов RC филтър. Току-що успях да изчисля изчислението на една итерация на филтъра на ATMEGE8 с тактова честота от 8 MHz в 100us (10kHz), т.е. във времето между две проби. Разбира се, изчисляването на целия филтър може да бъде допълнително оптимизирано. Има няколко опции. Може би в бъдеще ще се върна към този пример и ще се опитам да оптимизирам малко изчислението, да ускоря. Исках да покажа в тази статия, макар и малко от скоростта, че измереният сигнал може много лесно да се филтрира и от страната на MCU.
Предимства на цифровия филтър:
- Независимо от околната температура (и възрастта на филтъра), което не е възможно при аналоговите компоненти
- Той може лесно да се преконфигурира (пренастрои) на други честоти, като просто се променят коефициентите. Не е необходимо да се търсят подходящи стойности и комбинации от R и C.
- Лесно е да се проектират цифрови филтри от по-висок ред или филтри с характеристики, които би било много трудно да се създадат с помощта на аналогови компоненти (необходими са само основите на математиката, настройка на фракциите).
- Разбира се, цифровите филтри също имат своите недостатъци или ограничения, повече за тези, които се интересуват тук, например
- R1 = 10kΩ, R2 = 10kΩ, C1 = 133nF и чифт кабели
- Съвет за разработка на Atmega 8.
- USB към RS232 конвертор
- AVR STK500 като програмист
Толкова за тази статия. Докато създавах тази статия, стигнах до извода, че Atmega8 е твърде кратък за някои от моите идеи. Затова вероятно ще премина към друг MCU в близко бъдеще. Най-добре вече 32 бита. Ще се опитам да играя с някои комуникационни модули и ще се опитам да завъртя DC-мотора с Atmega8 и след това да премина към някакъв 32-битов MCU.