A mért jelet leszűrjük

Szia programozók. Cikket készítettem a jelszűrésről. Az elején nem akarok túl sokat beszélni a szűrésről, ezért azonnal bele fogunk ugrani az akcióba.
Mi fog történni, vagy mit fogok látni az oszcilloszkópon, amikor a PWM (téglalap alakú) jelet beengedem az áramkörbe az 1a. 1b. Ábra?
A választ közvetlenül az oszcilloszkópon néztem. 50Hz frekvenciájú jelet generáltam PWM-mel. R1 = R2 = 50 Ω. C1 = 133nF.

programozás


2. ábra A kondenzátor nélküli csatlakozás eredménye (az 1a. Ábra szerint)


3. ábra A kondenzátorral való kapcsolat eredménye (az 1b ábra szerint)

Tehát röviden:
Az áramkör kondenzátora a magasabb frekvenciák szűrőjeként működik. A kondenzátor reaktanciája növekszik a frekvencia növekedésével. Egyszerűen fogalmazva, a kondenzátor magasabb frekvenciáknál jelenik meg, mint rövidzárlat. Elsimítja a téglalap alakú jel éles széleit. Miért? Ha valaki hallott már Fourier-ról, eszébe jut, hogy egy téglalap alakú jel páratlan harmonikus szinuszos jelek felhasználásával állítható össze. Így a téglalap alakú jel valójában szinusz hullámok halmaza, az első harmonikus frekvenciája a téglalap alakú jel frekvenciája. Az, hogy a kondenzátor milyen gyorsan töltődik fel állandó feszültségértékre, az R1 és C paraméterektől függ. Az áramkör időállandója kiszámítható az R1 és C paraméterekből. Az áramkör időállandója az az idő, amely alatt a kondenzátor az állandó érték 63,2% -ára töltődik fel. Az időállandó háromszorosa az az idő, amelybe a kondenzátor töltődik az egyensúlyi állapot 95,0% -áig. Az áramkörben lévő R2 ellenállás csak feszültségosztóként szolgál. Nincs hatása az R1 és C által alkotott RC szűrőre.


4. ábra Feszültségesés a kondenzátoron RC áramkörben (exponenciális menet)

Az RC áramkör aluláteresztő szűrőként is működik, ill. magas áteresztés attól függően, hogy hogyan kapcsolódik az áramkörhöz.

4. ábra Aluláteresztő szűrő ill. a magas áteresztés és a frekvencia jellemzőik

További információ a szűrőkről az interneten bárhol megtalálható. Ismét csak röviden: a határérték a szűrő szlovák határértéke. A szűrő törésfrekvenciája olyan jelfrekvencia, amelynél a kimeneten a jel amplitúdója és a bemenetnél a jel amplitúdója 0,707 (csillapítás 3 dB). Az RC cella levágási frekvenciáját a következő összefüggés alapján számítják ki: f0 = 1/(2πRC)

Tehát az én esetemben, ahol R = 10kΩ és C = 133nF, a vágási frekvencia f0 = 120Hz.
Sokat írhatna még róla, de én másról beszélek. Mi van, ha nincs nálam a megfelelő értékű jelszűrő kondenzátor? Ha elegendő számítási kapacitással rendelkezem, szoftveresen szűrhetem a téglalap alakú jelet. Hogyan kell csinálni?
Először is meg kell ismernünk az 1. rendű aluláteresztő szűrő átviteli függvényét. Valaki a fejéből tudja, és valaki megtalálja az interneten. Az 1. rendű aluláteresztő szűrő átviteli funkciója:
H (s) = wc/(s + wc),
ahol wc a szűrő határértéke, wc = 2πf0.
Először le kell hiteltelenítenünk ezt az átviteli funkciót. Bilináris transzformációt fogok alkalmazni, és ugyanazt az eljárást használom, mint ebben a dokumentumban a 13. oldalon. Az eredmény az 1. rendű aluláteresztő szűrő egyenlete diszkrét formában.
y (n) = x (n) * b1 + x (n-1) * b2 - y (n-1) * a2
y (n) az aktuális érték vagy minta a szűrő kimenetén
x (n) az aktuális bemeneti érték vagy minta a szűrő bemeneténél
x (n-1) az előző bemeneti minta
y (n-1) az előző kimeneti minta
b1, b2 és a2 azok a szűrési együtthatók, amelyeket az említett dokumentumban a 13. oldalon megadott összefüggések alapján számolnak.
Miután megismerjük a szűrő együtthatóit, folytathatjuk a szűrő programozását és tesztelését.

A program leírása:

Időzítő segítségével 50 Hz frekvenciájú és 0,5 osztályú PWM jelet generálok. Ezt a PWM jelet egy R1 = R2 = 10 kΩ feszültségosztóhoz adom kondenzátor nélkül. A feszültségosztó jelét kiolvastam az ADC konverter segítségével. Az ADC átalakító 10 kHz frekvencián vesz mintát. Az átalakítás végétől számított megszakításban elmentem a mért értéket a mezőbe, és a szűrő kimenetén is sikerül kiszámítanom az aktuális értéket. Amikor így mérek és szűrök 150 mintát, soros vonalon keresztül elküldöm őket egy PC-re, és a mért és szűrt jelet megjelenítem az Excel programban.

Kódminta:

A "szűrő" funkció leírása:
A szűrőfunkció a mért jelet pontosan az első osztályú szűrő előírásai szerint szűri, azaz az alábbiak szerint:
y (n) = x (n) * b1 + x (n-1) * b2 - y (n-1) * a2
Az aktuális kimeneti érték megegyezik az aktuálisan mért érték és a B1 együttható szorzatával, plusz az előző bemeneti érték és a B2 együttható szorzatával, mínusz az előző kimeneti érték és az A2 együttható szorzatával.

A program eredménye:

5. ábra Szoftverszűrő kimenet

Következtetés:

Digitális szűrő segítségével a bemenő téglalap alakú jelet ugyanúgy tudtam szűrni, mint egy analóg RC szűrőt. A 8 MHz-es órajelű ATMEGE8-on a szűrő egy iterációjának kiszámítását 100us-ba (10 kHz), azaz két minta közötti időbe tudtam szorítani. Természetesen a teljes szűrőszámítás tovább optimalizálható. Számos lehetőség van. Talán a jövőben visszatérek erre a példára, és megpróbálom egy kicsit optimalizálni a számítást, felgyorsítani. Ebben a cikkben szerettem volna megmutatni, bár kicsit a sebességtől, hogy a mért jel nagyon könnyen szűrhető az MCU oldalán is.

A digitális szűrő előnyei:

  • Függetlenül a környezeti hőmérséklettől (és a szűrő korától), ami analóg komponensekkel nem lehetséges
  • Az együtthatók egyszerű megváltoztatásával könnyen átkonfigurálható (áthangolható) más frekvenciákra. Nincs szükség az R és C megfelelő értékeinek és kombinációinak keresésére.
  • Könnyű magasabb rendű digitális szűrőket vagy olyan szűrőket tervezni, amelyek jellemzői nagyon nehezen hozhatók létre analóg komponensek használatával (csak a matematika alapjaira, a törtek beállítására van szükség).
  • Természetesen a digitális szűrőknek is vannak hátrányaik vagy korlátaik, inkább az itt érdeklődők számára

  • R1 = 10kΩ, R2 = 10kΩ, C1 = 133nF és egy kábelpár
  • Atmega 8 fejlesztői testület.
  • USB-RS232 átalakító
  • AVR STK500 programozóként

Ennyit erről a cikkről. A cikk készítése közben arra a következtetésre jutottam, hogy az Atmega8 néhány ötletemhez túl rövid. Ezért valószínűleg a közeljövőben áttérek egy másik MCU-ra. A legjobb már 32 bites. Megpróbálok néhány kommunikációs modullal játszani, és megpróbálom megpörgetni az egyenáramú motort az Atmega8-mal, majd átállok egy 32 bites MCU-ra.