SetSample Time PID

Buenos Días,

Me encuentro realizando un proyecto sobre un brazo articulado el cual controlo su posición mediante un motor con su hélice en un extremo, la idea es que con un PID quede en horizontal:

(Esto ya esta resuelto)

Ahora me encuentro ajustando diferentes parametros del código y tengo una duda con el SampleTime

Se que es lo que hace, evalúa el algoritmo PID cada cierto tiempo.

No he encontrado mucha información al respecto, espero puedan responderme las siguientes preguntas:

-Si tu código hace un loop en mas tiempo que el sampletime establecido como afecta esto al código? pues puede que varíen los valores del Output a mitad de ejecución o como?

-En el caso que sea independiete uno de otro y no tenga que ver lo que tarda en un loop con el sample time, como puedo saber cual es el mas optimo? cuanto mas muestreos mejor?

Si tu código hace un loop en mas tiempo que el sampletime establecido como afecta esto al código?

Tu necesitas tener muestras nuevas para que el PID tenga sentido, sino que pasa, que el pid cree que la variable se mantiene durante dos muestras entones la parte integral dice, que bien, el error es 0... no hago cambios pero al siguiente muestreo se encuentra con un nuevo valor y entonces debe cambiar con brusquedad como si se tratara de una perturbación.

Debes ajustar aquello que ahora consume tanto tiempo en tu loop.
O pensar en otra técnica.
Tal vez simplemente atiendes demasiadas cosas y no asignas prioridad a las mismas.
Esto tiene prioridad siempre y si algo como mostrar en el monitor serie, o en pantalla require tiempo pues se lo das luego. Usa banderas o flags para controlar la ejecución de tareas lentas y si debes atender el PID entonces no liberes esa tarea para que se ejecute.
NO USES DELAY por nada del mundo a menos que sean cosas muy pequeñas de pocos mseg y que no afecten tu sistema de control.

surbyte:
Tu necesitas tener muestras nuevas para que el PID tenga sentido, sino que pasa, que el pid cree que la variable se mantiene durante dos muestras entones la parte integral dice, que bien, el error es 0... no hago cambios pero al siguiente muestreo se encuentra con un nuevo valor y entonces debe cambiar con brusquedad como si se tratara de una perturbación.

Entonces (corrígeme si me equivoco) Bastaria con calcular cuanto tarda en hacer un loop con la función

millis()

Y asignar un tiempo de muestreo menor.

Gracias.

Ahora es raro lo que dices porque normalmente dentro del loop se muestrea el sensor asi que eso esta asegurado.
No imagino un escenario diferente a este que te planteo salvo que muestrees con un timer, o con un sensor I2C/SPI y debas esperar su respuesta pero ambas ocurren generalmente dentro del loop asi que el muestreo siempre será mas rapido que el loop.

A mi me ocurrió un caso diferente y era porque use un sensor lento armado por mi para medir caudal.
Usaba una columna que llenaba con una electroválvla. Al cabo de un tiempo media el desplazamiento y estimaba el caudal. La columna era grande de modo que calibre la columna y para mi existían N sensores que en realidad eran determinadas posiciónes medibles por mi sensor de nivel en dicha columna. Como el sensor era muy preciso podia medir aceptablemente el caudal entre dos puntos superados.
Esa tarea me llevaba segundos y hablo de hasta 120 segundos y mas.
Asi que aca tienes un caso donde el tiempo de muestreo es superior al de loop que estaba en ese caso en 4 o 5 mseg. Hablo de un PLC. No pude implementar el PID asi que arme algo parecido y funcionaba aceptablemente.

Para todo hay solución pero conforme pasa el tiempo si olvidas (mi caso) o no has estudiado correctamente las técnicas de control estarás dando vueltas por falta de teoría y/o práctica.

Espero haberte respondido.

Creo que me he equivocado en mis conclusiones:

El sample time tendría que ser mayor (no menor como puse anteriormente) de lo que se tarda en hacer un loop, para como dices, que no reciba la misma entrada dos veces sino que haga un loop (o mas) re-calculando todo y reciba un input ya actualizado.

Para tu caso, ¿no crees que sería suficiente para implementar el PID con hacer que el sample time sea mayor a lo que tarda tu sensor en medir?.

Mi caso funciona y como he aprendido, con el tiempo, si algo funciona y te lo han pagado ya esta.
Si no, no terminas jamás.

Ademas involucra PLC y ya no quiero saber mas nada de ellos. Hoy para mi solo son Raspberry/ESP/Arduinos.

-Si tu código hace un loop en mas tiempo que el sampletime establecido como afecta esto al código? pues puede que varíen los valores del Output a mitad de ejecución o como?

-En el caso que sea independiete uno de otro y no tenga que ver lo que tarda en un loop con el sample time, como puedo saber cual es el mas optimo? cuanto mas muestreos mejor?

Hola.
En mi opinión lo importante es que el tiempo ente muestreos sea regular. Una vez satisfecho ese parámetro, supongo que cuanto más muestreo más reactivo será el sistema, siempre que no perdamos en fidelidad ni regularidad en la toma de datos de entrada.

Echando un rápido vistazo a la librería, al parecer el sampletime sólo es tomado en cuenta para sencillamente omitir el compute si cuando se llama al mismo aún no ha transcurrido dicho tiempo.

Por lo tanto, en mi opinión, está bien cuando el sampletime es ostensiblemente mayor que la frecuencia con la que se llama al compute. Por ejemplo si el loop (y la llamada a compute) se ejecuta unas cuatro o cinco veces la frecuencia de muestreo, y esa frecuencia no es muy regular porque se pueden dar distintas situaciones en el programa, el sample time "regularía" un poco el momento de tomar la muestra: una vez lo haría tras cuatro loops, otra tras cinco... pero 20% próxima a la velocidad buscada. Por ejemplo para PID lentos, el sistema es ideal. El de caudal de agua que comentaba surbyte, por ejemplo, que tal vez sólo se computa cada bastantes segundos, se pueden aprovechar los miles de loops para promediar y obtener un buen dato de entrada.

Sin embargo, para velocidades de muestreo más altas puede que no sea buena idea fiarse de ese sistema, pues la diferencia entre repetir cada uno o dos loops es un error próximo al 100%. En ese caso tal vez sea mejor poner un sampletime menor que nuestro tiempo de loop, con lo que vamos a muestrear en cada loop (esperemos que la duración de un loop sea más o menos similar), o modificar un poco la librería para buscar algún otro método de temporizado.

En el caso que nos ocupa, entiendo que lo ideal será la mayor velocidad de sampleo posible, siempre que la frecuencia sea regular y el dato de retroalimentación fiable. Si ocurre como ocurre en ocasiones con las lecturas analógicas de arduino, que sale de vez en cuando algún dato aberrante, será preferible ampliar el tiempo de muestreo en favor de una lectura más eficaz.

Así que lo primero, sería mover el brazo a mano y monitorizar la fiabilidad de los valores de ángulo que obtenemos, y cuánto tiempo insume cada ciclo de loop.