Según mi entendimiento, la mejor manera de implementar un controlador PID es dentro de una rutina de servicio de interrupción que generalmente es un ISR con temporizador con una frecuencia de frecuencia configurable. Aquí calculamos la salida del proceso como una función del punto de ajuste y la entrada del proceso, junto con otros cálculos.
Tengo las siguientes confusiones sobre lo que debe incluirse dentro del ISR y la función principal.
1) Dado que la frecuencia de algunos bucles PID es muy alta, es una buena idea leer las entradas, el punto de ajuste y otros valores desde fuera del ISR y calcular solo la salida dentro del ISR. En este caso, ¿qué sucederá si algunas de mis funciones de depuración (generalmente una impresión) retrasan la lectura de una entrada o punto de ajuste de la función principal? ¿Qué sucede si el ISR calcula un valor de salida perfecto pero el programa principal retrasa la salida al mundo exterior debido a las mismas funciones de depuración? Aquí el programa se comporta de una manera ligeramente diferente (a veces diferencias notables) con y sin el código de depuración.
2) Otra opción es implementar funciones de lectura de entrada y punto de ajuste dentro del ISR. En este caso, tanto la entrada como la salida pueden tomar una cantidad de tiempo significativa para leer los valores que afectarán el tiempo de ISR. Por ejemplo, el punto de ajuste puede ser un paquete en serie que puede convertirse en un problema para el tiempo de ejecución de ISR. Lo mismo sucede cuando enviamos el valor calculado al mundo exterior.
Estoy un poco confundido sobre qué enfoque seguir al diseñar un controlador PID. ¿Qué debe incluirse dentro de la ISR (entrada, punto de ajuste o rutinas de salida) y qué debe incluirse en la función principal?
Detalles de la implementación: - La configuración de la experimentación consiste en un motor de CC con engranaje de 60 RPM, un puente H (VNH5019) y un codificador giratorio magnético (AS5048B). El puente H tiene una entrada PWM para control de velocidad y otros 2 pines para control de dirección. AS5048B es un codificador absoluto que proporciona una salida de 14 bits que corresponde a una rotación de 0 a 360 grados del eje del motor y actúa como una señal de realimentación para la planta. Estoy tratando de implementar una configuración de control de posición PID para este motor. En este momento, la función de actualización de PID se escribe dentro de un temporizador ISR que se ejecuta a una frecuencia de 10 KHz (puede ser una exageración para esta aplicación en particular). La entrada proviene de un codificador rotatorio que será reemplazado por un paquete en serie en el futuro. Mi plan es leer la entrada y el punto de ajuste desde una función principal, acceder a los valores de PID Update ISR, calcular el valor de PWM de salida correspondiente al error al igual que la implementación de la biblioteca PID arduino como se muestra a continuación
Las variables se comparten con el ISR de actualización de PID mediante punteros. Por lo tanto, todas las entradas leídas desde el menú principal están disponibles en el ISR y el valor de salida calculado está disponible en la función principal. El valor de PWM así calculado se da a la entrada del IC del puente H.
Nota: la lectura de entrada, punto de ajuste y salida a H-bridge no es parte de ningún ISR en este momento. Solo el cálculo se realiza dentro de PID Update ISR.