Diseño en VHDL y síntesis en FPGA Xilinx Spartan 3 de un Controlador PID UNIVERSIDAD TECNOLÓGICA DE QUERÉTARO Diseño en VHDL y Síntesis en FPGA Xilinx Spartan 3 de un Controlador PID Memoria Que como parte de los requisitos para obtener el titulo de Ing. en Tecnologías de Automatización __________________ Presenta _______________________ Juan Esteban Mendoza Pacheco José Felipe Aguilar Pereyra Asesor de la UTEQ Luis Arturo Rangel Rodríguez Asesor de la Empresa Santiago de Querétaro, Mayo 2011 Lugar y fecha 2011 j Juan Esteban Mendoza Pacheco Universidad Tecnológica de Querétaro Firmado digitalmente por Universidad Tecnológica de Querétaro Nombre de reconocimiento (DN): cn=Universidad Tecnológica de Querétaro, o=Universidad Tecnológica de Querétaro, ou, email=webmaster@uteq.edu.mx, c=MX Fecha: 2011.05.19 13:40:46 -05'00' Querétaro, Qro. , a 3 de mayo de 2011. . C. Juan Esteban Mendoza Pacheco Candidato al grado de Ingeniero en Tecnologías de Automatización Presente Matrícula: 2004305036 AUTORIZACIÓN DE PRESENTACIÓN DE MEMORIA El que suscribe, por medio del presente le informa a Usted, que se le autoriza la presentación de su memoria de la Estadía profesional, titulada: “Diseño en VHDL y Síntesis en FPGA Xilinx Spartan 3 de un controlador PID”, realizado en la empresa: CIATEQ A.C. Trabajo que fue revisado y aprobado por el Comité de Asesores, integrado por: Ing. Luis Arturo Rangel Rodríguez M. en C. José Felipe Aguilar Pereyra Asesor de la Empresa Profesor Asesor Se hace constar el NO adeudo de materiales en las siguientes áreas. Lic.Concepción Macías Rodríguez Biblioteca UTEQ Ing. Aldo Jiménez Gaxiola Ing. Alberto Enciso Domínguez Lab. Informática Lab. de Tecnología Atentamente Ing. Rodrigo Mata Hernández Director de la División C.c.p.Lic. Mariana Sánchez Olalde.- Subdirector de Servicios Escolares Archivo 2 RESUMEN Un PID (Proporcional Integral Derivativo) es un mecanismo de control por retroalimentación que calcula la desviación o error entre un valor medido y valor que se quiere obtener, para aplicar una acción correctiva que ajuste el proceso; en este caso se requiere diseñar un PID que pueda ser utilizado y configurado para diferentes aplicaciones. Los dispositivos a utilizar son: una tarjeta Spartan 3, una tarjeta DAS1612 de adquisición de datos, la cual está diseñada para su uso en sistemas de instrumentación y control con FPGA y también es compatible con la tarjeta Spartan 3 de Digilent-Xilinx; una pantalla LCD de 2x16 caracteres cuyo fin es monitorear los valores tanto del de referencia “set point”, las constantes Kp, Ki, Kd, la variable de proceso y la variable de control; y a su vez poder modificar dichos parámetros mediante los botones de la tarjeta. El alcance de este proyecto es, crear un prototipo del hardware de un controlador PID sintetizado en un FPGA, con el uso de los recursos mencionados anteriormente. Entradas: Las señales son obtenidas por medio del ADS7841, que es un convertidor Analógico – Digital (ADC) de 12 bits con 4 canales de salida Serial, con un rango de conversión de 200KHz. Salidas: Las señales son enviadas a través del DAC7565, que es un convertidor Digital – Analógico (DAC) de 12 bits de 4 canales con salida de tensión. En la figura 1.1 se muestra el diagrama a bloques de un controlador PID conectado a una planta, en el se observa la señal de referencia u (t) a seguir y la salida del sistema y (t). Figura 1.1 Conceptualización del PID 3 ABSTRACT PID (Proportional Integral Derivative) is a forwarded control tool that calculates the deviation or error between the measured point and the set point, to apply a corrective action that adjust the process; in this way is needed to design a PID that can be used in several applications. A Discreet algorithm of the PID is developed in VHDL having internal connections (signals) with all the hardware drivers developed in VHDL in the same Xilinx Spartan 3 FPGA device. Hardware: Xilinx Spartan 3 development board; DAS1613 data acquisition Board designed to be adapted to any Spartan 3 Board connector (A1, A2 or B1); one AND491GST LCD Display with 2 lines x 16 characters and backlight. Inputs: ADS7841 is a 4-channel, 12-bit sampling Analog-to-Digital Converter (ADC) with a synchronous serial interface. It’s been considered the implementation in the Xilinx FPGA of one ADS7841 SPI driver to read these analog input channels. Outputs: DAC7565 is a low-power, voltage-output, 4-channel, 12bit digital-to-analog converter (DAC). It’s been considered the implementation in the Xilinx FPGA of one DAC7565 SPI driver to write these analog output channels. PWM Output: This is designed in VHDL to be implemented in the Xilinx FPGA, as a driver, it receives the PID output to drive out one Motor Control Circuit (The PWM is an interface between the PID and the MCC). LCD Display: the AND491GST LCD has two modes to be interfaced, eight data lines or four data lines; since the Xilinx FPGA has no limitation due to the lack of I/O pins, we can use both modes, so in this application it’s better to use the four data lines mode. 4 Índice Resumen ........................................................................................................................................ 3 Abstract.......................................................................................................................................... 4 Índice .............................................................................................................................................. 5 1. Antecedentes ......................................................................................................................... 6 2. Justificación ............................................................................................................................ 6 3. Objetivos ................................................................................................................................ 7 4. Alcances .................................................................................................................................. 8 5. Fundamentación teórica ........................................................................................................ 9 6. Plan de actividades ............................................................................................................... 42 7. Recursos materiales y humanos ........................................................................................... 45 8. Desarrollo del proyecto ........................................................................................................ 48 9. Resultados obtenidos ........................................................................................................... 84 10. Análisis de riesgos ................................................................................................................ 91 11. Conclusiones......................................................................................................................... 92 12. Recomendaciones ................................................................................................................ 93 13. Referencias bibliográficas..................................................................................................... 93 5 1. Antecedentes El Centro de Investigación y Asistencia Técnica del Estado de Querétaro, CIATEQ A.C. se ve en la necesidad de crear tecnología propia, con dispositivos que vayan según las tendencias tecnológicas. Dentro de las políticas de CIATEQ A.C. está la formación de capital humano y está ligada a las directrices que fomenta el CONACYT. Siendo este el marco de la iniciativa de CIATEQ A.C. de crear desarrollo tecnológico propio donde ya no integra equipamiento de línea, ya que todo proyecto pierde impacto cuando la mayor parte de los componentes son de tecnologías extranjeras, trátese de un desarrollo tecnológico en su conjunto o no, y sobre todo que CIATEQ A.C. reduzca la brecha tecnológica de sus productos y proyectos (reducir al mínimo las importaciones). Un beneficio consecuente que se obtiene es que al reducir las importaciones por ende se reducen los retrasos por envío y trámites. 2. Justificación CIATEQ A.C. en su búsqueda de innovar, ha decidido crear un laboratorio de sistemas embebidos que vaya con la tendencia tecnológica, dando por hecho que los sistemas embebidos siguen evolucionando hacia la tecnología de FPGA‟s, ya que el concepto de Microcontroladores como Circuitos Integrados tiende a cambiar a desarrollos VHDL o Verilog llamados Propiedad Intelectual “IP Cores” para su implementación en FPGA‟s. El 6 algoritmo de PID a diseñar en VHDL y su síntesis en cualquier FPGA constituye un desarrollo de propiedad intelectual. El desarrollo y/o utilización de IP Cores, nos ayuda a desarrollar aplicaciones más complejas sin tener que empezar desde cero, acortando el tiempo de salida de un producto de propósito específico al mercado. Otro beneficio que se obtiene es poder utilizar cada IP Core desarrollado, para otras aplicaciones sin la necesidad de pagar regalías. En este caso se seleccionó la tarjeta Spartan 3 de Digilent-Xilinx, ya que es un dispositivo confiable y de fácil operación en el mercado. La programación de esta tarjeta se realiza mediante la descripción en lenguaje VHDL, además la síntesis y programación se realizan con herramientas que son de licencia libre y pueden ser compatibles con otras herramientas del mercado (tarjetas de adquisición de datos, convertidores). 3. Objetivo El objetivo principal es llevar a la práctica un diseño en VHDL de un controlador PID, sintetizarlo y programarlo para una aplicación de control de velocidad, temperatura u otro proceso; de tal manera que demuestre su versatilidad para controlar diferentes procesos. 7 4. Alcances El primer alcance del proyecto es realizar la descripción del circuito capaz de realizar las operaciones de un controlador PID por medio de código VHDL, para esto fue necesario hacer los cálculos necesarios en el software MATLAB, en donde se obtuvieron las constantes necesarias. Será necesario sintetizar todo el código en forma modular, es decir, hacer un programa jerárquico donde se manden llamar módulos más pequeños, esto para poder llevar un control del avance en el proyecto, lo cual ayudará a la identificación de posibles detalles que surjan durante el proceso, y también ayudara para utilizarlos después en otra aplicación similar. Realizar la simulación de cada uno de los módulos que integren al programa general, esto para comprobar paso a paso el funcionamiento de cada uno, y después verificar el funcionamiento en conjunto para de esta forma identificar posibles fallas y hacer las correcciones necesarias. Al haber realizado la simulación correctamente se programará la tarjeta, primero de forma modular, ya que algunas veces en la simulación el dispositivo no funciona de la misma forma en que lo hace en la realidad, después de programar cada uno de los módulos, se programará con el código general. Se desarrollarán las tarjetas (drivers), para el control y monitoreo de elementos externos tales como el motor, debido a que la salida es por medio de 8 un PWM, es necesario desarrollar una tarjeta que pueda controlar el motor para que responda a la velocidad de la señal enviada por la tarjeta y visualizada en la pantalla LCD, la cual será controlada con el modo de cuatro líneas de datos, todo realizado por medio de la tarjeta Spartan3. Una vez terminadas las tarjetas y la programación el siguiente punto es la integración de estos, de esta forma también se podrán realizar las pruebas tanto de cada uno de los módulos como del programa completo, en este caso la prueba será el control de la velocidad de un motor de CD por medio de un PWM. Cuando las pruebas sean satisfactorias se realizará la documentación correspondiente a los puntos mencionados anteriormente, esto con la finalidad de mantener un orden y tener la facilidad de poder consultar rápidamente la información en caso de que sea requerido. 5. Fundamentación teórica. 5.1. Control Los sistemas de control han asumido un papel cada vez más importante en el desarrollo y avance de la civilización moderna y la tecnología. Prácticamente, cada aspecto de las actividades de nuestra vida diaria está 9 afectado por algún tipo de sistema de control. Los sistemas de control se encuentran en gran cantidad en todos los sectores de la industria, tales como control de calidad de los productos manufacturados, líneas de ensamble automático, control de máquinas- herramienta, tecnología espacial y sistemas de armas , control por computadora, sistemas de transporte, sistemas de potencia, robótica y muchos otros1. Para la comprensión de los temas, será necesario definir algunos términos. Variable controlada y variable manipulada. La variable controlada es la cantidad o condición que se mide y controla. La, variable manipulada es la cantidad o condición que el controlador modifica para afectar el valor de la variable controlada. Por lo común, la variable controlada es la salida (el resultado) del sistema. Controlar significa medir el valor de la variable controlada del sistema y aplicar la variable manipulada al sistema para corregir o limitar una desviación del valor medido a partir de un valor deseado2. 1 2 Plantas Sistemas de Control Automático, Benjamín C. Kuo, pág. 2 Ingeniería de Control Moderna, Katsuhiko Ogata, pág. 2-3 10 Una planta puede ser una parte de un equipo, tal vez un conjunto de las partes de una máquina que funcionan juntas, el propósito de la cual es ejecutar una operación particular3. Procesos Cualquier operación que se va a controlar. Algunos ejemplos son los procesos químicos, económicos y biológicos4. Sistemas Un sistema es una combinación de componentes que actúan juntos y realizan un objetivo determinado. Un sistema no necesariamente es físico. El concepto de sistema se aplica a fenómenos abstractos y dinámicos, tales como los que se encuentran en la economía. Por tanto, la palabra sistema debe interpretarse como una implicación de sistemas físicos, biológicos, económicos y similares5. Perturbaciones Una perturbación es una señal que tiende a afectar negativamente el valor de la salida de un sistema. Si la perturbación se genera dentro del sistema 3 Ingeniería de Control Moderna, Katsuhiko Ogata, pág. 2-3 Ingeniería de Control Moderna, Katsuhiko Ogata, pág. 2-3 5 Ingeniería de Control Moderna, Katsuhiko Ogata, pág. 2-3 4 11 se denomina interna, en tanto que una perturbación externa se produce fuera del sistema y es una entrada6. Control realimentado El control realimentado se refiere a una operación que, en presencia de perturbaciones, tiende a reducir la diferencia entre la salida de un sistema y alguna entrada de referencia y lo continúa haciendo con base en esta diferencia7. Sistemas de control en lazo cerrado Los sistemas de control realimentados se denominan también sistemas de control en lazo cerrado. En la práctica, los términos control realimentado y control en lazo cerrado se usan indistintamente. En un sistema de control en lazo cerrado, se alimenta al controlador la señal de error de actuación, que es la diferencia entre la señal de entrada y la señal de realimentación (que puede ser la señal de salida misma o una función de la señal de salida y sus derivadas y/o integrales), a fin de reducir el error y llevar la salida del sistema a un valor conveniente. El término control en lazo cerrado siempre implica el uso de una acción de control realimentado para reducir el error del sistema8. Sistemas de control en lazo abierto 6 Ingeniería de Control Moderna, Katsuhiko Ogata, pág. 2-3 Ingeniería de Control Moderna, Katsuhiko Ogata, pág. 7-8 8 Ingeniería de Control Moderna, Katsuhiko Ogata, pág. 7-8 7 12 Los sistemas en los cuales la salida no afecta la acción de control se denominan sistemas de control en lazo abierto. En otras palabras, en un sistema de control en lazo abierto no se mide la salida ni se realimenta para compararla con la entrada. Un ejemplo práctico es una lavadora. El remojo, el lavado y el enjuague en la lavadora operan con una base de tiempo. La máquina no mide la señal de salida, que es la limpieza de la ropa. En cualquier sistema de control en lazo abierto, la salida no se compara con la entrada de referencia. Por tanto, a cada entrada de referencia le corresponde una condición operativa fija; como resultado, la precisión del sistema depende de la calibración. Ante la presencia de perturbaciones, un sistema de control en lazo abierto no realiza la tarea deseada. En la práctica, el control en lazo abierto sólo se usa si se conoce la relación entre la entrada y la salida y si no hay perturbaciones internas ni externas. Es evidente que estos sistemas no son de control realimentado. Observe que cualquier sistema de control que opere con una base de tiempo es en lazo abierto. Por ejemplo, el control del tránsito mediante señales operadas con una base de tiempo es otro ejemplo de control en lazo abierto9. Sistemas de control en lazo cerrado vs los sistemas en lazo abierto Una ventaja del sistema de control en lazo cerrado es que el uso de la realimentación vuelve la respuesta del sistema relativamente insensible a las 9 Ingeniería de Control Moderna, Katsuhiko Ogata, pág. 7-8 13 perturbaciones externas y a las variaciones internas en los parámetros del sistema. Por tanto, es posible usar componentes relativamente precisos y baratos para obtener el control adecuado de una planta determinada, en tanto que hacer eso es imposible en el caso de un sistema en lazo abierto. Desde el punto de vista de la estabilidad, el sistema de control en lazo abierto es más fácil de desarrollar, porque la estabilidad del sistema no es un problema importante. Por otra parte, la estabilidad es una función principal en el sistema de control en lazo cerrado, lo cual puede conducir a corregir en exceso errores que producen oscilaciones de amplitud constante o cambiante. Debe señalarse que, para los sistemas en los que se conocen con anticipación las entradas y en los cuales no hay perturbaciones, es aconsejable emplear un control en lazo abierto. Los sistemas de control en lazo cerrado sólo tienen ventajas cuando se presentan perturbaciones impredecibles y/o variaciones impredecibles en los componentes del sistema. Observe que la valoración de la energía de salida determina en forma parcial el costo, el peso y el tamaño de un sistema de control. La cantidad de componentes usados en un sistema de control en lazo cerrado es mayor que la que se emplea para un sistema de control equivalente en lazo abierto. Por tanto, el sistema de control en lazo cerrado suele tener costos y potencias más grandes. Para disminuir la energía requerida de un sistema, se emplea un control en lazo abierto cuando puede aplicarse. Por lo general, una combinación adecuada de controles en 14 lazo abierto y en lazo cerrado es menos costosa y ofrecerá un desempeño satisfactorio del sistema general10. 5.2 Controlador PID Algunas veces se añade otro modo de control al controlador PI, este nuevo modo de control es: la acción derivativa que también se conoce como rapidez de derivación o pre actuación; tiene como propósito anticipar hacia dónde va el proceso, mediante la observación de la rapidez para el cambio del error, su derivada, como se muestra en la ecuación (5.1): (5.1) Donde ƬD = rapidez de derivación en minutos. Por lo tanto, el controlador PID tiene tres parámetros, K, o PB, ƬI o ƬRI: y ƬD, que se deben ajustar para obtener un control satisfactorio. Nótese que sólo existe un parámetro para ajuste de derivación, ƬD, el cual tiene las mismas unidades, minutos, para todos los fabricantes. 10 Ingeniería de Control Moderna, Katsuhiko Ogata, pág. 7-8 15 Como se acaba de mencionar, con la acción derivativa se da al controlador la capacidad de anticipar hacia dónde se dirige el proceso, es decir, “ver hacia adelante”, mediante el cálculo de la derivada del error. La cantidad de “anticipación” se decide mediante el valor del parámetro de ajuste, ƬD.11. 5.3. Sistemas Embebidos En dispositivos embebidos, todo el hardware electrónico reside en una tarjeta, también referido a una tarjeta impresa o PCB (Printed Circuit Board). Los PCB generalmente están hechos de delgadas hojas de fibra de vidrio. La conexión eléctrica del circuito está impresa en cobre, el cual conduce las señales eléctricas entre los diferentes componentes conectados en la placa. Todos los componentes que conforman al circuito son conectados a la placa, son soldados o montados en una base, o algún otro mecanismo de conexión. Todo el hardware en una tarjeta embebida está ubicado en la capa de hardware del Modelo de Sistemas Embebidos, el cual se muestra en la figura 5.1 Software de Aplicación Software del Sistema Hardware Tarjeta Embebida 11 Control Automático de Procesos, Smith – Corripio, pág. 212. 16 Figura 5.1. Tarjeta Embebida en el Modelo de Sistemas Embebidos. En el nivel más alto, los componentes de hardware mayor de muchas tarjetas pueden ser clasificados dentro de cinco categorías: Unidad Central de Procesamiento (CPU). El procesador maestro. Memoria. Donde el programa del sistema está almacenado. Dispositivos de entrada. Procesadores esclavos de entrada y componentes eléctricos relativos. Dispositivos de salida. Procesadores esclavos de salida y componentes eléctricos relativos. Buses o conexiones de datos. Interconectan los demás componentes, proveen un “camino” a la información para que pueda viajar de un componente a otro, incluyendo algunos cables, y buses. Estas cinco categorías son basadas en los elementos mayores definidos por el modelo Von Neumann, una herramienta que puede ser usada para entender la arquitectura del hardware de cualquier dispositivo electrónico, la cual se muestra en la figura 5.2. El modelo Von Neumann es un resultado del trabajo publicado por John Von Neumann en 1945, quien definió los requerimientos de una computadora de propósito general. Porque los sistemas 17 embebidos son un tipo de sistema de cómputo, este modelo puede ser aplicado como significado del entendimiento del hardware de sistemas embebidos12. TARJETA DE SISTEMA EMBEBIDO Procesador Maestro CONTROL DE USO Y MANIPULACIÓN DE DATOS COMPONENTES DE 5 SISTEMAS COMUNMENTE CONECTADOS CON BUSES DATOS DEL CPU O DISPOSITIVOS DE ENTRADA ALMACENDOS EN MEMORIA HASTA LA PETICIÓN DEL CPU O DISPOSITIVO DE ALIDA PROPORICONA DATOS DENTRO DEL SISTEMA EMBEBIDO Memoria Input Output ENVIA DATOS FUERA DEL SISTEMA EMBEBIDO Figura 5.2. Tarjeta de organización de un sistema embebido. 5.3. FPGA (Field Programmable Gate Array) es un dispositivo que consiste en miles de millones de transistores conectados para realizar funciones lógicas. Esas funciones mejoran de simples sumas y restas a filtros digitales complejos y detección y corrección de errores. Naves, automóviles, radares, misiles, y computadoras son solo algunos de los sistemas que utilizan FPGAs. 12 EMBEDDED HARDWARE know it all, Jack Ganssle, pág. 5-6. 18 El beneficio principal en el uso de las FPGAs es que los cambios que el diseño necesita no tienen un gran impacto en el hardware externo. Bajo ciertas circunstancias, un cambio en el diseño de la FPGA puede afectar al hardware externo (por ejemplo la tarjeta de conexiones), pero para la mayoría de las partes, este no es el caso. Una situación es si un dispositivo tiene recursos insuficientes para soportar los cambios del diseño, entonces es requerido uno dispositivo nuevo. Si el nuevo dispositivo no se puede reemplazar directamente - es decir, compatibilidad pin-por-pin (por ejemplo, alimentación y tierra están en la misma ubicación)- entonces la placa debe ser modificada. Xilinx, Altera, y Quicklogic son solo unas pocas compañías que manufacturan FPGFAs. Se sabe que hay varios manufactureros de FPGA, ellos comparten el mismo concepto básico de arquitectura. Esto consiste de tres capabilities básicas: interfaces entrada/salida (I/O), bloques básicos de desarrollo, e interconexiones13. En la figura 5.3 se muestra la tarjeta que implementa a la FPGA Spartan 3 de Xilinx. 13 FPGAs 101, Gina R. Smith, pág. 43. 19 Fig. 5.3. Spartan 3 de Xilinx 5.4. Programación VHDL. Existen diversos lenguajes descriptivos que han sido desarrollados en los últimos años, pero indudablemente el lenguaje que más difusión ha tenido y que se utiliza mayormente es el VHDL. Las características principales que hacen del VHDL el lenguaje universal de descripción de circuitos son el ser un lenguaje estándar definido como tal por el IEEE y que los proveedores del paquete tienen que seguir el estándar, haciendo que los diseños sean portátiles a cualquier plataforma. 20 Existen diversos proveedores de VHDL y todos ellos tienen sus características propias en cuanto al entorno gráfico del usuario, sin embargo, todos ellos son compatibles con la definición estándar y por lo tanto, una descripción de circuitos hecha bajo un entorno, puede ser llevada a otro sin cambios sustanciales. Todo entorno de interfaz gráfica al usuario contiene las siguientes partes que pueden ser realizadas en forma secuencial: 1. Ejecución del programa 2. Definición del proyecto de síntesis 3. Edición del archivo fuente 4. Compilación 5. Síntesis 6. Simulación El lenguaje descriptivo VHDL es un lenguaje estructurado y tiene ciertas similitudes con los lenguajes de programación PASCAL y ANSI C. Como todo lenguaje estructurado, éste consta de varios bloques de declaraciones, cada uno de ellos con una función particular. Los cuatro bloques de declaraciones en VHDL son: 1. Bloque de declaración de librerías 2. Declaración de terminales externas 3. Descripción de la arquitectura del circuito 21 4. Banco de pruebas Varios proveedores de compiladores VHDL proporcionan librerías especiales para facilitar el uso y manejo del lenguaje para la simulación o la síntesis. Las más utilizadas son las de la librería estándar 1164 del VHDL con los módulos de lógica estándar, aritmética y sin signo, las cuales deben ser interpretadas sin problemas por cualquier compilador comercial de VHDL. Para nombrar las terminales se pueden utilizar todos los caracteres alfanuméricos como las letras y los números, además de la barra inferior. VHDL no es sensitivo al tipo de letra y es indistinto el uso de mayúsculas y minúsculas. Las reglas para dar nombre a una terminal son las siguientes: 1. Siempre se debe iniciar con una letra 2. Después de la primera letra se pueden combinar las letras, números y la barra inferior 3. En principio, la longitud de los nombres de las variables no está limitado 4. No se pueden utilizar dos barras inferiores consecutivas 5. No se puede utilizar una barra inferior al final del nombre de la variable 6. No se pueden utilizar las palabras reservadas en VHDL Las terminales que se pueden declarar en VHDL son de cuatro tipos diferentes y pueden ser: 1. Entradas simples in 22 2. Salidas simples out 3. Terminales bidireccionales inout 4. Salida con retroalimentación buffer Todo circuito debe tener un encabezado y ser declarado por la palabra reservada entity, seguido del nombre del circuito y finalizando la línea con la palabra reservada is. Las terminales del circuito se declaran como puertos de comunicación mediante la palabra reservada port y abriendo paréntesis. Las terminales del circuito se declaran dentro de la sección de puertos y terminales del mismo tipo se pueden declarar una por una o en forma conjunta, separadas por comas. La última terminal finaliza su declaración sin el punto y coma. La sección de puertos se finaliza cerrando paréntesis seguido de punto y coma. Para finalizar la declaración de terminales se utiliza la palabra reservada end, seguida del nombre del circuito nuevamente. La descripción fundamental del circuito se realiza en el tercer bloque de declaraciones, denominado bloque de arquitectura, el cual comienza con la palabra reservada architecture, seguida por el nombre de la descripción del circuito, la palabra reservada of y el nombre del circuito y finalizando la línea con la palabra reservada is. No se debe confundir el nombre de la descripción del circuito con el nombre del circuito. La descripción del circuito va englobada entre un begin y un end con el nombre de la descripción. 23 Un aspecto muy importante de VHDL y en el que difiere sustancialmente de los lenguajes de programación convencionales es que las asignaciones son concurrentes, es decir, ocurren en el mismo tiempo. En los lenguajes de programación estándares las asignaciones se efectúan de manera secuencial, una después de otra. Asignaciones simples bajo VHDL. x <= „1‟; -- x toma el valor de 1 y <= „0‟; -- y toma el valor de 0 z <= x OR y; -- z toma el valor de x OR y que es 1 Para una mejor compresión de lo mencionado anteriormente, a continuación se describen los elementos más importantes necesarios en la programación14. Librerías. Los elementos que componen una librería es lo que se llaman unidades. Ya se han visto dos unidades hasta ahora, la entidad y la arquitectura, pero veremos que hay tres más que son los paquetes, los cuerpos de los paquetes, y las configuraciones. A las unidades de tipo declarativo, esto incluiría a la entidad, paquete y configuración, se las conoce como unidades primarias. Al resto de unidades que son de tipo ejecutivo, que son las arquitecturas y cuerpo de los paquetes, se las llama unidades secundarias. 14 Electrónica Digital y Lógica Programable, René de Jesús Romero Troncoso, Primera Edición 2007, DR Universidad de Guanajuato, Dirección General de Extensión/ Coordinación Editorial, pág. 95-99. 24 Se ha visto que la librería es donde se guardan las unidades de una descripción de un circuito a partir de un fichero. La forma que tiene el fichero de diseño es siempre la misma ya que se trata de un fichero texto con los comandos de VHDL, sin embargo, la forma que puede tomar la librería correspondiente puede ser muy diversa dependiendo de la herramienta de compilación utilizada y del sistema operativo. Esto quiere decir que no existe un mecanismo estándar en VHDL para la creación de librerías, siendo ésta una tarea de la herramienta que se esté utilizando. La sentencia que permite hacer esto se llama USE. Seguido del USE se pone el paquete y a continuación la unidad o elemento que se quiere referenciar dentro del paquete precedido por un punto. Si se quieren referenciar todos los elementos de un paquete se puede utilizar la palabra ALL. Ejemplos: LIBRARY componentes; -- Hace visible una librería con componentes USE componentes.logic.and2; -- Hace visible la puerta "and2" del paquete -- "logic" al resto del programa. USE componentes.arith.ALL; -- Hace visibles todos los elementos del -- paquete "arith". 25 En cualquier sistema basado en VHDL siempre existen dos librerías que no necesitan ser invocadas puesto que son cargadas por defecto. Una de estas librerías es work, es decir, la que contiene las unidades del diseño que se está compilando. La otra librería es la std que contiene dos paquetes, el standard y el textio. El paquete standard dentro de esta librería contiene todas las definiciones de tipos y constantes vistos hasta ahora, como por ejemplo los tipos bit y bit vector. El paquete textio contiene tipos y funciones para el acceso a ficheros de texto. Junto a estas librerías suele venir en las herramientas de simulación y síntesis, otra librería que se usan tanto que prácticamente también es estándar. Esta librería se llama IEEE y contiene algunos tipos y funciones que completan los que vienen incorporados por defecto. Dentro de esta librería hay inicialmente un paquete, el std_logic_1164 que contiene la definición de tipos y funciones para trabajar con un sistema de nueve niveles lógicos que incluyen los de tipo bit con sus fuerzas correspondientes, así como los de desconocido, alta impedancia, etc. El nombre de este tipo es el std_ulogic, y en el mismo paquete viene otro tipo, el std_logic que es exactamente como el anterior sólo que éste tiene asociada una función de resolución. Junto con este paquete existe otro que no es más que una extensión del anterior y se llama std_logic_1164_ext. Este paquete es como el anterior pero incorpora alguna función de resolución más, así como operaciones aritméticas y relacionales. 26 A fin de clarificar cómo vienen definidos estos tipos, se presenta a continuación el comienzo de la parte declarativa del paquete std_logic_1164 de la librería del IEEE, donde se pueden ver los diferentes niveles lógicos disponibles: PACKAGE std_logic_1164 IS -------------------------------------------------------------------- logic state system (unresolved) ------------------------------------------------------------------TYPE std_ulogic IS ( 'U', -- Uninitialized 'X', -- Forcing Unknown '0', -- Forcing 0 '1', -- Forcing 1 'Z', -- High Impedance 'W', -- Weak Unknown 'L', -- Weak 0 'H', -- Weak 1 '-' -- Don't care ); -------------------------------------------------------------------- unconstrained array of std_ulogic for use with the resolution function ------------------------------------------------------------------TYPE std_ulogic_vector IS ARRAY (NATURAL RANGE <>) OF std_ulogic; 27 -------------------------------------------------------------------- resolution function ------------------------------------------------------------------FUNCTION resolved (s : std_ulogic_vector ) RETURN std_ulogic; -------------------------------------------------------------------- *** industry standard logic type *** ------------------------------------------------------------------SUBTYPE std_logic IS resolved std_ulogic; -------------------------------------------------------------------- unconstrained array of std_logic for use in declaring signal arrays ------------------------------------------------------------------TYPE std_logic_vector IS ARRAY (NATURAL RANGE <>) OF std_logic; Posteriormente a estas definiciones vendría la sobrecarga de operadores, y otras definiciones15. Lógica Secuencial. Contraria a la lógica combinacional donde las funciones de salida dependen exclusivamente de las entradas, en la lógica secuencial además de las entradas, las funciones de salida dependen del estado que guarda la máquina. Esto último implica, la existencia de elementos de memoria que almacenan las condiciones o estados del circuito, tales como el que se muestra en la Figura 5.4. 15 VHDL. Lenguaje para descripción y modelado de circuitos, Fernando Pardo Capio, Universidad de Valencia, 1997, págs. 61-63. 28 S Q Q‟ R Figura 5.4. Circuito secuencial simple. En general, se puede decir que un circuito secuencial es un circuito combinacional que contiene elementos de memoria y guarda la información del estado de la máquina. La principal característica distintiva de un circuito o elemento de memoria es la existencia de señales realimentadas, como se muestra en la Figura 5.5. E n t r a d a s Bloque Combinacional Memoria S a l i d a s Figura 5.5. Diagrama de bloques de un circuito secuencial. 5.4.1 Elementos de memoria. 29 La clave para tener un circuito secuencial consiste entonces en contar con elementos de memoria que guarde los estados o condiciones internas de operación del sistema. Elementos de memoria. Son dispositivos lógicos formados con compuertas que mediante un anillo de retroalimentación son capaces de guardar información. Estado. Se entiende por estado de un sistema a todas y cada una de las combinaciones lógicas que pueden presentar los elementos de memoria. Sistema secuencial. Se dice que es secuencial cuando contiene uno o varios elementos de memoria. Dado que la presencia de memoria en el sistema implica la existencia de un estado actual y un estado futuro, la variable del tiempo se encuentra implicada y de ahí lo secuencial. Estado actual o estado presente. Es el estado que muestra un sistema secuencial en el instante de análisis. El símbolo que generalmente se utiliza es Qp. Estado futuro o próximo estado. Es la combinación lógica de los elementos de memoria que presentarán cuando se produzcan cambios en las entradas del sistema secuencial. El símbolo que generalmente se utiliza es Q n. 30 Elemento de memoria asíncrono. Se dice que es asíncrono si el cambio de estado depende exclusivamente de sus entradas y no contiene una señal de control maestra, Figura 5.6. R Q Q‟ S Figura 5.6. Candado SR con compuertas NOR. Elemento de memoria síncrono. Se dice que es síncrono o sincronizado si el cambio de estado depende de sus entradas y es controlado por una señal maestra que proporciona la temporización, Figura 5.7. R Q LD Q‟ S Figura 5.7. Candado SR con señal de sincronía. Circuitos secuenciales síncronos y asíncronos; Si bien los elementos de memoria por sí solos son considerados circuitos secuenciales, el término es más general e incluye la sección combinacional. Los 31 circuitos secuenciales pueden ser clasificados como circuitos síncronos o asíncronos, dependiendo de la forma en que se realice la temporización. Esta definición de sincronía es diferente a la que se define a los elementos puros de memoria. Circuito secuencial síncrono. Se dice que un circuito secuencial es síncrono cuando cumple con los siguientes tres requisitos: 1. Tiene señal de reloj 2. La señal de reloj es común a todos los elementos de memoria 3. Todos los elementos de memoria son idénticos. Si al menos una de las condiciones incluidas no se cumple, entonces el circuito se considera asíncrono, en la figura 5.8 se muestra un circuito secuencial síncrono. K Y D GRB CLR Q Q D GRB CLR Q Q CLK Figura 5.8. Circuito secuencial síncrono. 32 K Y D GRB CLR Q Q D GRB CLR Q Q CLK Figura 5.9. Circuito secuencial asíncrono. El circuito de la Figura 5.9 es asíncrono porque a pesar de tener un reloj común, los elementos de memoria son diferentes, siendo el primer flip-flop de borde de disparo positivo y el segundo flip-flop de borde de disparo negativo16. Máquinas de estado finitos. Todo circuito secuencial puede ser descrito como una máquina de estados finitos o FSM (Finite-State Machine). Esta máquina se dice que es de estados finitos porque el número de estados (combinaciones lógicas posibles de los elementos de memoria) que contiene es una cantidad finita y es la característica principal de los circuitos secuenciales. Mientras en la lógica combinacional se utilizan la tabla de verdad y los mapas de Karnaugh para la descripción de los sistemas, en la lógica secuencial sus contrapartes son la tabla de transiciones y el grafo. El grafo de una FSM es la representación diagramática o gráfica del comportamiento de la máquina y contiene los siguientes elementos: 16 Electrónica Digital y Lógica Programable, René de Jesús Romero Troncoso, Primera Edición 2007, DR Universidad de Guanajuato, Dirección General de Extensión/ Coordinación Editorial, pág. 197-216. 33 1. Estados 2. Transiciones 3. Entradas 4. Salidas Se debe recordar que los estados de una máquina secuencial son todas y cada una de las combinaciones lógicas posibles que presentan los elementos de memoria. De esta manera se tiene que una FSM con un elemento de memoria presenta dos estados posibles, una maquina con dos elementos de memoria tiene cuatro estados y en general, el número de estados está dado por la ecuación 5.2: S = 2m Donde: (5.2) S número de estados. m elementos de memoria. Un diagrama de estados tiene como finalidad la representación del funcionamiento descriptivo de un sistema secuencial donde cada uno de sus elementos determina el comportamiento del sistema. Dentro del grafo, los estados se representan como circunferencias etiquetadas con el nombre de su estado (Figura 5.10). Las transiciones en una máquina de estados es la forma en que se dan los cambios de estado. Se simbolizan mediante flechas que parten del estado presente y llegan al próximo estado. 34 A 0 0 1 1 B D 1 1 0 C 0 Figura 5.10. Grafo de una FSM con transiciones condicionales. Las entradas en una máquina secuencial son las que establecen las condiciones para realizar las transiciones o cambios de estado y se representan sobre la transición en cuestión con su valor lógico. Las transiciones que dependen de una o varias entradas se denominan transiciones condicionales. Cada estado tiene tantas transiciones como combinaciones lógicas existan entre las entradas. Con una entrada se tienen dos transiciones, con dos entradas se tiene cuatro transiciones y en general, el número de transiciones esta dado por la ecuación 5.3: L = 2n Donde: (5.3) L número de transiciones condicionales. n número de entradas. Las salidas en una máquina de estados definen dos aspectos de la misma: el tipo de máquina y las salidas propias. Por la forma en la que se 35 definen las salidas, una máquina secuencial tiene dos posibles estructuras y son: Máquina Mealy (Figura 5.11). Máquina Moore (Figura 5.12). En la máquina Mealy, las salidas son función de las entradas y de los estados presentes, por lo tanto, se indican a un lado de las entradas, separándolas por una diagonal. En la máquina Moore las salidas son función exclusiva de los estados presentes y se indican dentro del mismo estado, debajo de la etiqueta. Estas dos estructuras de máquinas secuenciales son equivalentes, desde el punto de vista tecnológico, las máquinas no tienen el mismo comportamiento debido a los retardos de los elementos. La diferencia principal entre ambas máquinas se puede notar en el comportamiento de las salidas y para poder verlo, es conveniente remitirse a las ecuaciones 5.4 y 5.5. Máquina Mealy: Y = F(X, P) (5.4) N = F(X, P) Máquina Moore: 36 Y = F (P) (5.5) N = F(X, P) Donde: Y Salidas X Entradas P Estados presentes N Próximos estados F Indica una función de lógica combinacional En la máquina Mealy se pueden presentar señales transitorias no deseadas en la salida, debido a que cualquier cambio en la entrada las afecta, mientras que en la máquina Moore los cambios en las salidas solamente atienden a los cambios de estado y las entradas no tienen una conexión directa a la salida. Este efecto es muy importante y determina la frecuencia de operación de una máquina de estados. En forma general se puede decir que la máquina Moore es más rápida que la máquina Mealy debido a los transitorios en la última. Además de la velocidad, la máquina Mealy presenta problemas de sincronía, mientras que la máquina Moore puede ser sincronizad en forma sencilla. 37 Combinacional 2 Entradas X Combinacional 1 N MEMORIA P Próximos estados Salidas Y Estados presentes Figura 5.11. Estructura a bloques de la máquina Mealy Combinacional 2 Entradas X Combinacional 1 N MEMORIA Próximos estados P Salidas Estados presentes Figura 5.12. Estructura a bloques de la máquina Moore El proceso completo de diseño de máquinas secuenciales se puede resumir a los pasos siguientes: 1. Problema 2. Planteamiento del grafo 3. Síntesis síncrona o asíncrona 4. Realización 38 Y Síntesis. Se denomina síntesis al proceso completo de diseño donde se plantea una solución al problema original y se termina con un circuito digital que realiza la función deseada. El proceso se lleva a cabo mediante el flujo mostrado en la figura 5.13 Problema Planteamiento estructural Descripción VHDL NO Simulación SI Síntesis Ruteo NO Simulación SI Mapa de fusibles Programación Figura 5.13. Diagrama de flujo del proceso de síntesis. 39 De acuerdo a la figura 5.13, partiendo del problema inicial, el primer paso consiste en realizar un planteamiento estructural del circuito que proporciona la solución. En este punto se determinan los elementos que han de ser utilizados para la solución del problema. El segundo paso consiste en realizar la descripción VHDL de la estructura propuesta para la solución del problema y se procede a la simulación lógica. Esta simulación lógica no contempla los retardos en las compuestas y solamente sirve para verificar la funcionalidad en comportamiento de la solución propuesta. Si la simulación es correcta se procede a la síntesis, si la simulación no es correcta hay que realizar las correcciones necesarias hasta obtener un circuito funcional. Para obtener un circuito que realice las operaciones descritas en el planteamiento se procede al paso cinco que consiste en realizar la síntesis del proyecto. Esta síntesis consiste en convertir el código VHDL en ecuaciones lógicas equivalentes a la tecnología donde se pretende llevar a cabo la realización final. Este paso y los siguientes, son sensitivos a la tecnología, es decir, en este momento se tiene que utilizar y especificar el fabricante del dispositivo y la familia de circuitos a utilizar. Existen diversos fabricantes de dispositivos lógicos programables. El sexto paso consiste en el ruteo que se encarga de ajustar las ecuaciones obtenidas por la síntesis en los bloques constructores del dispositivo lógico programable, especificado de manera particular. Este proceso 40 se encarga de convertir las ecuaciones lógicas en bloques constructores como son las macro-celdas o las celdas lógicas, según se haya utilizado un CPLD o un FPGA, y la interconectividad en las mismas. Este proceso predice los retardos que han de tener todas y cada una de las etapas sintetizadas en el circuito. El siguiente paso incorpora los retardos predichos por el ruteo y el listado VHDL original y se procede a realizar la simulación funcional donde además de la lógica, también se verifican los tiempos de retardo en que actúan las diferentes señales. Si la simulación es correcta se procede al siguiente paso, si la simulación no entrega los resultados deseados debido a los retardos, se deben realizar las modificaciones pertinentes, ya sea en la estructura del circuito o en el tipo de dispositivo seleccionado y proceder a realizar la síntesis y simulación funcional hasta que se cumpla con lo deseado. Una vez que la simulación funcional entrega los resultados correctos se procede a generar el mapa de fusibles del dispositivo, el cual define la interconectividad final del circuito que se desea programar. Finalmente, con del mapa de fusible y un programador lógico se procede a programar el circuito integrado y proceder a su aplicación. Se debe tener muy en cuenta que cada fabricante de circuitos lógicos programables tiene sus propias herramientas para llevar a cabo la síntesis, ruteo y generación de mapa de fusibles, por lo que es importante conocer estas 41 herramientas para la correcta aplicación de los diseños de circuitos lógicos realizados. Asimismo, cada familia de dispositivos tiene sus variantes en cuanto a recursos, es decir: cantidad de compuertas disponibles, velocidad de operación y número de terminales de entrada y/o salida. La selección del dispositivo específico donde se va a llevar a cabo la síntesis es muy importante para lograr una realización óptima en costo/desempeño. También se debe considerar que cada dispositivo requiere de un sistema que permita su programación que generalmente lo constituye un equipo especializado para programar circuitos. También se debe contar con este equipo y se debe asegurar que programe los dispositivos que son mayormente utilizados en los diseños propios. Como parte final del proceso de diseño se tiene que realizar la prueba real del circuito, donde se comprueba su completa funcionalidad17. 6. Plan de actividades Las actividades que se realizaron se muestran en la gráfica 6.1, en donde se pueden ver intervalos de tiempo en donde no se muestra actividad alguna, esto fue debido a que se realizó la investigación sobre otros equipos (FPGA Altera Cyclone II), así como la elaboración del reporte, esto debido al 17 Electrónica Digital y Lógica Programable, René de Jesús Romero Troncoso, Primera Edición 2007, DR Universidad de Guanajuato, Dirección General de Extensión/ Coordinación Editorial, pág. 143-146. 42 tiempo de espera en la compra de las tarjetas, ya que tuvieron que ser adquiridas puesto que la institución no contaba con ellas, las pruebas realizadas con la Spartan 3E se llevaron a cabo ya que fue la primera en ser adquirida y la forma de programar es similar a la de la tarjeta Spartan 3. 43 ene 2011 Id. Nombre de tarea Comienzo Fin 9/1 1 Investigación sobre programación 10/01/2011 13/01/2011 4d 2 Cotización de materiales 14/01/2011 14/01/2011 1d 3 Recopilación de información 17/01/2011 18/01/2011 2d 4 Documentación del programa 19/01/2011 21/01/2011 3d 5 Simulación de los módulos 24/01/2011 27/01/2011 4d 6 Diseño de los drivers del motor 31/01/2011 31/01/2011 1d 01/02/2011 01/02/2011 1d 02/02/2011 04/02/2011 3d 07/02/2011 09/02/2011 3d 10/02/2011 11/02/2011 2d 14/02/2011 18/02/2011 5d 21/02/2011 24/02/2011 4d 13 Sintetizar PWM en FPGA 28/02/2011 02/03/2011 3d 14 Pruebas con Display 2x16 03/03/2011 09/03/2011 5d Sintetizar PWM y desplegar porcentajes en LCD 10/03/2011 14/03/2011 3d 16 Pruebas del ADC con FPGA 17/03/2011 21/03/2011 3d 17 Pruebas del DAC con FPGA 22/03/2011 24/03/2011 3d Desarrollo y modificación del 18 programa general 25/03/2011 01/04/2011 6d 19 Simulación del programa general 04/04/2011 06/04/2011 3d 20 Sintetizar el programa general 07/04/2011 08/04/2011 2d Pruebas con el programa general 21 con FPGA 11/04/2011 20/04/2011 8d 22 Documentación del Proyecto 10/01/2011 20/04/2011 73d 7 8 9 Simulación y prueba de los drivers del motor Elaboración de códigos para pruebas Simulación de códigos para pruebas 10 Consulta de manuales Sintetizar códigos de prueba con 11 FPGA Spartan 3E Sintetizar códigos de prueba con 12 FPGA Spartan 3 15 feb 2011 mar 2011 abr 2011 Duración 16/1 23/1 30/1 6/2 Gráfica 6.1 44 13/2 20/2 27/2 6/3 13/3 20/3 27/3 3/4 10/4 17/4 7. Recursos materiales y humanos 7.1. Recursos materiales: Los recursos utilizados para la elaboración del proyecto son los mencionados en la tabla 7.1. Partida Descripción Cantidad Unidad Costo 1 1 Pieza Tarjeta Spartan 3. Tarjeta para experimentos con FPGA de $1308 200 Kilo compuertas 2 Convertidor USB-JTAG 1 Pieza Configuración de bajo costo y solución de $480 comunicación SPI 3 Tarjeta de Adquisición DAS1612 1 Pieza $1200 ADC Y DAC de 12 bits de resolución 4 Pantalla LCD de 2x16 AND491GST 1 Pieza $136 5 Motor de DC a 24V 1 Pieza $150 6 Motor de DC a 5V 1 Pieza $80 6 Transistor IRFZ44N para driver del motor 1 Pieza $ 20 7 Transistor PN2222A 1 Pieza $1 8 Transistor 2N3906 2 Pieza $1 9 Resistencia de 1KΩ 3 Pieza $1 10 Resistencia de 470Ω 1 Pieza $1 45 11 Capacitor electrolítico 10µF 12 Capacitor de tantalio 0.1µF 13 Diodos 4148 1 Pieza $3 2 Pieza $2 Costo Total Recursos Materiales $3390 Tabla 7.1 Recursos Materiales. 7.2. Maquinaria y herramientas También fue necesario el uso de herramientas para la elaboración de pruebas, así como equipo para el desarrollo de ciertas actividades tales como la programación en donde fue necesario el uso de una PC, el multimetro utilizado contaba con la función de medir la frecuencia, con ello se pudo realizar la medición de la frecuencia en el PWM, en la tabla 7.2 se pueden observar los costos de cada una de las herramientas utilizadas, cabe mencionar que ya se contaba con el Osciloscopio, y puede ser remplazado con otro, la ventaja que se obtuvo fue que se podían guardar los reportes a una USB y la parte gráfica tenía una buena resolución, también se contaba con la PC, son mostradas en la tabla como referencia únicamente. Parida Descripción Cantidad Unidad Costo 1 Pinzas de corte diagonal 1 Pieza $60 2 Protoboard 1 Pieza $60 46 3 PC con el software Active HDL, Xlinix 1 Pieza $9500 ISE, MatLab 4 Osciloscopio de 400MHZ 5GS/s LeCroy 1 Pieza $144483 WaveRunner 44Xi-A Costo Total Maquinaria y Herramientas $ 154103 Tabla 7.2 Maquinaria y Herramientas. 7.3. Recursos Humanos Debido a que el proyecto fue la elaboración de un prototipo, sólo fue necesaria la intervención de dos personas para llevarse a cabo, los cuales son mencionados en la tabla 7.3. Partida Descripción Horas 1 Herramientas 200 $350 2 Ing. Electrónico para supervisión 12 $500 Costo Total Recursos Humanos Costo /horas $76000 Tabla 7.3 Recursos Humanos Partida Descripción 1 Recursos Materiales 2 Maquinaria y herramientas Costo /horas $3390 $ 154103 47 3 Recursos Humanos $76000 Costo Total Recursos Humanos $ 233493 Tabla 7.4 Costo Total 8. Desarrollo del proyecto El proyecto fue realizado en las instalaciones de CIATEQ A.C., ubicadas en Av. Del Retablo #150, colonia Constituyentes FOVISSTE, en la ciudad de Querétaro. El tiempo en el que fue desarrollado abarcó del día 10 de Enero de 2011 al 22 de Abril del mismo año. 8.1. Investigación Lo primero que se realizó fue la investigación acerca de la programación, esto debido a la complejidad del lenguaje que fue utilizado en el código base, ya que algunas funciones no fueron vistas durante el curso enfocado a programación en VHDL. La información necesaria fue consultada en diversos libros, entre ellos el de Electrónica Digital y Lógica Programable, el cual fue creado por el Dr. René de Jesús Romero Troncoso, y fue de gran utilidad. Lo siguiente realizado fue la recopilación de información, en este punto se recopiló la programación realizada durante el curso tomado en la Universidad Tecnológica de Querétaro, así como de la que se proporcionó por 48 el asesor de la empresa, con el fin de tener un conocimiento más amplio sobre el tema. 8.2. Documentación de los códigos Una vez que fueron recolectados los códigos, se realizó la documentación de los mismos, para lograr un mejor entendimiento, de esta forma se facilitó al acceso de la información, puesto que cada consulta se realizó de una manera mucho más sencilla, lo que generó una menor pérdida de tiempo en cuanto a búsqueda. La documentación constó de agregar comentarios y explicaciones a cada parte de los códigos más importantes, esto con el fin de saber que acción se realizó en cada proceso o cuando alguna señal realizó algún cambio. Se comenzó de los módulos más sencillos o de menor jerarquía, puesto que de esta forma se vieron las operaciones más sencillas al comienzo y así se identificó rápidamente el funcionamiento de los módulos de mayor jerarquía. Otra parte de la documentación fue la elaboración de los diagramas de bloques para la identificación de cada una de las señales y de esta forma tener una mejor referencia acerca del funcionamiento individual y en conjunto. Los diagramas se realizaron por partes, debido a que el código general consta de varios códigos de menor jerarquía, y los cuales se interconectan entre ellos, 49 pero el nombre de las señales cambia de un módulo a otro, un ejemplo de estos diagramas se puede observar en la figura 8.1. STR "1001110000111" STR1 Timer ENI K RST RST CLK FS(0) ENO ADC RD FS CLR Ch1 Ch2 ERR CH3 ADC_DCLK SYNC FS(2) YK U FS(2) U(15 downto 6) “0001” a0 PWM WR D PWM_A PA, LED(1) DHZ K XK RST “11” a0 ADC_DIN CLK PID FS(1) „0‟ Ch0 ADC_DOUT RST CLK FS(1) EOR ADC_BUSY PWM_B PB, LED(0) CLK PWM_A PWM_B LED a1 a2 a1 ADC_BUSY b0 a2 ADC_DOUT b1 RST DAC_SCLK b0 CLK REF b1 „0‟ FS(2) DAC WR EOW DRST DAC_SCLK Ch0 DAC_SYNC Ch1 DAC_DIN Ch2 DAC_LDAC Ch3 DAC_RST LED(2) DAC_SYNC DAC_DIN DAC_LDAC RST CLK DAC_RST ADC_DCLK ADC_DIN Figura 8.1. Diagrama de bloques del programa general. 8.3. Simulación de los módulos. Se realizó la simulación de cada uno de los módulos de mayor jerarquía PWM, ADC (Convertidor Analógico Digital), PID y también se realizó la simulación de algunos módulos de menor jerarquía (Contadores, temporizadores “timers”, registros) con el fin de comprobar el funcionamiento de los mismos, así como también el verificar que la documentación realizada fuera la correcta, para de esta forma evitar errores futuros en la identificación de señales. La simulación fue realizada por medio del programa ActiveHDL, en donde se agregaron las señales de entrada para manipularlo, y así observar el 50 comportamiento de cada uno de los programas al hacer cambio en las señales, esta actividad no sólo sirvió para comprobar el funcionamiento de los mismo, sino también para aprovechar el tiempo de espera para la adquisición de las tarjetas, puesto que al momento de comenzar con el proyecto no se contaba con ellas, un ejemplo de una simulación se muestra en la figura 8.2, donde se pueden observar las diferentes señales de entrada y salida, del modulo PWM (modulación de ancho de pulso). Figura 8.2. Simulación en VHDL. 8.4. Diseño de Controladores (Drivers) Debido a que se compró una tarjeta de adquisición de datos, sólo fue necesario elaborar un controlador para la velocidad del motor, para ello se 51 realizó una investigación en varios foros de electrónica, esto para encontrar un controlador capaz de responder a la velocidad del PWM, debido a que la velocidad con que se maneja la señal es muy alta, una vez realizado esto se procedió a hacer la simulación del mismo en el programa PROTEUS, donde se comprobó que el circuito funcionaba correctamente. El circuito utilizado se muestra en la figura 8.3, Figura 8.3.Circuito para PWM El siguiente paso fue elaborar el circuito en una tarjeta de prueba “protoboard”, puesto que aun no se contaba con el FPGA, la primera prueba se realizo con un micro controlador PIC16F684 proporcionado por la empresa, el cual ya contaba con un programa de PWM, con esta prueba se comprobó que el circuito funcionaba de la misma forma que en la simulación. 52 8.5. Elaboración y síntesis de códigos de pruebas. Se realizó una etapa de entrenamiento, que constó de elaboración de códigos para pruebas de programación y funcionamiento de las tarjetas, una vez que fueron adquiridas, el primer programa que se implementó fue el de un contador de 8 bits, con una base de tiempo variable, el cual mostraba el cambio de los bits por medio de los LEDs, como se muestra en la figura 8.5, para la síntesis del programa en la tarjeta Spartan 3, fue necesario obtener un convertidor de USB a JTAG, puesto que la tarjeta no cuenta con uno interno como lo es en el caso de la tarjeta Spartan 3E. Después de realizar la síntesis del programa, el siguiente código elaborado fue el de un reloj de tiempo real, el cual se implementó en la tarjeta Spartan 3, que cuenta con 4 displays de 7 segmentos, en donde se desplegaban los minutos y las horas, para el ajuste del mismo se generó una base de tiempo variable, con la cual dependiendo del botón de entrada generaba el cambió de horas y de minutos como se muestra en la figura 8.6. 53 Figura 8.5. Contador de 8 bits Figura 8.6. Reloj de tiempo real. 54 El siguiente código de pruebas que se realizó fue el del contador de pulsos de entrada, de forma que si la señal se quedaba activa, el programa solo contaba un pulso, ya que en la mayoría de los contadores aumenta el valor del contador si esta se queda activa y si también hay un cambio en la señal del reloj, esto fue realizado debido a que surgió la idea de poder medir la velocidad del motor con un encoder en caso de ser necesario, el método que se utilizó fue el de retrasar la señal de entrada por medio de una negación con respecto al cambio de ciclo del reloj, después el comparar si la señal de entrada y la señal retrasada coincidían y de esta forma aumentar el valor del contador, lo cual se puede ver en la figura 8.7, donde “Q” es el valor del contador, “I” es la entrada y “C” es la señal retrasada. Figura 8.7. Contador de señales Después de haberse realizado el contador, el siguiente paso fue el generar un código capaz de aumentar y disminuir el valor por medio la perilla que contiene la tarjeta Spartan 3E, esto para poder modificar los valores ingresados a cada módulo del programa, y de esta forma poder utilizar un contador genérico con la opción de poder aumentar su dimensión por medio del código, lo cual se realizó por medio de una constante, que en este caso es un 55 entero, el cual puede definirse en la entidad dentro del código de menor jerarquía como se muestra en el Ejemplo (8.1). Entity Cont is generic (n:integer:=4); port (… (8.1) ); end Cont; En donde: Cont es el nombre de la entidad. n: la constante genérica que en este caso es un entero de valor 4. Y también puede ser modificada en la arquitectura dentro del código de mayor jerarquía como se muestra en el ejemplo (8.2), para de esta forma poder utilizar sólo un módulo que realice las mismas funciones sin necesidad de hacer varios de diferentes tamaños. Contador: Cont generic map (4) port map (…); En donde: Contador: es la etiqueta asignada al módulo. 56 (8.2) Cont : es el módulo de menor jerarquía. generic map: es donde se asigna el valor de la constante. por map: es donde se asigna el valor de las entradas y salidas. Una vez realizado el código, se prosiguió a la manipulación de la LCD de 2x16, para una mayor rapidez se utilizó la tarjeta Spartan 3E, debido a que cuenta con una integrada, para que esto se llevara a cabo se utilizó un código de ejemplo con el cual se contaba, lo primero que se realizó fue la identificación de señales, una vez entendido el programa, se procedió a hacer modificaciones, la primera fue el cambio de los caracteres desplegados, debido a que el programa solo contaba con 4 y desplegaba la palabra “FPGA” en el quinto espacio del primer renglón, lo que se realizó fue el uso de señales y la elaboración de un decodificador, esto para que no fueran caracteres fijos, y de esta forma poder manipular el mensaje desplegado. La primera prueba realizada fue elaborar un contador para hacer el desplazamiento del mensaje, y dependiendo del valor de su estado presente realizaba el cambio del último carácter, el cual iba del 0 al 9 y de la A hasta la Z, y a su vez también realizaba el corrimiento de izquierda a derecha, al llegar al último renglón visible del primer renglón, realizaba el cambio hacia el segundo y viceversa. Esto con el objetivo de entender por completo el funcionamiento del programa de la LCD, que para este proyecto se utilizó la comunicación de 4 bits, el objetivo principal del LCD fue implementarlo para 57 desplegar los valores de las señales que se utilizaron para cada uno de los módulos. 8.6. Programación del FPGA Para realizar la programación de la tarjeta fue necesario contar el software ISE Project Navigator Versión 12.3 de Xilinx para el desarrollo de la síntesis el cual se muestra en la figura 8.9 y el DIGILENT ADEPT Rev 2.5 para la comunicación con la tarjeta el cual se puede observar en la figura 8.11, esto debido a que fue necesario utilizar un convertidor JTAG – USB, el cual se muestra en la figura 8.8. Figura 8.8. Convertidor JTAG – USB. 58 Lo primero que se realizó fue generar un proyecto nuevo, iniciando el software ISE de Xilinx, se selecciona el botón “New Project…” después se escribe el nombre con el que se va a llamar el proyecto, y se selecciona la capeta de destino, se da clic en “Next”, el siguiente paso fue el seleccionar las propiedades del proyecto, donde se selecciona el tipo de FPGA, la familia, y sus características específicas, que para este proyecto fueron: Family: Spartan 3, Device: XC3S200, Package: FT256 y Speed: -4, se da un clic en “Next” y en el resumen se da clic en “Finish”. Una vez creado el proyecto el siguiente paso es agregar los códigos, que en este caso se realiza por medio de la caja “Hierarchy”, donde aparece “Empty View” se da clic derecho y se selecciona “Add Source”, se busca la dirección de los archivos, se seleccionan y se da clic en “Abrir”. El paso siguiente fue cambiar la configuración de la opción “Synthesize – XST” en el software ISE dando clic con el botón derecho y seleccionando la opción “Process Propierties…”, después en la opción “HDL Options” se cambia el valor de la casilla “FSM Encoding Algorithm” de “Auto” a “Compact”, una vez realizado se da clic en “Apply” y después en “OK”, esto para que la síntesis del código de las maquinas de estado se realice de una manera compacta, después se cambia la configuración de la opción “Generate Programming File” dando clic derecho y seleccionando la opción “Process Propierties…”, después en la opción “Startup Options” se cambia el valor de la casilla “FPGA Start-Up Clock” de “CCLK” a “JTAG Clock”, se da clic en “Apply” y después en “OK”, esto 59 debido a que el reloj utilizado para la programación es por medio de la comunicación JTAG. Una vez realizados los cambios en la configuración se procedió a realizar la síntesis, esto dando doble clic en la opción “Synthesize”, en donde se pueden encontrar los errores en el código o las alarmas, una vez que se realizado, se procedió a asignar las entradas y salidas de la tarjeta por medio de la opción “I/O Planning (PlanAhead) – Post-Synthesis”, la cual ejecuta el programa PlanAhead, que se muestra en la figura 8.10. Figura 8.9. Software ISE de Xilinx. Cuando se ejecuta el programa, se da doble clic en la opción “I/O Ports”, en esta parte se asigna la señal utilizada en la FPGA en la parte “Site”, en la parte “I/O Std” se selecciona el tipo de señal por ejemplo LVCMOS25, y dependiendo del tipo también se modifica la parte “DriveStrength”, un ejemplo 60 de ello es cuando se selecciona la señal LVCMOS33* se cambia el valor a 4*, cuando todas las señales fueron configuradas, se guarda el archivo y se cierra el programa. Se vuelve al programa ISE y se da doble clic en la opción “Implement Design”, cuando termina, el siguiente paso es dar doble clic en la opción “Generate Programming File”, esto para generar el archivo “.bit”, el cual es el que utiliza la FPGA. Figura 8.10. Software PlanAhead. Cuando los dos pasos anteriores fueron realizados, se inicia el software ADEPT, se conecta el convertidor a la PC, se enciende la tarjeta y se da clic en la opción “Initialize Chain”, en la parte donde aparece la FPGA, se selecciona la opción “Browse…”, después se selecciona la dirección de donde está el archivo 61 “.bit” y después se da clic en la opción “Program”, con lo cual se queda almacenado el archivo en el FPGA y concluye el proceso de la programación. Figura 8.11. Software ADEPT de DIGILENT. 8.7. Sintetizar PWM en FPGA Como ya se contaba con un programa de control de velocidad de un motor, se procedió a dividirlo en partes para poder observar el funcionamiento de cada uno, para de esta forma poder observar las señales que envía y recibe cada uno de ellos. El objetivo de esto fue para optimizarlos y de esta forma utilizarlo en otras aplicaciones. La primera prueba que se realizó fue el cambiar el ancho de pulso para la salida del PWM por medio de los interruptores con que cuenta la tarjeta, y la visualización se llevo a cabo por medio de un LED que también se encuentra 62 incluido, cada que se realizaba el cambio en los bits de entrada, se podía observar el cambio en la intensidad del LED, la frecuencia total, es definida por la ecuación 8.1, y también se pude observar en la figura 8.12. tpwm = tclk * (K+1) * [2 n-1 + DHZ] (8.1) Donde: tpwm = es la frecuencia del pwm. tclk = es el periodo del reloj, K = constante para el temporizador “timer”. N = es el número de bits. DHZ = constante de desplazamiento. Figura 8.12. Modulación de ancho de pulso Después se procedió a la modificación de los bits de entrada del PWM, esto debido a que el código que se tenía manejaba sólo 7 bits y el octavo se utilizaba para cambio de signo, se requirió convertirlo a 8 bits para de esta forma tener una mejor resolución para la modificación del ancho de pulso. El siguiente paso fue el de modificar los datos de entrada por medio de la perilla, 63 para lo cual fue necesario utilizar el programa del contador de pulsos mencionado anteriormente, esto debido a que la señal enviada por la perilla mantiene por determinado tiempo la señal hasta que cambia la posición, el siguiente problema encontrado fue el de saber el sentido hacia donde estaba girando la perilla, puesto que si se giraba hacia un lado o hacia otro el contador aumentaba, para esto fue necesario revisar un código que se encuentra en la página de Xilinx, el cual hace un corrimiento en los LEDs dependiendo del sentido en el que gira la perilla. Una vez analizado el código, se implementó en el programa, con lo cual pudo realizarse la modificación en la señal de entrada, y de esta forma pudo aumentar y disminuir dependiendo del sentido del giro. Códigos para porcentaje; Para poder desplegar el porcentaje de la salida fue necesario desarrollar un código capaza de realizar divisiones, como la mayor parte de la información se realiza por medio de bits y vectores de bits, el FPGA no puede realizar divisiones con este tipo de datos, por lo cual se procedió a convertirlos a un número entero, esto por medio de la función “conv_integer (dato)” , de esta forma si pudo ser realizada la división, aunque tiene otra limitante, que para este tipo de datos solo puede ser dividido por números que sean potencia de dos, que no fue un problema puesto que para este código se necesitó dividir por el número 256, es de considerarse también el definir el rango del entero con la 64 función “integer range -- to --”, esto es para no utilizar más información de la necesaria, ya que se utilizaron 5 números enteros por defecto son de 32 bits, lo cual abarca de -2147483647 a 2147483647 , después se procedió a hacer multiplicaciones y restas para poder definir el valor de las fracciones, las unidades y las decenas, después separarlas a un solo número y convertirlas nuevamente a vectores de bits por medio de la función “conv_std_logic_vector (Entero,numero de bits)”, para de esta forma tener todos los datos de un mismo tipo, en la figura 8.13 se muestra la simulación del código de conversión, en donde I es el vector de entrada, I2, I3, I4, I5, D, U, F son enteros, y Frac, Uni, Dec son los vectores de salida. Figura 8.13. Conversión vector a entero y viceversa 8.8. Pruebas con LCD La siguiente prueba realizada fue la de elaborar el código para desplegar el valor del porcentaje en la LCD, primero se utilizó el modificado anteriormente, 65 para esto se desarrollaron varios códigos, decodificadores, bases de tiempo, contadores, la forma en cómo trabaja el código es moviendo la señal de entrada al decodificador, y a su vez el decodificador manda la señal a un carácter de la LCD, para que de esta forma sea de manera variable y se observe el cambio que sufre la señal. Una vez que funcionó el código, se procedió a combinar el código de la perilla junto con el del porcentaje y el de los datos en la LCD en la tarjeta Spartan 3E, para ello fue necesario utilizar 6 caracteres de la LCD, el primero de izquierda a derecha se utilizó para las decenas, el segundo para las unidades, el tercero para el punto, el cuarto para los decimales y el quinto para el signo de porcentaje, y de esta forma observar el cambio producido en cada giro de la perilla como se muestra en la figura 8.14. Al concluir la prueba del porcentaje, se implemento el mismo código junto con el del PWM, para comparar el valor desplegado en la pantalla con la intensidad del LED, y de esa forma ver la velocidad de la respuesta y la resolución cada que cambia un bit. Gracias al desarrollo satisfactorio de esta prueba, se obtuvo la ventaja de utilizarlo para la visualización y manipulación para las señales de punto de partida “set point”. 66 Figura 8.14. Visualización del porcentaje en FPGA Spartan 3E. 8.9. Pruebas del ADC con FPGA La conversión Analógico – Digital se llevó a cabo por medio de la tarjeta DAS1612, la cual es compatible con la tarjeta Spartan 3 y se muestra en la figura 8.14, esta tarjeta cuenta con cuatro canales de entrada, debido al diseño de esta, sólo pueden ser utilizados dos canales al mismo tiempo el 0 y 3 o el 1 y 2, los datos de la lectura son enviados por medio de comunicación serial a una velocidad de 2.5 MHz, la primera prueba que se realizó con las tarjetas fue la de variar una señal con un potenciómetro y observar el comportamiento por medio de los LEDs como se muestra en la figura 8.15. 67 El convertidor analógico – digital con el que cuenta la tarjeta DAS1612 es el ADS7841 y el digital – analógico es el DAC7565. Figura 8.15. Conversión Analógico –Digital. La siguiente acción realizada fue la modificación del módulo con el que se contaba, puesto que estaba diseñado para cuatro canales analógicos de entrada y cuatro de salida, lo que se realizó fue modificar el contador de los canales, el cual tenía un valor predefinido en booleano de “11” y se modificó por “01”, a su vez también se modificó la secuencia de datos de escritura hacia el ADC, debido a que es por comunicación serial, los datos deben enviarse como se muestra en la figura 8.16. Así también para la manipulación de estos, el código contaba con un contador de bits, lo cual los almacenaba en un registro, para poder visualizarlos en manera de arreglo de bits. 68 Figura 8.16 Tiempo de conversión, 24 reloj por conversión En la figura 8.16, se observa como son enviados y recibidos los datos, en donde DCLK es el reloj para comunicación serial, el cual trabaja a una velocidad de 5MHz, DIN son los 8bits de escritura hacia el ADS7841 que es un convertidor analógico a digital, y el DOUT son los datos de lectura que recibe la tarjeta Spartan 3, la forma en que deben ser enviados los bits de DIN es: S = Señal de inicio. A2, A1 y A0 = Selector de canal, la configuración es 001 canal 1, 101 canal 1, 010 canal 2 y 110 canal 3. MODE = Selector de conversión 12 bits en bajo y 8 bits en alto. SGL/DIF = Selector de Salida, simple en alto o diferencial en bajo. PD1-PD0 =Selector de apagado, en este caso se selecciono “11”, siempre encendido. 69 Una vez enviados los 8 datos, se recibe el bit de espera “BUSY”, para de este modo iniciar la adquisición, que comienza del bit más significativo hasta el menos significativo. 8.10. Pruebas del DAC con FPGA La conversión Digital – Analógica también fue llevada a cabo por medio de la tarjeta DAS1612, el código diseñado manejaba 4 canales de salida, por lo cual se tuvo que reducir a dos canales, puesto que solo se contaba dos canales de entrada, la modificación que se realizó fue el eliminar las señales y registros pertenecientes a los dos canales, así como cambiar el valor del contador de canales de “11” a “01”, en tabla 8.1 se muestra como deben ser enviados los datos. Tabla 8.1 Control para el Convertidor Digital – Analógico Para escribir lDAC7565 es necesaria una señal de reloj para la comunicación serial, la cual es de 5MHz, también puede verse que es necesario enviar un dato de 24 bits, donde son necesarios 8 bits de control (DB24 a 70 DB16) y 12 bits de datos (DB15 a DB4) y los bits DB3 a DB0 son ignorados por el DAC, para el código del programa sólo fueron necesarias las configuraciones de las primeras filas de la tabla, otro cambio realizado fue a la salida LDAC que estaba en 0 por lo tanto mantenía el valor fijo en la salida, lo que se hizo fue cambiar el valor por el de la señal de fin de adquisición de datos, con lo cual se refrescaba continuamente el valor de salida, la señal SYNC se mantuvo igual así como el ENABLE. En la figura 8.17 se muestra las señales enviadas al DAC7565. Figura 8.17 Señales para el DAC7565. 8.11. Modificación del programa general. Una vez realizadas las pruebas con el PWM, ADC y DAC, el siguiente paso fue la modificación del programa general puesto que al cambiar los códigos de menor jerarquía se generan errores, lo primero que se realizó fue 71 eliminar las señales pertenecientes a los canales que no fueron utilizados, así como el valor de los contadores, también se tuvieron que agregar más códigos tal es el caso del menú, esto debido a que se propuso la idea de mostrar los valores en un display y para ello fue necesario desarrollar el código para desplegar los datos de una forma convencional, para este código fue necesario utilizar 4 botones de entrada, la configuración de izquierda a derecha es la siguiente: Botón 1: Salir de submenú (Escape). Botón 2: Subir. Botón 3: Bajar. Botón 4: Entrar (Enter). La forma en cómo se encontraban los menús es la siguiente: Sintonización Kp Ki Kd Ajuste SP (Set Point) Vista SP (Set Point) % Salida (Porcentaje de salida) 72 Var. Proceso (Variable de Proceso) ERROR Para crear este código fue necesario elaborar una tabla de valores para saber las condiciones necesarias para el cambio de los estados, la cual se muestra en la Tabla 8.2, en donde se puede ver los valores necesarios en los contadores de General, Sintonía, Vista, Ent/Esc y dependiendo de la combinación de ellos se asigna un valor a Qn, que es el estado futuro, el cual cambia a Qp que es el estado presente cada que hay un cambio del reloj, lo que aparece entre comillas en la fila de menú es lo que se despliega la pantalla LCD. General Sintonía Vista Ent/Esc Qn Menú 00 00 00 00 00000 “Sintonía” 01 00 00 00 00001 “Ajuste” 10 00 00 00 00010 “Vista” 00 00 00 01 00011 “Kp” 00 00 00 01 000100 Valor de Kp 00 01 00 01 00101 “Ki” 00 01 00 10 00110 Valor de Ki 00 10 00 01 00111 “Kd” 00 10 00 10 01000 Valor de Kd 73 01 00 00 01 01001 “Sp” 01 00 00 10 01010 Valor de Sp 10 00 00 01 01011 “Sp” 10 00 00 10 01100 Valor de Sp 10 00 01 01 01101 “% Salida” 10 00 01 10 01110 Valor % Salida 10 00 10 01 01111 “Variable Pro” 10 00 10 10 10000 Valor Variable de Proc 10 00 11 01 10001 “Error” 10 00 11 10 10010 Valor del error Tabla 8.2 Valores de Qp para el menú. Realizada la tabla, el siguiente paso fue el desarrollar el algoritmo para poder cambiar entre los menús, como se muestra en la tabla, el valor del punto de partida “SP” se repite en dos ocasiones, se manejó de esta forma puesto que como son dos menús diferentes al momento de salir de ese submenú, no se regresaba al menú anterior sino al de “Ajuste”, por ejemplo, si se estaba en el menú “Vista” y se ingresaba al submenú “SP”, al momento de presionar el botón Atrás la pantalla desplegaría “Ajuste”, una parte del código se muestra en el ejemplo 8.3, donde se muestra el primer estado de Qp que es “Sintonía”, con las condiciones para cambiar a “Kp” o a “Ajuste”. 74 Case Qp is when "00000" => if E2 = '1' then Qn <= "00011"; elsif CU2 ='1' then (8.3) Qn <= "00001"; else Qn <= Qp; end if; … 8.12. Acoplamiento del motor y del generador “Hardware” No todo el proyecto constó de programación, también fue necesaria la elaboración de la base para poder fijar el motor de 24V y el de 5V utilizado como generador, para de esta forma tener la retroalimentación al circuito. La forma en la que se acoplaron se muestra en la figura 8.18, al momento de energizar el motor de 24V se midió la tensión generada por el motor la cual era de 5V, lo cual fue de gran ayuda, puesto que el convertidor posee un rango de 0 a 5V. El material utilizado para la base de los motores se encontraba en la empresa, lo que se realizó fue el corte de las placas de aluminio, y los barrenos para la sujeción de los motores, una vez realizado, lo siguiente fue alinear las flechas de los dos motores, esto para que al momento de estar rotándolos, se 75 elimine la fricción o el dañar alguno de los dos, para la unión de las flechas se utilizó el engrane que estaba implementado en uno de ellos, el otro se sujeto por medio de un tornillo, como se puede observar en la figura 8.18, también se dejo un poco de juego en los orificios de las placas, esto para poder moverlas y de esa forma tener un mejor ajuste, una vez realizada la sujeción, se procedió a energizar el motor para ver el comportamiento, ya realizado el ajuste el motor y el generador pudieron girar correctamente. Figura 8.18 Motor (izquierda) y generador (derecha). 76 8.13. Sintonización del PID Cuando fue realizado el Hardware, se detectó una la falla en la respuesta del controlador, por lo tanto se procedió a hacer la modificación en las constantes, esto con el fin de llevar el controlador a una respuesta que lo hiciera tener una mejor respuesta a los cambios, para saber la respuesta escalón, se utilizó el modelo que se muestra en la figura 8.19. Figura 8.19. Modelo propuesto para motor de CD. La respuesta escalón obtenida del motor fue la que se muestra en las figuras 8.20 y 8.21. En la figura 8.20 se observa el tiempo de retraso del motor cuando se le ingresa un impulso, la señal en rojo es de 21V que es la alimentación del motor y la de amarillo es a 5V que es la tensión que envía el generador, también se observa que el tiempo de respuesta es de 2.31 ms. 77 Figura 8.20. Retardo inicial En la figura 8.21 se observa el tiempo de levantamiento, el cual es de 15.59 ms., donde también se observa el valor del 63.2% que es de 2.62V. 8.21. Tiempo de respuesta. 78 Una vez obtenidos los valores, el siguiente paso fue realizar la sintonía, lo cual se realizó por medio de la ecuación 8.4, con lo cual se obtienen las ganancias. (8.4) Para la obtención de las constantes se utilizó el software MATLAB, con el cual se realizaron simulaciones para ver la respuesta obtenida al modificar los valores de las constantes, sabiendo que Kp afecta la velocidad de la respuesta, Ki afecta el sobrepaso máximo y Kd afecta el amortiguamiento, la figura 8.22 muestra los valores ingresados a las constantes en el programa para la sintonización y la figura 8.23 muestra la gráfica de la respuesta del controlador con respecto al impulso. 79 Figura 8.22. Asignación de valores. Figura 8.23 Respuesta del controlador 80 En la figura 8.23 se ve que los valores asignados al controlador reflejaban una respuesta considerable, así mismo se observa que se alcanza la señal a los 1.3 segundos de que se genera el impulso, los valores obtenidos fueron los siguientes Kp = 3, Ki = 50 y Kd =0.000001. Lo siguiente a realizar fue la discretización todo por medio de los coeficientes a partir de las ganancias del controlador, lo cual se realizó con la ecuación 8.5. (8.5) También dependiendo del controlador varían las señales, como se muestra en la Tabla 8.3, donde se ven las funciones de transferencia y la equivalencia. Tabla 8.3 Funciones de transferencia y equivalencias Como el que se realizó en este proyecto es un PID, fue necesario obtener los valores de las constantes a0, a1, a2, b1, b2, para la realización de las operaciones fue necesario utilizar el software de MATLAB, esto con la 81 finalidad de hacer un código genérico con el cual se pudieran adquirir las constantes sin necesidad de crear uno nuevo, el código utilizado se muestra en la figura 8.24, este programa también fue proporcionado por la empresa. Figura 8.24 Cálculo de las constantes. Una vez ingresados los valores de Kp, Ki, Kd, se obtuvieron los siguientes valores para las constantes: a0 = 3.0225, a1 = -3.0400, a2 = 0.0200, b1 = 1, b2 = 0. El siguiente paso fue ingresarle los valores al código para verificar que el motor respondiera de la misma forma que en la simulación. 82 8.14. Pruebas con el código general. El último paso fue la realización de pruebas del código general, las cuales consistieron en conectar las señales del FPGA hacia los drivers y de esta forma monitorear los valores existentes entre ellas por medio del menú desplegado en la LCD, con estas pruebas se comprobó el funcionamiento de la programación, puesto que fue la única parte gráfica con la cual podían ser monitoreadas, las pruebas consistían en dejar un valor de referencia por medio de un potenciómetro, con lo que el controlador mantendría al motor funcionando de tal manera que la señal enviada por el generador estuviera lo más cercano al valor de esta, como el programa fue diseñado para otro motor, la respuesta no coincidió, por lo que se recurrió a modificarse, una vez realizadas las modificaciones el programa funcionó de la manera esperada, en la figura 8.25 se muestra la gráfica de las señales. Figura 8.25 Señales. 83 Las señales de la figura 8.25 muestran el comportamiento dependiendo de las variaciones, en el Canal 1 que se muestra en color amarillo se observa la señal de PWM, la cual aumenta o disminuye dependiendo del valor del referencia “set point”, cuando el sistema tiene carga tiende a aumentar al valor más cercano al 100%, el Canal 2 se muestra en color rojo e indica el valor que envía el generador, el cual se resta a la referencia para de esta forma hacer el error, en el Canal 3 en color azul se muestra el valor de referencia, también se observa que la diferencia entre la referencia y el valor de la variable es en mili volts, ya sea positivo o negativo, esto debido a la oscilación generada por la corrección del controlador. 9. Resultados Obtenidos Los resultados obtenidos durante la realización del proyecto se describen a continuación de la misma forma que en el desarrollo. 9.1. Investigación Debido a que la empresa proporcionó un programa base, se recurrió a investigar en libros y en algunos sitios de internet diferentes formas de programación, esto con el fin de adquirir conocimiento sobre el tema puesto que en el curso que se llevó en la Universidad no cubrió cierta parte de lo que contenía el código proporcionado, el objetivo fue alcanzado, esto debido a que 84 gracias a la investigación se tuvo una mejor comprensión al momento de revisar cada uno de los módulos utilizados. 9.2. Documentación de los programas. Gracias a la investigación realizada, la documentación de los módulos pudo realizarse de una forma más sencilla, esto debido a que se pudo comprender más rápidamente la forma en como fueron utilizados los códigos, otro punto que favoreció al desarrollo de esto fue la elaboración de simulaciones dentro del programa ActiveHDL, esto debido a que en él se pueden observar las diferentes señales y el comportamiento de las mismas respecto a cualquier cambio realizado tanto como en las entradas como en las condiciones internas del código, también facilitó a la realización de los diagramas de bloques para la identificación de las señales utilizadas entre cada módulo. 9.3. Simulación de los módulos. Esta fue una parte muy importante puesto que sirvió tanto como para el desarrollo de las actividades anteriores como para una mejor interpretación de cada uno de los módulos, y de esa forma lograr que las mismas fueran realizadas conforme al tiempo estimado para su desarrollo. 9.4. Diseño de Controladores (Drivers) 85 El driver utilizado para el control del motor funcionó correctamente, en las primeras pruebas se utilizó un micro controlador, puesto que aun no se contaba con la tarjeta Spartan 3, se realizó otra prueba con un motor diferente y se tuvo una falla puesto que la corriente que demandó el motor fue más grande a la que soportaba el diodo, lo que provocaba que todo el driver se fuera a cortocircuito, después se cambió el motor y se realizó otra prueba, con la cual se tuvieron resultados satisfactorios, y de esta forma se eligió el motor que cumplía con las capacidades necesarias. 9.5. Elaboración y síntesis de códigos de pruebas. Los códigos de pruebas fueron una parte muy importante ya que gracias a ellos se pudo adquirir práctica para poder generar códigos más fácilmente y también para modificar los que ya se contaban, también sirvió para poder utilizar diferentes tipos de programación, tales como condiciones, instrucciones, etc., esto para ver de que forma se utilizaban menos condiciones o si se podía realizar la estructura de una manera más sencilla y de esa forma poder implementarlo en donde fuera necesario, lo cual fue satisfactorio. 9.6. Programación del FPGA La programación fue satisfactoria, debido a que se contó con la ventaja de que el software utilizado en el proyecto fue el mismo que se utilizó en los cursos tomados en la Universidad Tecnológica de Querétaro, la única variación 86 fue la forma de programar la tarjeta, puesto que la utilizada para el controlador necesitó de un software adicional para la comunicación JTAG-USB, pero no fue impedimento puesto que el software fue muy amigable y fácil de usar. 9.7. Sintetizar PWM en FPGA La síntesis del programa fue realizada satisfactoriamente, la primera prueba realizada fue con los botones y los LEDs con los que cuenta la tarjeta, se observaba la intensidad dependiendo de los botones que se encontraban activos, el siguiente paso que se realizó fue el cambiar los botones por el encoder rotatorio con el que cuenta la tarjeta Spartan 3, lo que también fue satisfactorio, puesto que al girar la perilla hacia un lado aumentaba la intensidad luminosa, y al girarla hacia el otro lado disminuía, así como también la modificación de la entrada del PWM, esto para tener una mejor resolución, lo cual se realizó satisfactoriamente. 9.8. Pruebas con LCD Las primeras pruebas con la LCD fueron las más importantes, esto debido a que el código para el control de esta ya había sido diseñado, por lo tanto se tuvo que hacer un análisis del funcionamiento, esto para ver la forma de poder cambiar los valores, y como hacer para desplegar los datos, una vez que es entendió el procedimiento del código lo siguiente fue el cambio del mismo para poder desplegar mensajes diferentes así como valores de las 87 señales de algún código en específico, para ello se realizaron varios decodificadores debido a que se manejaban señales de diferentes tipos, tales como vectores, enteros, etc., y también se realizaron códigos de escalamiento, los cuales hacían una regla de tres, esto para saber el porcentaje de la señal que estaba siendo monitoreada, los decodificadores funcionaron correctamente y las pruebas realizadas tanto a los decodificadores como a los códigos de escalamiento fueron satisfactorias. 9.9. Pruebas del ADC con FPGA Una parte importante para el desarrollo del proyecto fue la parte de la adquisición de los datos, lo cual fue realizado por medio de la tarjeta DAS1612, la primera prueba realizada fue la síntesis del programa y por medio de los LEDs de la tarjeta visualizar el cambio provocado cada que se subía o bajaba la tensión de entrada, el siguiente punto fue realizar la visualización por medio de la pantalla LCD, esto para poder verificar el comportamiento de la conversión, por medio de la comparación entre la LCD y el valor desplegado en la pantalla del multimetro, lo cual implicó la modificación del código puesto que había una pequeña diferencia, así como la cantidad de canales ya que solo se contaba con dos disponibles y el código manejaba cuatro, las pruebas fueron realizadas en tiempo y acorde con las fechas manejadas. 88 9.10. Pruebas del DAC con FPGA. Estas pruebas fueron realizadas a la par con las del ADC, esto para revisar si la señal que se estaba adquiriendo era la misma que se estaba enviando, lo cual se comprobó por medio de un multimetro, la primera prueba demostró que había cierta variación en el valor de la salida, por lo que se procedió a hacer modificaciones hasta llegar al punto más cercano y de esta forma no tener diferencia entre las conversiones, lo cual fue realizado de una manera satisfactoria. 9.11. Modificación del programa general. Una vez que fueron realizadas las pruebas, el siguiente punto importante fue la modificación del programa general, esto debido a que como se hicieron cambio en los valores de algunos códigos fue necesario hacer que las señales coincidieran, evitando de esta forma futuros errores al momento de compilar la información del código general, otro punto por el cual se tuvo que modificar fue por la creación del menú gráfico en la LCD, el cual desplegaba la información de los valores de las señales utilizadas así como de las constantes, para lo cual fue necesario diseñar un código para el control del mismo, las primeras pruebas tuvieron fallas puesto que había veces en las que se ciclaba o no hacía su función, aunque después de varias modificaciones se pudo corregir ese problema y se logró que el menú funcionara correctamente. 89 9.12. Acoplamiento del motor y del generador “Hardware”. Para el desarrollo del Hardware se utilizó material común, como lo fueron placas de aluminio, el cual ya estaba en la empresa, lo que se realizó fue el corte y barrenado de estas, para poder montar los motores fácilmente, una vez realizado, lo siguiente fue el acoplar las flechas y después energizar para ver si había algún tipo de vibración, lo cual sucedió, pero se fue ajustando hasta llegar a un punto en el que las flechas giraban libremente sin exceso de vibración, al ser satisfactoria la prueba se procedió a hacer el apriete de los tornillos para evitar el movimiento de las placas. 9.13. Sintonización del PID Debido a que el programa anterior tenía valores asignados a las constantes se procedió a utilizarlo de la misma forma, pero se tuvo problemas en la respuesta, puesto que el sistema actuaba diferente a la esperada, y con lo cual se pudo observar que era un problema de sintonía, con lo que se procedió a realizar los cálculos y simulaciones para adaptarlas y de esta forma tener un mejor funcionamiento, una vez realizados, se procedió a hacer las pruebas, las cuales fueron satisfactorias, ya que el sistema respondió como se esperaba. 9.14. Pruebas con el código general. 90 Las primeras pruebas no fueron satisfactorias, puesto que no se activaba el motor, se procedió a revisar la parte electrónica en donde se detectó que unas señales no están colocadas correctamente, una vez realizadas las modificaciones necesarias se volvió a realizar otra prueba, se descubrió que el programa no hacía su función, puesto que manejaba dos salidas a PWM, lo que sería ideal para un puente H, pero en este proyecto, solo se utilizó un transistor, puesto que solo se necesitó de un sentido de giro, se procedió a modificar la programación para solucionarlo, al principio se eliminó una parte del código que correspondía al signo, por lo cual se tuvieron problemas a la hora de implementar y con lo que se generó que se regresara al programa original, en donde se realizaron los cambios que funcionaron anteriormente, así también se tuvo confusión con el método utilizado para las operaciones del PID puesto que se utilizo un formato 2 bits para entero y 14 bits para decimales en entrada y salida y un formato de 10 bits de entero y 8 bits para decimales en los coeficientes, una vez realizado se generó la prueba de todo el sistema y se vio un funcionamiento diferente y que era más cercano al comportamiento esperado, se realizaron unos últimos ajustes con los parámetros de sintonía y se obtuvo el funcionamiento esperado para el controlador. 10. Análisis de riesgo Las principales limitaciones en el desarrollo de este proyecto fueron el tiempo de entrega de los materiales, esto debido a que como no se contaba con 91 las tarjetas se procedió a comprarlas y como son enviadas desde el extranjero tienen cierto tiempo de espera, y ahí no solo depende de la empresa que las fabrica si no de la empresa de paquetería que se utiliza, ya que dependiendo del servicio es el tiempo de respuesta. El conocimiento acerca de la programación es otra barrera puesto que si el programa ya existe, se debe tener el conocimiento, ya que al momento de querer realizar algún cambió se pude modificar el funcionamiento del mismo, lo que puede generar errores o que no se realicen algunas operaciones. El presupuesto también es un recurso muy importante, puesto que las tarjetas utilizadas y los programadores no son tan económicos, así como los instrumentos de medición necesarios para la realización de pruebas, aparte de que este proyecto fue un prototipo que generalmente es muy costosa su elaboración. El tiempo es un factor importante, esto debido a que al hacer el análisis de señales, las simulaciones, la realización de las síntesis, las pruebas, se consume considerablemente este recurso, lo que provoca que se tenga que aprovechar al máximo todo el disponible, esto para no generar retrasos. 11. Conclusiones La principal conclusión fue que para el desarrollo de algún prototipo se necesita de mucho capital, puesto que es necesario conseguir equipo o 92 personas que tengan conocimiento acerca del tema y como generalmente se utiliza tecnología reciente es más costoso. El uso de operaciones aritméticas en lenguaje VHDL es algo complejo, puesto que se necesita utilizar varios métodos para la parte de decimales, como es el caso del punto fijo, de esta forma se tiene un estándar en el caso de operaciones con vectores, así se definen la cantidad de bits para el número, el signo y sus decimales. La realización de simulaciones es de mucha ayuda, puesto que se puede ir viendo paso a paso el funcionamiento del código y de esta forma facilita la realización de modificaciones. La creación de respaldos es un factor muy importante, puesto que se hacen modificaciones constantes, y puede perderse información, así también hay que revisar el programa a fondo, puesto que a veces se procedía a hacer modificaciones a partes importantes del mismo. 12. Recomendaciones Siempre hay que actualizar el conocimiento, ya que en esta área se realizan modificaciones constantemente, y lo que nunca se debe descuidar es la investigación, esto debido a que si no se tiene el conocimiento del tema o si 93 se sabe muy poco, es fundamental recurrir a libros o artículos que hablen sobre este. Prestar mucha atención al momento de realizar cambios o pruebas, esto debido a que hay veces que cuando se hacen modificaciones se pueden cometer errores, lo que puede generar la falla de un equipo o errores en la programación, lo que genera una pérdida de tiempo al momento de estar buscando la falla y también puede genera pérdidas monetarias, esto en el aspecto de dañar un equipo. 13. Referencias Bibliográficas Ganssle Jack. (2008). EMBEDDED HARDWARE know it all, USA: Elsevier. Kuo Benjamín C. (1996). Sistemas de Control Automático. México: Prentice Hall. Ogata Katsuhiko. (1998). Ingeniería de Control Moderna. México: Prentice Hall. Romero Troncoso René de Jesús. (2007). Electrónica Digital y Lógica Programable, Guanajuato México: Dirección Coordinación Editorial. Smith Gina R. (2010). FPGAs 101. USA: Elsevier. 94 General de Extensión/