walterword Inserito: 13 ottobre 2002 Segnala Share Inserito: 13 ottobre 2002 sto mettendo giu un pid fatto in casa in base a quanto i vecchi libri di matematica mi suggerisconopremesso che si tratti di una valvola proporzionale e che sia da controllare una temperatura , e premesso che il twido non abbia numeri a 32 bitpensavo di svolgere i calcoli come segue setpoint:=%mw10feddback:=%mw11kp:=%mw12 , chi:=%mw13 , kd:=%mw14cost. prop. cost. integ. cost. deriv.dti:=%mw15 tempo di campionamento per l'integraledtd:=%mw16 tempo di campionamento per la derivataerrore:=%mw17 erroreerr_precedente:=%mw18 errore precedenteoutp:=%mw20 uscita prop.outi:=%mw21 uscita int.outd:=%mw22 uscita deriv.out:=outp+outi+outd+ bias(che spero di non usare)beginerrore:=setpoint-feedback outp:=errore*kp (faro' partire la funzione solo con il proporzionale fino a quando la curva non vada in equilibrio dopodiche aggiungo l'integrale:outi:=(errore/dti)*chi uscita integrale outd:=((errore-err_precedente)/dtd)*kd uscita derivataout:=outp+outi+outderr_precedente:=erroreconsiderando che la valvola mi lavori da 0 a 10 volt , quindi min e max ,e che sull'out dovro scalare il valore , e che scatenero un interrupt a tempo non capisco alcune cose:dti che sarebbe il delta t in base al quale calcolo l'area dell'integrale coincide con il tempo di campionamento? (tra un interrupt ed il successivo?)dtd che sarebbe anche qua la base del rettangolo dove vado a calcolare la pendenza della curva e quindi la derivata e' un tempo a se oppure anche lui coincide con il tempo di campionamento???ed in fine pensavo di lanciare questi calcoli all'interno di un interrupt chiamato ogni 3-4 secondi a parte il fatto che non ho ancora studiato come fare il manuale e l'automatico del pid , al limite se decido di farlo nel momento in cui decidessi di mettere in manuale posso tranquillamente impostare setpoint=feedback forzandolo o esiste una prassi ben piu definitagiusto perche il pid magari lavora ancora e nel momento in cui rimetto in automatico non vorrei che mi sparesse l'uscita grazie a tutti (in particolare al mago dell'automazione nonche dei controlli sig. livio qualora volesse insegnarmi qualcosa)ciao e buona domenica Link al commento Condividi su altri siti More sharing options...
rguaresc Inserita: 13 ottobre 2002 Segnala Share Inserita: 13 ottobre 2002 A occhio e croce mi sembra che:- Il calcolo dell'azione proporzionale vada bene.- Il calcolo dell'azione derivativa può andare se il dtd è l'intervallo tra due interrupt. In sostanza fai la derivata tra un interrupt e l'altro.- Per l'azione integrale non direi. Devi fissare un tempo integrale Ti che sia utile per il processo e assai superiore al "dt" tra due interrupt. Poi devi totalizzare tutti i prodotti (errore * dt) fino a che la somma dei dt uguaglia il Ti. Questo totale per chi sarà l'azione integrale. Per implementarlo potresti ad esempio, fare un vettore (blocco dati) a scorrimento con tante posizioni quanti sono i dt che ti servono più uno e quando campioni l'errore devi fargli posto facendo scorrere i vecchi campionamenti di un posto perdendo il più vecchio.Non si riesce a calcolare l'integrale con i soli dati attuali e di un momento fa, bisogna tenere traccia dell'errore per tutto il tempo Ti. Se il tempo Ti è troppo piccolo non serve. Non ho mai provato a fare un algoritmo PID istruzione per istruzione. E' interessante, ma sono certo che quelli dei regolatori sono sofisticati. Bisogna anche pensare a "tener buono" il regolatore all'avviamento e quando si cambia il set.SalutiR.G. Link al commento Condividi su altri siti More sharing options...
Federico Milan Inserita: 14 ottobre 2002 Segnala Share Inserita: 14 ottobre 2002 Ciao,il passaggio da manuale a automatico è meglio usare (come hai giustamente intuito) tecniche bumpless, cioè, quando tu passi in manuale, fai in modo che ance il set pint e la regolazione segua il manuale, in modo che quando ripassi in automatico non hai il colpo dovuto a uno scalino ... dipende da come si realizza il pid, molti non sono dacordo in questo utilizzo, ma spesso si vede che chi = Kp/Ti , cioè Ti è il tempo in cui si anulla l'azione proporzionale ... stesso discorso per la derivativa ... In linea di principio il codice è giusto, quello che mi preocupa sono i calcoli a 16 bit, la questione è che potrebbe fuzionare tutto senza problemi, come potrebbero inescarsi delle oscillazioni dovute alla quantizzazione ... il problema infatti, non è solo nel linearizzare l'azione della valvola tra 0-10 volt, ma il cacolo fatto a 16 bit, potrebbe saltarti delle condizioni, quindi porre in oscillazione il sistema, infatti integrando a passi, se sono troppo grandi approssimi troppo con le conseguenze citate ... ciao Link al commento Condividi su altri siti More sharing options...
curob21 Inserita: 14 ottobre 2002 Segnala Share Inserita: 14 ottobre 2002 Aggiungi anche :If Int_err > IL then Int err = ILIf Int:err < -IL then Int_err = -ILIL = limitazione dellintegraleServe per evitare che l'integrale vada in overflow e per limitarne l'azione Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora