Tabla de contenido:

Controlador PID VHDL: 10 pasos
Controlador PID VHDL: 10 pasos

Video: Controlador PID VHDL: 10 pasos

Video: Controlador PID VHDL: 10 pasos
Video: Control de motor a medios pasos y pasos completos en VHDL 2024, Noviembre
Anonim
Controlador PID VHDL
Controlador PID VHDL
Controlador PID VHDL
Controlador PID VHDL

Este proyecto fue mi proyecto final para completar mi licenciatura con honores del Instituto de Tecnología de Cork. Este tutorial se divide en dos secciones, la primera cubrirá el cuerpo principal del código PID, que es el propósito principal del proyecto, y la segunda sección cubre la interfaz del código que se implementó en una placa de desarrollo Basys 3 y luego se interconectó con una pelota de ping pong. plataforma de levitación. El aparejo teórico y construido se muestran en las imágenes adjuntas.

Suministros

Simulación

Suite Vivado Design

Implementación (entre paréntesis está lo que se usó para mi proyecto)

  • Placa FPGA que puede ingresar y emitir señales digitales / analógicas (Basys 3)
  • un sistema que es controlable con una sola fuente de retroalimentación (Ping Pong Ball Levitation Rig)

Plataforma

  • Tubo de policarbonato
  • Ventilador 5V
  • Sensor de infrarrojos
  • Base impresa en 3D (este tutorial documenta la construcción de la plataforma, el sensor se agregó para proporcionar comentarios, pero la plataforma fue generalmente la misma)
  • Resistencias 1k
  • Protoboard con 5V y riel GND

Paso 1: Teoría básica de control

Teoría básica de control
Teoría básica de control

Pensé que agregar alguna teoría de control básica le daría a cualquiera que quisiera probar e implementar este código una buena base para comenzar.

El diagrama adjunto es el diseño de un controlador de lazo único.

r- Es la referencia. Esto determina dónde se desea que vaya el controlador.

e-Es el error. Ésta es la diferencia entre el valor de su sensor y su referencia. p.ej. e = r- (d + salida del sensor).

K-Este es el controlador. Un controlador puede estar compuesto por tres términos. Estos términos son P, I y D. Los tres términos tienen multiplicadores llamados Kp, Ki y Kd. Estos valores determinan la respuesta del controlador.

  • P-proporcional. Un controlador estrictamente P tendrá una salida proporcional al error actual. Un controlador P es fácil de implementar y funciona rápido, pero nunca alcanzará el valor que establezca (referencia).
  • I-Integral. Un controlador estrictamente integral resumirá el error anterior que eventualmente alcanzará la referencia deseada. Este controlador generalmente es demasiado lento para implementar. Agregar un término P reducirá el tiempo necesario para llegar a la referencia. Se debe tener en cuenta el tiempo en el que se muestrea la entrada, el término integral se integra con respecto al tiempo.
  • D-Derivado. El término derivado tendrá una salida que depende de la tasa de cambio de error. Este término se usa generalmente con un término P o con un término PI. Dado que esto es proporcional a la tasa de cambio de error, un solo ruidoso tendrá su ruido amplificado, lo que puede hacer que el sistema sea inestable. El tiempo también debe tenerse en cuenta, ya que el término derivado también lo es con respecto al tiempo.

U- Esta es la señal de control. Esta señal es una entrada al equipo. En el caso de este proyecto, la u es una entrada de señal PWM al ventilador para cambiar la velocidad.

G- Este es el sistema que se está controlando. Este sistema se puede modelar matemáticamente en el dominio S o Z. Los sistemas pueden ser del orden enésimo, pero para alguien que esté comenzando con el control, probablemente debería suponerse un sistema de primer orden, ya que es mucho más fácil de calcular. Hay una gran cantidad de información sobre el sistema de modelado que se puede encontrar en línea. Dependiendo del tiempo de muestreo del sensor, el modelo del sistema es discreto o continuo. Esto tiene un efecto drástico en el controlador, por lo que se recomienda investigar ambos.

d- Esta es una perturbación que se agrega al sistema. La perturbación son fuerzas externas que el modelo del sistema no tiene en cuenta. Un ejemplo fácil de esto sería un dron que querría flotar a 5 metros, una ráfaga de viento viene y deja caer el dron 1 metro, el controlador reposicionará el dron después de que haya ocurrido la perturbación. Esto se conoce como perturbación, ya que el viento no es repetible, por lo que no se puede modelar.

Para ajustar el controlador hay demasiadas reglas para nombrar, pero algunas buenas con las que comencé son Cohen Coon y Zieger Nichols.

El modelado de un sistema es generalmente la parte más importante sin un modelo preciso, el controlador que ha sido diseñado no responderá como se desea.

Debería haber suficiente información aquí para comprender cómo funciona el controlador junto con algunas investigaciones individuales y el código debajo de un controlador con cualquier combinación de los tres términos se puede implementar.

Paso 2: escribir el código PID

Escribir código PID
Escribir código PID

El principio básico del código que se encuentra en el siguiente enlace fue tomado y modificado, ya que este código no funcionaba, pero tenía muchos de los principios correctos, lo que dio un buen punto de partida. PID original El código tenía varios errores como

  • Operación continua: el controlador es heredablemente discreto, por lo que el controlador tuvo que configurarse para calcular solo los 3 términos cuando una nueva entrada estaba disponible. La solución para esta simulación fue verificar si la entrada había cambiado desde la última vez. esto solo funciona para simular que el código funciona correctamente.
  • El tiempo de muestra no tuvo efecto en el término integral y derivado: el controlador tampoco consideró el tiempo en el que se tomó la muestra, por lo que se agregó un valor llamado divisor de tiempo para garantizar que los términos integral y derivado estuvieran operando sobre el correcto intervalo.
  • El error solo podía ser positivo: al calcular el error también había un problema, ya que el error nunca podía tener un significado negativo cuando la señal de retroalimentación había superado el valor de referencia de que el controlador continuaría incrementando la salida cuando debería estar disminuyendo.
  • Los valores de ganancia para los 3 términos eran números enteros; en mi experiencia, siempre encontré que los valores para los 3 términos en el controlador siempre eran números de punto flotante debido a que Basys 3 no tiene un número de punto flotante, los valores tenían que recibir un valor de numerador y un valor del denominador que serviría como una solución para superar este problema.

El código se adjunta a continuación, hay el cuerpo principal del código y un banco de pruebas para simular el código. La carpeta zip contiene el código y el banco de pruebas que ya se encuentran en Vivado para que se puedan abrir para ahorrar tiempo. También hay una prueba simulada del código que muestra la salida siguiendo la referencia, lo que demuestra que el código está funcionando según lo previsto.

Paso 3: Cómo modificar para su sistema

En primer lugar, no todos los sistemas son iguales, hay que analizar las entradas y salidas del sistema. En mi caso, la salida de mi equipo que me dio un valor para la posición fue una señal analógica y la entrada del sistema fue una señal PWM. Lo que significa que se necesitaba una conversión de ADC. Afortunadamente, el Basys 3 tiene un ADC incorporado, por lo que esto no fue un problema, la salida del sensor de infrarrojos tuvo que reducirse a 0V-1V, ya que este es el rango máximo del ADC integrado. Esto se hizo usando un circuito divisor de voltaje que se hizo con resistencias de 1k configuradas como una resistencia de 3k en serie con una resistencia de 1k. La señal analógica estaba ahora dentro del alcance del ADC. La entrada PWM al ventilador puede ser impulsada directamente por la salida de un puerto PMOD en el Basys 3.

Paso 4: Aprovechamiento de la E / S en Basys 3

Hay una serie de E / S en Basys 3 que permitieron una depuración más fácil cuando el código se estaba ejecutando. la E / S se configuró de la siguiente manera.

  • Pantalla de siete segmentos: se utilizó para mostrar el valor de la referencia y el valor en el ADC en voltios. Los primeros dos dígitos de la pantalla de siete segmentos muestran los dos dígitos después del lugar decimal del valor ADC ya que el valor está entre 0-1V. Los dígitos tres y cuatro en la pantalla de siete segmentos muestran el valor de referencia en voltios, esto también muestra los dos primeros dígitos después del lugar decimal, ya que el rango también está entre 0-1V.
  • 16 LED: los LED se usaron para mostrar el valor de la salida para garantizar que la salida se saturara y que la salida cambiara correctamente.

Paso 5: ruido en la salida del sensor de infrarrojos

Hubo ruido en la salida del sensor para solucionar este problema, se colocó un bloque de promediado ya que esto era suficiente y requería muy poco trabajo para completar.

Paso 6: Diseño general del código

Disposición general del código
Disposición general del código

Hay un fragmento de código del que aún no se ha hablado. Este código es un divisor de reloj llamado disparador. este bit de código activa el código ADC para muestrear. el código ADC tarda un máximo de 2us en completarse, por lo que se promedian la entrada actual y la entrada anterior. 1us después de este promedio, el controlador calcula los términos P, I y D. El diseño general del código y la interfaz se muestra en el diagrama de conexión improvisado.

Paso 7: prueba

Pruebas
Pruebas

El código se implementó en Basys 3 y se registró la siguiente respuesta. la referencia cambió entre 2 valores. que es el caso en el código de proyecto completo adjunto. El video adjunto muestra esta respuesta en tiempo real. Las oscilaciones decaen más rápido en la parte superior del tubo, ya que el controlador fue diseñado para esta región, pero el controlador no funciona tan bien en la parte inferior del tubo, ya que el sistema no es lineal.

Paso 8: Modificaciones para mejorar el proyecto

El proyecto funcionó como se esperaba, pero hay algunas modificaciones que habría hecho si el proyecto se hubiera extendido.

  • Implemente un filtro digital para atenuar completamente el ruido
  • Configure el código ADC, el código promedio y el código de integración para que se activen secuencialmente.
  • use un sensor diferente para la retroalimentación ya que la respuesta no lineal de este sensor causó una amplia variedad de problemas con este proyecto, pero eso está más en el lado del control que en el lado de la codificación.

Paso 9: Trabajo extra

En el transcurso del verano, escribí código para un controlador en cascada e implementé las modificaciones que recomendé para el controlador PID de bucle único.

Modificaciones realizadas al controlador PID regular

· Plantilla de filtro FIR implementada, los coeficientes deben cambiarse para lograr la frecuencia de corte deseada. La implementación actual es un filtro abeto de 5 tomas.

· La sincronización del código se ha configurado para que el filtro propague la nueva muestra y cuando la salida esté lista, se activará el término integral, lo que significará que el código se puede modificar para que funcione en diferentes intervalos de tiempo con menos esfuerzo para cambiar código.

· El bucle for principal que impulsa el programa también se ha reducido ya que este bucle for tardaba 7 ciclos anteriormente, esto ralentizaba la velocidad máxima de funcionamiento del controlador, pero al reducir el bucle for t 4 indica que esto significa que el bloque principal de código puede funcionar. dentro de 4 ciclos de reloj.

Pruebas

Este controlador se probó y se realizó según lo previsto. No tomé fotografías de esta prueba ya que esta parte del proyecto era solo para mantener la mente activa. El código para las pruebas y el banco de pruebas estarán disponibles aquí para que pueda probar el programa antes de la implementación.

Por que usar un controlador en cascada

Un controlador en cascada controla dos partes del sistema. En este caso, un controlador en cascada tendría un bucle exterior que es un controlador que tiene retroalimentación del sensor de infrarrojos. El bucle interno tiene retroalimentación en forma de tiempo entre los pulsos del tacómetro que determina la velocidad de rotación del ventilador. Al implementar el control, se puede lograr una mejor respuesta fuera del sistema.

¿Cómo funciona el controlador en cascada?

El circuito externo del controlador alimentará un valor por el tiempo entre los pules al controlador del circuito interno. Este controlador aumentará o disminuirá el ciclo de trabajo para lograr el tiempo deseado entre pulsos.

Implementación de modificaciones en plataforma

Desafortunadamente, no pude implementar estas modificaciones en el equipo porque no tenía acceso a él. Probé el controlador de bucle único revisado que funciona según lo previsto. Todavía no he probado el controlador en cascada. Estoy seguro de que el controlador funcionará, pero es posible que requiera algunas pequeñas modificaciones para que funcione según lo previsto.

Pruebas

No pude probar el controlador porque era difícil simular dos fuentes de entrada. El único problema que puedo ver con el controlador en cascada es que cuando el bucle exterior intenta aumentar el punto de ajuste suministrado al bucle interior, un punto de ajuste más grande es en realidad un RPS más bajo para el ventilador, pero esto se puede solucionar fácilmente. tomar el punto de ajuste del valor máximo de la señal del punto de ajuste (4095 - punto de ajuste - tacho_result).

Paso 10: Conclusión

En general, el proyecto funciona según lo previsto cuando comenzó, así que estoy contento con el resultado. Gracias por tomarse el tiempo de leer mi intento de desarrollar un controlador PID en VHDL. Si alguien está intentando implementar alguna variación de esto en un sistema y requiere ayuda para entender el código, contácteme, le responderé lo antes posible. Cualquiera que intente el trabajo adicional que se completó pero no se implementó, por favor contácteme para cualquier mano. Le agradecería mucho que alguien que lo implemente me diga cómo va.

Recomendado: