Намотките и операционните усилватели ви позволяват да създавате много интересни схеми, като известните честотни филтри. Тези филтри имат множество приложения в електронната индустрия. Както е случаят с нискочестотния филтър, високочестотния филтър и т.н. Те са особено интересни за определени звукови приложения, като могат да филтрират шумове или повече или по-малко сериозни звуци според тяхната честота. Затова те са много полезни.
Ако искате да знаете повече за нискочестотен филтъри други филтри и как те могат да ви помогнат във вашите проекти с Arduino или „Направи си сам“, насърчавам ви да продължите да четете ...
Електрически филтри
Както подсказва името му, филтърът е верига, която е съставена от поредица намотки и кондензатори и дори някои операционни усилватели, с цел пропускане само на определени части от честотата. Тоест, от целия спектър на наличните честоти, те ще филтрират една или повече части, за да им попречат да преминат.
Да за ejemplo Говорим за спектъра, чут от човека, който преминава от 20 Hz до 20 Khz, с филтри, които можете да елиминирате най-ниското или най-високото, за да позволите само преминаването на повече или по-малко високи / басови звуци. Това е нещо, което много системи за запис или възпроизвеждане на звук използват като микрофони, високоговорители и т.н.
Тип
Според тип филтърили по-точно, в зависимост от честотата, която блокират, или тази, която пропускат, има различни видове вериги, които са:
- Нискочестотен филтър: те се наричат така, защото са онези филтри, които пропускат най-ниските честоти и потискат или намаляват преминаването на по-високите честоти. Те се състоят от една или повече намотки (последователно с захранването и товара) и един или два шунтиращи кондензатора с захранването и товара. Не забравяйте, че под товар се разбира устройството, свързано към филтъра и което събира изхода на филтъра ... В тези филтри има и варианти, като L, T и π.
- Високочестотен филтър: високочестотният филтър е противоположният на нискочестотния, в този случай това, което ще филтрира или ограничи, е нискочестотният, пропускащ по-високите честоти. В това се влагат електронните елементи, които го съставят. Тоест тук кондензаторите ще бъдат тези последователно с захранването и товара, докато намотките ще бъдат шунтирани. Съществуват и същите подтипове, както при нискочестотните филтри.
- Лентов филтър: Този тип филтър упражнява два блока на честотната лента. Тоест, те действат едновременно като нискочестотен филтър и като високочестотен филтър, противопоставяйки се на преминаването на най-ниските честоти и в същото време на най-високите. С други думи, той позволява само средните честоти да преминават.
- Лентов филтър: той е точно обратното на предишния, а това, което прави, е, че филтрира прохода на средните честоти и пропуска само най-ниските и най-високите честоти.
Не забравяйте, че индуктивности те пропускат ниски честоти и се противопоставят на преминаването на високи честоти. Вместо, кондензатори те пропускат високи честоти и се противопоставят на преминаването на ниски честоти.
Бих искал да добавя, че филтрира на практическо ниво те не са перфектнии те винаги могат да преминат някои ниски или високи честоти, които трябва да блокирате. Те обаче си вършат работата доста добре за повечето приложения.
И накрая, бих искал да изясня и още нещо, а то е, че със сигурност сте чували за EMA и DEMA филтри. Филтрите EMA (експоненциално подвижно средно) позволяват да се приложи този тип филтри по прост начин във вградени устройства. Що се отнася до DEMA (Double Exponential Moving Average), те имат по-бърза реакция от EMA, поддържайки добро потискане на шума, който искате да избегнете.
Алфа фактор
El алфа фактор, който ще видите, че се появява в Arduino IDE кодовете в следващия раздел, е параметърът, който обуславя поведението на експоненциалния филтър. Това е свързано с граничната честота:
- Алфа = 1: това осигурява сигнал към нефилтрирания изход.
- Alpha = 0: стойността на филтъра винаги ще бъде 0.
- Alpha = x: други стойности могат да получат други промени в EMA филтъра. Ако намалите алфа коефициента, ще смекчите честотния сигнал, получен повече, и времето за реакция на системата също се увеличава (отнема повече време за стабилизиране).
Филтри и Arduino
Трябва да знаете, че не е необходимо да създавате веригата високочестотен филтър или нискочестотен филтър за да го свържете с вашата Arduino платка и да работите с него. Въпреки че можете да експериментирате и да създавате такива видове прости филтри, можете също да тествате как EMA ще работи само с платката Arduino и с прост код за IDE на Arduino. Това е единственото нещо, което трябва да видите как отговаря за филтрирането на някои честоти (в този случай действието се симулира и някои цели числа / плувки просто се филтрират симулирайки какво бих направил филтър всъщност).
Ето няколко примерни кода, които можете да използвате за практикуване.
Пример за прост цифров филтър в Arduino от типа нисък пас:
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);
Пример за код за тип Arduino Висока пас:
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 }
Пример за Arduino код лентов пропуск:
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); }
Пример за Arduino код за група:
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); }
Съветвам ви да модифицирате и експериментирате с тези кодове. Резултатът можете вижте много графично благодарение на серийния плотер на IDE на Arduino ... Не забравяйте, че ако имате въпроси относно програмирането на Arduino или как да използвате IDE, можете да изтеглите безплатен курс на HwLibre в PDF.