Spoler og op-forstærkere giver dig mulighed for at oprette meget interessante kredsløb, såsom den berømte frekvensfiltre. Disse filtre har en lang række applikationer i elektronikindustrien. Som det er tilfældet med lavpasfilter, højpasfilter osv. De er især interessante for visse lydapplikationer, at være i stand til at filtrere lyde eller mere eller mindre alvorlige lyde alt efter deres frekvens. Derfor er de meget nyttige.
Hvis du vil vide mere om lavpasfilter, og andre filtre, og hvordan de kan hjælpe dig i dine projekter med Arduino eller DIY, jeg opfordrer dig til at fortsætte med at læse ...
Elektriske filtre
Som navnet antyder, er et filter et kredsløb, der består af en række spoler og kondensatorer og endda nogle driftsforstærkere med det formål at kun at lade bestemte dele af en frekvens passere. Det vil sige, at af hele spektret af tilgængelige frekvenser filtrerer de en eller flere dele for at forhindre dem i at passere igennem.
Hvis for ejemplo Vi taler om det spektrum, der kan høres af mennesket, og som går fra 20 Hz til 20 Khz, med filtre, som du kan eliminere den laveste eller den højeste for kun at lade de mere eller mindre diskant / baslyde passere. Det er noget, som mange lydoptagelses- eller reproduktionssystemer bruger, såsom mikrofoner, højttalere osv.
Typer
Ifølge filtertypeeller rettere, afhængigt af frekvensen, de blokerer eller den, de slipper igennem, er der forskellige typer kredsløb, der er:
- Lavpasfilter: de kaldes så fordi de er de filtre, der lader de laveste frekvenser passere og undertrykke eller reducere passet for de højere frekvenser. De består af en eller flere spoler (i serie med strømforsyningen og belastningen) og en eller to shuntkondensatorer med strømforsyningen og belastningen. Husk at belastningen forstås som den enhed, der er tilsluttet filteret, og som opsamler filterets output ... Inden for disse filtre er der også varianter, såsom L, T og π.
- Højpasfilter: højpasfilteret er det modsatte af lavpas, i dette tilfælde, hvad der filtrerer eller begrænser, er lavfrekvenspas, så de højere frekvenser passerer. I dette investeres de elektroniske elementer, der komponerer det. Det vil sige, her vil kondensatorerne være dem i serie med strømforsyningen og belastningen, mens spolerne shuntes. Der er også de samme undertyper som i tilfælde af lavpasfiltre.
- Båndpasfilter: Denne type filter udøver to låse på frekvensbåndets hastighed. Det vil sige, de fungerer både som et lavpasfilter og som et højpasfilter, der modsætter sig passagen af de laveste frekvenser og også den højeste på samme tid. Med andre ord tillader det kun de midterste frekvenser at passere.
- Båndfilter: det er nøjagtigt det modsatte af den forrige, hvad det gør er, at det filtrerer passet for mellemfrekvenserne og kun slipper igennem de laveste og højeste frekvenser.
Husk det induktanser de slipper igennem lave frekvenser og modsætter sig passage af høje frekvenser. I stedet, kondensatorer de slipper igennem høje frekvenser og modsætter sig passage af lave frekvenser.
Jeg vil gerne tilføje disse filtre på et praktisk niveau de er ikke perfekte, og de kan altid passere nogle lave eller høje frekvenser, som du skal blokere. De gør dog deres arbejde ganske godt til de fleste applikationer.
Og endelig vil jeg også gerne afklare en anden ting, og det er, at du helt sikkert har hørt om EMA- og DEMA-filtre. EMA-filtre (eksponentielt glidende gennemsnit) gør det muligt at implementere denne type filter på en enkel måde i indlejrede enheder. Hvad angår DEMA (dobbelt eksponentielt glidende gennemsnit), har de en hurtigere respons end EMA og opretholder en god undertrykkelse af den støj, du vil undgå.
Alfafaktor
El alfafaktor, som du vil se, der vises i Arduino IDE-koder i det næste afsnit, er den parameter, der betinger det eksponentielle filters opførsel. Det er relateret til afskæringsfrekvensen:
- Alpha = 1: der giver et signal til det ufiltrerede output.
- Alpha = 0: filterværdien vil altid være 0.
- Alpha = x: andre værdier kan få andre ændringer i EMA-filteret. Hvis du reducerer Alpha-faktoren, blødgør du det opnåede frekvenssignal mere, og systemets responstid øges også (det tager længere tid at stabilisere sig).
Filtre og Arduino
Du skal vide, at det ikke er nødvendigt at oprette kredsløbet højpasfilter eller lavpasfilter at forbinde det til dit Arduino-kort og arbejde med det. Selvom du kan eksperimentere og oprette disse slags enkle filtre, kan du også teste, hvordan en EMA kun fungerer med Arduino-kortet og en simpel kode til Arduino IDE. Det er det eneste, du har brug for for at se, hvordan det har ansvaret for at filtrere nogle frekvenser (i dette tilfælde er handlingen simuleret, og nogle heltal / floats filtreres simpelthen simulere hvad jeg ville gøre filter faktisk).
Her er nogle kodeeksempler, som du kan bruge til at øve.
Eksempel på simpelt digitalt filter i Arduino af typen lavpas:
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);
Kodeeksempel for Arduino-typen Høj pas:
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 }
Eksempel på Arduino-kode båndpas:
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); }
Eksempel på Arduino-kode til band:
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); }
Jeg råder dig til at ændre og eksperimentere med disse koder. Det resultat, du kan se meget grafisk tak til den serielle plotter af Arduino IDE ... Husk, at hvis du har spørgsmål om Arduino-programmering eller hvordan du bruger IDE, kan du downloade gratis HwLibre-kursus i PDF.