Funciones de salida de entrada dentro de un controlador de interrupción PID

0

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

enlace

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.

    
pregunta Supreeth

2 respuestas

1

1) Si las funciones de depuración cambian el comportamiento del sistema, entonces estás depurando los errores de Schrodinger. No sabrás si hay un error o no porque lo estás buscando.
Ese es un problema que debe ser abordado.

Debe usar un fifo para generar datos de forma asíncrona desde la ubicación de la llamada de impresión. Haga que la función de impresión salga al fifo, y use la interrupción de TX completa para obtener un nuevo byte para transmitir. Asegúrese de no desbordar este búfer de fifo, y de que no está interrumpiendo las funciones de impresión con esas interrupciones. Debe tratarlo como registro, con una baja frecuencia de líneas (como dmesg). Solo en los cambios de estado, no para el trazado continuo de datos de medición.

2) Si el punto de ajuste llega de forma asíncrona, no puede esperar en el subproceso PID. Tienes que guardarlo en otro lugar.
Si las medidas también son asíncronas, entonces tiene otro problema. No tiene sentido recalcular el PID cuando:
 - no hay una nueva medida.
 - La salida anterior no fue procesada todavía.
Es posible que deba disminuir la frecuencia del cálculo de PID.

Parece que lo que describe es un sistema de tasador simple. Usted tiene un superloop (main 'while (1)) con tareas de prioridad inactiva, y algunos ISR con prioridad alta o tareas regulares. Por ejemplo, realizar un DSP en las muestras de ADC es una tarea de alta prioridad regular. Si llega tarde, los datos son irrelevantes y se sobrescriben.
Las cosas que son de menor prioridad, por ejemplo, se comunican con un usuario o leen los marcos de mensajes de punto de ajuste recibidos.

La prioridad de las diversas interrupciones define la prioridad de la tarea, y si pueden anticiparse. Esta es una forma extremadamente simple de programar. Pero tiene inconvenientes. Las tareas no deben tomar más tiempo que su intervalo, esto incluye posibles tareas anticipadas.
Asegúrate de configurar las prioridades correctamente.

Si pones el único reinicio del watchdog en el superloop, sabrás cuándo se cuelga algún hilo.
También debes estar atento a las interrupciones perdidas, por ejemplo, cuando aún estás haciendo A, y la IRQ A se establece nuevamente.

Vea también si un (RT) OS tiene un valor agregado para su sistema.

    
respondido por el Jeroen3
0

No habrá una respuesta específica disponible para su pregunta porque no hay suficiente información sobre lo que está tratando de controlar. El comportamiento de su sistema será clave para entender cómo lo codifica, cómo lo depura y cómo lo ajusta.

Las únicas cosas que puedo sacar de lo que escribiste son:

  1. El uso de I / O como printf para la depuración en un sistema en tiempo real no suele ser un enfoque adecuado, especialmente si la salida de este se enruta a una interfaz lenta como un puerto UART. Es muy posible que necesite diseñar otros métodos de depuración.
  2. Necesitas mirar tu proceso de lectura de punto de ajuste. ¿Qué tan rápido puede cambiar? Por lo que describe que llega a través de la entrada en serie, debe indicarle inmediatamente que no debe leerse desde la serie dentro de su ISR de temporizador.

Al final, todo en un sistema de control en tiempo real es un acto de equilibrio para encontrar la manera correcta de parcelar los ciclos de CPU disponibles de manera que se maximice la eficiencia computacional. Cada vez que encuentre la CPU esperando algo al mismo tiempo que necesita estar cuidando otra cosa, significa que no tiene el diseño correcto.

    
respondido por el Michael Karas

Lea otras preguntas en las etiquetas