...
Dynaamiset yhtälöt ja avoimen silmukan siirtofunktiot DC-moottorille ovat:
Järjestelmän tilakaavio nättää Järjestelmän lohkokaavio näyttää seuraavalta:
Alkuperäiset Alkuperäisen ongelman yhtälöt ja derivoinnit löytyvät aikaisemmasta edellisestä esimerkistä DC-moottorin malli. Käy malli läpi, jos yhtälöt ovat hepreaa.
Jos laitetaan laitetaan askelvasteen vaatimukseksi 1rad/s askelsyötteeksi, perusteet ovat:
- Asettumisaika alle 2 sekunttiasekuntia
- Ylitys on alle 5%5 %
- Paikallaan ollessa virhe on alle 1% 1 % (vakaa tila)
DC-moottorin mallissa asettumis aika on noin 3s. PID-säätimellä pyritään pääsemään tässä harjoituksessa näiden arvojen sisälle.
Seuraavaksi suunnitellaan PID-säädin ja lisätään se järjestelmään. Luo ensin uusi m-tiedosto ja syötä seuraavat komennot (katso DC-moottorin mallia käskyjen yksityiskohdista made by Jukka "nättitukka"Tamminen, josta löytyy tiedot miten kyseinen malli on tehty)
Code Block |
---|
function Moottori() J=0.01; b=0.1; K=0.01; R=1; L=0.5; numjaettava=K; denjakaja=[(J*L) ((J*R)+(L*b)) ((b*R)+K^2)]; motor=tf(numjakaja,denjaettava); |
Muista että, siirtofunktioo Siirtofunktio PID säätimelle on:
Suhteellinen säätö (proportional control)
Kokeillaan Katsotaan ensin käyttää suhteellisen säädön vahvituksena vaikutusta. Käytetään aluksi vahvistuksena (gain) arvoa 100. Suljetun kierron siirtofunktion määrittämiseen käytämme palauta komentoa (feedback). Lisää seuraava koodi m-tiedostosi loppuun:
Code Block |
---|
Kp=100; contrsaadin=Kp; sys_cl=feedback(contrsaadin*motor,1); |
Seuraavaksi katsotaan miltä askelvaste näyttää. Lisää seuraavat arvot arvot Jotta näytölle saadaan aikaiseksi kuvaaja tarvitsee lisätä seuraavat komennot. Lisää komennot m-tiedoston loppuun ja suorita ohjelma komentoikkunassa.Tämän jälkeen voidaan tutkia askelvastetta.
Code Block |
---|
t=0:0.01:5; step(sys_cl,t) title('StepAskelvaste response with Proportional Controlsuhteellisella säädöllä') |
Sinun pitäis pitäisi saada seuraavanlainen kuvaaja:
matlab kuva
PID-säädin
Yläpuolella olevasta kuvaajasta näämmenäemme, että sekä vakaan tilan että ylityksen virhe on liians uuriliian suuri. Aijemmista Aiemmista esimerkeistä tiedämme että PID-säätimen integraali kertoimen (Ki) lisääminen poistaa vakaan tilan virheen ja derivointi kerroin (Kd) alentaa ylitystä. Testataan PID-säädintä pienillä Ki ja Kd arvoilla. Muuta m-tiedostoa seuraavanlaiseksi:
Code Block |
---|
J=0.01; b=0.1; K=0.01; R=1; L=0.5; num=K; den=[(J*L) ((J*R)+(L*b)) ((b*R)+K^2)]; motor=tf(num,den); Kp=100; Ki=1; Kd=1; contrsaadin=tf([Kd Kp Ki],[1 0]); sys_cl=feedback(contrsaadin*motor,1); step(sys_cl) title('PID_säädin Controlpienellä with small Ki andja Kd arvolla') |
Suorittamalla muutetun m-tiedoston saat seuraavanlaisen kuvaajan
matlab kuvaaja
Vahvistuksen säätäminen (gain)
Nyt asettumisaika on liian pitkä. Ki termiä kasvattamalla voimme alentaa asettumisaikaa. Muuta m-tiedostossa Ki arvoon 200. Suorita jälleen ohjelma ja kuvaajan pitäisi näyttää seuraavalta:
Nyt näemme että reagointi on paljon nopeampaa kuin aikaisemmin. Suuri Ki:n arvo on kuitenkin kasvattanut ylitystä. Seuraavaksi suurennetaan Kd arvoa jolla voidaan pienentää ylitystä. Muuta m-tiedostossa Kd arvo 10. Suorita ohjelma ja kuvaajan pitäisi näyttää seuraavanlaiselta:
Tämän jälkeen tiedämme että jos käytämme PID-säätimelle arvoja
Code Block |
---|
Kp=100;
Ki=200;
Kd=10;
|
Tulevat kaikki vaatimukset täytetyksi.
Sama Scilabilla
Code Block |
---|
function moottoriStepJaBode ()
s=poly(0,'s'); //määrää s polynomin muuttujaksi
U=12; I=10;n=1500;T=2 //moottorin alkuarvot
J=0.01;R=1;L=0.5;b=0.1
Kt=T/I
Ke= U/(1500/60*2*3.14)
//moottorin siirtofunktio
//Ω / U =K t / (JL s2 + (JR+Lb) s+(b*R+K t K e));
SiirtofunkNopeus=Kt/(J*L*s^2+ (J*R+L*b)*s+(b*R+Kt*Ke))
//linearisen systeemin maarittely
systeemiLin=syslin('c',SiirtofunkNopeus);//muodostetaan systeemi aikajatkuvana ('c') lineaarisena mallina.
t=[0:0.05:5]; //aika vektori, jota käytetään simulaatiossa alku:resoluutio:loppuaika
y1=csim('step',t,systeemiLin); // Simuloidaan järjestelmää askefunktiolla
scf(1);clf; //avataan ja puhditetaan kuva-alue
//moottorin askelvaste, ota kommentit pois jos haluat askelfunktion pelkasta moottorista
//plot(t,y1)
//moottorin bodediagrammi
//bode(sys, 0.01, 100);
//HUOM! takaisinkykentahaaran asteluvun tulee olla yhtäsuuri tai suurempi kuin
takaisinkytkentaLin=syslin('c',[(2+0*s)/(1+0*s)])
//saadin
Kd=0.0001
Kp=10
Ki=0.001
saadin= (Kd*s^2+Kp*s+Ki)/s
saadinLin=syslin('c',saadin)
//muodostetaan takaisinkytkenta operaattorilla /.
takaisinkytkettyJarjestelma=saadinLin*systeemiLin/.takaisinkytkentaLin
bode(takaisinkytkettyJarjestelma, 0.01, 100);
endfunction
|