• Nem Talált Eredményt

A zajos fordulatszámjel szűrése

In document Digitális szervo hajtások (Pldal 94-101)

Jm 12.6 gcm^2 = 12.6E-7 kgm^2 rotor tehetetlenségi nyomatéka

9. Nyílt szabályozó kör mérése -- Motion control/Exercise 4 menüpont alatt található control/Exercise 4 menüpont alatt található

9.5. A zajos fordulatszámjel szűrése

Az szögsebesség-idő függvénye nagyon zajos, mert a pozíciójelből digitális deriválási művelettel kapjuk. A deriválás általában kiemeli a zajokat, és ezt a méréseknél a gyakorlatban is tapasztalni fogjuk. Általában, ha lehet, akkor a deriválást kerülni szoktuk. pl. kevésbé zajos jelet kapnánk, ha a fordulatszámot közvetlenül érzékelnénk. Ha erre nincs mód, akkor a zajos jelet célszerű szűrni egy aluláteresztő szűrővel, például a következő módon.

Tekintsük a rendszer bemenetének a mért , kimenetének a szűrt szögsebességet.

(5.30)

Tegyük fel, hogy sorba kapcsolunk 3 db elsőfokú aluláteresztő szűrűt, azonos időállandóval. A szűrő átviteli függvénye

(5.31)

Átrendezve

(5.32) Inverz Laplace-transzformálva

( 5.33 )

ahol Tc a vágási körfrekvencia reciproka és a pont jelöli ( ) az idő szerinti deriváltat. A szűrő állapottér egyenlete (5.33) alapján:

mérési gyakorlatok leírása)

( 5.34 )

Az állapottér egyenlet (5.34) leírható diszkrét alakban.

(5.35)

Ahol k a k-dik mintavételezés rövidítése és a rendszermátrix elemei (ai és bi) kiszámíthatók a MATLAB “c2d”

függvényével, ami “continuous to discrete”, vagy folytonos-diszkrét rövidítése.

[Ad, Bd] = c2d(A, B, tsample);

ahol tsample a mintavételezési periódus és Tc szűrő időállandója

(5.36)

(5.37)

A értékének meghatározásához abból indulhatunk ki, hogy a fordulatszám jelhez adódó zaj abból adódik, hogy két pozíciójel különbségéből számítjuk. A pozíciójelet a számlálóból olvassuk ki, ami az enkóderből érkező impulzusokat számlálja. Az enkóderből érkező jelek értelemszerűen nincsenek szinkronizálva a számláló értékének beolvasásával. Ezért előfordulhat, hogy egyszer pont egy enkóderből származó impulzus érkezése előtt, egyszer pont utána olvassuk ki a számláló értékét, így állandó szögsebesség esetén is két különböző értéket fogunk kiszámítani. Elképzelhető, hogy minden beolvasásánál a hiba előjelet vált, így a zaj periódus idejét jól közelíthetjük a mintavételi idő kétszeresével. Ebből már meghatározhatjuk a zaj frekvenciáját, illetve

körfrekvenciáját, mivel a szűrő tervezéséhez ez utóbbira van szükség. Esetünkben

(5.38)

Az aluláteresztő szűrő vágási frekvenciáját ennél kisebbre kell beállítani. Ha egy dekáddal kisebbre állítjuk be, akkor az egy harmadjajú szűrő esetén kb. ezred részére képes csökkenti a zajt. a vágási körfrekvencia reciproka, ezért legyen a választásunk a következő

(5.39)

mérési gyakorlatok leírása)

A diszkrét idejű szűrő együtthatóit meghatározó és a C kódot generáló MATLAB program Ts = 0.001;

A szűrő mellékhatása, hogy növeli a rendszer fáziseltolását. E problémán javíthatunk, ha egy más típusú szűrőt alkalmazunk.

5.24. ábra - Normál harmadfokú aluláteresztő szűrő Bode diagramja

mérési gyakorlatok leírása)

Vizsgáljunk meg egy harmadrendű Bessel szűrőt. A harmadrendű Bessel szűrő átviteli függvénye:

(5.40)

mérési gyakorlatok leírása) float bd1 = 0.048071;

float bd2 = 120.9668;

float bd3 = 159737.83;

5.25. ábra - Harmadfokú Bessel alul-áteresztő szűrő Bode diagramja

Vizsgáljunk meg egy ötödrendű Bessel szűrőt. Az ötödrendű Bessel szűrő átviteli függvénye:

(5.41)

A diszkrét idejű szűrő együtthatóit meghatározó és a C kódot generáló MATLAB program Ts = 0.001;

Tc = 1/(2*pi*1/(2*Ts)/10);

A = [0, 1, 0, 0, 0;

0, 0, 1, 0, 0;

0, 0, 0, 1, 0;

0, 0, 0, 0, 1;

-945/Tc^5, -945/Tc^4, -420/Tc^3, -105/Tc^2, -15/Tc];

B = [0;0;0;0;945/Tc^5];

[Ad,Bd] = c2d(A,B,Ts);

for i = 1:5 for j = 1:5

disp(['float ad',num2str(i),num2str(j),' = ',num2str(Ad(i,j)),';']) end

end

for i = 1:5

disp(['float bd',num2str(i),' = ', num2str(Bd(i)),';']);

end

mérési gyakorlatok leírása)

A CalculateController függvényt a valós idejű óra minden jelére meghívja a keretprogram. A saját szabályozó algoritmusát a következő programba írhatja bele:

#include <windows.h>

mérési gyakorlatok leírása) //Declaration of your controller

// Position is saved automatically ResultData.Position = CurrentPosition;

// Angular velocity is saved automatically if (CurrentTime != 0.0f){

ResultData.Velocity = (1000.0f * (float)(CurrentPosition - OldPosition)/(float)(CurrentTime - OldTime));

A pirossal írt részek helyére kell a saját programot elhelyezni. A változók új értékeit és minden számítást ezen a függvényen belül kell megadni. A motor állapotát a keretprogram kiszámítja és a következő változókban tárolja:

ResultData.Position : pozíció ResultData.Velocity : szögsebesség ResultData.Time : az aktuális idő

Biztonsági okokból a motor bemeneti feszültségét nem lehet direkt módon állítani. Az irányítóprogram kimenete, amely a kimenő jel a D/A kártyán a referencia áram-jel. Ez referencia nyomaték-jelnek is tekinthető.

A saját programunkban kell, hogy legyen a következő értékadás:

ResultData.Torque = …

A felhasználónak az értéket a ―your controller program‖ végén kell beállítania. Például:

ResultData.Torque = 1;

azt jelenti, hogy a tengelyen a nyomaték (a fogaskerék után) 1 Nm-re lett állítva. Mivel a D/A kártya kimenete feszültség, a keretprogram kiszámolja a megfelelő feszültség értéket a ResultData.Torque-ból, amely a kimeneti jel lesz.

Ebben a feladatban nyílt hurkú méréseket végzünk a DC motoron. Maximum 10 állapotváltozó választható ki Matlab formátumban történő mentésre. A 10-ből 4 állapotváltozó kötött: az idő, a pozíció, a szögsebesség és a motor nyomatéka.

Ha az állapotváltozó hibát kívánja menteni, az alábbiakat kell tennie:

Írja be az állapotváltozó nevét vel_filt (szűrt sebesség) az ötödik sorba a következő formában:

5. vel_filt

Írja be a változó deklarációját:

float vel_filt;

Írja be a következőt a parancs dobozba:

Vel_filt = (ki kell számítani a szűrt sebesség értékét) ResultData.StateVariable_5 = vel_filt;

A mérés után a vel_filtállapotváltozó is letölthető.

Hajtsa végre a feladatokat nyílt körre és hasonlítsa össze őket a P, és PI szabályozókkal.

Az eredményfájlok, amelyek a mérés végén letölthetők, MATLAB-ban kiértékelhetők. Erre a feladatra már írtunk egy programot, amely kirajzolja a tengelysebesség-idő, feszültség-idő és pozíció-idő diagramjait. Ezek a diagramok .jpg formátumban menthetők el további dokumentációkhoz.

mérési gyakorlatok leírása) MEGJEGYZÉS:

A szabályozó programot minden egyes mintavételező periódusban meghívja a keretprogram. A függvény végrehajtása után minden változó (kivéve a ResultData.Time, ResultData.Velocity,ResultData.Position ResultData.Torque és ResultData.StateVariable_5-10) felszabadul (avagy az értékek elvesznek). Ha szükséges egy változó a következő mintavételező periódusban is, akkor statikus típusú változóként kell deklarálni. Például:

static float vel_filt;

Általános lépések szükségesek:

• Tanumányozza az ebben a fejezetben a DC motorról írt „A DC motor elméleti háttere” című szövegrészt.

• Beállíthatja a mérés idejét milliszekundumban (az alapérték 1000).

• A mérések alapján határozza meg a tranziens válaszokat és a DC szervomotor stabil-állapot karakterisztikáit.

Segítségképp az első három laboratóriumi gyakorlaton megismert két kártyát a keretprogram inicializálja. Csak a fentebb leírt lépések szükségesek a sikeres laboratóriumi mérés végrehajtásához.

In document Digitális szervo hajtások (Pldal 94-101)