...
PID-säätimen
...
suunnittelu
...
DC-moottorin
...
nopeussäätimeen
...
Dynaamiset
...
yhtälöt
...
ja
...
avoimen
...
silmukan
...
siirtofunktiot
...
Järjestelmän lohkokaavio näyttää seuraavalta:
Alkuperäisen ongelman yhtälöt ja derivoinnit löytyvät edellisestä esimerkistä DC-moottorin malli. Käy malli läpi, jos yhtälöt ovat hepreaa.
Jos laitetaan askelvasteen vaatimukseksi 1rad/s, perusteet ovat:
- Asettumisaika alle 2 sekuntia
- Ylitys on alle 5 %
- Paikallaan ollessa virhe on alle 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 järjestelmään. Luo ensin uusi m-tiedosto ja syötä seuraavat komennot (katso DC-moottorin mallia, josta löytyy tiedot miten kyseinen malli on tehty)
Code Block |
---|
|http://wiki.metropolia.fi/display/koneautomaatio/Esimerkki+DC-moottori] Järjestelmän lohkokaavio näyttää seuraavalta: !s.JPG! Alkuperäisen ongelman yhtälöt ja derivoinnit löytyvät edellisestä esimerkistä DC-moottorin malli. Käy malli läpi, jos yhtälöt ovat hepreaa. Jos laitetaan askelvasteen vaatimukseksi 1rad/s, perusteet ovat: * Asettumisaika alle 2 sekuntia * Ylitys on alle 5 % * Paikallaan ollessa virhe on alle 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 järjestelmään. Luo ensin uusi m-tiedosto ja syötä seuraavat komennot (katso DC-moottorin mallia, josta löytyy tiedot miten kyseinen malli on tehty) {code} function Moottori() J=0.01; b=0.1; K=0.01; R=1; L=0.5; jaettava=K; jakaja=[(J*L) ((J*R)+(L*b)) ((b*R)+K^2)]; motor=tf(jakaja,jaettava); {code} |
Siirtofunktio
...
PID
...
säätimelle
...
on:
Suhteellinen säätö (proportional control)
Katsotaan ensin suhteellisen säädön 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 |
---|
!r.JPG! h1. Suhteellinen säätö (proportional control) Katsotaan ensin suhteellisen säädön 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} Kp=100; saadin=Kp; sys_cl=feedback(saadin*motor,1); {code} |
Jotta
...
näytölle
...
saadaan
...
aikaiseksi
...
kuvaaja
...
tarvitsee
...
lisätä
...
seuraavat
...
komennot.
...
Lisää
...
komennot
...
m-tiedoston
...
loppuun
...
ja
...
suorita
...
ohjelma.Tämän
...
jälkeen
...
voidaan
...
tutkia
...
askelvastetta.
Code Block |
---|
} t=0:0.01:5; step(sys_cl,t) title('Askelvaste suhteellisella säädöllä') {code} |
Sinun
...
pitäisi
...
saada
...
seuraavanlainen
...
kuvaaja:
PID-säädin
...
Yläpuolella
...
olevasta
...
kuvaajasta
...
näemme,
...
että
...
sekä
...
vakaan
...
tilan
...
että
...
ylityksen
...
virhe
...
on
...
liian
...
suuri.
...
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; saadin=tf([Kd Kp Ki],[1 0]); sys_cl=feedback(saadin*motor,1); step(sys_cl) title('PID_säädin pienellä Ki ja Kd arvolla') {code} |
Suorittamalla
...
muutetun
...
m-tiedoston
...
saat
...
seuraavanlaisen kuvaajan
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 |
---|
kuvaajan \\ !pieni_Ki_Kd.JPG|align=center!\\ h1. h1. 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: \\ !suuri_Ki.JPG|align=center!\\ 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: \\ !PID_saadin.JPG|align=center!\\ Tämän jälkeen tiedämme että jos käytämme PID-säätimelle arvoja {code} Kp=100; Ki=200; Kd=10; {code} |
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 {code} |