Алгоритъм за цифров филтър

Много цифрови устройства използват ADC за преобразуване на аналогови сигнали. Аналоговите сигнали често съдържат нежелан високочестотен шум.
За „почистване“ на сигнала от този шум се използват аналогови RC нискочестотни филтри, които се инсталират след източника на сигнала. Този подход не винаги е идеален и практичен. Например, големите константи на времето изискват големи R и C стойности.
Като алтернатива можете да "почистите" шумния сигнал с цифровия еквивалент на аналогов RC нискочестотен филтър.

Всъщност програмата за този цифров филтър се състои само от два реда в C:

Dacc = Dacc + Din - Dout
Dout = Dacc/K

където Dout е изходната стойност на филтъра, Din е входната стойност на филтъра, K е постоянен коефициент, който се изчислява по формулата:

K = T x SPS

където T е времевата константа на филтъра, SPS е честотата на вземане на проби ADC.

Dacc и Dout трябва да запазят своите стойности след изпълнението на алгоритъма. Ако алгоритъмът е реализиран като функция, тогава тези променливи могат просто да бъдат направени статични.

За 8-битови входове алгоритъмът за цифров филтър в C код може да изглежда така:

За по-голяма яснота разгледайте реален пример за използване на този алгоритъм в микроконтролера AVR atmega16. Да кажем, че искаме да симулираме RC филтър с времева константа 0,001 s. Диаграмата е показана на фигурата по-долу.

R1 = 10 kΩ
C1 = 0,1 μF
Trc = R1 * C1 = 10000 Ohm * (0.1/1000000) Ф = 0.001 s
F = 1/(2 * Pi * R1 * C1) = 1/(6,28 * Trc) =

Тактовата честота на модула ADC в микроконтролерите AVR зависи от неговата тактова честота и вътрешния предскалер. Да приемем, че нашият микроконтролер е тактиран от вътрешен генератор с честота 8 MHz, а предусилвателят в модула ADC е зададен на 64. Тогава тактовата честота на модула ADC ще бъде:

Fadc = Fcpu/Pre = 8 000 000/64 = 125 000 Hz

От тази честота можете да изчислите ADC честотата на вземане на проби, когато работите в режим на непрекъснато преобразуване. Тя е равна на съотношението на тактовата честота на ADC към броя тактови цикли, необходими за извършване на едно преобразуване. От листа с данни можете да разберете, че една трансформация се извършва в 13 тактови цикъла (ако това не е първата трансформация).

Fs = Fadc/n = 125000/13 =

И така, честотата на вземане на проби е 9600 Hz, а времевата константа е 0,001 s. Факторът на филтъра ще бъде:

K = SPS x T = 9600 * 0,001 = 9,6 =

Сега всички данни са известни и можете да напишете тестова програма за проверка на алгоритъма.

Направих тази програма много проста. ADC работи в режим на непрекъснато преобразуване. В прекъсването резултатът от 8-битовото преобразуване се обработва от алгоритъма и се записва към порт C. Порт C е свързан към DAC веригата R-2R въз основа на резистори, за да можете да сравните получения сигнал със сигнала от аналоговия RC филтър. Тактовата честота на микроконтролера atmega16 е 8MHz, коефициентът на ADC за предскалиране е 64. Тестовата схема е показана на фигурата по-долу.

обикновен


Код на програмата

Резултат от симулация

Резултатът от симулацията на програмата в Proteus е показан на фигурата по-долу. Червеният сигнал е входната квадратна вълна с честота 200 Hz, синият сигнал е сигналът на изхода на RC филтъра с времева константа 0,001 s, а жълтият е сигналът, обработен от микроконтролера. Той има стъпаловидна форма, тъй като не е филтриран след DAC.

Както можете да видите от фигурата, формата на сигнала на микроконтролера доста точно повтаря сигнала от изхода на RC филтъра.

вземане проби

За най-бърза производителност, коефициентът K е по-добре да изберете кратно на степен 2 (например 2, 4, 8 .), тогава компилаторът ще замени операцията на разделяне с отмествания. В противен случай при висока честота на вземане на проби микроконтролерът може да няма време да изчисли следващата изходна стойност на филтъра. Сблъсках се с това, докато моделирах.
Също така е необходимо да се вземе предвид моментът, че при големи стойности на коефициента K променливата Dacc трябва да има достатъчен капацитет, така че да не прелива.