Sistemas Térmicos
Para comenzar, vamos a tomar como ejemplo un sistema térmico. Tal como se dijo en la introducción al tema, nos interesa el comportamiento de la variable, en este caso la temperatura, con respecto al tiempo. Como base, tenemos que la transferencia de calor se realiza, generalmente, por tres métodos:
- Conducción: El intercambio de energía se realiza por el movimiento cinético o el impacto directo de las moléculas.
- Convección: El intercambio de energía se relaciona con el movimiento relativo de un fluido respecto a otro.
- Radiación: El intercambio de energía se realiza por emisión
Así, que en un proceso térmico, estarán presentes, en mayor o menor magnitud, estas tres formas de transferencia de calor.
Como ejemplo práctico, supongamos que tenemos inmerso en un fluido un elemento (sensorial), el cual posee ciertas características como lo son: Un área superficial A, un calor específico c y una masa m. Al estar inmerso en el fluido, el sistema está en equilibrio térmico, es decir, ha alcanzado una temperatura uniforme y no hay transferencia de calor en ningún sentido. En este caso:
Supongamos ahora que la temperatura del fluido TF aumenta (función paso):
Esta variación, hace que el equilibrio anterior se rompa y por ende nos hace pensar en que pasa dentro del sistema. Para simplificar las cosas, pensamos en lo mas básico que tiene un sistema térmico: el calor. De ahí podemos deducir que una ecuación que puede describir el equilibrio en el sistema es:
Calor de Entrada - Calor de Salida = Grado de cambio calórico en el sensor
Suponemos que el calor de salida del sistema es nulo, ya que es el sensor el que esta inmerso en el fluido, así que nos interesa conocer el intercambio calórico entre el sensor y el fluido.
El calor de entrada, está definido como:
En donde h es el coeficiente de transferencia de calor entre el fluido y el sensor.
El aumento calórico del sensor está determinado por:
Nos interesa es el cambio en el tiempo del aumento calórico del sensor, es decir la tasa de aumento del contenido calórico del sensor, ésto estará dado por:
$ mc\frac{d}{dt}[T-T(0^{-})]
Definiendo:
$ \Delta T=T-T(0^{-})
y $ \Delta T_{F}=T_{F}-T_{F}(0^{-})
Tenemos, reemplazando en la ecuación de equilibrio:
$ hA(\Delta T_{F}-\Delta T) = mc\frac{d}{dt}\Delta T
o, lo que es mas ordenado:
$ \frac{mc}{hA}\frac{d}{dt}\Delta T+\Delta T = \Delta T_{F}
Que es una ecuación diferencial de primer orden, de esas que son muy fáciles de resolver :mrgreen:
Recordemos que $ \Delta T
es la variable que nos indica el cambio de temperatura del nuestro sensor inmerso en un fluido. Si resolvemos la ecuación diferencial, obtendremos una función, a la cual se le da el nombre de función de transferencia y es con esta función con la que se puede predecir el comportamiento de nuestra variable en función del tiempo y en relación a un cambio de temperatura, en este caso $ \Delta T_{F}
.
Para resolver la ecuación diferencial, usamos la Transformada de Laplace (http://es.wikipedia.org/wiki/Transformada_de_Laplace), con la cual, se vuelve tan simple como lo es multiplicar y dividir. Tenemos entonces:
$ \tau[s\Delta T(s)-\Delta T(0^{-})]+\Delta T(s)=\Delta T_{F}(s)
En donde:
$ \tau=\frac{mc}{hA}
Recordemos, que en t=0-, teniamos que la temperatura del elemento sensorial es igual a la temperatura del fluido, por lo tanto:
Reemplazando, hallamos la función de transferencia, la cual relaciona la salida con la entrada de un sistema, en este caso nuestro elemento sensorial.
$ \frac{\Delta T(s)}{\Delta T_{F}(s)}=G(s)=\frac{1}{\tau s+1}
Si graficamos la función de solución de nuestra ecuación:
(http://img408.imageshack.us/img408/4381/funcion1.png)
Vemos que ese numero $ \tau
es muy importante, ya que justo cuando $ t = \tau
, el valor de la función es el 63.2% del valor final. También nos da información acerca de lo confiable que es la medida respecto al tiempo, ya que, idealmente el sistema se estabilizará en un tiempo infinito, pero, como no podemos pasarnos toda una vida midiendo, basta con $ t = 5\tau
para estar en un 90% del valor de estado estable.
Lo ideal, sería que todos los sistemas térmicos se comportaran de igual manera, pero siempre hay otras variables que afecten al sistema. Sin embargo éste modelo es aplicable a sistemas como los hornos, ya que describe muy bien el comportamiento dinámico de estos.
Cont...
Tiempo Muerto
En los sistemas reales, se tiene que los cambios dentro del mismo sistema, no son inmediatos, si no que toman cierto tiempo, debido a la inercia del mismo proceso. En el momento de efectuarse el aumento de temperatura $ T_{F}>T
, hay un tiempo de espera hasta que el sistema comienza a reaccionar, es como una clase de juego en la reacción.
El tiempo muerto es parte integral del proceso y se debe tomar en cuenta en la función de transferencia de los procesos.
Matemáticamente modifica nuestra función de transferencia:
$ \frac{\Delta T(s)}{\Delta T_{F}(s)} = \frac{K_{1}e^{-t_{0}s}}{\tau s + 1}
(http://img193.imageshack.us/img193/3141/tiempomuerto.png)
Componentes de los sistemas de control
Como se mencionó en la Introducción, las operaciones básicas de un sistema de control son:
Con los sensores y transmisores, se realizan las operaciones de medición en el sistema de control. En la actualidad hay muchos tipos de sensores que nos permiten tomar medidas muy confiables en precisión y exactitud, con muy buena resolución y algunos hasta ya vienen calibrados desde fábrica. La etapa de medición es muy importante, ya que la acción del controlador se calcula en función del error entre el valor de consigna (Set Point) y el valor medido en el proceso.
La etapa de acción la realizan los actuadores, que pueden ser válvulas, interruptores, TRIAC´s, etc. La señal de salida del controlador debe estar relacionada de alguna manera con el actuador en la variable de control. Por ejemplo: para un horno, la temperatura que genera la resistencia eléctrica, está relacionada con la cantidad de corriente que fluye por ella, gracias a esta relación se puede cuantificar que cantidad de calor se introduce al sistema en función de la cantidad de corriente que se permite circular por la resistencia.
En la etapa de la decisión, está involucrado el concepto propio del control, puede ser por el simple paso del valor de consigna o por un valor de razón proporcional, etc.
Tipos de controladores por retroalimentación
Como se ha venido mencionando, los controladores por retroalimentación, toman la decisión para mantener el punto de control o Set Point, según el cálculo de la salida con base en la diferencia que hay entre la variable de salida que se está controlando y el punto de consigna, diferencia a la que se denomina error.
Control Proporcional: Es el tipo mas simple de controlador y la decisión de control hace gala a su nombre, es decir: produce una acción de control proporcional al error. A mayor valor de error, mayor sera la señal de corrección, si el valor del error disminuye, la señal de corrección disminuirá también:
$ %OUT_{ctrl} = K_{p} \times error
Si aplicamos Laplace -para simplificar las cosas- :
$ %OUT_{ctrl}(s) = K_{p}E(s)
La función de transferencia del controlador proporcional corresponde a una constante: $ K_{p}
.
Si aplicáramos esta señal a nuestra planta, nos quedaría un diagrama de bloques como el siguiente:
(http://img441.imageshack.us/img441/9581/ctrlp.png)
En donde:
- X(s) : Set Point
- Y(s) : Valor de Salida, con el cual calculo el error en función de X(s)
- E(s) : Valor del error, resultado de la diferencia entre X(s) y Y(s)
- G(s) : Función de la planta o del proceso
En este tipo de control, siempre va a haber error en estado estable, es decir, cuando el tiempo tiende a infinito y se supone que el proceso se estabiliza para el valor de Set Point fijado por nosotros. Esto es debido a la naturaleza del controlador, ya que es prácticamente imposible que el elemento de acción regrese al estado inicial, que fue justamente cuando se inició el error.
Matemáticamente, el error en estado estable se calcula con :
$ Error_{ss} = \lim_{s\rightarrow0}sE(s)
Este valor interesa mucho, ya que se supone que debería tender a cero (de hecho, eso es lo que se busca al implementar un controlador) cuando ha pasado el tiempo suficiente (unos $ 5 \tau
).
En casos reales, la linealidad entre el error y la salida del controlador, solo existe en un rango determinado, al cual se le denomina banda proporcional.
(http://img594.imageshack.us/img594/9305/bandap.png)
Para los valores por fuera de ese rango, el valor de salida se saturará y no habrá señal de control mayor, por ejemplo: en el caso de la apertura de una válvula, si el valor ya está en el máximo, no hay forma de seguir abriendo mas la válvula, o si un actuador necesita mas voltaje del que suministra la fuente.
Cont...
Control Derivativo: En este tipo de control, el cambio de la salida del controlador respecto al Set Point es proporcional a la rapidez de cambio de la señal de error en el tiempo.
$ I_{sal} - I_{0} = K_{d} \frac{dE}{dt}
En donde:
- I0 : Valor de salida del controlador para el valor de referencia, es decir, cuando el error es cero.
- Isal : Valor de salida cuando el error E cambia a una tasa
$ \frac{dE}{dt}
.
Siguiendo el mismo método anterior, aplicamos transformada de Laplace para hallar la función de transferencia de un controlador derivativo:
$ I_{sal} - I_{0} = K_{d}sE(s)
La función de transferencia del controlador es derivativo, entonces: $ sK_{d}
.
En esta parte, se puede apreciar la gran ventaja de trabajar con la transformada de Laplace, ya que la derivada de la función error en el tiempo, pasa a ser un producto aplicando la transformada.
Resulta lógico que este controlador no tiene efecto si el error permanece constante, por lo que no es muy utilizado solo, si no en combinación con el proporcional y el integral.
Control Integral: En este tipo de control, la tasa de cambio en la señal de salida del controlador respecto al tiempo es proporcional al error:
$ \frac{dI}{dt} = K_{i} E
Para hallar nuestra función de respuesta del controlador, integramos:
$ I_{sal} - I_{0} = \int^{t}_{0}\, K_{i} e\,dt
a la cual, le aplicamos Laplace -para variar-:
$ I_{sal} - I_{0} = \frac{1}{s}\, K_{i}\, E(s)
La función de transferencia del control Integral es, entonces: $ \frac{1}{s} K_{i}
Este tipo de control es muy útil para atacar el error de estado estable u OffSet, ya que para valores constantes de error, la acción del controlador aumentará en el tiempo.
(http://img690.imageshack.us/img690/379/ctrli.png)
Este tipo de controlador no se utiliza solo, si no en combinación con los otros anteriores.
Controlador P+I+D : Es la combinación de la acción de los tres controladores anteriores en una sola función de transferencia. De esta forma obtenemos un controlador que no tiene desviación en el error y que disminuye la probabilidad a producir oscilaciones.
Tenemos entonces:
$ I_{sal} - I_{0}(s) = ( K_{p} + \frac{1}{s}K_{i} + sK_{s})E(s)
Como bien se aprecia en las ecuaciones anteriores, hay ciertas constantes de proporción en las funciones de transferencia para los diferentes tipos de controladores; si hallamos los valores adecuados para esas constantes, garantizaremos que la señal de acción del controlador sea la adecuada, que se mantenga dentro de los límites y por ende, el buen funcionamiento del proceso.
Cont...
Ajuste de controladores por retroalimentación
El ajuste del controlador es el procedimiento mediante el cual se adecuan los parámetros del controlador para obtener una respuesta específica del circuito cerrado. En el caso de un controlador Proporcional-Integral (PI) habría que ajustar los dos modos de control para obtener una respuesta óptima en nuestra respuesta. En el caso de un controlador PID habría que ajustar los tres modos, el Proporcional (la ganancia), el Integral (tiempo de reajuste) y el Derivativo (tiempo de derivación), es algo así como hallar el valor RGB óptimo para un color específico.
Lógicamente, el sistema tendrá un tiempo de respuesta ante los efectos del controlador, no es el caso del color RGB, que se tendrá una respuesta inmediata. Aún con esa demora en la reacción (que puede ser de horas según el sistema) el ajuste por realimentación es muy utilizado.
Para hallar estos ajustes vamos a recurrir a un método llamado Método de la curva de reacción del proceso.
Para aplicar este método, lo que se hace es obtener la curva de reacción de nuestro sistema a una entrada escalón y verificamos que el sistema sea de orden 1. Como bien vimos anteriormente, el sistema térmico, va a presentar una respuesta típica de un sistema de orden 1 -no todos los sistemas presentan este tipo de respuesta- o al menos se va a acercar bastante.
(http://img79.imageshack.us/img79/7161/ziegrle.png)
Hay unas formulas que se aplican para calcular los valores de las constantes:
(http://img404.imageshack.us/img404/8371/zieglerpid.png)
$ R= M/T
Estas fórmulas son empíricas y se las debemos a Ziegler y Nichols (http://en.wikipedia.org/wiki/Ziegler%E2%80%93Nichols_method). Hay restricciones para el uso de estas ecuaciones en relación a la razón existente entre el tiempo muerto y la constante de tiempo del sistema. Si el valor de la razón entre estos dos valores está fuera de un rango de 0.10 y 1.0, no se debe usar éste método y es mejor pensar en otro :mrgreen:
Para construir un controlador basta con un amplificador operacional configurado de la siguiente manera:
(http://img191.imageshack.us/img191/399/pidao.png)
En donde tendríamos:
$ K_{P} = \frac{RI}{R+RD}
$ K_{D} = RD \times CD
$ K_{I} = \frac{1}{RI \times CI}
Si queremos digitalizar nuestro controlador, hay que tener en cuenta que ya no se estaría trabajando en tiempo continuo, si no que hay de por medio un tiempo entre la toma de una muestra y otra de nuestra variable, a este tiempo se le denomina Tiempo de Muestreo e influye en el comportamiento de nuestro controlador.
Su influencia radica en el concepto de frecuencia, ya que, si el tiempo con el que muestreo la señal es muy prolongado, la señal que obtendré no será la real, si no que estará modificada su frecuencia. Para saber a que tiempo se debe muestrear se usa un teorema denominado Teorema de Nyquist (http://es.wikipedia.org/wiki/Teorema_de_muestreo_de_Nyquist-Shannon), que en sí nos determina cuanto debe ser la frecuencia mínima de muestreo en función de la frecuencia de nuestra señal a muestrear.
Matemáticamente se debe recurrir a una transformada para que nos facilite mas las cosas a la hora de diseñar. Esa transformada es la transformada Z. Esta transformada Z es en si, una transformada de Laplace de la señal muestreada mediante una función impulso.
(http://img687.imageshack.us/img687/4859/trz.png)
Ya en la realidad, se tiene es una función escalonada, ya que el valor del último muestreo se mantiene hasta el siguiente.
Para trabajar en tiempo discreto, se debe entonces, discretizar la ecuación del controlador. Una forma sencilla y rápida es hacer una aproximación de las partes derivativa e integral. Para la parte derivativa, se aproxima a la diferencia de dos puntos y para la parte integral, se aproxima a la suma trapezoidal. Estas aproximaciones hacen que se sume un error a nuestro controlador.
Tenemos entonces:
$
m(kT) = K \left\{ e(kT) + \frac{T}{T_{i}} \sum_{h=1}^{k} \frac{e((h-1)T)+e(ht)}{2} + \frac{T_{d}}{T}[e(kT)-e((k-1)T)] \right\}
en donde:
- T : Tiempo de muestreo
- Ti : Tiempo integral
- Td : Tiempo derivativo
- K : Constante proporcional
- k : 0,1,2,....
- e() : error
- m() : salida del controlador
Para simplificar toda esa ensalada, se recurre a la transformada Z, al aplicarla y operar, se tiene:
$
M(z) = K_{p}\left[1 + \frac{T}{T_{i} (1-z^{-1})} + T_{d}\frac{(1-z^{-1})}{T} \right]E(z)
En esta ecuación se hace mas clara la influencia del tiempo de muestreo en la sintonización del controlador.
Cont...
Bien ..... para la parte de programación, debemos tener claro el proceso que se va a realizar.
Como se vio anteriormente, hay que calcular el error para poder aplicar el algoritmo PID; el error lo definimos como la diferencia que hay entre el valor de consigna (Set Point) y el valor que esta midiendo el sensor.
Para el caso nuestro, el valor "real" de la temperatura será el valor medido por el canal analógico. En el caso de los conversores AD de los microcontroladores, no son muy estables, por lo que hay que filtrar la señal para que la medida sea mas confiable. Para ello hacemos uso de un filtro muy sencillo de implementar: Moving Average o de media móvil.
A pesar de su simplicidad, el filtro de la media móvil es óptimo para una tarea común como puede ser la reducción de un ruido fortuito mientras retiene una respuesta de paso muy bien definida. Esto hace que este filtro predomine en el campo de las señales codificadas en el dominio del tiempo, con la posibilidad de separar una banda de frecuencias de otra. Relacionado con el este tipo de filtro se puede encontrar la media móvil Gaussiana, de Blackman y de múltiple-paso. Estos confieren una mejor ejecución en el dominio de la frecuencia, con un mayor gasto del tiempo de CPU. Como su propio nombre indica, el filtro de la media móvil opera mediante el promedio de un número de puntos de la señal de entrada para producir cada punto de la señal de salida. En una formula matemática queda como:
$ y[i] = \frac{1}{M} \sum_{j=0}^{M-1} x[i+j]
Como es lógico, a mayor numero de muestras, mas confiable será la medida.
En código, quedaría mas o menos así:
const int8 NumeroMuestras = 100;
int16 ADCBuffer[NumeroMuestras];//Usamos 10 bits de resolucion para la conversion
...
int16 FiltroADC(void)//................................................................................................Filtro ADC
{
int8 i=0;
int16 Sumatoria=0;
float Resultado;
set_adc_channel(0);
memset
(ADCBuffer,
0,
sizeof(ADCBuffer
)); for(i=0;i<NumeroMuestras;i++)
{
delay_us(50);
ADCBuffer[i]=read_adc();
}
for(i=0;i<NumeroMuestras;i++)
Sumatoria += ADCBuffer[i];
Resultado = Sumatoria/NumeroMuestras*0.0061428;
return((int16)(Resultado*100/0.41322));//Operaciones para pasar el valor digital a temperatura usando Termocupla J
}
Para la parte del controlador, se tiene lo siguiente:
$ \frac{M(z)}{E(z)} = a + b (1-z^{-1})^{-1} + c (1-z^{-1})
con:
$ a = K_{p} \\ b = \frac{K_{p} \times T}{T_{i}} \\ c = \frac{K_{p}\times T_{d}}{T}
Recordemos que:
$ X(z) = Z[x(t)] = Z[x(kT)] = \sum_{k=0}^{\infty} x(kT)z^{-k}
Con: T = Tiempo de muestreo y k = 0,1,2 ....
Definimos en el código:
//Los valores de a, b y c, se deben calcular segun el sistema
const float a = 21.0494;
const float b = 0.327;
const float c = 338.69;
......
struct BytesPID
{
float rT; //Valor del Set Point
float eT; //Valor del Error
float iT; //Valor del termino Integral
float dT; //Valor del termino Derivativo
float yT; //Valor real
float uT; //Valor de salida del controlador
float iT0; //Valor del termino integral en t0
float eT0; //Valor del termino del error en t0
}PID={0,0,0,0,0,0,0,0};
Para implementar el código del controlador, la forma mas sencilla es en al configuración en paralelo, es decir, se calcula cada término por separado y luego se suman.
(http://img641.imageshack.us/img641/7296/pidparalelo.png)
//Valores para los limites de disparo para el control de fase
const float MAX = 30.0;
const float MIN = 115.0;
void ControlPID(int16 SetPointT)//...................................................................................Controlador PID
{
PID.yT = FiltroADC();
PID.rT = SetPointT;
PID.eT = PID.rT - PID.yT;//Calculo el error
PID.iT = b*PID.eT + PID.iT0;//Calculo el termino integral
PID.dT = c*(PID.eT - PID.eT0);//Calculo el termino derivativo
PID.uT = a*PID.eT + PID.iT + PID.dT;//Calculo de la señal de control
if(MIN-PID.uT/10<MAX)//Ajuste de valores MAX y MIN para el control de fase
CtrlFase.Setting = MAX;
else if(MIN-PID.uT/10>MIN)
CtrlFase.Setting = MIN;
else
CtrlFase.Setting = (int8)((MIN - PID.uT/10));
PID.iT0 = PID.iT;
PID.eT0 = PID.eT;
}
Como el actuador es un TRIAC, tenemos también un detector de cruce por cero.
#define on output_high
#define off output_low
#define toggle output_toggle
#define subida 1
#define bajada 0
#define AnchoPulso 200
#define gate_triac pin_c0
...
struct BytesFase
{
int8 Setting;
int1 Flanco;
int8 IntsTimer;
} CtrlFase={0,0,0};
....
#int_CCP2
void ZeroCross_isr(void)
{
if(CtrlFase.Flanco==subida)
{
enable_interrupts(INT_TIMER0);
setup_ccp2(CCP_CAPTURE_FE);
CtrlFase.Flanco = bajada;
}
else
{
enable_interrupts(INT_TIMER0);
setup_ccp2(CCP_CAPTURE_RE);
CtrlFase.Flanco = subida;
}
}
#int_TIMER0
void FaseCtrl_isr(void)
{
CtrlFase.IntsTimer++;
if(CtrlFase.IntsTimer>CtrlFase.Setting)
{
on(gate_triac);
delay_us(AnchoPulso);
off(gate_triac);
CtrlFase.IntsTimer=0;
disable_interrupts(INT_TIMER0);
}
set_timer0(0);
}
Recordemos que con el control de fase, a mayor tiempo que nos demoremos en disparar el TRIAC, la potencia será menor y visceversa.
Normalmente, los TRIAC's se disparan de los 30° a los 180°.
(http://img684.imageshack.us/img684/6388/triacangulo.png)
El ángulo de disparo es, en sí, la espera que hay desde el cruce por cero y el momento en el que se dispara el TRIAC para que conduzca. Si la frecuencia de red es de 60Hz, tenemos:
$ t (\frac{\pi}{6}) = 1,4mS \\ \\ t(\pi) = 8,3mS
Con el timer 0 configurado a 8 bits, podemos obtener desbordes de 51,2uS, por lo que, podemos hacer el ajuste de escala de la siguiente manera:
$ MIN = \frac{8,3mS}{51,2\mu S} = 162 \\ MAX = \frac{1,4mS}{51,2\mu S}= 27
Ya en la realidad, se ajusta los valores para no trabajar tan cerca al límite del valor del cruce por cero, además que en la interrupción hay mas código y por ende el valor calculado no sera 51,2uS exactamente.
El controlador arrojará valores entre $ -\infty
y $ \infty
, por lo que hay que poner limites tanto a la parte superior como a la inferior del rango de trabajo, esto se hace con los if(). El dividir entre diez es solo el ajuste de resolución para el controlador (ese valor es de un control para otro horno), es decir, es un factor de relación entre el rango de salida del controlador con el rango de entrada del actuador.
Hay que seleccionar bien el TRIAC para que no se caliente mucho. En mi caso, las resistencias son de 1100W y van a 110V, por lo que la corriente que debe manejar el TRIAC será de 10A. He comprado un TRIAC trabaja con 50A, así que espero que no haya problema; la verdad me sorprende que venga en un TO220, por lo que es mejor colocar un disipador.