Cewki i wzmacniacze operacyjne pozwalają na tworzenie bardzo interesujących układów, takich jak słynny filtry częstotliwości. Filtry te mają wiele zastosowań w przemyśle elektronicznym. Podobnie jak w przypadku filtra dolnoprzepustowego, górnoprzepustowego itp. Są szczególnie interesujące w niektórych zastosowaniach dźwiękowych, ponieważ są w stanie filtrować szumy lub mniej lub bardziej poważne dźwięki w zależności od ich częstotliwości. Dlatego są bardzo przydatne.
Jeśli chcesz dowiedzieć się więcej o Filtr dolnoprzepustowyi inne filtry oraz jak mogą Ci pomóc w Twoich projektach z Arduino czy DIY, zachęcam do dalszej lektury ...
Filtry elektryczne
Jak sama nazwa wskazuje, filtr to obwód złożony z szeregu cewek i kondensatorów, a nawet niektórych wzmacniaczy operacyjnych, w celu przepuszczanie tylko niektórych części częstotliwości. Oznacza to, że z całego spektrum dostępnych częstotliwości będą filtrować jedną lub więcej części, aby zapobiec ich przejściu.
Jeśli dla ejemplo Mowa o widmie słyszalnym przez człowieka, które sięga od 20 Hz do 20 kHz, z filtrami można było wyeliminować najniższe lub najwyższe, aby przepuszczać tylko mniej lub bardziej wysokie tony / basy. Jest to coś, czego używa wiele systemów nagrywania lub odtwarzania dźwięku, takich jak mikrofony, głośniki itp.
Rodzaje
Stosownie typ filtra, a raczej, w zależności od częstotliwości, którą blokują lub przepuszczają, istnieją różne typy obwodów, które są:
- Filtr dolnoprzepustowy: są tak nazywane, ponieważ są to filtry, które przepuszczają najniższe częstotliwości i tłumią lub redukują przejście wyższych częstotliwości. Składają się z jednej lub więcej cewek (połączonych szeregowo z zasilaczem i obciążeniem) oraz jednego lub dwóch kondensatorów bocznikowych z zasilaniem i obciążeniem. Pamiętaj, że przez obciążenie rozumie się urządzenie podłączone do filtra, które zbiera wyjście filtra ... W ramach tych filtrów występują również warianty, takie jak L, T i π.
- Filtr górnoprzepustowy: filtr górnoprzepustowy jest przeciwieństwem filtra dolnoprzepustowego, w tym przypadku tym, co będzie filtrować lub ograniczać, jest pasmo niskich częstotliwości, przepuszczając wyższe częstotliwości. W to zainwestowane są elementy elektroniczne, które go tworzą. Oznacza to, że tutaj kondensatory będą połączone szeregowo z zasilaczem i obciążeniem, podczas gdy cewki będą bocznikowane. Istnieją również te same podtypy, co w przypadku filtrów dolnoprzepustowych.
- Filtr pasmowy: Ten typ filtra wywiera dwa bloki przepustowości pasma częstotliwości. Oznacza to, że działają one zarówno jako filtr dolnoprzepustowy, jak i górnoprzepustowy, przeciwdziałając przejściu najniższych częstotliwości, a jednocześnie najwyższych. Innymi słowy, przepuszcza tylko średnie częstotliwości.
- Filtr pasmowy: jest dokładnym przeciwieństwem poprzedniego, to, co robi, polega na tym, że filtruje przejście średniej częstotliwości i przepuszcza tylko najniższe i najwyższe częstotliwości.
Pamiętaj o tym indukcyjności przepuszczają niskie częstotliwości i przeciwdziałają przejściu wysokich częstotliwości. Zamiast, kondensatory przepuszczają wysokie częstotliwości i przeciwdziałają przejściu niskich częstotliwości.
Chciałbym dodać, że filtry są na poziomie praktycznym nie są doskonałe, i zawsze mogą przepuścić niektóre niskie lub wysokie częstotliwości, które powinieneś blokować. Jednak w przypadku większości aplikacji całkiem dobrze wykonują swoją pracę.
Na koniec chciałbym wyjaśnić jeszcze jedną rzecz, a mianowicie, że na pewno słyszałeś o Filtry EMA i DEMA. Filtry EMA (Exponential Moving Average) pozwalają w prosty sposób zaimplementować tego typu filtry w urządzeniach wbudowanych. Jeśli chodzi o DEMA (Double Exponential Moving Average), mają one szybszą odpowiedź niż EMA, zachowując dobre tłumienie szumu, którego chcesz uniknąć.
Współczynnik alfa
El współczynnik alfa, który zobaczysz, który pojawia się w kodach Arduino IDE w następnej sekcji, jest parametrem warunkującym zachowanie filtra wykładniczego. Jest to związane z częstotliwością odcięcia:
- Alpha = 1: zapewnia sygnał do niefiltrowanego wyjścia.
- Alpha = 0: wartość filtru zawsze będzie wynosić 0.
- Alpha = x: inne wartości mogą spowodować inne zmiany w filtrze EMA. Zmniejszenie współczynnika Alfa spowoduje większe zmiękczenie uzyskanego sygnału częstotliwościowego, a także zwiększy się czas odpowiedzi układu (stabilizacja zajmie więcej czasu).
Filtry i Arduino
Powinieneś wiedzieć, że nie jest konieczne tworzenie obwodu filtr górnoprzepustowy lub dolnoprzepustowy podłączyć go do płyty Arduino i pracować z nią. Chociaż możesz eksperymentować i tworzyć tego rodzaju proste filtry, możesz również przetestować, jak EMA działałaby tylko z płytą Arduino i prostym kodem dla Arduino IDE. Jest to jedyna rzecz, którą musisz zobaczyć, jak odpowiada za filtrowanie niektórych częstotliwości (w tym przypadku akcja jest symulowana, a niektóre liczby całkowite / zmiennoprzecinkowe są po prostu filtrowane symulowanie tego, co bym zrobił filtr faktycznie).
Oto kilka przykładów kodu, których możesz użyć do ćwiczenia.
Przykład prostego filtra cyfrowego typu Arduino dolnoprzepustowy:
float lowpass_prev_out[LOWPASS_ANALOG_PIN_AMT], lowpass_cur_out[LOWPASS_ANALOG_PIN_AMT]; int lowpass_input[LOWPASS_ANALOG_PIN_AMT]; int adcsample_and_lowpass(int pin, int sample_rate, int samples, float alpha, char use_previous) { // pin: Pin analógico de Arduino usado // sample_rate: El ratio adecuado // samples: Samples // alpha: El factor Alpha para el filtro paso bajo // use_previous: Si es true se sigue ajustando hasta el valor más reciente. float one_minus_alpha = 1.0-alpha; int micro_delay=max(100, (1000000/sample_rate) - 160); if (!use_previous) { lowpass_input[pin] = analogRead(pin); lowpass_prev_out[pin]=lowpass_input[pin]; } int i; for (i=samples;i>0;i--) { delayMicroseconds(micro_delay); lowpass_input[pin] = analogRead(pin); lowpass_cur_out[pin] = alpha*lowpass_input[pin] + one_minus_alpha*lowpass_prev_out[pin]; lowpass_prev_out[pin]=lowpass_cur_out[pin]; } return lowpass_cur_out[pin]; } int resulting_value; void setup() { Serial.begin(9600); resulting_value = adcsample_and_lowpass(0, 1000, 300, 0.015, false); } void loop() { resulting_value = adcsample_and_lowpass(0, 1000, 150, 0.015, true); Serial.println(resulting_value);
Przykład kodu dla typu Arduino Wysokie przejście:
int sensorPin = 0; //pin usado para el ADC int sensorValue = 0; //Inicia sensor variable equivalente a EMA Y float EMA_a = 0.3; //Inicialización del EMA Alpha int EMA_S = 0; //Iniciación del EMA s int highpass = 0; void setup(){ Serial.begin(115200); EMA_S = analogRead(sensorPin); } void loop(){ sensorValue = analogRead(sensorPin); //Lee el valor del sensor ADC EMA_S = (EMA_a*sensorValue) + ((1-EMA_a)*EMA_S); //Ejecuta el filtro EMA highpass = sensorValue - EMA_S; //Calcula la seña alta Serial.println(highpass); delay(20); //Espera 20ms }
Przykład kodu Arduino przepustka zespołu:
int sensorPin = 0; //Pin para el ADC int sensorValue = 0; //Inicia la variable del sensor, equivale a EMA Y float EMA_a_low = 0.3; //Inicia EMA Alpha float EMA_a_high = 0.5; int EMA_S_low = 0; //Inicia EMA S int EMA_S_high = 0; int highpass = 0; int bandpass = 0; void setup(){ Serial.begin(115200); EMA_S_low = analogRead(sensorPin); EMA_S_high = analogRead(sensorPin); } void loop(){ sensorValue = analogRead(sensorPin); //Lee el valor del sensor ADC EMA_S_low = (EMA_a_low*sensorValue) + ((1-EMA_a_low)*EMA_S_low); //Ejecuta EMA EMA_S_high = (EMA_a_high*sensorValue) + ((1-EMA_a_high)*EMA_S_high); highpass = sensorValue - EMA_S_low; bandpass = EMA_S_high - EMA_S_low; Serial.print(highpass); Serial.print(" "); Serial.println(bandpass); delay(20); }
Przykład kodu Arduino dla zespołu:
int sensorPin = 0; //Pin usado para el ADC int sensorValue = 0; //Inicio para EMA Y float EMA_a_low = 0.05; //Inicio de EMA alpha float EMA_a_high = 0.4; int EMA_S_low = 0; //Inicia EMA S int EMA_S_high = 0; int highpass = 0; int bandpass = 0; int bandstop = 0; void setup(){ Serial.begin(115200); EMA_S_low = analogRead(sensorPin); EMA_S_high = analogRead(sensorPin); } void loop(){ sensorValue = analogRead(sensorPin); //Lee el valor del sensor ADC EMA_S_low = (EMA_a_low*sensorValue) + ((1-EMA_a_low)*EMA_S_low); //Ejecuta EMA EMA_S_high = (EMA_a_high*sensorValue) + ((1-EMA_a_high)*EMA_S_high); bandpass = EMA_S_high - EMA_S_low; bandstop = sensorValue - bandpass; Serial.print(sensorValue); Serial.print(" "); Serial.print(EMA_S_low); Serial.print(" "); Serial.println(bandstop); delay(20); }
Radzę modyfikować i eksperymentować z tymi kodami. Wynik, który możesz zobacz bardzo graficznie dzięki Ploterowi Szeregowemu Arduino IDE ... Pamiętaj, że jeśli masz pytania dotyczące programowania Arduino lub korzystania z IDE, możesz pobrać darmowy kurs HwLibre w formacie PDF.