Entra

View Full Version : [Controllo Digitale] Datemi una mano che sono in crisi per favore!


luxorl
22-07-2006, 16:26
Ciao, devo consegnare entro questo mercoledì questo progetto:

Due robot cooperano per manipolare un’asta prima di inserirla in un’apertura di un blocco posizionato su un tavolo. La funzione di trasferimento che caratterizza il controllo di un giunto di un robot ha la seguente forma:

Gp(S) ═ 4/S(S+0.5)

Si Programmi un regolatore che garantisca il soddisfacimento delle seguenti specifiche:

- Errore di velocità pari a 0.0125
- Tempo di Assestamento Ta ≤ 2 sec
- Picco SMax ≤ 25%

Lo devo svolgere con tre metodologie diverse, la prima è la tecnica della discetizzazione..

Vi allego il mio svolgimento con il primo metodo..

Il mio problema è che non so come fare per impostare un errore di velocità pari a 0.0125... lo che che dovrei utilizzare il teorema del valor finale:

lim s-->0 di s*E(s)

dove E(s) sta per la funzione di trasferimento dell'errore a ciclo chiuso..

il problema è che visto che il mio sistema ha già un polo in zero mi basterebbe avere un controllore statico K per avere un errore finito alla rampa.. solo che per far rispettare le altre due specifiche non riesco a far rispettare la prima.. (cry)

comunque per capire leggete l'allegato.. e ditemi la vostra per favore!! è urgente e sono disperato :muro:

luxorl
22-07-2006, 17:01
TECNICA DELLA DISCRETIZZAZIONE


- Prima Fase: Scelta del Tempo di Campionamento:

Ci sono moltissimi modi per la scelta di un tempo di campionamento appropriato.
Avendo una specifica sul tempo di assestamento, in questa prima parte del progetto, ho scelto di prendere un tempo di campionamento in modo da avere 50 campioni della risposta del sistema all’interno del tempo di assestamento:

Ta = 2 sec
T = 2/50 = 0.0400


- Seconda Fase: Costruzione Schema a Blocchi a Tempo Continuo:

La funzione di trasferimento del ricostruttore di ordine zero è:

H0(S) = (1 – e-ST) / S

Quest’ultima può essere approssimata attraverso lo sviluppo in serie di Taylor a:

H0(S) ≈ T / (1+T/2 S)

Questa funzione è in cascata con il campionatore il quale ha un guadagno pari a 1/T quindi avremo:

GH(S) = 1/T ∙ T/(1+T/2 S) = 1 / 1 + T/2 S

Svolgendo la cascata tra Gp(S) e GH(S) la nostra G(S) da controllare sarà uguale a:

G(S) = Gp(S) GH(S) = 1/(1+T/2 S) 4/S(S+0.5)
G(S) = 4/(0.02 s3 + 1.01 s2 + 0.5 s)

Che nella forma poli, zeri, guadagno è uguale a:

G(S) = 200 / S (S+50) (S+0.5)
Abbiamo quindi poli in:

- p1 = 0
- p2 = -50
- p3 = -0.5

-Terza Fase: Determinazione di un Controllore C(S) a Tempo Continuo:

Nelle specifiche come prima richiesta ho un errore alla rampa pari a 0,0125.
Per avere un errore finito alla rampa bisogna avere un polo nell’origine. Se osserviamo la funzione di trasferimento da controllare ci accorgiamo subito che il polo nell’origine di cui abbiamo bisogno c’è già. Proviamo quindi a procedere con il più semplice dei controllori:

Cs(S) = K

Applicando il teorema del valor finale otteniamo:

lim S→0 S E(S)

Dove E(S) è la funzione di trasferimento dell’errore che uguale a:

E(S) = R(S) / 1+G(S)Cs(S)

Dove R(S) è il riferimento in ingresso, nel nostro caso la rampa: 1/S2, sostituendo:

E(S) = (1/S2) / (1 + 200K / S (S+50) (S+0.5))
E(S) = (S+50)(S+0.5) / S2(S+50)(S+0.5)+200K

Quindi tornando al teorema del valor finale:

lim S→0 S (S+50)(S+0.5) / S2(S+50)(S+0.5)+200K

Otteniamo:

1 / 8K

Che poniamo uguale all’errore desiderato:

1 / 8K = 0.0125
K = 1 / 0.0125 * 8 = 10

Abbiamo trovato la parte statica del nostro controllore: Cs(S) = 10.


Attenzione però, guardando il luogo delle radici di G(S):

Ci accorgiamo subito dei problemi di stabilità che potremmo avere, perché il sistema a ciclo chiuso non risulta stabile per ogni valore di K, infatti i due poli più significativi tendono a marciare verso l’instabilità. Se effettuiamo uno zoom della parte critica

Vediamo che esiste qualche valore di K per cui il sistema risulterà stabile. Per trovare questi valore applichiamo Routh.

Calcoliamo per primo la nostra funzione di trasferimento a ciclo chiuso, la W(S):

W(S) = Cs(S) G(S) / 1 + Cs(S) G(S)
W(S) = K G(S) / 1 + K G(S)
W(S) = 200K / S(S+50)(S+0.5)+200K

Prendiamone solo il denominatore:

DW(S) = S(S+50)(S+0.5)+200K
DW(S) = S3 + 50.5S2 + 25S + 200K

Costruendo la tabella di Routh otteniamo:

Da cui otteniamo le seguenti disequazioni:

K < 6.3125
K > 0

Per cui il sistema W(S) risulterà stabile per valori di K compresi strettamente fra 0 e 6.3125.


Tempo di Assestamento Ta ≤ 2 Sec

Sappiamo che il Tempo di Assestamento è uguale a:

Ta = 3 / δωn
δωn ≈ −Re[pi]

La parte reale dei poli più significativi del sistema in analisi è al massimo pari al punto di diramazione dei due poli nel luogo delle radici e questo nel nostro caso è pari a: 0.249. Approssimandolo a 0.25 e calcolandoci il Ta ci accorgiamo subito che:

Ta ≈ 3 / 0.25
Ta ≈ 12 Sec

Decisamente troppo per la nostra specifica. Con un solo controllore statico non riesco a coprire le specifiche, ho bisogno di aggiungere una parte dinamica. E lavorando per cancellazione mi rendo conto che il polo che mi crea problemi è il polo in -0.5, per questo aggiungo uno zero in -0.5, e ovviamente per la fisica realizzabilità ho necessità di aggiungere anche un nuovo polo.

Cd(S) = S + 0.5 / 1 + τpS

Devo scegliere il nuovo polo in modo che il punto di diramazione si trovi in almeno -1.5 se non di più. Decido quindi di fissare il nuovo polo in -3 in modo che con il polo in 0 il punto di diramazione sia circa uguale a -1.5.

Però anche così non ce la faccio, infatti osservando la risposta

Ho una sovraelongazione massimo dello 0% ma un tempo di assestamento ancora troppo alto, pari a 3.97. Decido allora di allontanare ancora di più il polo appena aggiunto in modo da spostare anche più a sinistra il punto di diramazione.
Raddoppio il polo, da -3 lo sposto a -6.5, e il punto di diramazione si sposta a circa -3.15.
Prendendo i poli in modo che siano reali e più grandi possibili (esattamente nel punto di diramazione) ottengo:

Ottengo un tempo di assestamento di 1.88 secondi e una sovraelongazione praticamente inesistente.
Il controllore ottenuto è

2.7919(S+0.5) / (s+6.5)

Come faccio a modificare questo controllore per rispettare anche la specifica sull'errore alla rampa?


(Ho omesso le immagini)

pietro84
22-07-2006, 18:10
TECNICA DELLA DISCRETIZZAZIONE


- Prima Fase: Scelta del Tempo di Campionamento:

Ci sono moltissimi modi per la scelta di un tempo di campionamento appropriato.
Avendo una specifica sul tempo di assestamento, in questa prima parte del progetto, ho scelto di prendere un tempo di campionamento in modo da avere 50 campioni della risposta del sistema all’interno del tempo di assestamento:

Ta = 2 sec
T = 2/50 = 0.0400


- Seconda Fase: Costruzione Schema a Blocchi a Tempo Continuo:

La funzione di trasferimento del ricostruttore di ordine zero è:

H0(S) = (1 – e-ST) / S

Quest’ultima può essere approssimata attraverso lo sviluppo in serie di Taylor a:

H0(S) ≈ T / (1+T/2 S)

Questa funzione è in cascata con il campionatore il quale ha un guadagno pari a 1/T quindi avremo:

GH(S) = 1/T ∙ T/(1+T/2 S) = 1 / 1 + T/2 S

Svolgendo la cascata tra Gp(S) e GH(S) la nostra G(S) da controllare sarà uguale a:

G(S) = Gp(S) GH(S) = 1/(1+T/2 S) 4/S(S+0.5)
G(S) = 4/(0.02 s3 + 1.01 s2 + 0.5 s)

Che nella forma poli, zeri, guadagno è uguale a:

G(S) = 200 / S (S+50) (S+0.5)
Abbiamo quindi poli in:

- p1 = 0
- p2 = -50
- p3 = -0.5

-Terza Fase: Determinazione di un Controllore C(S) a Tempo Continuo:

Nelle specifiche come prima richiesta ho un errore alla rampa pari a 0,0125.
Per avere un errore finito alla rampa bisogna avere un polo nell’origine. Se osserviamo la funzione di trasferimento da controllare ci accorgiamo subito che il polo nell’origine di cui abbiamo bisogno c’è già. Proviamo quindi a procedere con il più semplice dei controllori:

Cs(S) = K

Applicando il teorema del valor finale otteniamo:

lim S→0 S E(S)

Dove E(S) è la funzione di trasferimento dell’errore che uguale a:

E(S) = R(S) / 1+G(S)Cs(S)

Dove R(S) è il riferimento in ingresso, nel nostro caso la rampa: 1/S2, sostituendo:

E(S) = (1/S2) / (1 + 200K / S (S+50) (S+0.5))
E(S) = (S+50)(S+0.5) / S2(S+50)(S+0.5)+200K

Quindi tornando al teorema del valor finale:

lim S→0 S (S+50)(S+0.5) / S2(S+50)(S+0.5)+200K

Otteniamo:

1 / 8K

Che poniamo uguale all’errore desiderato:

1 / 8K = 0.0125
K = 1 / 0.0125 * 8 = 10

Abbiamo trovato la parte statica del nostro controllore: Cs(S) = 10.


Attenzione però, guardando il luogo delle radici di G(S):

Ci accorgiamo subito dei problemi di stabilità che potremmo avere, perché il sistema a ciclo chiuso non risulta stabile per ogni valore di K, infatti i due poli più significativi tendono a marciare verso l’instabilità. Se effettuiamo uno zoom della parte critica

Vediamo che esiste qualche valore di K per cui il sistema risulterà stabile. Per trovare questi valore applichiamo Routh.

Calcoliamo per primo la nostra funzione di trasferimento a ciclo chiuso, la W(S):

W(S) = Cs(S) G(S) / 1 + Cs(S) G(S)
W(S) = K G(S) / 1 + K G(S)
W(S) = 200K / S(S+50)(S+0.5)+200K

Prendiamone solo il denominatore:

DW(S) = S(S+50)(S+0.5)+200K
DW(S) = S3 + 50.5S2 + 25S + 200K

Costruendo la tabella di Routh otteniamo:

Da cui otteniamo le seguenti disequazioni:

K < 6.3125
K > 0

Per cui il sistema W(S) risulterà stabile per valori di K compresi strettamente fra 0 e 6.3125.


Tempo di Assestamento Ta ≤ 2 Sec

Sappiamo che il Tempo di Assestamento è uguale a:

Ta = 3 / δωn
δωn ≈ −Re[pi]

La parte reale dei poli più significativi del sistema in analisi è al massimo pari al punto di diramazione dei due poli nel luogo delle radici e questo nel nostro caso è pari a: 0.249. Approssimandolo a 0.25 e calcolandoci il Ta ci accorgiamo subito che:

Ta ≈ 3 / 0.25
Ta ≈ 12 Sec

Decisamente troppo per la nostra specifica. Con un solo controllore statico non riesco a coprire le specifiche, ho bisogno di aggiungere una parte dinamica. E lavorando per cancellazione mi rendo conto che il polo che mi crea problemi è il polo in -0.5, per questo aggiungo uno zero in -0.5, e ovviamente per la fisica realizzabilità ho necessità di aggiungere anche un nuovo polo.

Cd(S) = S + 0.5 / 1 + τpS

Devo scegliere il nuovo polo in modo che il punto di diramazione si trovi in almeno -1.5 se non di più. Decido quindi di fissare il nuovo polo in -3 in modo che con il polo in 0 il punto di diramazione sia circa uguale a -1.5.

Però anche così non ce la faccio, infatti osservando la risposta

Ho una sovraelongazione massimo dello 0% ma un tempo di assestamento ancora troppo alto, pari a 3.97. Decido allora di allontanare ancora di più il polo appena aggiunto in modo da spostare anche più a sinistra il punto di diramazione.
Raddoppio il polo, da -3 lo sposto a -6.5, e il punto di diramazione si sposta a circa -3.15.
Prendendo i poli in modo che siano reali e più grandi possibili (esattamente nel punto di diramazione) ottengo:

Ottengo un tempo di assestamento di 1.88 secondi e una sovraelongazione praticamente inesistente.
Il controllore ottenuto è

2.7919(S+0.5) / (s+6.5)

Come faccio a modificare questo controllore per rispettare anche la specifica sull'errore alla rampa?


(Ho omesso le immagini)


C(s)=Cd(s)Cs(s)
quello che hai trovato è Cd(s).
ora devi fare in modo che il guadagno statico complessivo del controllore sia pari a 10(se è giusto il risultato che hai trovato prima). quindi devi moltiplicare il Cd(s) per la costante adatta e controllare se il sistema è stabile.
C(s)=k Cd(s)
prova k=45 e vedi se il sistema a ciclo chiuso è stabile(a occhio è così ma fai i conti bene)

luxorl
22-07-2006, 20:11
C(s)=Cd(s)Cs(s)
quello che hai trovato è Cd(s).
ora devi fare in modo che il guadagno statico complessivo del controllore sia pari a 10(se è giusto il risultato che hai trovato prima). quindi devi moltiplicare il Cd(s) per la costante adatta e controllare se il sistema è stabile.
C(s)=k Cd(s)
prova k=45 e vedi se il sistema a ciclo chiuso è stabile(a occhio è così ma fai i conti bene)

Grazie come sempre per la risposta!
Si lo so che il controllore lo posso dividere in parte statica e in parte dinamica...
e infatti il mio Cs era uguale a 10... solo che con routh ho trovato che K deve essere compreso fra 0 e 6... e poi quando mi sono calcolato il Cd (parte dinamica del controllore) questo a un suo guadagno.. che interferisce no? se uso K=45 si fa a moltiplicare con il guadagno del Cd che è 2.79.. io devo fare in modo invece che il complessivo sia uguale a 10 no?

pietro84
22-07-2006, 22:32
Cd(s)= 2.7919(S+0.5) / (s+6.5)
Cd(0)=(2.7919*0.5)/6.5=0.2148
questo è il guadagno statico del controllore(parte dinamica).

C(s)=kCd(s)
C(0)=k*0.2148=10----------> k=46.56

in questo modo C(0)=10 e ti trovi con il risultato che volevi ottenere

luxorl
23-07-2006, 08:40
http://img91.imageshack.us/img91/1933/helprm1.jpg


Risposta al gradino:

http://img215.imageshack.us/img215/6209/stepwqw1.jpg

:muro:

Ti faccio vedere cosa ho ottenuto con Routh:


Calcoliamo per primo la nostra funzione di trasferimento a ciclo chiuso, la W(S):

W(S) = Cs(S) G(S) / 1 + Cs(S) G(S)
W(S) = K G(S) / 1 + K G(S)
W(S) = 200K / S(S+50)(S+0.5)+200K

Prendiamone solo il denominatore:

DW(S) = S(S+50)(S+0.5)+200K
DW(S) = S3 + 50.5S2 + 25S + 200K

Costruendo la tabella di Routh otteniamo:


http://img145.imageshack.us/img145/4981/routhdwprimometodofd4.jpg


Da cui otteniamo le seguenti disequazioni:

K < 6.3125
K > 0

Per cui il sistema W(S) risulterà stabile per valori di K compresi strettamente fra 0 e 6.3125


Quindi ho due risultati paradossali!
Ho bisogno che il controllore abbia un guadagno k=10 per avere quell'errore di velocità, però questo valore non è compreso nel range di stabilità trovato con Routh...

la specifica non è ottenibile?



NB: Il sistema è 200/S(s+50)(s+0.5) nell'immagine sopra c'è un errore.. cmq la situazione è la stessa:

-Range Stabilità ottenuto con Routh [0 , 6.3125]
-Per avere un errore alla rampa di 0.0125 ho bisogno di un K=10.. fuori range!!

:cry:

luxorl
23-07-2006, 13:29
:help:

pietro84
23-07-2006, 14:15
devi applicare il teorema del valor finale tenendo conto anche del controllore dinamico che hai trovato, non ho capito se l'hai fatto o no.

luxorl
23-07-2006, 15:54
devi applicare il teorema del valor finale tenendo conto anche del controllore dinamico che hai trovato, non ho capito se l'hai fatto o no.

Ok, guarda:

Il mio sistema è: 200/s (s+50) (s+0.5)

Il mio controllore dinamico è: 2.4719 (s+0.5)/(s+6.5) con questo controllore le specifiche di tempo di assestamente e sovraelongazione sono ampiamente soddisfatte!

TEOREMA DEL VALOR FINALE:

lim s-->0 S*E(S) = S R(S) 1/1+G(S)Cd(S)K

limite di s che tende a zero di s per il riferiemento (nel mio caso la rampa: 1/s^2) per 1 su 1 più Sistema per Controllore Dinamico per il K che sto cercando

si riduce a:

lim S-->0 di
1/S 1/1+ 494.38(S+0.5)K/S(S+6.5)(S+50)(S+0.5) =

(S+6.5)(S+50)(S+0.5) / S(6.5)(S+50)(S+0.5)+494.38(S+0.5)K

Sostituendo S=0 mi rimane solo:

(6.5)(50)(0.5)/494.38(0.5)K =

162.5/247.19K = 0.0125 (pongo uguale all'errore voluto)

K = 162.5 / (247.19*0.0125) = 52.6

E con questo K la mia risposta a ciclo chiuso impazzisce:

http://img49.imageshack.us/img49/4717/stepwab5.jpg

I calcoli li ho fatti e rifatti.. e mi sembrano giusti!
Quello che vorrei sapere è possibile che la specifica non sia ottenibile?

pietro84
23-07-2006, 17:26
ora non ho tempo di seguire tutti i calcoli passo-passo.
cmq è possibile che quando viene richiesta una velocità di risposta troppo alta il sistema diventi instabile.
per curiosità quali sono gli altri 2 metodi?
qui hai usato la trasformazione bilineare per passare dal continuo al discreto?

ps: cmq quella risposta al gradino mi sembra sottocampionata, è troppo spigolosa.

luxorl
23-07-2006, 17:59
ora non ho tempo di seguire tutti i calcoli passo-passo.
cmq è possibile che quando viene richiesta una velocità di risposta troppo alta il sistema diventi instabile.
per curiosità quali sono gli altri 2 metodi?
qui hai usato la trasformazione bilineare per passare dal continuo al discreto?

ps: cmq quella risposta al gradino mi sembra sottocampionata, è troppo spigolosa.

Gli altri due metodi sono:

-Luogo delle radici a tempo discreto
-Piano W

nel metodo che ho postato qui, per discretizzazione, sto lavorando ancora a tempo continuo, aggiungendo al sistema la funzione di trasferimento del campionatore/ricostruttore cioè:

1/1+(T/2)S

il tempo di campionamento l'ho scelto sul tempo di assestamento.. e mi esce 0.04.. ma ancora a parte nella funzione di trasferimento del campionatore/ricostruttore non l'ho ancora usato

luxorl
23-07-2006, 18:08
Ho svolto tutto il secondo metodo (Luogo Radici Discreto) e mi da tutto perfettamente.

Credo di aver individuato il problema dove sta... usando routh sul sistema normale che ho dalla traccia ottengo come unico limite su K per cui il sistema è stabile:

k>0

Mentre nel primo metodo (questo che ho postato qui) il sistema da controllare va messo in cascata con la funzione di trasferimento del campionatore/ricostruttore... questa cosa mi modifica il sistema.. e applicandoci routh ottengo un range di k per cui il sistema è stabile di:

0<k<6.3125

Dovendo avere almeno un K=10 per avere errore di velocità pari a 0.0125
nel primo metodo ho problemi perchè se prendo un k più grande di 6.3125 la risposta a ciclo chiuso impazzisce...

Secondo voi è giusto scrivere sul progetto che usando il primo metodo la cascata sistema-campion/ricostruttore non mi fa ottenere l'errore di velocità desiderato?

pietro84
23-07-2006, 22:09
Ho svolto tutto il secondo metodo (Luogo Radici Discreto) e mi da tutto perfettamente.

Credo di aver individuato il problema dove sta... usando routh sul sistema normale che ho dalla traccia ottengo come unico limite su K per cui il sistema è stabile:

k>0

Mentre nel primo metodo (questo che ho postato qui) il sistema da controllare va messo in cascata con la funzione di trasferimento del campionatore/ricostruttore... questa cosa mi modifica il sistema.. e applicandoci routh ottengo un range di k per cui il sistema è stabile di:

0<k<6.3125

Dovendo avere almeno un K=10 per avere errore di velocità pari a 0.0125
nel primo metodo ho problemi perchè se prendo un k più grande di 6.3125 la risposta a ciclo chiuso impazzisce...

Secondo voi è giusto scrivere sul progetto che usando il primo metodo la cascata sistema-campion/ricostruttore non mi fa ottenere l'errore di velocità desiderato?


c'è qualcosa che non mi quadra...
hai provato ad aumentare la frequenza di campionamento?
diminuisci T e vedi che succede

luxorl
24-07-2006, 11:11
Ok, ti chiedo l'ultimo sforzo ( :ave: )... seguimi per benino un attimo:

Io inizialmente ho campionato a T=0.04.. che mi sembrava abbastanza buono come tempo di campionamento.

Ecco la funzione di trasferimento del campion/ricostruttore con T=0.04... ricordo che la funz di ttrasferimento è: 1/(1+(T/2 S))... quindi non dovrebbero esserci errori...
http://img212.imageshack.us/img212/714/ghmh3.jpg


ed ecco il risultato dopo la cascata con il mio sistema:
http://img209.imageshack.us/img209/9428/gvi0.jpg

e con Routh applicato a quest'ultimo ottengo: 0<k<6.3125

Per farti capire meglio posto il luogo delle radici e la risposta a ciclo chiuso variando pian piano K:

K=0.1 (Si vede anche nell'immagine)
http://img147.imageshack.us/img147/8912/rltool01sn6.jpg

K=3
http://img218.imageshack.us/img218/6828/rltool3gr9.jpg

K=6 (Quasi al limite del risultato ottenuto con Routh)
http://img131.imageshack.us/img131/9114/rltool6rv6.jpg

K=6,5 APPENA APPENA FUORI RANGE DI STABILITA'
http://img143.imageshack.us/img143/5958/rltool65sj0.jpg

K=10 GUADAGNO CHE MI SERVE PER UN ERRORE ALLA RAMPA DI 0.0125
http://img204.imageshack.us/img204/8040/rltool10ek1.jpg

Guarda cosa succede se diminuisco di un ordine di grandezza il tempo di campionamento:

T=0.004 (Decisamente piccolo)

Ecco la nuova funzione del ricostruttore e poi anche la cascata con il mio sistema:
http://img155.imageshack.us/img155/1122/newgtms6.jpg

Non ho applicato Routh a questo nuovo sistema ma guarda che succede se lavoro sul luogo delle radici e inserisco un K=10 come serve a me:
http://img96.imageshack.us/img96/1798/newrltool10vt3.jpg

La risposta a ciclo chiuso rimane stabile... e così fino a K=62 circa...
Praticamente diminuendo di un ordine di grandezza il Tempo di campionamento ho aumentato di un ordine di grandezza il range di k per la quale la funzione rimane stabile?

T=0.04 --------> 0<K<6.3

T=0.004 --------> 0<K<63

Secondo te è giusto quanto detto?
Si può trarre conclusione che con un tempo di campionamento relativamente grande non riesco a ottenere un errore alla rampa per colpa della "lentezza" del campionatore/ricostruttore.. mentre rendendo adeguatamente piccolo sto tempo di campionamento ce la faccio?

pietro84
24-07-2006, 12:40
sì stai cominciando a capire. se la frequenza di campionamento è bassa il sistema non riesce a essere rapido abbastanza per seguire le variazioni richieste dalle specifiche(senza diventare instabile naturalmente).