He desarrollado un sistema electrónico integrado centrado alrededor de Arduino Due. En mi aplicación, estoy controlando la fuerza del efector final de un objeto rígido utilizando un motor de CC. El sensor de fuerza de retroalimentación tiene mucho tiempo muerto y no puedo obtener el rendimiento que espero con un PID estándar. Ahora estoy buscando un modelo de control predictivo, pero al principio intentaré usar un predictor de Smith. Para hacer esto, necesitamos desarrollar un modelo interno que describa el sistema que tenemos. Nunca he hecho esto y necesito orientación sobre la formulación de un modelo discreto y su implementación en C ++ / Arduino.
Hasta ahora, he desarrollado un modelo de tiempo continuo basado en datos de entrada-salida usando la Caja de herramientas de identificación del sistema en MATLAB. Luego realicé la discretización apropiada (retención de orden cero) para obtener un modelo discreto, \ $ H (z) \ $, en el dominio z. Para implementar esto en C ++ / Arduino, creo que debo realizar la transformación z inversa para obtener \ $ h [n] \ $. \ $ h [n] \ $ luego se escribe en una rutina de servicio de interrupción (ISR) para obtener la salida del modelo.
Por ejemplo, mi modelo continuo es:
$$ H = \ frac {1} {5s + 10} $$
Al utilizar la retención de orden cero a 100 Hz, el modelo discreto es:
$$ H_ {zoh} = \ frac {0.00198} {z-0.9802} $$
Tiempo de muestra: 0.01 segundos
Usando la tabla de la transformación z, la inversa \ $ h [n] \ $ es:
$$ h [n] = 0.00198 \ cdot \ mathcal {H} (n-1) \ cdot 0.9802 ^ {(n-1)} $$
Hasta ahora, ¿es lo que he estado haciendo en el camino correcto? Si es así, ¿cómo implementaría esto en un ISR?