Høgskolen i Sør-Trøndelag Avdeling for Teknologi Institutt for Elektroteknikk Klasse 2EA Studieretning for automatisering EDT211T Reguleringsteknikk PC-øving nr 1 NB: Det lønner seg å kjøre gjennom leksjonen før du tar fatt på selve øvingen på siste side. 1. Oppstart Før du starter opp Matlab bør du lage en katalog til lagring av filer for eksempel c:\automat Etter at du har startet opp Matlab bør du bør du skifte til denne katalogen. Dette kan gjøres direkte på verktøymenyen (Current directory) eller i kommando-vinduet (command window). I sistnevnte vindu skriver du DOS-kommandoen: >> cd c:\automat 2. Hvordan lage funksjonsdiagrammer >> t=[0:0.01:2]; % Tidsvektor. Består av verdiene 0, 0.01, 0.02,...2 >> y=2*cos(10*t)+2; % Funksjonsvektor. Vil få like mange verdier som t >> plot(t,y) >> grid >> xlabel('t[sek]') >> ylabel('y') >> title('funksjonen y = 2(cos(10t) + 1)') Tittel samt merking av aksene kan også utføres via edit-menyen på figuren. Her brukes da Figure properties og Axes properties. Resultatet blir: 1
3. Bruk av m-fil. m-fil er en tekstfil bestående av tekst og MATLAB kommandoer. Den skal alltid ende med.m! Filen lages fortrinnsvis med Matlabs egen teksteditor. Trykk ikonet helt til venstre på verktøylinjen for å komme inn i editoren. En m-fil kan benyttes av Matlab som en funksjon og hentes ved å skrive navnet på filen uten file-extention.m Om filen heter f. eks tank1.m skriver du tank1 og den blir straks kjørt. NB: Pass på hvilken katalog du legger m-filen på. Du må stå i denne katalogen i kommando-vinduet for å få tilgang til funksjonen. Lag først denne filen og lagre den på katalogen c:\automat % cosplot.m % Denne m-filen plotter funksjonen y = a(cos(omega*t)+1) % Verdien av a og omega må eksistere før m-filen startes. % (parametre kan også legges inn interaktivt ved hjelp av funksjonen "input") % Tidshorisonten for plottet er 0 til 2 sekunder t=[0:0.01:2]; y=a*(cos(omega*t)+1); plot(t,y) xlabel('t[sek]') ylabel('y(t) = a(cos(omega*t) + 1)') title(['a = ',num2str(a),'omega = ',num2str(omega)]) grid I Matlab skriver du så: >> help cosplot cosplot.m Denne m-filen plotter funksjonen y = a(cos(omega*t)+1) Verdien av a og omega må eksistere før m-filen startes. (parametre kan også legges inn interaktivt ved hjelp av funksjonen "input") Tidshorisonten for plottet er 0 til 2 sekunder >> a=10; omega=5; >> cosplot 2
4. Bruk av subplot. >> subplot(221) >> cosplot >> omega=10; subplot(222) >> cosplot >> omega=20; subplot(212) >> cosplot Legg merke til at num2str funksjonen gjør at parameterverdiene a og omega i diagramoverskriftene blir oppdatert automatisk. Dersom du vil ha en oversikt over de variable som ligger i Matlabs arbeidslager, kan du benytte kommandoen whos: >> whos Name Size Bytes Class a 1x1 8 double array omega 1x1 8 double array t 1x201 1608 double array y 1x201 1608 double array Grand total is 404 elements using 3232 bytes 3
5. Forskjellige typer modeller for dynamiske systemer. Gitt svingesystemet til høyre. Bevegelsen av massen kan beskrives av følgende differensiallikning: mx dx kx F Laplacetransformert: ms 2 ds k X s F s d k Disse likningene gir den dynamiske variasjonen omkring likevektspunktet x 0 som er bestemt av tyngdekraften. Til bruk i eksemplene framover settes m=2, d=1,4 og k=0,1 5.1 Transferfunksjon, polynomform Transferfunksjonen mellom F og X blir: h s 2 X s 1 F s 2s 1, 4s 0,1 Denne beskrives i Matlab ved tellerpolynom teller, og nevnerpolynom nevner: >> teller=1; nevner=[2 1.4 0.1]; m F x 5.2 Transferfunksjon, pol-nullpunkt-form Alle transferfunksjoner uten tidsforsinkelse kan skrives på formen: s Z1s Z2 s ZM h s K s P s P s P 1 2 N Her er Z nullpunkter og P er poler i h(s). K er forsterkninga. Poler og nullpunkter kan du finne i Matlab ved å bruke tf2zp (Transfer Function TO Zero Pole): >> format compact >> [Z,P,K]=tf2zp(teller,nevner) Z = Empty matrix: 0-by-1 P = -0.6193-0.0807 K = 0.5000 ( format compact gjør utskriften litt tettere i Matlab-vinduet. ) En annen mulighet til å finne polene er å bruke funksjonen roots : >> P=roots(nevner) P = -0.6193-0.0807 4
5.3 Tilstandsromform (state space) Vi bruker følgende oppsett for tilstandsrommodeller: x Ax Bu Cv y Dx Eu Fw Tilstandsromformen for systemet vårt blir: x 0,7x 0,05x 0,5u v x 1 1 2 x 2 1 (dynamiske tilstandslikninger) (algebraiske målelikninger) der x 1 (hastighet) og x 2 (posisjon) er systemets tilstander, u = F er systemets pådrag v = mg er forstyrrelsen I Matlab kan vi overføre et system på transferfunksjonform til tilstandsform ved hjelp av funksjonen tf2ss (Transfer Function TO State Space): >> help tf2ss TF2SS Transfer function to state-space conversion. [A,B,C,D] = TF2SS(NUM,DEN) calculates the state-space representation:. x = Ax + Bu y = Cx + Du of the system: NUM(s) H(s) = -------- DEN(s) from a single input. Vector DEN must contain the coefficients of the denominator in descending powers of s. Matrix NUM must contain the numerator coefficients with as many rows as there are outputs y. The A,B,C,D matrices are returned in controller canonical form. This calculation also works for discrete systems. For discrete-time transfer functions, it is highly recommended to make the length of the numerator and denominator equal to ensure correct results. You can do this using the function EQTFLENGTH in the Signal Processing Toolbox. However, this function only handles single-input single-output systems. See also TF2ZP, SS2TF, ZP2SS, ZP2TF. Legg forøvrig merke til at Matlab bruker betgnelsen C om målematrisen (vi bruker D om denne) og D om overføringsmatrisen (vi bruker E om denne) og at vi ikke kan finne noen forstyrrelsesmatrise (vår C) eller målestøymatrise (vår F) ved hjelp av denne funksjonen. 5
Jeg foretrekker å bruke våre betegnelser for matrisene og dette kan vi få til på følgende måte: >> [A,B,D,E]=tf2ss(teller,nevner) A = -0.7000-0.0500 1.0000 0 B = 1 0 D = 0 0.5000 E = 0 6. Simulering av sprangrespons Matlab-funksjonen step gir en rask og enkel måte å få fram sprangresponser på. Vi har flere muligheter ved kall av funksjonen step. Vi kan også velge om vi vil benytte tilstandsrommodell eller transferfunksjonmodell. Skriv help step i Matlab for å se flere detaljer. Det aller raskeste er denne måten: >> step(teller,nevner) >> grid Diagrammene kan overføres til annet dokument ved å gå inn på edit-menyen og velge copy figure. Deretter brukes vanlige klipp-og-lim funksjoner. Best er allikevel å lage en såkalt LTI-modell som er standard i Matlab og gir et utgangspunkt for alle slags simuleringer, Bode-diagram osv. Dette gjøres på følgende måte: >> svingsys=tf(teller,nevner); >> step(svingsys), grid Resultatet bli selvsagt det samme som før. 6
7. Simulering i Matlab ut fra blokkdiagram Td + - h3 540 + - h1 10 s + 1 h2 1 2s+0.5 T h4 0.1 Følgende Matlab-funksjoner blir brukt: series, feedback, step, ginput, axis, lsim, bode og semilogx 7.1 Hvordan bestemme transferfunksjonen for et blokkdiagram I eksemplet vist nedenfor kaller vi tellerpolynomene tx og nevnerpolynomene nx der x refererer til transferfunksjon-nummer 1,2,3 og 4 i figuren ovenfor. Framgangsmåte: Først bruker vi series for å regne ut transferfunksjonen ha = ta/na som er seriekoplingen av h1 og h2. Deretter bruker vi feedback for beregning av transferfunksjonen hb = tb/nb for den innerste sløyfa. Deretter må vi finne hc = tc/nc for seriekoplingen av h3 og og hb. Til slutt brukes feedback på nytt for å finne transferfunksjonnen mellom ω d og ω. >> t1=10; n1=[1 1]; h1=tf(t1,n1); >> t2=1; n2=[2 0.5]; h2=tf(t2,n2); >> t3=540; n3=1; h3=tf(t3,n3); >> t4=1; n4=10; h4=tf(t4,n4); >> ha=series(h1,h2); >> hb=feedback(ha,h4); >> hc=series(h3,hb); >> motor=feedback(hc,1); >> motor Transfer function: 54000 --------------------- 20 s^2 + 25 s + 54015 7
7.2 Enkel sprangrespons, forandring av akser, avlesing av periodetid >> step(motor) >> axis([0 0.5 0 2]), grid >> [tid,turtall]=ginput tid = 0.1514 0.2738 turtall = 0.9952 0.9760 Priodetiden leses av ved hjelp av ginput. Ved kall av denne får du et trådkors i diagrammet. Plasser trådkorset ved starten av en periode og trykk på venstre musetast. Flytt trådkorset til slutten av perioden og trykk venstre musetast igjen og deretter ENTER-tasten på tastaturet. Du får da en utskrift som vist ovenfor, og kan beregne periodetiden T. ( Av turtallsverdiene som jeg fikk ser vi at disse målingene kan gjøres mer nøyaktig enn ovenfor. Turtallsverdiene skal ideelt sett bli like. Periodetiden blir differansen mellom de to tids-verdiene) 7.3 Bruk av lsim for simulering med pådrag som ikke er et enhetssprang >> help lsim LSIM Simulate time response of LTI models to arbitrary inputs. LSIM(SYS,U,T) plots the time response of the LTI model SYS to the input signal described by U and T. The time vector T consists of regularly spaced time samples and U is a matrix with as many columns as inputs and whose i-th row specifies the input value at time T(i). For example, t = 0:0.01:5; u = sin(t); lsim(sys,u,t) simulates the response of a single-input model SYS to the input u(t)=sin(t) during 5 seconds. For discrete-time models, U should be sampled at the same rate as SYS (T is then redundant and can be omitted or set to the empty matrix). For continuous-time models, choose the sampling period T(2)-T(1) small enough to accurately describe the input U. LSIM issues a warning when U is undersampled and hidden oscillations may occur. LSIM(SYS,U,T,X0) specifies the initial state vector X0 at time T(1) (for state-space models only). X0 is set to zero when omitted. LSIM(SYS1,SYS2,...,U,T,X0) simulates the response of multiple LTI models SYS1,SYS2,... on a single plot. The initial condition X0 is optional. You can also specify a color, line style, and marker for each system, as in lsim(sys1,'r',sys2,'y--',sys3,'gx',u,t). 8
Y = LSIM(SYS,U,T) returns the output history Y. No plot is drawn on the screen. The matrix Y has LENGTH(T) rows and as many columns as outputs in SYS. For state-space models, [Y,T,X] = LSIM(SYS,U,T,X0) also returns the state trajectory X, a matrix with LENGTH(T) rows and as many columns as states. For continuous-time models, LSIM(SYS,U,T,X0,'zoh') or LSIM(SYS,U,T,X0,'foh') explicitly specifies how the input values should be interpolated between samples (zero-order hold or linear interpolation). By default, LSIM selects the interpolation method automatically based on the smoothness of the signal U. See also GENSIG, STEP, IMPULSE, INITIAL, LTIMODELS. Overloaded methods help lti/lsim.m help frd/lsim.m For å kunne bruke lsim må vi først lage en tidsvektor t, og et pådrag u. Vi lar først u være en sinus med vinkelfrekvens 10 rad/s >> t=[0:0.01:2]; >> u=sin(10*t); >> [y,x]=lsim(motor,u,t); >> plot(t,u,'-',t,y,'--'), grid Så undersøker vi oppførselen til motoren for en frekvens som er 10 ganger så stor. Vi simulerer i 10 sekunder og ser på signalene de siste 0,2 sekunder av simuleringstiden. >> t=[0:0.001:10]; >> u=sin(100*t); >> [y,x]=lsim(motor,u,t); >> plot(t,u,'-',t,y,'--'), grid >> axis([9.8 10-1 1]) 9
7.4 BODE-diagram, enkleste måte Den enkleste måten å få fram et bodediagram på er ganske enkelt kommandoen bode >> bode(motor), grid Bruk selv help for å se hvordan funksjonen bode kan brukes. 7.5 BODE-diagram med kontroll av akser og oppløsning Vi bruker logspace til å lage en logaritmisk vektor for w. Som du ser nedenfor er det angitt at den skal ha 400 verdier fordelt mellom frekvensene 10 rad/s (log=1) og 100 rad/s (log=2) Ved plotting bruker vi kommandoen semilogx som gir logaritmisk skalert x-akse. Legg merke til at dataene må omformatteres for å kunne brukes til plotting. Dessuten må forsterkningsverdiene regnes om til db (20*log10(A)) : >> w=logspace(1,2,400); >> [A1,phi1]=bode(motor,w); >> size(a1) ans = 1 1 400 >> % vi ser at A1 (og phi1) har et format som er >> % uegnet for plotting. Dette ordnes slik: >> >> for n=1:400 A(n,1)=A1(1,1,n); phi(n,1)=phi1(1,1,n); end >> >> % så må forsterkningen (A) konverteres til db: >> >> AdB=20*log10(A); >> semilogx(w,adb), grid >> figure(2) >> semilogx(w,phi), grid 10
PC-øving 1 Oppgave 1 (plott.m) Lag et program som plotter i 4 adskilte plott, men i samme bilde, funksjonene : 1 2 3 1 2 4 1 2 y sin t a y cos t b y y y y y y Alle plottene skal ha grid og tidshorisonten 0 til 10 sekunder. a, b, ω og θ skal spesifiseres av bruker før kall av programmet. Det må gå klart frem av plottene hvilke funksjoner som vises samt verdiene på a, b, ω og θ. Programforfatters navn skal vises i hjelpeteksten til programmet. Programmet lagres på filen : plott.m NB: Pass på å få med to t er i navnet, ellers vil Matlab forveksle m-fila med kommandoen plot. Oppgave 2 (sprang.m) Differensialligningen for et svingesystem blir: mx Dx kx F Anta at m = 1 kg, k = 1 N/m. Du skal undersøke hvordan systemet oppfører seg for forskjellige verdier av D: D = 1, 1.5, 2 og 2.5 Lag et program (sprang.m) som simulerer systemet når F er et enhetssprang (1N) og systemet er helt i ro når spranget inntrer. Programmet skal vise innsvingningsforløpet for posisjonen, x, for de 4 forskjellige verdiene av D. Oppgave 3 (butterx.m) Et 3.ordens Butterworth lavpassfilter med båndbredde ω 0 har transferfunksjonen h s 3 0 2 2 s 0s 0 s 0 Lag at program (butterx.m) som tegner bodediagrammet for et slikt filter. Båndbredden ω 0 skal kunne spesifiseres før kall av programmet. (x-en i navnet er vesentlig da det finnes en Matlab funksjon som heter butter.) 11