f Proyecto: Pendulo invertido ~ Ingenieria a nivel industrial

Visita mi canal de youtube

domingo, 16 de julio de 2017

Proyecto: Pendulo invertido


Introducción
          El objetivo de este proyecto fue construir e implementar un equilibrador de péndulo invertido, en el plano bidimensional vertical, utilizando el control de retroalimentación Proporcional-Integral-Derivativo (PID).
          El equilibrador de péndulo invertido es un coche controlado por radio modificado mediante la adición de una plataforma de plexiglás y un péndulo invertido con pivote giratorio libre. El componente eléctrico del balanceador reúne hardware computacional (microcontrolador Atmel Mega32), un sensor de ángulo de entrada (US Digital Optical Shaft Encoder) y un controlador de salida del motor (National Semiconductor LMD18200 H-Bridge) en una sola placa cuyo único propósito es Controlar de forma autónoma el movimiento del coche para evitar que el péndulo caiga.
          Motivado por el curso de Sistemas de Control de Retroalimentación de la Escuela de Ingeniería Mecánica y Aeroespacial de la Universidad de Cornell, nuestro deseo era integrar el conocimiento de estabilizar un sistema inestable usando el control de realimentación (MAE478), el poder de cálculo rápido y flexible de los microcontroladores (ECE476) El uso de herramientas de ingeniería del mundo real y las restricciones presupuestarias que nos imponen los directores de proyectos. El resultado fue un dispositivo simple, barato y divertido que completó nuestro objetivo deseado.
Diseño de alto nivel
          Nuestra motivación se originó en los Sistemas de Control de Retroalimentación (MAE478), un curso en el que actualmente estamos inscritos. Queríamos intentar un proyecto en el que pudiéramos implementar un controlador de retroalimentación con un microcontrolador. La pregunta era qué controlar. Después de hacer algunas investigaciones, encontramos un proyecto EE281 de la Universidad de Stanford de Geoffrey Bainbridge. Este proyecto "Self-Balancing Robot" intentó diseñar un robot de una sola pierna que se equilibra usando un control de retroalimentación con el microcontrolador Atmel Mega163. Bainbridge intentó equilibrar una varilla conectada directamente por dos ruedas. Rápidamente agregó una tercera rueda de soporte y pivote después de que el diseño de dos ruedas creó movimiento de rotación no deseado alrededor del eje vertical. Además, Bainbridge utilizó un sensor de inclinación para medir el ángulo del robot. Sin embargo, el sensor de inclinación resultó ser inexacto debido a la combinación de la aceleración horizontal del robot y la caída gravitacional del brazo.
          A continuación se muestra la estructura básica del sistema de control de realimentación. La lectura del sensor angular se resta del ángulo de referencia para producir el error. Este error se utiliza para calcular los parámetros de control del motor utilizando el algoritmo PID (discutido más adelante). El control del motor se envía al dispositivo. Decidimos mantener nuestro sistema de control de retroalimentación SISO (single-input single-output) en lugar de MIMO (multi-input multi-output) para simplificar para ayudar con nuestro modelado de caja negra. El ángulo de referencia es la única entrada al sistema y el control de realimentación utiliza el error de ángulo de la referencia y calcula una salida del motor.



Nuestra capacidad limitada de ingeniería mecánica, junto con el corto plazo para completar el proyecto, favoreció el uso de un automóvil prefabricado. Un vehículo de cuatro ruedas no experimentaría el movimiento de rotación que Bainbridge encontró en su proyecto. RadioShack de la amplia selección de juguetes Radio controlados coches hizo que nuestro proceso de selección muy fácil. Una vez que un vehículo estable con características de respuesta rápida fue descubierto y modificado para contener un péndulo invertido, la búsqueda se volvió hacia la búsqueda de un dispositivo de detección de ángulo de alta resolución fiable. Las dos opciones más viables fueron un acelerómetro MEMS o un codificador óptico. Después de las pruebas iniciales, el acelerómetro analógico no podía funcionar tan bien como el codificador digital. Por lo tanto, el codificador de eje óptico de 1024 ciclos por revolución (CPR) de US Digital se convirtió en nuestro sensor de ángulo. Esta es una gran mejora sobre el sensor de inclinación, ya que el codificador no se vio afectado por los efectos de la gravedad o la aceleración del coche.
          El microcontrolador Atmel Mega32 se utilizó en lugar del Mega163 debido a su velocidad superior, para el muestreo de interrupción externa de los datos del codificador y opciones de temporizador más versátiles. Las pruebas iniciales de la caja negra de las capacidades del motor de CC del coche nos dieron una buena idea del funcionamiento del coche. Se observaron diferentes escenarios de conducción, incluyendo la conducción de una sola dirección y el movimiento oscilatorio. Al terminar el control del motor, pasamos a probar el sensor. Las señales de entrada del codificador óptico se convirtieron rápidamente en un ángulo de error referenciado a partir de su valor de contaje inicial.
          La etapa de diseño final fue el controlador Proporcional-Integral-Derivativo (PID) para relacionar el error de ángulo con la velocidad y la dirección del motor (ver la ecuación a continuación). El término proporcional (A) aplicó una tensión al motor proporcional al error. Este valor afectó el tiempo de respuesta del carro; Más alto el término proporcional, más rápida es la respuesta del coche a expensas de la estabilidad del sistema. El término integral (B) corregiría cualquier error de estado estacionario que ocurriría debido a cualquier respuesta lenta del motor. El control integral daría al motor un poco más de "empuje" para asegurar el seguimiento correcto del ángulo de referencia. Sin embargo, un término de control integral más alto podría crear oscilaciones que son irrecuperables o pueden arrojar el sistema a la inestabilidad. Finalmente, el término derivado (C) se utiliza para suavizar los cambios de error en el tiempo. Este término suele suavizar las oscilaciones en el vehículo a expensas de una respuesta más lenta. El ajuste fino de estas tres variables de acuerdo con el comportamiento del sistema permitirá al automóvil equilibrar el péndulo invertido.

Diseño de programas y hardware
          Hardware Deisgn - El hardware requerido para el balanceador de péndulo invertido puede ser fácilmente dividido en 2 subsistemas: Mecánico y Eléctrico.

Mecánico:

Nuestra primera prioridad era adquirir rápidamente un dispositivo capaz de avanzar y retroceder movimiento, con transiciones rápidas y aceleración rápida. A falta del conocimiento del diseño mecánico del carro y de la capacidad de engranar un motor correctamente para un par suficiente para mover el carro, adoptamos rápidamente la idea de usar un coche controlado por radio como nuestra base. Después de probar varios coches RC de RadioShack, encontramos un coche que parecía tener el rendimiento que necesitábamos, junto con una base robusta que permitiría fácilmente un aparato de péndulo para ser instalado.

El motor de CC del vehículo estaba situado en un lugar de fácil acceso en la parte trasera inferior del coche. Seis pilas AA eran la fuente de poder definida por el fabricante; Por lo tanto, sabíamos que nuestra fuente de alimentación tendría que suministrar al menos 9 voltios. Los seis AA se instalaron con una rotura en el último contacto del soporte de la batería y un amperímetro (DVM ajustado para medir la corriente) en serie para medir la corriente sacada por el dispositivo. Con el coche no bajo carga (es decir, no en el suelo con las ruedas en el aire), el dispositivo atrajo 300 mA. Estimamos que bajo carga, el coche requeriría al menos 600-800 mA para funcionar con bastante energía. Después de rebuscar en muchas fuentes de alimentación en el Phillips Hall Digital Lab, encontramos una fuente de alimentación de 12v 1500mA de RadioShack, que sería más que suficiente para nuestras necesidades. Más tarde se descubrió que bajo carga y rápida transición en movimiento, el dispositivo realmente atrajo aproximadamente 900mA del suministro.

Al elegir nuestro dispositivo, nuestra siguiente tarea fue construir un péndulo invertido en el coche. Se utilizó una placa de plexiglás para crear una plataforma sobre la cual se puede fijar el péndulo (ver imagen 9). Esta placa fue asegurada al coche con 4 pernos en cada esquina del vehículo. En el centro de la plataforma, se colocaron dos soportes con sus ángulos interiores tocando uno al otro, conectados por un tornillo de ¼ ", y utilizados para crear el pivote del péndulo (ver Figura 3). Finalmente, se atornilló una barra de 38 "(3/8" de diámetro) en el centro del soporte superior para crear nuestro péndulo. Parecería extraño tener una barra de 38 "por encima de un coche de 12". Sin embargo, la altura de la vara actúa a nuestro favor, ya que el mayor momento de inercia (y el centro de masa más alto) ralentiza el movimiento inicial de la barra. El peso añadido al vehículo amplificaría los efectos no deseados del sistema de suspensión del coche. Por lo tanto, se colocaron cuatro bandas elásticas alrededor del coche para bloquear los choques en una posición comprimida.

Con el péndulo sentado en el soporte superior y el tornillo actuando como pivote, nuestra siguiente tarea fue detectar el ángulo y la dirección de la inclinación del péndulo. Nuestra primera opción fue un acelerómetro MEMS de Analog Devices, ADXL202E. Sin embargo, las pruebas iniciales demostraron que la señal analógica del acelerómetro no nos proporcionaría la resolución que necesitábamos para la detección de ángulos. La salida digital del ADXL202E sin superficie, sin plomo, se desactivó con el PCB que utilizamos para montarlo. Por lo tanto, nos dirigimos al departamento MAE, donde pudimos tomar prestado un codificador de eje óptico 1024CPR (ciclos por revolución) del laboratorio de realimentación MAE478.

En lugar de usar el eje del codificador como pivote, decidimos utilizar un enfoque que pondría la menor cantidad de tensión en la delicada pieza de equipo. El codificador se colocó en paralelo con el soporte del péndulo. La altura del eje del codificador se alineó con el pivote, creando efectivamente una línea imaginaria desde el pivote hasta el eje del codificador. Finalmente, se fijó un pasador al eje del codificador, con abrazaderas de plástico, y se conectó al soporte del péndulo. El soporte tenía un orificio de 0,096 "perforado por encima del pivote de tal manera que el pasador encajaría firmemente, sin resbalar; Por lo tanto, cuando el péndulo se movía, el eje del codificador giraba (Ver Figura 3, Imagen 3 e Imagen 4).

Eléctrico:

Una vez que el péndulo inestable fue montado y montado en el coche, un circuito eléctrico tenía que ser diseñado para aceptar información del codificador óptico, procesar la información, y luego controlar el vehículo en movimiento hacia adelante y atrás. No necesitamos ningún circuito de control de radio o capacidades de giro para nuestro diseño; Por lo tanto, las líneas de motor del automóvil fueron separadas del resto de los circuitos del fabricante cortando los cables que conducían al motor. La aplicación de un potencial a los conductores del motor hará que el motor gire en una dirección, mientras que la inversión de la polaridad en los conductores hará que el motor de CC pin en la dirección opuesta. Para controlar el avance y retroceso del automóvil, requerimos un dispositivo de 4 interruptores simple (ver Figura 1) que garantizara la protección contra un cortocircuito de la fuente de CC, es decir, los interruptores 1 y 4 o 2 y 3 nunca podrían ser cerrados en al mismo tiempo. Para hacer funcionar el motor en una dirección, simplemente cierre los interruptores 1 y 3; Para invertir Abrir los interruptores 1 y 3 y cerrar los interruptores 2 y 4. Para detener completamente el motor, simplemente abra todos los interruptores. En lugar de implementar físicamente cada interruptor como un transistor, se usó el semiconductor LMD18200T H-Bridge de National Semiconductor. Este práctico paquete de 11 patillas acepta una tensión de alimentación de hasta 55V y puede suministrar hasta 3A de corriente de salida. El dispositivo contiene la configuración de 4 interruptores necesaria para nuestro control de motor, junto con diodos de protección y circuitería para asegurar que nunca haya un cortocircuito desde el suministro a tierra. Al conectar la alimentación (pin 6) y tierra (pin 7), sólo 3 entradas controlan el funcionamiento del motor. Para cortar eficazmente los terminales de salida conectados al motor se utiliza un pin de corte (pin 4). Sin una diferencia de potencial a través de los conductores del motor, el dispositivo no funciona. Un bit de alto corte implementa esta característica; Un bit de baja rotura permitirá que la corriente fluya a través del motor. La dirección del motor está determinada por el bit de dirección (pasador 3). Cuando la dirección es alta, la salida 1 (pin 2) generará mientras la salida 2 (pin 10) se hundirá, y viceversa para un bit de dirección bajo. Finalmente, la velocidad del motor se determina mediante una señal modulada en anchura de impulso (PWM) en el pasador 5 del puente H. La velocidad es directamente proporcional al ancho de pulso en esta entrada; Cuanto mayor sea el ciclo de trabajo, mayor será la velocidad del motor. Además, para aumentar el rendimiento, se colocaron condensadores de 0,01 μF de cada salida a su correspondiente clavija de arranque y un condensador de derivación de suministro de 100 μF (entre alimentación del motor y tierra) para absorber las corrientes de recirculación de las cargas inductivas, según las recomendaciones del fabricante. Sin este condensador de 100 μF, el comportamiento del motor era muy lento. El motor fue conectado al H-Bridge a través de un cabezal de 2 pines (ver Figura 2, J3). Se utilizaron dos encabezados más de 2 patillas para fines de depuración. La primera se colocó en paralelo a la cabecera del motor de 2 patillas (véase la Figura 2, J2) de tal manera que la tensión a través del motor podría ser fácilmente medida. La segunda cabecera se colocó en serie entre la salida 2 (clavija 10) del puente H y el conductor correspondiente del motor para medir la corriente que pasa a través del motor. Bajo el funcionamiento normal, se debe colocar un puente a través de este cabezal (Vea la Figura 2, J1). Una vez que el hardware para conducir el motor fue identificado, nos movimos a crear un tablero independiente de tal manera que todos los controles estarían en el vehículo. Usando un tablero de 6 "x 2-1 / 16" Perf, comenzamos a preparar los componentes necesarios para que el microcontrolador Atmel Mega32 funcione sin el tablero de desarrollo STK-500. Nuestro tablero inicial utilizó un solo suministro de 12V para suministrar energía tanto al MCU como al motor. Un regulador de voltaje Texas Instruments UA7805CKCS se utilizó para llevar un 5V regulado a la MCU. Se colocó un condensador de 0,1 μF a tierra en cada lado del regulador para bloquear cualquier ruido en la línea desde el restablecimiento de la MCU. Se colocó un cristal de 16 MHz a través de XTAL1 (clavija 13) y XTAL2 (clavija 12), con un condensador de 27 pF a tierra en cada pasador. Finalmente, se utilizó un encabezado 2x3 para permitir la programación en el sistema del Mega32 (ver Figura 2). La línea Vcc en el encabezado ISP se deshabilitó. Conectar la línea 5V del ISP, que trae Vcc desde el STK-500 durante la programación, a la línea Vcc regulada de la MCU, que viene directamente de la fuente de alimentación de 12V, podría conducir a que los dos suministros se combatan si ambos estuvieran encendidos en la Mismo tiempo. Por lo tanto, decidimos que la mejor opción sería desactivar la línea Vcc del ISP y usar siempre nuestra línea de suministro de 12V. Esto, sin embargo, requería que la tarjeta fuera alimentada externamente durante la programación. Las clavijas MISO (pin ISP 1), SCK (ISP pin 3), MOSI (ISP 4), ~ Reset (ISP pin 5) y Ground (ISP 6) se conectaron a las clavijas 7, 8, 6, 9 y 11 respectivamente para completar la configuración de programación en el sistema. Por último, hemos dedicado PORTD.4, D.5 y D.6 en la MCU como las 3 señales de control del motor; Break, PWM y Dirección respectivamente. La adición del codificador óptico al circuito fue el paso final en el hardware necesario para equilibrar el péndulo. Los canales de salida A y B del codificador (clavijas 3 y 5, respectivamente) se utilizaron para activar interrupciones externas en PORTD.2, D.3, respectivamente. El codificador se conectó al circuito usando una cabecera de 1x5 pines, que entregó + 5V, tierra y canales A y B de la MCU al codificador. (Vea la Figura 2, J4) Encender la energía parecía la única cosa que paraba nuestro circuito en este punto. Una vez que nuestro software estaba listo para ser probado, los problemas con el hardware surgieron casi inmediatamente; Los más drásticos son los problemas de ruido que se derivan del motor. Dado que sólo se utilizó una fuente de alimentación (12V para el motor y regulada a 5V para la MCU), el ruido creado cuando el motor cambia de dirección se desplazaría por la línea de tierra y reiniciaría la MCU, que tenía un valor máximo absoluto de 200mA DC current En Vcc y pines de tierra. La separación física de las líneas de tierra (pero todas las que conducían a la misma tierra de alimentación) no ayudaron. Esto se vio además cuando se probó usando el STK-500 y un
Traductor de Google para empresas:Google Translator ToolkitTraductor de sitios web H-bridge en un prototipo de circuito de placa de pan. Dado que el ruido mantuvo la puesta a cero de la MCU y la única línea que conectaba el STK-500 al puente H fue molida, se tuvo que usar un esquema de tierra aislado. Por lo tanto, pasamos de un único diseño de suministro a dos suministros, 5V para alimentar el MCU y el codificador, y 12V estrictamente para alimentar el motor. Para aislar completamente la circuitería del motor, que sólo consiste en el puente H, de la MCU, se utilizan tres opto-aisladores 4N35 para separar las tres líneas de MCU (ruptura, PWM y dirección) de sus homólogas de puente H. Este dispositivo utiliza un diodo infared para encender y apagar un fototransistor. Cuando la corriente pasa a través del diodo, el transistor es esencialmente un interruptor cerrado, cortocircuito a tierra en nuestra aplicación. Cuando el fotodiodo está apagado, el transistor es un circuito abierto y la salida es alta, 12V aunque un 1 kOhm pull-up resistor. Dado que la fuente de alimentación de 12V no está regulada y suele salir alrededor de 14V, dos LED en serie se colocaron entre la fuente de 12V y la línea pull-up para llevar el voltaje a aproximadamente 11V. Esto se hizo debido a la potencia máxima absoluta de entrada de H-Bridge de 12V en los pines 3,4 y 5. El opto-aislador es un dispositivo inversor, por lo tanto, en lugar de introducir una señal referida a tierra, utilizamos 5V como entrada Y se hace referencia a cada una de las tres señales. Una vez que las señales se invierten a través del transistor del opto-aislador, las señales correctas se pasan al puente H, con la excepción de que un alto lógico es 12V en lugar de 5V. Dado que los opto-aisladores usan fototransistores que reciben señales IR, no hay conexión física entre los circuitos de la MCU al puente H. Por lo tanto, ningún ruido del motor puede ir a la MCU. La adición de los tres opto-aisladores hizo la disposición del tablero muy apretada. Por lo tanto, sólo se utiliza un interruptor de alimentación. El interruptor controla la potencia de la MCU, mientras que la alimentación del motor de 12V siempre está conectada. Es digno de notar que si no entran señales de entrada en el puente H, los motores no funcionan. Ambas fuentes de alimentación están conectadas a la placa con cabezales de dos clavijas. La separación completa de los motivos entre el motor y la MCU resolvió todos los problemas de ruido y permitió transiciones de motor de alta velocidad sin reiniciar MCU. Diseño del programa - El código del controlador final tiene tres funciones principales: entrada del sensor (codificador), cálculo del control PID y salida del control del motor. El código del controlador del motor (test_motor.c) fue escrito primero. El motor de corriente continua se controla mediante un puente H y tres señales controlan la rotura (encendido / apagado), la velocidad y la dirección del motor. Estas se~nales se emitıan de los pines del puerto D del microcontrolador a los pines del puente H. La velocidad del motor se controla mediante una señal modulada en anchura de impulso (PWM). La corriente suministrada al motor es proporcional a la anchura del impulso, por lo que el porcentaje del período de ciclo de servicio determina la velocidad del motor. Como no sabíamos a qué frecuencia enviar la señal PWM y con qué sensibilidad el período de ciclo de servicio afectaría a la velocidad del motor, queríamos escribir un código de controlador del motor que podría cambiar tanto la frecuencia de la señal PWM como el período del ciclo de servicio con facilidad. Por esta razón, elegimos el puerto D del microcontrolador. El pin OC1A (PD5) en el puerto D puede servir como una salida externa para el modo de comparación de salida del temporizador 1. La operación "Modo PWM Rápido" en el Temporizador 1 proporciona una generación de forma de onda PWM de alta frecuencia. El contador del temporizador 1 se incrementa de cero a TOP y luego se reinicia desde cero. El OC1A está ajustado (el pin se ajusta a alta @ 5V) cuando el contador alcanza el valor TOP. El OC1A se borra (el pin se establece bajo @ 0V) cuando hay una coincidencia de comparación entre el contador y el registro OCR1A. Así, el valor TOP del contador (junto con el valor del prescaler del reloj) determina la frecuencia y el valor del registro OCR1A determina el período del ciclo de servicio de la señal PWM que se emite (véase la figura 4). En "Fast PWM Mode" de los 3 temporizadores en Mega32, sólo el temporizador 1 permite ajustar el valor TOP en el registro ICR1 en lugar de valores fijos. Esto permitió la frecuencia variable de la señal PWM. Los registros OCR1A e ICR1 son ambos registros de 16 bits, por lo que los valores tenían que establecerse utilizando dos operaciones de escritura, con el byte alto siempre escrito antes del byte bajo. Se declararon dos entero sin signo global varialbes, motor_PWM_period y motor_PWM_duty. La función motor_updateDuty () establece los bytes alto y bajo de motor_PWM_duty a OCR1AH ​​y OCR1AL respectivamente. La función motor_updatePeriod () establece los bytes alto y bajo de motor_PWM_period a ICR1H e ICR1L respectivamente. Para probar la frecuencia y el período de ciclo de servicio de la señal PWM que acciona un motor de CC, se escribió un código de prueba (void test_speed ()) que utilizó los botones de la tarjeta de desarrollo STK-500. Se definieron dos botones para aumentar o disminuir el valor del registro ICR1, que en efecto aumentó o disminuyó la frecuencia de la señal PWM. Se definieron dos botones para aumentar o disminuir el valor del registro OCR1A, que en efecto aumentó o disminuyó el Período de ciclo de la señal PWM. Al cambiar estos valores de registro, el código tenía que comprobar que el valor de OCR1A era menor que el valor de ICR1. Si el valor de OCR1A se hizo mayor que el valor de ICR1, una comparación de coincidencia entre el contador y OCR1A nunca ocurriría porque el contador de temporizador 1 se restablecería a cero en el valor ICR1. Se definió un botón para conmutar la señal de dirección y se definió otro botón para conmutar la señal de interrupción. Usando esta implementación, encontramos que el ajuste del valor ICR1 a 300 es suficiente para controlar el motor. Esto equivalía a tener una señal PWM de 208,3 Hz ((16e6Hz / 256) /300 = 208,3Hz). A continuación, desarrollamos una función (void motor_controller ()) en el código de prueba del motor, donde planificamos accpet la salida del controlador PID. El cálculo PID usaría el ángulo del péndulo para calcular la velocidad a la que conducir el carro. El signo del error determinaría la dirección del movimiento del carro. La función, motor_controller (), acepta la salida del cálculo PID y establece la velocidad (período de ciclo de servicio), la dirección (signo de la salida PID) y la duración de tiempo a la que debe ir a esta velocidad. Una vez ajustados estos parámetros, la ruptura se desactiva (se pone a nivel bajo) y espera hasta que el temporizador se agote. Cuando el temporizador se agota, la ruptura se activa (se establece en alto) y la función finaliza. Es importante tener en cuenta que la duración del temporizador determina la velocidad a la que se realiza el cálculo PID. Una vez finalizada la función, el código vuelve al cálculo PID (ver Figura 5) donde se usa el error del ángulo para calcular la nueva velocidad y dirección. Usando esta nueva función, probamos la rapidez con la que el carro puede oscilar. La prueba demostró que el carro era capaz de cambiar de dirección lo suficientemente rápido, el comportamiento de carácter que sospechábamos que sería necesario para equilibrar un péndulo inestable. Después de que decidimos que un codificador óptico sería un mejor sensor para medir la inclinación que un acelerómetro, escribimos el código del controlador del sensor. El codificador convierte el ángulo del eje en tiempo real, la velocidad y la dirección en salidas de onda cuadrada TTL de dos canales con pulso de índice. La resolución es 1024CPR (ciclos por revolución), o 1024 ciclos por cada 360 grados mecánicos de rotación del eje. La onda cuadrada se emite en ambos canales una vez por ciclo. Cuando el eje gira en una rotación a la derecha, el canal B conduce el canal A por ¼ de ciclo, y cuando el eje está girando en una rotación a la izquierda, el canal A conduce el canal B por ¼ de ciclo. El pulso de índice también se emite una vez por ciclo cuando tanto el canal A como el canal B están bajos. (Véase la figura 6). Siguiendo la pista de cuál de los dos canales sube primero, podemos controlar la rotación del eje. Midiendo el tiempo entre los bordes ascendentes / descendentes entre Ch. A y B, podemos calcular la velocidad de rotación del eje. Nosotros, sin embargo, no nos importa la velocidad de la inclinación del eje por lo que no se calculó. Por otro lado, nos preocupamos por el ángulo del eje, que se puede mantener en cuenta contando cada ciclo que el encoder emite. Para obtener el MCU para procesar todos los datos emitidos desde el codificador resultó ser una tarea difícil. 1024 ciclos por revolución se traduce en 360/1024 = 0,35 grados mecánicos por ciclo. Por cada 0,35 grados, el codificador emite dos ondas cuadradas y un pulso de índice. El primer intento de intentar contar cada ciclo de encoder con la MCU utilizó el pin de Interrupción Externa en el Puerto D (D.2) conectado a la salida de impulsos de índice del codificador. La rutina de servicio de interrupción externa se configuró para ser activada en cada borde descendente de la salida de índice. De acuerdo con las especificaciones del codificador, uno de los canales iría a un máximo de 300ns después de la caída del borde del pulso de índice. Dado que se tarda aproximadamente 35 ciclos en introducir un ISR (~ 2e-6 o 2μs), la tensión en el canal A y B se comprueba al comienzo del ISR. Si uno de los canales es alto y el otro es bajo, sabemos la dirección de la rotación y puede incrementar / decrementar el contador en consecuencia. Con esta implementación, el mostrador parecía funcionar bien cuando giraba de forma rápida pero no lenta en una dirección y cuando giraba lenta pero no rápidamente en la otra dirección. Esto se debió probablemente al hecho de que el ISR se activó en un borde descendente y que los niveles del canal estaban cambiando demasiado rápido en comparación con la duración ISR. Después de un doloroso intento de depurar esta implementación, decidimos probar otra implementación con dos interrupciones externas (INT0 / D.2 e INT1 / D.3) conectadas a las dos salidas de canal del codificador. Las rutinas de servicio de interrupción externas se activaron en cada cambio de nivel lógico. Durante el ISR para el canal A, el 0º bit de la variable global char sin signo sensor_channel se alternaría. Durante el ISR para el canal B, el primer bit de la variable sensor_channel se alternaría. Después de cada conmutación de bit en cada ISR, el valor de la variable sensor_channel sería . Si el valor de sensor_channel equivalía a 1 (0x01) en el ISR para el canal A, implicaría que Ch.A condujera Ch.B, por lo que la rotación en sentido antihorario del eje. Si el valor del sensor_channel equivalía a 2 (0x02) en el ISR para el canal B, implicaría que Ch.B condujera Ch.A, por lo tanto, la rotación en sentido horario del eje. Para cada ciclo de rotación en sentido horario, la variable del contador, sensor_index, se incrementó en uno y para cada ciclo de rotación a la izquierda, la variable sensor_index se decrementó en uno. Esta implementación funcionó como un encanto para varias velocidades de rotación en ambas direcciones. La variable sensor_index se declaró como un carácter sin signo, porque sabíamos que una vez que el péndulo fue montado en el coche, el rango del péndulo sería inferior a 90 grados (1024/360 * 90 = 256). El sensor_index se inicializó en 128 para que el contador pueda contar hasta 45 grados en ambas direcciones. Una vez que la entrada del sensor y los códigos de salida del motor se probaron independientemente, las dos lógicas se fusionaron y probaron primero sin los cálculos PID (controller.c). Este código se utilizó para accionar el motor con rotación manual del eje del encoder. Al reiniciar el programa, el motor no se acciona con ningún voltaje. Cuando el eje se gira más de 15 grados en una dirección, el motor fue impulsado en una dirección. Si el eje vuelve a su posición original, el motor se detiene. Si el eje fue girado por más de 15 degress en la otra dirección, el motor fue conducido en la dirección reversa. Usando este código, aseguramos que la entrada del sensor y la lógica de salida del motor estaban trabajando juntas. Implementar el cálculo del control PID fue bastante sencillo (balancer.c). Las constantes proporcionales (kp), integral (ki), y drivativas (kd) se definieron al principio del código. Cabe señalar que los valores de delta t en la ecuación PID se absorben en estas constantes. En la función pid_controller (), el error del ángulo se calcula tomando la diferencia entre el valor sensor_index y el valor init_sensor_index. Al reiniciar el programa, el sensor_index se inicializa al valor init_sensor_index y se actualiza constantemente a través de interrupciones externas del codificador. Este error, que puede ser valor positivo o negativo, se utiliza entonces para calcular los términos corporales, integrales y derivados. Las variables se invocan para flotar para estos cálculos porque las constantes podrían ser valores decimales. Se añaden los tres términos, el signo de la suma determina la dirección, y luego se toma su valor absoluto. Este nuevo valor calculado es la velocidad del motor, o el porcentaje del período de ciclo de servicio de la señal PWM. Este valor se comprueba con la variable max_motor_duty y se cambia a su valor si excede el valor. Esto es para asegurar que el período de ciclo de servicio de la señal PWM nunca excede un umbral predefinido (como máximo 100 por ciento). El nuevo valor calculado se transmite entonces al motor_controller (). El flujo de código se muestra en la Figura 5. Con el fin de evitar que el automóvil se mueva a alta velocidad en una dirección cuando el péndulo cayera completamente a un lado, se implementó una característica de seguridad (safty_check ()) al final de cada cálculo PID ciclo. La función safety_check tiene dos funciones de comprobación segura. La primera característica comprueba el ángulo de la inclinación del péndulo (sensor_index) y si supera aproximadamente 40 grados desde el punto de referencia, entonces asumimos que el carro no tiene ninguna posibilidad de equilibrar el péndulo de nuevo y detiene la operación del motor. La segunda característica comprueba si el carro se mueve por encima de una velocidad predefinida (safety_speed) en una dirección durante un período de tiempo (safety_timer). Esta parte de la característica de seguridad es asegurar que la seguridad no se base únicamente en la lectura de ángulo del péndulo desde el codificador. El péndulo se puede inicializar en cualquier ángulo, por lo que el motor puede funcionar a gran velocidad incluso si la MCU no registra el ángulo del péndulo como si hubiera caído a un lado. Resultados del diseño Las constantes de PID se determinaron mediante ensayo y error sistemáticos. Inicialmente, los términos integral y derivado fueron puestos a cero y el término proporcional se incrementó gradualmente hasta que el sistema se volvió inestable. Una vez que conocimos el término máximo proporcional, añadimos el término derivado para suavizar la oscilación del carro. El término integral permaneció en cero porque la oscilación causada por el término integral hizo que el equilibrador se comportara mal. Corremos el balanceador empezando con el péndulo equilibrado. Al establecer todas las condiciones iniciales en cero, el codificador se puede inicializar al restablecer y crear un ángulo de referencia. Un ligero toque en la parte superior del péndulo inestable es todo lo que se requiere para iniciar el proceso de equilibrio. El equilibrador se ajusta rápidamente para recuperar el error en el ángulo. El péndulo completa con éxito 5-7 periodos de recuperación en promedio antes de que las características del motor / coche inhiban la respuesta rápida necesaria para recuperar el ángulo. El ini
El equilibrio de equilibrio vertical demuestra que el problema del equilibrador de péndulo invertido puede resolverse, sin embargo, nuestras limitaciones mecánicas, a saber, un mal funcionamiento del motor / coche (deslizamiento del tren de engranajes y deslizamiento de las ruedas blandas con el piso, Mantenernos de la última hazaña del equilibrio infinito. Período de ciclo de la señal PWM. Al cambiar estos valores de registro, el código tenía que comprobar que el valor de OCR1A era menor que el valor de ICR1. Si el valor de OCR1A se hizo mayor que el valor de ICR1, una comparación de coincidencia entre el contador y OCR1A nunca ocurrieron por el contador de temporizador 1 se restablecería un cero en el valor ICR1. Se definió un botón para conmutar el signo de dirección y se definió otro botón para conmutar el señal de interrupción. Usando esta implementación, que el ajuste del valor ICR1 a 300 es suficiente para controlar el motor. Esto equivalía a tener una señal PWM de 208,3 Hz ((16e6Hz / 256) / 300 = 208,3Hz). A continuación, desarrollamos una función (void motor_controller ()) en el código de prueba del motor, donde planificamos la salida del controlador PID. El cálculo PID uso el ángulo del péndulo para calcular la velocidad que conduce el carro. El signo del error determina la dirección del movimiento del carro. La función, motor_controller (), acepta la salida del cálculo PID y establece la velocidad (el período de ciclo de servicio), la dirección (signo de la salida PID) y la duración de tiempo un qué debe ir a esta velocidad. Una vez ajustados estos parámetros, la ruptura se desactiva y se espera hasta el temporizador se agote. Cuando el temporizador se agota, la ruptura se activa (se establece en alto) y la función finaliza. Es importante tener en cuenta que la duración del temporizador determina la velocidad a la que se realiza el cálculo PID. Una vez finalizado la función, el código vuelve al cálculo PID (ver Figura 5) donde se usa el error del ángulo para calcular la nueva velocidad y dirección. Usando esta nueva función, probamos la rapidez con la que el coche puede oscilar. La prueba demostró que el carro era capaz de cambiar de dirección lo suficientemente rápido, el comportamiento de carácter que sospechábamos que era necesario para equilibrar un péndulo inestable. Después de que decida que un codificador óptico sería un mejor sensor para medir la inclinación que un acelerómetro, escribimos el código del controlador del sensor. El codificador convierte el ángulo del eje en tiempo real, el velo y la dirección en las salidas de onda cuadradas TTL de dos canales con el pulso del índice. La resolución es 1024CPR (ciclos por revolución), o 1024 ciclos por cada 360 grados mecánicos de rotación del eje. La onda cuadrada se emite en ambos canales una vez por ciclo. Cuando el eje gira en una rotación a la derecha, el canal B conduce el canal A por el ¼ de ciclo, y cuando el eje está girando en una rotación a la izquierda, el canal Un conducto el canal B por ¼ de ciclo. El pulso de índice también se emite una vez por ciclo cuando tanto el canal como el canal B están bajos. (Véase la figura 6). Siguiendo la pista de cuál de los dos canales sube primero, puede controlar la rotación del eje. Midiendo el tiempo entre los bordes ascendentes / descendentes entre Ch. A y B, puede calcular la velocidad de rotación del eje. Nosotros, sin embargo, no nos importa la velocidad de la inclinación del eje por lo que no se calculó. Por otro lado, nos preocupamos por el ángulo del eje, que se puede mantener en cuenta contando cada ciclo que el codificador emite. Para obtener el MCU para procesar todos los datos emitidos del codificador resultó ser una tarea difícil. 1024 ciclos por revolución se traduce en 360/1024 = 0,35 grados mecánicos por ciclo. Por cada 0,35 grados, el codificador emite las ondas cuadradas y un pulso de índice. El primer intento de intentar contar cada ciclo de encoder con el MCU utilizó el pin de Interrupción Externa en el Puerto D (D.2) conectado a la salida de impulsos de índice del codificador. La rutina de servicio de interrupción externa se configuró para ser activado en cada borde descendente de la salida de índice. De acuerdo con las especificaciones del codificador, uno de los canales en un máximo de 300ns después de la caída del borde del pulso del índice. Dado que se tarda aproximadamente 35 ciclos en introducir un ISR (~ 2e-6 o 2μs), la tensión en el canal A y B se comprueba al comienzo del ISR. Si uno de los canales es alto y el otro es bajo, sabe la dirección de la rotación y puede aumentar / decrementar el contador en consecuencia. Con esta implementación, el mostrador está funcionando bien cuando la giraba de forma rápida pero no lenta en una dirección y cuando giraba lenta pero no rápidamente en la otra dirección. Esto se debió probablemente al hecho de que el ISR se activó en un borde descendente y que los niveles del canal estaban cambiando demasiado rápido en comparación con la duración ISR. Después de un doloroso intento de depurar esta implementación, decidimos probar otra implementación con dos interrupciones externas (INT0 / D.2 e INT1 / D.3) conectadas a las dos salidas de canal del codificador. Las rutinas de servicio de interrupción externas se activaron en cada cambio de nivel lógico. Durante el ISR para el canal A, el 0º bit de la variable global char sin signo sensor_channel se alternaría. Durante el ISR para el canal B, el primer bit de la variable sensor_channel se alternaría. Después de cada conmutación de bit en cada ISR, el valor de la variable sensor_channel sería Sugerir un cambio



Siempre y cuando uno se adhiera a los procedimientos de configuración, cualquier persona puede operar el equilibrador de péndulo invertido. El procedimiento es el siguiente:

                1) Conecte las líneas de alimentación de 5V y 12V para corregir los pines de la placa de circuito.
                2) Con ambas fuentes de alimentación apagado, equilibre el péndulo en el coche.
                3) Encienda el suministro de 12V al motor de potencia.
                4) Encienda el suministro de 5V para permitir la inicialización del codificador.
                5) Toque suavemente la parte superior del péndulo en cualquier dirección.
El dispositivo no interferirá con ningún otro dispositivo en la habitación. El único dispositivo de alta frecuencia en la placa es el cristal de 16 MHz, cuyos cables son cortos con condensadores a tierra, para mantener todo el ruido en un mínimo. El circuito de RF del coche RC está desactivado para no interferir con los circuitos de nadie, por no hablar de los nuestros. Finalmente, la señal PWM está a una frecuencia tan baja (208,3 Hz) y pasa a través de cable blindado de tal manera que no irradiaba para interferir con el circuito de nadie más. Nota: Estas frecuencias no son las mismas que las transmitidas por estudiantes con proyectos de RF. Esto prácticamente no garantiza interferencia entre los proyectos.
          La varilla de metal utilizada como péndulo puede crear una situación peligrosa cuando se coloca en un vehículo en movimiento. Por lo tanto, pedimos que todos los observadores respeten una zona de seguridad de 10 '. Además, se implementa una característica de seguridad de software para aplicar la rotura al motor si viaja en una dirección durante más de 2 segundos sin cambiar de dirección o si la MCU procesa que el péndulo haya caído más de 40 grados.



Lo que haríamos de manera diferente la próxima vez
          Suponiendo que la restricción presupuestaria no se elimine, elegiríamos nuestro coche con más cuidado y basaremos la decisión no sólo en la respuesta, sino también en el diseño mecánico y la estabilidad (balanceo, suspensión, etc.). El péndulo se reforzaría de tal manera que el movimiento se limitaría al plano vertical, sin movimiento de rotación en el péndulo, lo que provocaría una sobrepresión en el codificador y posibles lecturas erróneas del sensor.
          Todo nuestro proceso de diseño giraba en torno a lo que habíamos aprendido en MAE478. Hacia el final del semestre (y al final del proyecto), el curso de retroalimentación comenzó a pasar del análisis del sistema al diseño del controlador y al modelado del sistema. El uso de técnicas que habíamos aprendido hacia el final del semestre en la fase de diseño inicial (a mitad del semestre) habría creado un controlador más robusto y preciso. La capacidad de modelar el sistema mecánico, de utilizar el análisis de caja gris (en lugar del análisis de caja negra) y aplicar el diagrama de bode y el diseño de locus de raíz para crear polos y ceros dominantes que hacen que el sistema se realice de la manera deseada también tendría Hecho para un proceso de diseño más satisfactorio, donde el conocimiento entre los dos cursos podría ser integrado. Finalmente, el problema de ruido fue arrastrado por unos 4 días mientras que probamos soluciones rápidas a nuestra junta original. En el momento en que se observó este problema y el ruido en la línea de tierra visto con el osciloscopio (que mostraba picos de ruido muy altos alrededor de 1V en amplitud), el nuevo diseño de la placa (con MCU aislada y circuitos del motor) debería haber sido adoptado. Esto nos habría dado más tiempo para afinar el controlador PID y tal vez suavizar algunos cuellos de botella mecánicos que nos impidieron un mayor tiempo de equilibrio.


Conclusión

          A lo largo del proyecto, nuestra única preocupación fue que la respuesta del coche / motor no era lo suficientemente buena para nuestra tarea deseada; Esto era verdad. El coche no podía equilibrar el péndulo indefinidamente. El deslizamiento, originado tanto en el tren de engranajes como en los neumáticos blandos (en contacto con el suelo), crearía un retraso en nuestro sistema que eventualmente lo llevó a la inestabilidad. El retraso hizo imposible que el coche alcanzara, aunque sus cálculos de velocidad fueran correctos. Sin embargo, aunque no pudimos equilibrar el péndulo indefinidamente, el equilibrio limitado logró nuestro objetivo principal, que era equilibrar el péndulo. La cantidad de tiempo para el que nos equilibramos está fuera de nuestra mano con nuestro presupuesto actual, sin embargo, el prototipo muestra claramente que el proyecto se puede hacer, aunque con piezas de calidad. Estamos seguros de que mediante el uso de nuestro circuito y la lógica en una configuración más sólida mecánica y, obviamente, el ajuste de parámetros PID, el sistema puede lograr la hazaña final de equilibrio indefinido.


           Todos los aspectos del diseño eran nuestros. Por supuesto, las ideas fueron tomadas de los laboratorios de control de retroalimentación del MAE478, pero no se implementaron de la misma manera. Además, solicitamos ayuda externa de personas con experiencia en Ingeniería Mecánica en nuestro diseño de vehículo / péndulo. El código y la implementación del circuito del diseño fueron nuestros. No tuvimos tiempo, sin embargo, de fabricar el tablero independiente. Dado que necesitábamos un prototipo de todos modos, se realizó un circuito de placa de perforación y después de numerosas horas de soldadura y depuración de los dos circuitos diferentes (fuentes de alimentación de una o dos fuentes), decidimos que el tiempo sería mejor asignado al ajuste del controlador PID Que fabricar un tablero.

          A pesar del corto período de tiempo de ~ 1 mes y los obstáculos mecánicos encontrados, estamos muy contentos con la cantidad lograda. El proyecto fue un proceso de aprendizaje continuo y resultó ser una de las experiencias más gratificantes en Cornell.




0 comentarios:

Publicar un comentario