Universidad Tecnológica de Querétaro

Anuncio
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/
Descargar