sábado, 11 de febrero de 2017

Predictor de Smith

El problema de los controladores clásicos, como por ejemplo el PID, es el comportamiento de éstos a la hora de controlar plantas con retardos importantes.

¿Porqué los retrasos son un problema a la hora de controlar un proceso?


Un retraso es un factor: $$e^{-\tau s}=1\cdot \angle{-\tau\omega\, rad}$$
Como podemos observar tiene siempre módulo 1,luego no se introduce atenuación alguna pero sin embargo la fase si que varía y a mayor frecuencia, mayor desfase se introduce.

Al introducirse tanto desfase, el margen de fase se reduce y el sistema puede llegar a perder la estabilidad en bucle cerrado.

Éstos retardos se pueden deber a los efectos de una red de comunicación que debido al protocolo que usan generan retrasos para que no haya una colisión de datos. También se pueden deber a que la información necesita un tiempo para viajar del sensor al control y del control al actuador. 

Una técnica es usar lo que se conoce como el predictor de Smith.


Ésta técnica se basa en que al conocer el retardo es posible predecir que pasará después del mismo, es decir, podemos predecir lo que pasará. Se basa en un modelo del proceso y mejora la robustez si lo comparamos con un PID.

Lo que se hace es diseñar el controlador como si no hubiera retraso y luego implementamos la siguiente estructura:

Fig. 1: Estructura de un predictor de Smith, el controlador es la zona marcada













sábado, 28 de enero de 2017

¿Qué es el diferencial de un coche?

El diferencial no es más que un elemento mecánico que permite que las ruedas de un mismo eje de un coche giren a distinta velocidad cuando éste toma una curva. Está formado por engranajes.

Pero para ver como funciona os dejo este vídeo explicativo muy bueno.


viernes, 27 de enero de 2017

Funciones definidas a trozos en MATLAB

Hoy voy a hablar de una cosa que es muy pero que muy tonta pero que no sabía hacer y tuve que buscar en Internet:

Como representar funciones definidas a trozos en MATLAB.

Primero tenemos que hablar de los operadores lógicos. Ahora vamos a usar el concepto de que 'true'=1 y 'false'=0. Si tenemos en una ecuación una desigualdad que está multiplicando algo y si ésta desigualdad es verdad (porque se cumple) entonces ésta genera una valor 'true' y por lo tanto lo que multiplica esta desigualdad será multiplicado por '1'. Mientras que si la desigualdad no se cumple entonces nos devolverá un valor 'false' que es igual a '0' y por lo tanto todo lo que esté multiplicando a la desigualdad desaparecerá.

Después de esta pequeña introducción vamos a ver como hacerlo, el código es muy simple.
Primero debemos definir un variable que vamos a usar como abscisa, para ello usaremos un paso de 0,1. Esta variable la definimos en un intervalo por ejemplo 0 y 10. Por lo tanto tenemos que escribir la siguiente línea de código:

x = 0:0.1:10; (el formato es: comienzo_intervalo:paso:fin_intervalo)

Luego tenemos que definir la función a trozos que vamos a representar. En este caso representaremos ésta:


Para ello vamos a usar los operadores lógicos. Una cosa que hay que mencionar antes es que entre los operadores lógicos y la función hay que usar .* para que no se produzca ningún error:

f=(x<=1).*(-x+1)+(x>1).*log(x);

Ya sólo queda usar el comando para poder representar la función:

plot(x,f);

De tal forma que usando las siguientes líneas de código,

x = 0:0.1:10 ;
f = (x<=1).*(-x+1)+(x>1).*log(x) ;
plot(x,f) ;
grid on
xlabel('x')
ylabel('f(x)')

Obtenemos:


Como podemos observar cuando x<=1 sólo aparece el término -x+1 mientras que cuando x>1 sólo esta el término log(x).