You are on page 1of 28

Arduino PID - Gua de uso de la librera

Traduccin del trabajo de Brett Beauregard:


http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/

Licencia:
Moyano Jonathan Ezequiel [ jonathan215.mza@gmail.com] Obra liberada bajo licencia Creative Commons by-nc-sa. Reconocimiento - NoComercial - CompartirIgual (by-nc-sa): No se permite el uso comercial de la obra original ni de las posibles obras derivadas, la distribucin de las cuales se debe hacer con una licencia igual a la que regula la obra original. Para ms informacin: http://es.creativecommons.org/licencia/

PID para principiantes, primer acercamiento:


En esta introduccin, veremos los parmetros bsicos a tener en cuenta sobre el control propocional, integral , derivativo (PID); el objetivo de este tutorial no es introducirnos en los anlisis tericos del PID, sin ver su aplicacin en un sistema real, utilizando un microcontrolador programado en un lenguaje de alto nivel, como puede ser C.

La ecuacin del PID:


De la documentacin existente sobre sistemas de control, podemos destacar la siguiente ecuacin.

Para tener una idea ms clara, recurrimos al siguiente diagrama

De la ecuacin, podemos hacer las siguientes afirmaciones: 3

e(t) es el error de la seal. u(t) salida del controlador y entrada de control al proceso. Kp es la ganancia proporcional. Ti es la constante de tiempo integral. Td es la constante de tiempo derivativa.

Del diagrama de flujo determinamos lo siguiente: El primer bloque de control (proporcional) consiste en el producto entre la seal de error y la constante proporcional, quedando un error en estado estacionario casi nulo. El segundo bloque de control (integral) tiene como propsito disminuir y eliminar el error en estado estacionario, provocado por el modo proporcional. El control integral acta cuando hay una desviacin entre la variable y el punto de consigna, integrando esta desviacin en el tiempo y sumndola a la accin proporcional. El tercer bloque de control (Derivativo) considera la tendencia del error y permite una repercusin rpida de la variable despus de presentarse una perturbacin en el proceso. Explicado lo anterior, tenemos el siguiente cdigo:
/ Vralsuiiaa e e cnrldrPD * * aibe tlzds n l otoao I. / usge ln lsTm; nind og atie dul Ipt Otu,Ston; obe nu, upt epit dul eru,lsEr obe rSm atr; dul k,k,k; obe p i d vi Cmue) od opt( { / Cat tep ps dsee tm cluo * * uno imo a ed l lio cl. / usge ln nw=mli(; nind og o ils) dul tmCag =(obe(o -lsTm) obe iehne dul)nw atie; / Cluao tdslsvralsd err * * aclms oa a aibe e ro. / dul err=Ston -Ipt obe ro epit nu; eru + (ro *tmCag) rSm = err iehne; dul dr =(ro -lsEr /tmCag; obe Er err atr) iehne / Cluao l fnind sld dlPD * * aclms a uc e aia e I. /

Otu =k *err+k *eru +k *dr; upt p ro i rSm d Er / Gadmse vlrd agnsvralspr e pioccod cluo * * urao l ao e lua aibe aa l rxm il e cl. / lsEr=err atr ro; lsTm =nw atie o; } / Etbeeo lsvlrsd lscntne pr l snoiain * * salcms o aoe e a osats aa a itnzc. / vi Stuig(obeK,dul K,dul K) od eTnnsdul p obe i obe d { k =K; p p k =K; i i k =K; d d }

El programa anterior funciona correctamente, pero tiene limitaciones en cuanto a su aplicacin a un sistema real. Para que se comporte como un PID de nivel industrial, hay que tener en cuenta otros parmetros; el algoritmo del PID funciona mejor si se ejecuta a intervalos regulares, si se incorpora el concepto del tiempo dentro del PID, se pueden llegar a simplificar los clculos.

El problema:
Los PID principiantes, estn diseados para ejecutarse a periodos irregulares, esto puede traer 2 problemas: - Se tiene un comportamiento inconsistente del PID, debido a que en ocaciones se lo ejecuta regularmente y a veces no. - Hay que realizar operaciones matemticas extras para calcular los trminos correspondientes a la parte derivada e integral del PID, ya que ambos son dependientes del tiempo.

La solucin:
Hay que asegurarse que la funcin que ejecuta el PID lo haga regularmente. Basado en un tiempo de ejecucin predeterminado, el PID decide si debe hacer clculos o retornar de la funcin. Una vez que nos aseguramos que el PID se ejecuta a intervalos regulares, los clculos correspondientes a la parte derivada e integral se simplifican. 5

/ Vralsuiiaa e e cnrldrPD / aibe tlzds n l otoao I. usge ln lsTm; nind og atie dul Ipt Otu,Ston; obe nu, upt epit dul eru,lsEr obe rSm atr; dul k,k,k; obe p i d itSmlTm =10;/ Stao e tep d mete e 1sgno n apeie 00 / eems l imo e usro n eud. vi Cmue) od opt( { usge ln nw=mli(; nind og o ils) ittmCag =(o -lsTm) n iehne nw atie; / Dtrias hyqeeeua e PDortra d l fnin / eemn i a u jctr l I eonr e a uc. i(iehne=apeie ftmCag>SmlTm) { / Cluatdslsvralsd err / acl oa a aibe e ro. dul err=Ston -Ipt obe ro epit nu; eru + err rSm = ro; dul dr =(ro -lsEr; obe Er err atr) / Cluao l fnind sld dlPD / aclms a uc e aia e I. Otu =k *err+k *eru +k *dr; upt p ro i rSm d Er / Gadmse vlrd agnsvralspr e pioccod cluo / urao l ao e lua aibe aa l rxm il e cl. lsEr=err atr ro; lsTm =nw atie o; } } / Etbeeo lsvlrsd lscntne pr l snoiain * salcms o aoe e a osats aa a itnzc. Dbd aqeaoasbmsqee tep etemeta e cntne eio u hr aeo u l imo nr usrs s osat, n hc flamlilcruayor vzpre cmi d tep;pdms o ae at utpia n ta e o l abo e imo oeo autrlscntne K yK,otneds u rslaomtmtc euvlne jsa a osats i d beinoe n eutd aeio qiaet pr mseiineqee l pieavrind l fnin * eo fcet u n a rmr es e a uc. / vi Stuig(obeK,dul K,dul K) od eTnnsdul p obe i obe d { dul SmlTmISc=(dul)apeie/00 obe apeiene (obeSmlTm)10; k =K; p p k =K *SmlTmISc i i apeiene; k =K /SmlTmISc d d apeiene; } vi StapeieitNwapeie od eSmlTm(n eSmlTm) { i (eSmlTm >0 f Nwapeie ) { / s e uurodcd cmire tep d mete drnee fninmet,K yK tnrn * i l sai eie aba l imo e usro uat l ucoaino i d ed qeautrepr rfea et cmi.* u jsas aa eljr se abo / dul rto =(obeNwapeie/(obeSmlTm; obe ai dul)eSmlTm dul)apeie k * rto i = ai;

k / rto d = ai; SmlTm =(nindln)eSmlTm;} apeie usge ogNwapeie }

Los resultados:
- Independientemente de cun frecuente es llamada la funcin para calcular el PID, el algoritmo de control ser evaluado a tiempos regulares. - Debido la expresin (i t t m C a g = ( o - l s T m ) ) no importa cuado m l i ( se n iehne nw atie; ils) hace cero nuevamente, ya que al tiempo actual, se le resta el tiempo transcurrido con anterioridad. - Como el tiempo de muestreo ahora es constante, no necesitamos calcular permanentemente las constantes de sintonizacin. Con lo cul nos ahorramos clculos cada vez que procesamos el PID. - Tener en cuenta que es posible mejorar la gestin de los tiempos de muestreos mediante interrupciones, pero queda a cargo del diseador la implementacin y prueba de este concepto.

Derivative Kick
Esta modificacin que presentaremos a continuacin, cambiar levemente el termino derivativo con el objetivo de eliminar el fenmeno Derivative Kick. Este fenmeno, se produce por variaciones rpidas en la seal de referencia r(t), que se magnifican por la accin derivativa y se transforman en componentes transitorios de gran amplitud en la seal de control.

La imagen de arriba ilustra el problema. Siendo el error = setpoint - entrada, cualquier cambio en la consigna, causa un cambio instantneo en el error; la derivada de este cambio es infinito (en la prctica, dt no es cero, igualmente, el valor termina siendo muy grande). Esto produce un sobrepico muy alto en la salida, que podemos corregir de una manera muy sencilla.

La solucin:

Resulta que la derivada del error es igual a la derivada negativa de la entrada, salvo cuando el setpoint est cambiando, esto acaba siendo una solucin perfecta. En lugar de aadir (Kd * error derivado), restamos (Kd * valor de entrada derivado). Esto se conoce como el uso de "Derivada de la medicin".

El cdigo:
/ Vralsuiiaa e e cnrldrPD / aibe tlzds n l otoao I. usge ln lsTm; nind og atie dul Ipt Otu,Ston; obe nu, upt epit dul eru,lsIpt obe rSm atnu; dul k,k,k; obe p i d itSmlTm =10;/ Tep d mete d 1sgno n apeie 00 / imo e usro e eud. vi Cmue) od opt( { usge ln nw=mli(; nind og o ils) ittmCag =(o -lsTm) n iehne nw atie; i(iehne=apeie ftmCag>SmlTm) { / Cluatdslsvralsd errs / acl oa a aibe e roe. dul err=Ston -Ipt obe ro epit nu; eru + err rSm = ro; dul dnu =(nu -lsIpt; obe Ipt Ipt atnu)

/ Cluao l fnind sld dlPD / aclms a uc e aia e I. Otu =k *err+k *eru -k *dnu; upt p ro i rSm d Ipt / Gadmse vlrd agnsvralspr e pioccod cluo / urao l ao e lua aibe aa l rxm il e cl. lsIpt=Ipt atnu nu; lsTm =nw atie o; } } vi Stuig(obeK,dul K,dul K) od eTnnsdul p obe i obe d { dul SmlTmISc=(dul)apeie/00 obe apeiene (obeSmlTm)10; k =K; p p k =K *SmlTmISc i i apeiene; k =K /SmlTmISc d d apeiene; } vi StapeieitNwapeie od eSmlTm(n eSmlTm) { i (eSmlTm >0 f Nwapeie ) { dul rto =(obeNwapeie/(obeSmlTm; obe ai dul)eSmlTm dul)apeie k * rto i = ai; k / rto d = ai; SmlTm =(nindln)eSmlTm; apeie usge ogNwapeie } }

Las modificaciones son bastante sencillas, estamos reemplazando la derivada positiva del error con la derivada negativa de la entrada. En vez de recordar el ltimo valor del error, ahora recordamos el ltimo valor que tom la entrada.

El resultado:

Podemos ver como los picos en la salida han sido eliminados. Este factor de correccin se aplica a sistemas muy sensibles a dichas variaciones; en un horno por ejemplo, donde la inercia trmica es muy grande, no le afectan en lo ms mnimo dichos picos. Por lo tanto no sera necesario tener en cuenta esta correccin.

Cambios en la sintonizacin
El problema: La posibilidad de cambiar la sintonizacin del PID, mientras el sistema est corriendo, es la caracterstica ms respetable del algoritmo del sistema de control.

Los PID principiantes, de hecho, actan de manera errtica si queremos setear los valores de la sintonizacin, mientras el sistema est corriendo. Veamos por que. Aqu se muetra el estado del PID antes y despus de que los parmetros han cambiado.

10

De inmediato podemos ver que el culpable de este bache en la seal de salida es el trmino integral; es el nico trmino que cmbia drsticamente cuando la seal de sintonizacin se modifica. Esto sucede debido a la interpretacin de la integral.

Esta interpretacin funciona bien hasta que Ki cambia. De repente, la suma de todos los errores se multiplica con el valor de Ki, esto no es lo que necesitamos. Nosotros solo queremos que afecte a los valores que estn por delante. Por ejemplo: Si nosotros modificamos Ki, en un tiempo t=5s. Necesitamos que el impacto de este cambio solo afecte a valores de Ki que se modifican en un tiempo mayor a t=5s.

La solucin:
La solucin a este error no queda muy elegante, pero consiste en reescalar la suma del error, doblando el valor de Ki o cortando la suma de los errores a la mitad. Esto quita el bache del termino integral, solucionando el problema.

En lugar de tener el trmino Ki fuera de la integral, lo introducimos dentro del clculo. Al parecer, no hemos realizado nada extrao, pero en la prctica est 11

accin resulta en una grn diferencia en la funcin de salida del PID. Ahora tomamos el error y lo multiplicamos por el valor de Ki en ese momento, luego almacenamos la suma de los diferentes errores multiplicados por la constante Ki. Esto resulta en una funcin de salida, suave y sin sobresaltos, con la ventaja de no tener que utilizar matemtica adicional para ello.
/ Vralsuiiaa e e cnrldrPD / aibe tlzds n l otoao I. usge ln lsTm; nind og atie dul Ipt Otu,Ston; obe nu, upt epit dul Iem lsIpt obe Tr, atnu; dul k,k,k; obe p i d itSmlTm =10;/ Tep d mete:1sgno n apeie 00 / imo e usro eud. vi Cmue) od opt( { usge ln nw=mli(; nind og o ils) ittmCag =(o -lsTm) n iehne nw atie; i(iehne=apeie ftmCag>SmlTm) { / Cluatdslserrs / acl oo o roe. dul err=Ston -Ipt obe ro epit nu; Iem+ (i*err; Tr = k ro) dul dnu =(nu -lsIpt; obe Ipt Ipt atnu) / Cluao l fnind sld dlPD / aclms a uc e aia e I. Otu =k *err+Iem-k *dnu; upt p ro Tr d Ipt / Gadmse vlrd agnsvralspr e piorcluo / urao l ao e lua aibe aa l rxm ecl. lsIpt=Ipt atnu nu; lsTm =nw atie o; } } vi Stuig(obeK,dul K,dul K) od eTnnsdul p obe i obe d { dul SmlTmISc=(dul)apeie/00 obe apeiene (obeSmlTm)10; k =K; p p k =K *SmlTmISc i i apeiene; k =K /SmlTmISc d d apeiene; } vi StapeieitNwapeie od eSmlTm(n eSmlTm) { i (eSmlTm >0 f Nwapeie ) { dul rto =(obeNwapeie/(obeSmlTm; obe ai dul)eSmlTm dul)apeie k * rto i = ai; k / rto d = ai; SmlTm =(nindln)eSmlTm; apeie usge ogNwapeie

12

} }

Reemplazamos la variable errSuma, por una variable compuesta llamada Iterm. Suma Ki*error en lugar de solamente el error. Por ltimo, como el clculo de Ki est embebido en el trmino integral, se elimina de la ecuacin principal del PID.

El resultado:

Con las modificaciones hechas, los cambios en la sintonizacin del trmino integral no afectan al rendimiento general de nuestro sistema, ya que tiene en cuenta la modificacin en cada instancia de error, sumandose al total.

13

Reset WindUp El problema:

El efecto windup aparece al arrancar el sistema o en cualquier otra situacin, donde aparece un error muy grande durante un tiempo prolongado. Esto har que el trmino integral aumente para reducir el error. Pero si nuestro actuador es limitado, con esto me refiero que la tensin que podemos aplicarle esta entre 0 y 5V (0 a 255 , pwm de 8 bits), se saturar, pero el termino integral seguir creciendo. Cuando el error se reduce, la parte integral tambin comenzar a reducirse, pero desde un valor muy alto, llevando mucho tiempo hasta que logre la estabilidad, generando fluctuaciones exageradamente grandes. El problema se manifiesta en forma de retrasos extraos. En la imagen podemos ver que el valor de la salida, est muy por encima del lmite. Cuando el valor del setpoint cae por debajo de un valor determinado, el valor de salida decrece por debajo de la lnea lmite de 255 (5v). 14

La solucin - Paso 1:

Hay varias formas para mitigar el efecto del WindUp, pero la elegida es la siguiente: decirle al PID cules son los lmites de salida. En el cdigo de abajo, veremos que ahora hay una funcin SetOuputLimits. Una vez que ya se alcanza el lmite, el PID detiene el funcionamiento del trmino integral.

La solucin - Paso 2:
Observe en el grfico anterior, si bien nos libramos del retraso inducido por el WindUp, no hemos resuelto todo el problema. Todava hay una diferencia, entre lo que el pid piensa que est enviando, y lo que est enviando. Por qu? Veamos el trmino proporcional y (en menor medida) el trmino derivativo. Aunque el trmino integral ha sido acotado de forma segura, el termino Proporcional y Derivativo estn aadiendo pequeos valores adicionales, dando un resultado superior al lmite de salida. Esto es inaceptable. Si el usuario llama a 15

la funcin "SetOutputLimits" tiene que asumir que eso significa "la salida se mantendr dentro de estos valores." As que en el paso 2, hacemos una suposicin vlida. Adems de la restriccin del trmino Integral, hay que acotar el valor de salida para que se mantenga dentro de los lmites. Uno se preguntar, por que acotamos el termino integral y la salida. Esto se debe a lo siguiente: Por ms que pongamos lmites al valor que puede tomar la salida, el trmino integral seguira creciendo, introduciendo errores en la salida.

El cdigo:
/ Vralsd taao / aibe e rbj. usge ln lsTm; nind og atie dul Ipt Otu,Ston; obe nu, upt epit dul Iem lsIpt obe Tr, atnu; dul k,k,k; obe p i d itSmlTm =10;/ Tep d mete d 1sgno n apeie 00 / imo e usro e eud. dul oti,ota; obe uMn uMx vi Cmue) od opt( { usge ln nw=mli(; nind og o ils) ittmCag =(o -lsTm) n iehne nw atie; i(iehne=apeie ftmCag>SmlTm) { / Cluatdslserrs / acl oo o roe. dul err=Ston -Ipt obe ro epit nu; Iem=(i*err; Tr+ k ro) i(Tr>ota)Iem ota; fIem uMx Tr= uMx es i(Tr<oti)Iem oti; le fIem uMn Tr= uMn dul dnu =(nu -lsIpt; obe Ipt Ipt atnu) / Cluao l fnind sld dlPD / aclms a uc e aia e I. Otu =k *err+Iem k *dnu; upt p ro Tr- d Ipt i(upt>ota)Otu =ota; fOtu uMx upt uMx es i(upt<oti)Otu =oti; le fOtu uMn upt uMn / Gadmse vlrd agnsvralspr e piorcluo / urao l ao e lua aibe aa l rxm ecl. lsIpt=Ipt atnu nu; lsTm =nw atie o; } } vi Stuig(obeK,dul K,dul K) od eTnnsdul p obe i obe d { dul SmlTmISc=(dul)apeie/00 obe apeiene (obeSmlTm)10; k =K; p p

16

k =K *SmlTmISc i i apeiene; k =K /SmlTmISc d d apeiene; } vi StapeieitNwapeie od eSmlTm(n eSmlTm) { i (eSmlTm >0 f Nwapeie ) { dul rto =(obeNwapeie/(obeSmlTm; obe ai dul)eSmlTm dul)apeie k * rto i = ai; k / rto d = ai; SmlTm =(nindln)eSmlTm; apeie usge ogNwapeie } } vi Stuptiisdul Mn dul Mx od eOtuLmt(obe i, obe a) { i(i >Mx rtr; fMn a) eun oti =Mn uMn i; ota =Mx uMx a; i(upt>ota)Otu =ota; fOtu uMx upt uMx es i(upt<oti)Otu =oti; le fOtu uMn upt uMn i(Tr>ota)Iem ota; fIem uMx Tr= uMx es i(Tr<oti)Iem oti; le fIem uMn Tr= uMn }

17

Como podemos ver el fenmeno del WindUp es eliminado. Adems, podemos ver que la salida permanece dentro del rango que deseamos. Esto significa que podemos configurar el rango de valores mximos y mnimos que necesitamos en la salida.

PID: On/Off El problema:

Digamos que en algn momento del programa deseamos forzar la salida a un valor determinado (0 por ejemplo), usando la siguiente rutina: void loop() { Compute(); Output=0; }

18

De esta manera no importa el valor de salida que haya computado el PID, nosotros simplemente determinamos su valor manualmente. Esto en la prctica es errneo ya que introducir errores en el PID: Dir, yo estoy variando la funcin de salida, pero en realidad no pasa nada. Como resultado, cuando pongamos nuevamente el PID en funcionamiento, tendremos un cambio brusco y repentino en el valor de la funcin de salida.

La solucin:
La solucin a este problema es tener un medio para encender o apagar el PID de vez en cuando. Los trminos comunes para estos estados son "Manual" (ajustar el valor de la salida manualmente) y "Automatic" (el PID ajusta automticamente la salida). Vamos a ver cmo se hace esto en el cdigo:
/ Vralsd taao / aibe e rbj. usge ln lsTm; nind og atie dul Ipt Otu,Ston; obe nu, upt epit dul Iem lsIpt obe Tr, atnu; dul k,k,k; obe p i d itSmlTm =10;/ Tep d mete 1sgno n apeie 00 / imo e usro eud. dul oti,ota; obe uMn uMx bo iAt =fle ol nuo as; #eieMNA 0 dfn AUL #eieATMTC1 dfn UOAI vi Cmue) od opt( { i(iAt)rtr; f!nuo eun usge ln nw=mli(; nind og o ils) ittmCag =(o -lsTm) n iehne nw atie; i(iehne=apeie ftmCag>SmlTm) { / Cluao tdslserrs / aclms oo o roe. dul err=Ston -Ipt obe ro epit nu; Iem=(i*err; Tr+ k ro) i(Tr>ota)Iem ota; fIem uMx Tr= uMx es i(Tr<oti)Iem oti; le fIem uMn Tr= uMn dul dnu =(nu -lsIpt; obe Ipt Ipt atnu) / Cluao l fnind sld dlPD / aclms a uc e aia e I. Otu =k *err+Iem k *dnu; upt p ro Tr- d Ipt i(upt>ota)Otu =ota; fOtu uMx upt uMx es i(upt<oti)Otu =oti; le fOtu uMn upt uMn

19

/ Gadmse vlrd agnsvralspr e piorcluo / urao l ao e lua aibe aa l rxm ecl. lsIpt=Ipt atnu nu; lsTm =nw atie o; } } vi Stuig(obeK,dul K,dul K) od eTnnsdul p obe i obe d { dul SmlTmISc=(dul)apeie/00 obe apeiene (obeSmlTm)10; k =K; p p k =K *SmlTmISc i i apeiene; k =K /SmlTmISc d d apeiene; } vi StapeieitNwapeie od eSmlTm(n eSmlTm) { i (eSmlTm >0 f Nwapeie ) { dul rto =(obeNwapeie/(obeSmlTm; obe ai dul)eSmlTm dul)apeie k * rto i = ai; k / rto d = ai; SmlTm =(nindln)eSmlTm; apeie usge ogNwapeie } } vi Stuptiisdul Mn dul Mx od eOtuLmt(obe i, obe a) { i(i >Mx rtr; fMn a) eun oti =Mn uMn i; ota =Mx uMx a; i(upt>ota)Otu =ota; fOtu uMx upt uMx es i(upt<oti)Otu =oti; le fOtu uMn upt uMn i(Tr>ota)Iem ota; fIem uMx Tr= uMx es i(Tr<oti)Iem oti; le fIem uMn Tr= uMn } vi StoeitMd) od eMd(n oe { iAt =(oe= ATMTC; nuo Md = UOAI) }

Una solucin bastante simple. Si no est en modo automtico, sale inmediatamente de la funcin de cmputo del PID, sin ajustar la salida ni las variables internas del mismo.

El resultado:
20

Ciertamente podramos conseguir un efecto similar sin llamar a la funcin que calcula el PID, pero esta solucin mantiene las variables del PID contenidas. Al mantener el valor de dichas variables, podemos hacer un seguimiento de los valores de las mismas, y lo ms importante, vamos a saber cuando podemos cambiar los modos.

PID: Inicializacin
Anteriormente habamos implementado la posibilidad de encender o apagar el PID de vez en cuando. Ahora vamos a ver lo que pasa cuando volvemos a encenderlo:

21

Aqu tenemos un problema, el PID entrega a la salida el ltima valor computado, luego comienza a corregir a partir de ah. Esto resulta en un sobrepico en la entrada que es preferible no tener.

La solucin:
Esto es bastante fcil de solucionar. Ahora sabemos que al pasar de manual a automtico, slo tenemos que inicializar los parmetros para una transicin sin problemas. Esto significa, inicializar el valor de la entrada con el ltimo valor almacenado, e inicializar el trmino integral con el ltimo valor que tom la salida, para evitar los sobrepicos en la salida.

El cdigo:

/ Vralsd taao / aibe e rbj. usge ln lsTm; nind og atie

22

dul Ipt Otu,Ston; obe nu, upt epit dul Iem lsIpt obe Tr, atnu; dul k,k,k; obe p i d itSmlTm =10;/ Tep d mete 1sgno n apeie 00 / imo e usro eud. dul oti,ota; obe uMn uMx bo iAt =fle ol nuo as; #eieMNA 0 dfn AUL #eieATMTC1 dfn UOAI vi Cmue) od opt( { i(iAt)rtr; f!nuo eun usge ln nw=mli(; nind og o ils) ittmCag =(o -lsTm) n iehne nw atie; i(iehne=apeie ftmCag>SmlTm) { / Cluao tdslserrs / aclms oo o roe. dul err=Ston -Ipt obe ro epit nu; Iem=(i*err; Tr+ k ro) i(Tr>ota)Iem ota; fIem uMx Tr= uMx es i(Tr<oti)Iem oti; le fIem uMn Tr= uMn dul dnu =(nu -lsIpt; obe Ipt Ipt atnu) / Cluao l fnind sld dlPD / aclms a uc e aia e I. Otu =k *err+Iem k *dnu; upt p ro Tr- d Ipt i(upt>ota)Otu =ota; fOtu uMx upt uMx es i(upt<oti)Otu =oti; le fOtu uMn upt uMn / Gadmse vlrd agnsvralspr e piorcluo / urao l ao e lua aibe aa l rxm ecl. lsIpt=Ipt atnu nu; lsTm =nw atie o; } } vi Stuig(obeK,dul K,dul K) od eTnnsdul p obe i obe d { dul SmlTmISc=(dul)apeie/00 obe apeiene (obeSmlTm)10; k =K; p p k =K *SmlTmISc i i apeiene; k =K /SmlTmISc d d apeiene; } vi StapeieitNwapeie od eSmlTm(n eSmlTm) { i (eSmlTm >0 f Nwapeie ) { dul rto =(obeNwapeie/(obeSmlTm; obe ai dul)eSmlTm dul)apeie k * rto i = ai; k / rto d = ai; SmlTm =(nindln)eSmlTm; apeie usge ogNwapeie } }

23

vi Stuptiisdul Mn dul Mx od eOtuLmt(obe i, obe a) { i(i >Mx rtr; fMn a) eun oti =Mn uMn i; ota =Mx uMx a; i(upt>ota)Otu =ota; fOtu uMx upt uMx es i(upt<oti)Otu =oti; le fOtu uMn upt uMn i(Tr>ota)Iem ota; fIem uMx Tr= uMx es i(Tr<oti)Iem oti; le fIem uMn Tr= uMn }

vi StoeitMd) od eMd(n oe { bo nwuo=(oe= ATMTC; ol eAt Md = UOAI) i(eAt & !nuo fnwuo & iAt) { / Pr cmird mna aatmtc,iiilzmsagnsprmto. / aa aba e aul uoio ncaiao luo aers Iiilz(; ntaie) } iAt =nwuo nuo eAt; } vi Iiilz( od ntaie) { lsIpt=Ipt atnu nu; Iem=Otu; Tr upt i(Tr>ota)Iem ota; fIem uMx Tr= uMx es i(Tr<oti)Iem oti; le fIem uMn Tr= uMn }

Hemos modificado setMode () para detectar el paso de manual a automtico y hemos aadido nuestra funcin de inicializacin. En l se establecen (i e m = s l d ) Tr aia cuidar de que el trmino integral, y (L s I p t = E t a a para mantener la derivada de atnu nrd) la adicin. El trmino proporcional no se basa en la informacin del pasado, por lo que no necesita ningn tipo de inicializacin.

El resultado:

24

Vemos en el grfico anterior que una inicializacin adecuada, da como resultado, una transferencia de manual a automtico sin perturbaciones: exactamente lo que estbamos buscando.

PID: Direccin El problema:


Los procesos a los cules un PID estar enlazado, se dividen 2 grupos: de accin directa y de accin inversa. Todos los ejemplos vistos hasta el momento han sido de accin directa, por lo tanto, un incremento en la entrada, da como resultado un incremento en la salida. En el caso de los procesos de accin reversa, es todo lo contrario. En un refrigerador, por ejemplo, un aumento en la accin de enfriamiento, causa una disminucin de la temperatura. Para que el PID funcione en un proceso de accin inversa, los signos de Kp, Ki, y Kd deben ser negativos. 25

Esto no es un problema por si mismo, pero el usuario debe elegir el signo correcto, y asegrese de que todos los parmetros tengan el mismo signo.

La solucin:
Para hacer el proceso un poco ms simple, se requiere que los parmetros Kp, Ki, y kd sean > = 0. Si el usuario est trabajando en un proceso de accin inversa, se especifica por separado, utilizando la funcin SetControllerDirection. esto asegura que los parmetros tienen el mismo signo.

El cdigo:
/ Vralsd taao / aibe e rbj. usge ln lsTm; nind og atie dul Ipt Otu,Ston; obe nu, upt epit dul Iem lsIpt obe Tr, atnu; dul k,k,k; obe p i d itSmlTm =10;/ Tep d mete 1sgno n apeie 00 / imo e usro eud. dul oti,ota; obe uMn uMx bo iAt =fle ol nuo as; #eieMNA 0 dfn AUL #eieATMTC1 dfn UOAI #eieDRC 0 dfn IET #eieRVRE1 dfn EES itcnrleDrcin=DRC; n otolrieto IET vi Cmue) od opt( { i(iAt)rtr; f!nuo eun usge ln nw=mli(; nind og o ils) ittmCag =(o -lsTm) n iehne nw atie; i(iehne=apeie ftmCag>SmlTm) { / Cluao tdslserrs / aclms oo o roe. dul err=Ston -Ipt obe ro epit nu; Iem=(i*err; Tr+ k ro) i(Tr>ota)Iem ota; fIem uMx Tr= uMx es i(Tr<oti)Iem oti; le fIem uMn Tr= uMn dul dnu =(nu -lsIpt; obe Ipt Ipt atnu) / Cluao l fnind sld dlPD / aclms a uc e aia e I. Otu =k *err+Iem k *dnu; upt p ro Tr- d Ipt i(upt>ota)Otu =ota; fOtu uMx upt uMx es i(upt<oti)Otu =oti; le fOtu uMn upt uMn

26

/ Gadmse vlrd agnsvralspr e piorcluo / urao l ao e lua aibe aa l rxm ecl. lsIpt=Ipt atnu nu; lsTm =nw atie o; } } vi Stuig(obeK,dul K,dul K) od eTnnsdul p obe i obe d { i (p0| K<| K<)rtr; f K< | i0| d0 eun dul SmlTmISc=(dul)apeie/00 obe apeiene (obeSmlTm)10; k =K; p p k =K *SmlTmISc i i apeiene; k =K /SmlTmISc d d apeiene; i(otolrieto =RVRE fcnrleDrcin =EES) { k =( -k) p 0 p; k =( -k) i 0 i; k =( -k) d 0 d; } } vi StapeieitNwapeie od eSmlTm(n eSmlTm) { i (eSmlTm >0 f Nwapeie ) { dul rto =(obeNwapeie/(obeSmlTm; obe ai dul)eSmlTm dul)apeie k * rto i = ai; k / rto d = ai; SmlTm =(nindln)eSmlTm; apeie usge ogNwapeie } } vi Stuptiisdul Mn dul Mx od eOtuLmt(obe i, obe a) { i(i >Mx rtr; fMn a) eun oti =Mn uMn i; ota =Mx uMx a; i(upt>ota)Otu =ota; fOtu uMx upt uMx es i(upt<oti)Otu =oti; le fOtu uMn upt uMn i(Tr>ota)Iem ota; fIem uMx Tr= uMx es i(Tr<oti)Iem oti; le fIem uMn Tr= uMn }

vi StoeitMd) od eMd(n oe { bo nwuo=(oe= ATMTC; ol eAt Md = UOAI)

27

i(eAt & !nuo fnwuo & iAt) { / Pr cmird mna aatmtc,iiilzmsagnsprmto. / aa aba e aul uoio ncaiao luo aers Iiilz(; ntaie) } iAt =nwuo nuo eAt; } vi Iiilz( od ntaie) { lsIpt=Ipt atnu nu; Iem=Otu; Tr upt i(Tr>ota)Iem ota; fIem uMx Tr= uMx es i(Tr<oti)Iem oti; le fIem uMn Tr= uMn } vi Stotolrieto(n Drcin od eCnrleDrcinit ieto) { cnrleDrcin=Drcin otolrieto ieto; }

28