Filtrăm semnalul măsurat
Bună programatori. Am pregătit un articol despre filtrarea semnalului. Nu vreau să vorbesc prea mult despre filtrare la început, așa că vom sări imediat în acțiune imediat.
Ce se va întâmpla sau ce voi vedea pe osciloscop când voi lăsa semnalul PWM (dreptunghiular) în circuitul din Fig. 1a resp. Fig.1b?
Am privit răspunsul direct pe osciloscop. Am generat un semnal cu o frecvență de 50Hz cu PWM. R1 = R2 = 50 Ω. C1 = 133nF.
Fig.2 Rezultat pentru conectarea fără condensator (conform Fig.1a)
Fig.3 Rezultatul conexiunii cu condensatorul (conform Fig.1b)
Deci pe scurt:
Condensatorul din circuit acționează ca un filtru pentru frecvențe mai mari. Reactanța condensatorului scade odată cu creșterea frecvenței. Pur și simplu, un condensator apare pentru frecvențe mai mari decât un scurtcircuit. Netezeste marginile ascutite ale unui semnal dreptunghiular. De ce? Dacă cineva a auzit de Fourier, îți va veni în minte că un semnal dreptunghiular poate fi urmărit folosind semnale sinusale armonice impare. Astfel, semnalul dreptunghiular este de fapt un grup de unde sinusoidale, frecvența primei armonici fiind frecvența semnalului dreptunghiular. Cât de rapid se încarcă condensatorul la o valoare de tensiune constantă depinde de parametrii R1 și C. Constanta de timp a circuitului poate fi calculată din parametrii R1 și C. Constanta de timp a circuitului este timpul în care condensatorul este încărcat la 63,2% din valoarea constantă. De trei ori constanta de timp este timpul necesar pentru ca condensatorul să se încarce la 95,0% din starea de echilibru. Rezistorul R2 din circuit servește doar ca divizor de tensiune. Nu are niciun efect asupra filtrului RC format din R1 și C.
Fig.4 Curs de tensiune pe condensator în circuitul RC (curs exponențial)
Circuitul RC funcționează și ca un filtru trece-jos sau resp. trecere înaltă în funcție de modul în care este conectat în circuit.
Fig.4 Filtru trece jos resp. trecerea înaltă și caracteristicile lor de frecvență
Mai multe despre filtre pot fi găsite oriunde pe internet. Din nou, doar pe scurt, frecvența de tăiere este frecvența de tăiere slovacă a filtrului. Frecvența de întrerupere a filtrului este o frecvență a semnalului la care raportul dintre amplitudinea semnalului la ieșire și amplitudinea semnalului la intrare este de 0,707 (atenuare de 3 dB). Frecvența de întrerupere a celulei RC este calculată în funcție de următoarea relație: f0 = 1/(2πRC)
Deci, în cazul meu, unde R = 10kΩ și C = 133nF, frecvența de tăiere este f0 = 120Hz.
Încă ai putea scrie multe despre asta, dar vorbesc despre altceva. Ce se întâmplă dacă nu am valoarea corectă a condensatorului de filtrare a semnalului la mine? Dacă am suficientă putere de calcul, pot filtra semnalul dreptunghiular după software. Cum să o facă?
În primul rând, trebuie să cunoaștem funcția de transfer a filtrului trece-jos de ordinul 1. Cineva o știe din cap și cineva o poate găsi pe internet. Funcția de transfer a filtrului trece-jos de ordinul 1 este:
H (s) = wc/(s + wc),
unde wc este frecvența de întrerupere a filtrului, wc = 2πf0.
Mai întâi trebuie să discredităm această funcție de transfer. Voi folosi o transformare biliniară și aceeași procedură ca în acest document la pagina 13. Rezultatul este ecuația unui filtru trece-jos de ordinul 1 în formă discretă.
y (n) = x (n) * b1 + x (n-1) * b2 - y (n-1) * a2
y (n) este valoarea curentă sau eșantion la ieșirea filtrului
x (n) este valoarea curentă de intrare sau eșantion la intrarea filtrului
x (n-1) este eșantionul de intrare anterior
y (n-1) este eșantionul de ieșire anterior
b1, b2 și a2 sunt coeficienții de filtrare care se calculează în funcție de relațiile date în documentul menționat la pagina 13.
Odată ce cunoaștem coeficienții filtrului, putem trece la programarea și testarea filtrului în sine.
Descrierea programului:
Folosind un cronometru, generez un semnal PWM cu o frecvență de 50 Hz și o clasă de 0,5. Furnizez acest semnal PWM unui divizor de tensiune R1 = R2 = 10 kΩ fără condensator. Am citit semnalul de la divizorul de tensiune de către convertorul ADC. Eșantioanele traductorului ADC la o frecvență de 10 kHz. Întreruperea de la sfârșitul conversiei, salvăm valoarea măsurată în câmp și reușesc, de asemenea, să calculez valoarea curentă la ieșirea filtrului. Când măsoară și filtrez 150 de probe în acest fel, le trimit printr-o linie serială către un computer și afișez semnalul măsurat și filtrat în Excel.
Exemplu de cod:
Descrierea funcției "filtru":
Funcția de filtrare filtrează semnalul măsurat exact conform prescripției filtrului de prim ordin, adică după cum urmează:
y (n) = x (n) * b1 + x (n-1) * b2 - y (n-1) * a2
Valoarea de ieșire curentă este egală cu valoarea măsurată curentă de coeficientul B1 plus valoarea de intrare anterioară de coeficientul B2 minus valoarea de ieșire anterioară de coeficientul A2.
Rezultatul programului:
Fig.5 Iesire filtru software
Concluzie:
Folosind un filtru digital, am reușit să filtrez semnalul dreptunghiular de intrare în același mod ca și cu un filtru RC analogic. Am reușit să strâng doar calculul unei iterații a filtrului de pe ATMEGE8 tactat la 8 MHz în 100us (10kHz), adică în timpul dintre două eșantioane. Desigur, întregul calcul al filtrului ar putea fi optimizat în continuare. Există mai multe opțiuni. Poate că pe viitor voi reveni la acest exemplu și voi încerca să optimizez puțin calculul, să grăbesc. Am vrut să arăt în acest articol, deși un pic față de viteză, că semnalul măsurat poate fi foarte ușor filtrat și pe partea MCU.
Avantajele filtrului digital:
- Independent de temperatura ambiantă (și de vârsta filtrului), ceea ce nu este posibil cu componentele analogice
- Poate fi ușor reconfigurat (reglat) la alte frecvențe prin simpla schimbare a coeficienților. Nu este nevoie să căutați valori și combinații adecvate de R și C.
- Este ușor să proiectați filtre digitale de ordin superior sau filtre cu caracteristici care ar fi foarte dificil de creat folosind componente analogice (sunt necesare doar elementele de bază ale matematicii, ajustarea fracțiilor).
- Desigur, filtrele digitale au și dezavantajele sau limitările lor, mai mult pentru cei interesați aici, de exemplu
- R1 = 10kΩ, R2 = 10kΩ, C1 = 133nF și o pereche de cabluri
- Placa de dezvoltare Atmega 8.
- Convertor USB la RS232
- AVR STK500 ca programator
Atât de mult pentru acest articol. În timp ce am creat acest articol, am ajuns la concluzia că Atmega8 este prea scurt pentru unele dintre ideile mele. Prin urmare, probabil că voi trece la un alt MCU în viitorul apropiat. Cel mai bun deja pe 32 de biți. Voi încerca să mă joc cu câteva module de comunicare și să încerc să rotesc motorul de curent continuu cu Atmega8 și apoi să trec la un MCU pe 32 de biți.