PROYECTO DE GRADO FERNAN PEDRAZA

92
IEL2-II-04-26 1 CONTROL ADAPTATIVO EN SISTEMAS EMBEBIDOS FERNÁN ALFONSO PEDRAZA MORALES Informe Proyecto de Grado Fredy Segura Carlos Camargo Alain Gauthier Asesores del Proyecto UNIVERSIDAD DE LOS ANDES DEPARTAMENTO INGENIERÍA ELÉCTRICA Y ELECTRÓNICA ENERO 2005

Transcript of PROYECTO DE GRADO FERNAN PEDRAZA

Page 1: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

1

CONTROL ADAPTATIVO EN SISTEMAS EMBEBIDOS

FERNÁN ALFONSO PEDRAZA MORALES

Informe Proyecto de Grado

Fredy Segura Carlos Camargo Alain Gauthier

Asesores del Proyecto

UNIVERSIDAD DE LOS ANDES DEPARTAMENTO INGENIERÍA ELÉCTRICA Y ELECTRÓNICA

ENERO 2005

Page 2: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

2

CONTENIDO

INTRO DUCCIÓ N 1

OBJETIVO S 2

1 SISTEMAS EMB EBIDOS (SE) 3

1.1. INTRODUCCIÓN 3 1.2. SISTEMAS O PERATIVOS EN TIEMPO REAL (RTOS) 3 1.2.1. INTRODUCCIÓN 3 1.2.2. DEFINICIÓN 4 1.2.3. FUNCIONES 5 1.2.4. APLICACIONES 7 1.2.5. CRITERIOS DE SELECCIÓN DE UN RTOS 7 1.2.6. ECOS 9 1.3. HARDWARE 10 1.3.1. LÓGICA PROGRAMABLE: CPLD’S Y FPGA’S 10 1.3.2. MEMORIA FLASH 12 1.3.3. PROGRAMACIÓN DE DISPOSITIVOS RECONFIGURABLES 13 INTERFAZ DE PROGRAMACIÓN DE LA MEMORIA FLASH 13 1.4. ARQUITECTURA GBA-XPORT 16

2 CONTRO L ADAPTATIVO 18

2.1. INTRODUCCIÓN 18 2.2. GANANCIA PROGRAMADA 18 2.3. SISTEMA ADAPTATIVO POR MODELO DE REFERENCIA (MRAS) 19 2.3.1. ESQUEMA DE ALTA GANANCIA EN SERIE 19 2.3.2. ESQUEMA EN PARALELO 20 2.4. REGULADORES AUTO-AJUSTABLES (STR) 20 2.5. CONTROL ESTOCÁSTICO 21

3 IDENTIFICACIÓ N DE SISTEMAS 23

3.1. INTRODUCCIÓN 23 3.2. ESTIMADOR DE MÍNIMOS CUADRADOS 24 3.3. ESTIMADOR RECURSIVO POR MÍNIMOS CUADRADOS (RLS) 27 3.3.1. SISTEMAS INVARIANTES EN EL TIEMPO 27 3.3.2. SISTEMAS VARIANTES EN EL T IEMPO 29 3.4. ESTIMACIÓN DE PARÁMETROS PARA SISTEMAS DINÁMICOS 30

Page 3: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

3

3.4.1. MODELOS DE FUNCIÓN DE TRANSFERENCIA 30 3.5. EXCITACIÓN PERSISTENTE 32

4 REGULADO R AUTO -AJUSTABLE (STR) 38

4.1. DISEÑO POR POSICIONAMIENTO DE POLOS 38 4.2. SEGUIMIENTO DEL MODELO 39

5 ARQ UITEC TURA DE SO LUCIÓ N 45

5.1. IDENTIFICACIÓN 45 5.1.1. CONVERSOR ANÁLOGO-DIGITAL 45 5.1.2. ALGORITMO DE IDENTIFICACIÓN 47 5.2. AJUSTE DE PARÁMETROS Y CONTROLADOR 48 5.2.1. CONVERSOR ANÁLOGO-DIGITAL 49 5.2.2. MDPP CON CANCELACIÓN DE CERO Y CONTROLADOR R, S, T 49 5.2.3. CONVERSOR DIGITAL-ANÁLOGO 49 5.3. INTERFAZ 51 5.3.1. TECLADO PS2 51 5.3.2. VISUALIZACIÓN 55

CONCLUSIO NES 57

BIBLIO GRAFIA 58

ANEXO S 59

A DISPOSITIVO 59

B CÓDIGO ECOS 62

C CÓDIGO VHDL 70

D TECLADO PS2 87

Page 4: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

4

LISTA DE FIGURAS

FIGURA 1-1. DIAGRAMA DE BLOQUES GBA-XPORT 16 FIGURA 1-2. DIAGRAMA DE COMUNICACIÓN GBA-XPORT 17 FIGURA 2-1. DIAGRAMA DE BLOQUES SISTEMA ADAPTATIVO GENERALIZADO 18 FIGURA 2-2. DIAGRAMA DE BLOQUES CONTROL DE GANANCIA PROGRAMADA 19 FIGURA 2-3. DIAGRAMA DE BLOQUES MRAS. ESQUEMA DE ALTA GANANCIA 19 FIGURA 2-4. DIAGRAMA DE BLOQUES MRAS. ESQUEMA EN PARALELO 20 FIGURA 2-5. DIAGRAMA DE BLOQUES STR 21 FIGURA 2-6. DIAGRAMA DE BLOQUES CONTROL ESTOCÁSTICO 21 FIGURA 3-1. DIAGRAMA DE BLOQUES PARA LA IDENTIFICACIÓN DE SISTEMAS 24 FIGURA 3-2. CIRCUITO ELÉCTRICO DE LA ARMADURA Y DIAGRAMA DE CUERPO LIBRE DEL

ROTOR 33 FIGURA 3-3. LUGAR DE LA RAÍZ 34 FIGURA 3-4. DIAGRAMAS DE BODE 34 FIGURA 3-5. DIAGRAMA DE BLOQUES EJEMPLO 3-1 EN SIMULINK 35 FIGURA 3-6. SEÑAL DE ENTRADA 35 FIGURA 3-7. PARÁMETROS A2 Y B2 ESTIMADOS CON (A) Λ=1, (B) Λ=0.99, (C) Λ=0.95 Y (D)

Λ=0.8. 36 FIGURA 3-8. PARÁMETRO A1 ESTIMADO CON (A) Λ=1, (B) Λ=0.99, (C) Λ=0.95 Y (D) Λ=0.8. 36 FIGURA 3-9. PARÁMETRO B1 ESTIMADO CON (A) Λ=1, (B) Λ=0.99, (C) Λ=0.95 Y (D) Λ=0.8. 37 FIGURA 4-1. CONTROLADOR LINEAL GENERALIZADO 38 FIGURA 4-2. DIAGRAMA DE BLOQUES EJEMPLO 4-1 EN SIMULINK 41 FIGURA 4-3. PARÁMETROS ESTIMADOS PARA STR 42 FIGURA 4-4. SEÑAL DE REFERENCIA UC(T) (EN VERDE) Y SALIDA DEL PROCESO Y(T) (EN

ROJO) 42 FIGURA 4-5. SEÑAL DE CONTROL U(T) 43 FIGURA 4-6. RESPUESTA DEL SISTEMA SIN BLOQUE DE IDENTIFICACIÓN 44 FIGURA 4-7. RESPUESTA DEL SISTEMA CON BLOQUE DE IDENTIFICACIÓN 44 FIGURA 5-1. DIAGRAMA DE PIRBHAI-HATLEY BLOQUE DE IDENTIFICACIÓN 45 FIGURA 5-2. DIAGRAMA DE TIEMPOS ADC 46 FIGURA 5-3. DIAGRAMA DE CONEXIÓN ADC PARA UNA APLICACIÓN TÍPICA 47 FIGURA 5-4. MULTIPLEXOR DE LAS SEÑALES ANÁLOGAS 47 FIGURA 5-5. DIAGRAMA DE PIRBHAI-HATLEY BLOQUE DE AJUSTE DE PARÁMETROS Y

CONTROLADOR 49 FIGURA 5-6. DIAGRAMA DE CONEXIÓN DAC PARA UNA APLICACIÓN TÍPICA 50 FIGURA 5-7. DIAGRAMA DE TIEMPOS DAC 50 FIGURA 5-8. TECLADO 51 FIGURA 5-9. CONECTOR MINI-DIN 52 FIGURA 5-10. PALABRA DE CONTROL, MANEJO LEDS 52 FIGURA 5-11. DIAGRAMA DE TIEMPOS COMUNICACIÓN TECLADO-HOST 54 FIGURA 5-12. DIAGRAMA DE TIEMPOS COMUNICACIÓN HOST-TECLADO 55 FIGURA 5-13. DIAGRAMA DE PIRBHAI-HATLEY BLOQUE DE VISUALIZACIÓN 55 FIGURA 5-14. EJEMPLO DE VISUALIZACIÓN 56 FIGURA A-1. FOTO GBA-XPORT 59 FIGURA A-2. FOTO TARJETA DE EXPANSIÓN (VISTA SUPERIOR) 59 FIGURA A-3. DIAGRAMA DE CONEXIÓN DE LA TARJETA DE EXPANSIÓN 60 FIGURA A-4. TARJETA DE EXPANSIÓN, VISTA SUPERIOR 60 FIGURA A-5. TARJETA DE EXPANSIÓN, VISTA INFERIOR 61 FIGURA A-6. FOTO DISPOSITIVO DE CONTROL ADAPTATIVO 61

Page 5: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

1

INTRODUCCIÓN El desarrollo del control adaptativo ha sido necesario para enfrentar procesos cuyas dinámicas cambian continuamente y cuyas variaciones no pueden ser previstas. En esos casos donde el control tradicional no presenta soluciones acertadas. Una de las principales limitaciones del control adaptativo es la demora que este presenta al momento de ajustarse; esto se debe, principalmente, a los cálculos que se realizan para obtener los parámetros del controlador. En muchos casos, esto puede solucionarse acoplando un bloque de ganancia programada, que lleve al controlador a un estado aceptable, desde el cual, el método de adaptación, optimice la respuesta del sistema. El problema mayorse presenta al no contar con este tipo de ajuste rápido y que ocurre básicamente por el desconocimiento de las posibles condiciones de funcionamiento del proceso. De esta forma, se requiere que el controlador se auto ajuste de manera eficaz y eficiente, encontrando los parámetros que le permitan llegar a la respuesta deseada. Es posible además, que esta configuración se almacene para poder responder de forma instantánea frente a las mismas condiciones, en ocasiones posteriores. El tiempo de ajuste constituye entonces, un elemento crítico en el desarrollo de controladores óptimos. Los sistemas embebidos brindan la posibilidad de superar estos problemas de respuesta temporal; y además, abren el campo para el diseño de módulos especializados con los cuales se optimicen recursos y costos. Actualmente, se encuentran en el mercado controladores industriales con automatic tuning, gain scheduling y feedfoward, como el ECA600.[10] En el área de controladores en tiempo real, se han implementado funciones para programas como MATLAB, y en otros casos algunas funciones en lenguaje C++. Los sistemas embebidos, por su parte, han sido ampliamente trabajados, aunque para la implementación de sistemas de control adaptativo, no se ha encontrado información relevante.

Page 6: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

2

OBJETIVOS

• Con este proyecto se pretende desarrollar una aplicación, sobre una plataforma de un sistema embebido, enfocada principalmente al área de control de procesos de tipo industrial. El objetivo principal de este proyecto es el diseño, desarrollo y verificación de un sistema de identificación y control adaptativo implementado sobre una plataforma de un sistema embebido, que presente ventajas en cuanto a su tamaño y capacidad de manipulación, capaz de interactuar tanto con la planta como con el usuario, permitiendo a este último la posibilidad de hacer seguimiento del proceso. El sistema implementado debe ser capaz de realizar una identificación y un posterior control de una planta de forma autónoma. Los resultados generales que se obtienen de este proyecto son: o Obtención de una herramienta que, por medio de la utilización de sistemas

embebidos, optimice los recursos destinados a la identificación y control de sistemas. Desarrollo de una herramienta versátil que permita un control autónomo sobre procesos cuya dinámica no es inicialmente conocida. El dispositivo debe contar con dispositivos tanto de entrada, que le permitan la recepción de los datos, ya sea para identificación o para control, directamente de la planta; como de salida, que permitan acceder a los actuadores de forma directa o a través de circuitos de acople (externos al dispositivo). Debe contar con una interfaz con el usuario que permita, si es el caso, hacer seguimiento del rendimiento del sistema controlado.

o El diseño de este dispositivo debe permitirle tener un bajo costo al momento de salir al mercado, de tal forma que le de ventajas sobre software especializado que se utiliza actualmente para este tipo de aplicaciones. Esto implicaría que debe ser una herramienta de fácil acceso.

Page 7: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

3

1 SISTEMAS EMBEBIDOS1 (SE)

1.1. Introducción Los SEs se definen informalmente como una colección de piezas programables rodeadas por ASICs y otros componentes estándares, que interactúan continuamente con un ambiente a través de sensores y actuadores para cumplir una función dada. Se trata de la unión entre el diseño software y hardware, cuya finalidad es brindar soluciones optimas que relacionen conceptos tales como tiempo-a-mercado, costo, tamaño de código, peso, energía, y comportamiento en tiempo real, a una necesidad especifica. Un SE se refiere al equipo o dispositivos que no son pensados como computadoras, pero cuya operación depende de alguna clase de computación interna. Las aplicaciones embebidas están de alguna u otra forma presentes en la gran mayoría aplicaciones en muchos campos de la ingeniería actual, como la electrónica de consumo, equipos médicos, sistemas de comunicaciones, procesamiento de señales, automatización, etc. Dado que un SE es diseñado para una necesidad especifica, existen literalmente miles de diversos SEs distintivos; cada uno conteniendo un desarrollo altamente especializado que lo hace casi único.

1.2. Sistemas Operativos en Tiempo Real (RTOS)

1.2.1. Introducción Sistemas de Tiempo Real (RTS) Un sistema es evaluado según la veracidad de sus respuestas. Un RTS no solamente da respuestas correctas a determinados estímulos, sino que además las da en un determinado tiempo. Por ejemplo un computador en tiempo real realiza sus funciones y responde a eventos externos asíncronos en una cantidad de tiempo específica. El tiempo requerido para que el sistema responda a un evento es llamado Latencia o estado latente. Mientras menor sea el estado latente, mejor va a responder el sistema a eventos que requieran atención inmediata. Un concepto importante en los RTS es la previsibilidad, que se relaciona con cuánto tiempo el sistema tomará para realizar una acción particular. De esta forma se define un RTS como todo sistema para el que sea vital el tiempo de respuesta a una entidad externa. En un RTS el correcto funcionamiento no solo depende de la veracidad lógica de la computación sino del tiempo en que se produce ese resultado. Si las restricciones de tiempo no se cumplen se considera que el sistema ha fallado. No todos los SEs son RTS, esto depende del campo de aplicación en el que se estén utilizando. No es lo mismo un sistema de video juegos, donde un retardo no es significativo, que los controles de turbulencia de un avión, donde una falla en el tiempo de respuesta puede traer graves consecuencias. De este ejemplo se pueden visualizar dos categorías de RTS:

• Hard RTS: es un RTS donde es vital el funcionamiento a tiempo. (Ej. Los controladores del avión)

1 Se ha usado el término embebido como traducción del vocablo inglés "embedded". En otros textos en español a menudo se usa el termino empotrado.

Page 8: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

4

• Soft RTS: en un RTS donde una falla en el tiempo de respuesta no implica consecuencias graves, sino mas bien un bienestar para el consumidor. (Ej. El video juego)

RTS y SE operan en ambientes cuyas restricciones son principalmente en memoria de computo y fuentes de alimentación, además de las ya mencionadas restricciones de tiempo, es por esto que se hace necesario el uso de RTOS en SE. Sistemas Operativos Se puede definir un sistema operativo como la capa de software más baja que administra y controla directamente los recursos hardware ( CPU, memoria principal y periféricos ) proporcionando una máquina virtual más fácil de utilizar que el hardware subyacente. El sistema operativo es el encargado, entre otros, de velar por la integración de los periféricos y la programación de tareas Tipos de Sistemas Operativos Dependiendo de la aplicación se pueden clasificar los sistemas operativos en tres grupos: ”sistemas operativos convencionales, sistemas operativos para sistemas embebidos y sistemas operativos en tiempo real. Convencionales: Son aquellos destinados a ejecutar aplicaciones de propósito general, que corren sobre sistemas no destinados a usos específicos. Estos sistemas operativos suelen tener que hacer frente a diversas aplicaciones que habitualmente tratarán de consumir todos los recursos que puedan, siempre y cuando éstos supongan una mejora en el rendimiento de su propia función. Este tipo de sistemas operativos han de centrarse en dar flexibilidad a las tareas a la par que han de asegurar que no se van a producir conflictos en la utilización de los recursos. Embebidos: Son aquellos incluidos en sistemas de propósito específico. Estos sistemas se caracterizan por tener unos recursos muy limitados dedicados única y exclusivamente a cumplir con la tarea para la que fueron diseñados. Este tipo de sistemas operativos suele centrar sus objetivos en convertirse en un software muy optimizado en cuanto a velocidad y memoria, han de ofrecer al programador funciones de alto nivel poco costosas (en tiempo y memoria) y además han de coordinar el manejo de los dispositivos. Tiempo Real: Son aquellos incluidos en sistemas de propósito específico tales como los descritos anteriormente, pero con unas restricciones temporales muy concretas. Los sistemas operativos de tiempo real han de ser predecibles (se ha de saber cuándo y cómo van a desencadenar qué acciones) y han de minimizar las latencias de atención a eventos (tanto síncronos como asíncronos).”

1.2.2. Definición En consecuencia a las ideas expuestas con anterioridad un RTOS es un sistema operativo en el que el correcto funcionamiento depende tanto de las repuestas lógicas del sistema, como de los tiempos de latencia. De modo que si las restricciones de tiempos no se satisfacen en determinado instante se considera esto como un fallo del sistema. Los requerimientos fundamentales para un RTOS son:

Page 9: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

5

• Comportamiento predecible, manejo de tiempos. • Manejo multitarea con derechos preferentes, schedulling. • Soporte de tareas prioritarias, con herencia de la prioridad. • Soporte de mecanismos predecibles de sincronización y comunicación de tareas. • Se debe conocer el tiempo máximo en el que las interrupciones son enmascaradas por el

RTOS. • Se debe conocer el tiempo máximo que usan los drivers del dispositivo para procesar

una interrupción, además de la información especifica de los IRQs de cada driver. • El estado latente debe ser predecible y compatible con los requerimientos de la

aplicación.

1.2.3. Funciones Control de interrupciones y excepciones “Otra característica muy común de todos los sistemas operativos es el control de interrupciones y de las excepciones. Las interrupciones son de naturaleza asíncrona, es decir, se producen en momentos indeterminados del funcionamiento del programa, interrumpiendo el flujo normal de éste. Para atender a la interrupción es necesario un cambio de contexto y la salvaguarda del anterior para poder retomar posteriormente el flujo del programa en el punto en el que se dejó. Las excepciones, sin embargo, son de naturaleza síncrona, pero también necesitan un cambio de contexto y se suelen tratar de forma semejante a las interrupciones. Cuando se produce una excepción o interrupción se guardan automáticamente los registros del contador del programa y de la pila (PCB). De la salvaguarda del resto del contexto se ha de encargar el sistema operativo. El programador de aplicaciones sobre un sistema operativo suele contar con una serie de facilidades para crear y modificar rutinas de atención a interrupción (o excepción). El manejo de las interrupciones se trata de hacer flexible y con instrucciones de alto nivel. Además, un sistema operativo suele ofrecer al programador un sistema de interrupciones más complejo y versátil que el que el propio hardware tiene. Así, es corriente encontrar que los sistemas operativos pueden simular un controlador de interrupciones con muchas más líneas que el controlador de interrupciones real. También suelen permitir realizar un control de interrupciones por prioridades, a pesar de que el hardware no lo realice automáticamente. El sistema operativo, como todo software, también consume recursos. Puede necesitar configurar para sí la rutina de atención de alguna interrupción (como en el caso de utilizar la interrupción de un temporizador para dar paso a la rutina de programación de tareas). Así que el propio sistema operativo hará uso de sus funciones de manejo de interrupciones.” [6]

Gestión de la memoria “Una de las funciones más típicas de todo sistema operativo es la gestión de memoria. Todo sistema basado en un microprocesador usa algún tipo de memoria. Mientras que la memoria ROM no se puede gestionar en tiempo de ejecución, recursos como la memoria RAM o FLASH si que se pueden administrar en tiempo de ejecución. Es habitual que los sistemas operativos doten a las aplicaciones de la capacidad de requerir (y liberar) memoria en tiempo de ejecución, lo cual tiene gran importancia en sistemas

Page 10: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

6

multitarea, de forma que varias tareas distintas pueden pedir recursos de memoria cuando se necesitan y liberarlos después. También en sistemas monotarea es interesante que el sistema operativo provea un mecanismo de administración de memoria en tiempo real, ya que de esta forma se pueden reutilizar los mismos recursos de memoria en distintos instantes de la ejecución. Los sistemas operativos suelen realizar dos tipos de gestión de memoria distintas, las basadas en asignaciones de memoria de tamaño variable y las basadas en asignaciones de memoria de tamaño fijo. Los mecanismos de gestión de memoria basados en asignaciones de tamaño fijo suelen ser más rápidos y necesitan menos información interna que las asignaciones de tamaño variable, sin embargo, las asignaciones de tamaño variable pueden permitir un mejor aprovechamiento de la memoria1. Otra característica común de la gestión de memoria es la capacidad de virtualización de ésta. Muchos son los sistemas operativos que presentan al programador una memoria virtual, lo cual permite que cada tarea se enlace independientemente de la posición física de sus datos en la memoria y la de sus datos. La virtualización permite elaborar mecanismos de ejecución de nuevas tareas en tiempo real y también permite proteger el acceso a terminadas zonas de memoria. No obstante, los mecanismos de virtualización de memoria suelen ser eficientes únicamente si se posee hardware subyacente que la permita. Las implementaciones puramente basadas en software están muy limitadas y evidentemente sólo son capaces de dotar al sistema operativo de elementos de protección si se siguen estrictamente las condiciones de uso prefijadas.”[6]

Manejo de dispositivos hardware Casi todos los sistemas operativos reservan para sí el privilegio de decidir el modo en el que los distintos dispositivos son controlados y la forma en la que pueden ofrecer sus servicios a la aplicación de usuario. Los dispositivos de entrada/salida suelen tener un interfaz común para producir la comunicación. Es común encontrar funciones de escritura o lectura de caracteres que se realizan igual para distintos dispositivos, con sólo usar un identificador de dispositivo distinto. Los sistemas operativos suelen ofrecer interfaces comunes para manejar dispositivos muy variopintos, sin embargo dichos interfaces comunes pueden abstraer en exceso los dispositivos, sobrecargando demasiado las labores de gestión sencillas. Librería C Es muy común que un sistema operativo incluya una serie de librerías con funciones típicas de programación. La librería C es muy corriente dado que introduce funciones tan conocidas como "main" o las de entrada salida "printf", "fopen", etc. También es muy corriente que existan librerías matemáticas que implementen funciones trigonométricas, raíces, números complejos, transformadas, etc. Cuantas más librerías incluya un sistema operativo, mejor, siempre y cuando se puedan excluir del ejecutable cuando no se utilicen.

1Aunque también puede ser que se produzca un peor aprovechamiento, es necesario hacer un estudio del tipo de reservas que se hacen en tiempo de ejecución y ver que tal se ajustan los mecanismos de asignación de memoria del sistema operativo concreto que se esté usando.

Page 11: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

7

1.2.4. Aplicaciones Al contrario de la definición fundamental de los RTOS, las aplicaciones típicas de los sistemas de tiempo real ha cambiando a lo largo de los años. En la década de los 80’s, los RTS eran utilizados en su mayoría para aplicaciones de control. De hecho, una definición de esta época lista únicamente dos tipos de RTS, uno de control y otro de monitoreo de sistemas. Con el paso de los años, en los 90’s, las aplicaciones de los RTS se abrieron campo en áreas como el tratamiento de imágenes medicas, control industrial y algunos sistemas de visualización. Los hard RTS no pueden soportar ciertos dispositivos por que no se puede garantizar el manejo de los tiempos. Dado que tienen menos restricciones, los soft RTS si pueden soportar una mayor diversidad de dispositivos, hecho que incentivo el desarrollo de los RTS en esta campo. Como consecuencia, los usos para estos sistemas se incrementaron sustancialmente. Hoy en día las aplicaciones de soft RTS están en la mayor parte de objetos electrónicos que facilitan nuestras vidas, se pueden encontrar desde teléfonos, multimedia, equipos médicos, juegos hasta proyectos científicos como exploración submarina y vehículos autómatas para exploración interplanetaria. De esta forma los RTOS tienen un amplio campo de aplicación, ya que los avances tecnológicos introducen cada día nuevas soluciones basadas en sistemas cada vez más desarrollados, que los hacen necesarios para su implementación.

1.2.5. Criterios de selección de un RTOS Sea cual sea la elección de un sistema operativo, los elementos que habrá que tener en cuenta a la hora de elegir qué sistema operativo se va a utilizar deberán ser:

• Herramientas de desarrollo que se van a necesitar para utilizarlo (compiladores, simuladores...)

• Costo de las herramientas de desarrollo. • Tiempo necesario para poner el sistema en funcionamiento. • Costo del sistema operativo (royalties, licencias, etc.). • Control sobre el código fuente. • Soporte, fiabilidad del sistema y documentación.

La elección final ha recaído en un sistema operativo llamado eCos 1. Los motivos de elección de este sistema operativo han sido:

• El sistema operativo es gratuito. • El código fuente está disponible bajo una licencia del tipo GPL. • El kernel se puede configurar en gran medida, pudiendo ajustar el sistema operativo a

las necesidades individuales. • El tamaño del kernel también es configurable en gran medida. • Se utilizan herramientas de desarrollo de libre distribución como los compiladores de

GCC o los depuradores de GDB.

1Embedded Configurable Operating System, desarrollado por Red Hat.

Page 12: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

8

• Existe un foro de debate en Internet en el que se da soporte de eCos de manera gratuita. Este foro está atendido por los desarrolladores del sistema operativo.

• Existe la posibilidad de contratar soporte específico para eCos con Red Hat. En vista de que los distintos sistemas operativos ofrecen más o menos lo miso, el motivo de más peso en la elección del sistema operativo ha sido el económico. eCos permite desarrollar de forma completamente gratuita, comenzando a evaluar el sistema operativo sin hacer un desembolso inicial y pudiendo implementar el sistema en tantos dispositivos como sea necesario sin costo adicional. Una de las características fundamentales que sorprende de eCos es la gran cantidad de opciones que existen al configurar el sistema, permitiendo una personalización del sistema operativo. La herramienta de gestión de paquetes y la facilidad con que se introducen nuevas funcionalidades en el kernel de eCos han sido decisivas a la hora de adoptar este sistema operativo, siendo eCos un sistema completamente modular en tiempo de compilación. El uso de las herramientas de desarrollo de GNU permite poner la experiencia de los programadores con dichas herramientas al servicio del proyecto. Muchos de los entornos de desarrollo comerciales están basados en dichas herramientas, pero de las cuales sólo se obtiene soporte y actualizaciones pagando altos precios por ellas. El foro de debate de eCos es un foro vivo y con un alto grado de participación en el que los creadores del sistema operativo resuelven las dudas de los usuarios, resultando un servicio de gran valor, aún siendo gratuito. El foro es tal que las preguntas quedan respondidas en un corto plazo (casi todas las preguntas tienen respuesta en menos de medio día), y se responden todo tipo de cuestiones, tanto de principiantes como de filosofía avanzada de sistemas operativos. En el foro de debate se pone de manifiesto la gran cantidad de compañías que están haciendo uso de eCos, lo que garantiza su existencia y desarrollo en un plazo razonablemente largo. Por último, eCos está mantenido por Red Hat, empresa de sobrado renombre en el mundo informático. Red Hat ofrece los servicios típicos de los sistemas operativos comerciales, por lo que siempre es posible encargar y externalizar trozos de desarrollos de eCos a dicha empresa. La funcionalidad de eCos cumple con los requisitos funcionales que se requirieron. Su funcionalidad incluye las siguientes funciones:

• Manejo de interrupciones • Sistema de arranque completo (no necesita cargador o "bootloader") • Programador de tareas basado en hilos con prioridades • Elementos de sincronización (semáforos, banderas, variables de condición, y buzones

de mensajes) • Manejo de excepciones • Contadores, relojes y alarmas • "Pools" de memoria1 para la gestión de la memoria dinámicamente • Mutex para el arbitraje del acceso a recursos • API µITRON • API EL/IX

1Secciones de memoria que se pueden asignar y liberar en tiempo real, haciendo asignaciones de tamaño fijo o variable.

Page 13: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

9

• Interfaz con GDB para depurar el sistema • Librería C ISO 9899:1990 • Librería matemática compatible con ANSI/POSIX 1003.1, IEEE-754, XPG3, o System

V Definition Edition 3. • Rutinas de trazado y depuración • Gestión integrada de fecha y hora • Manejo de dispositivos mediante interfaces estándar de entrada/salida

Además es un sistema operativo para el que ya existen paquetes que incluyen pilas de protocolos TCP/IP, máquinas JAVA virtuales, gestores de ventanas (nano-X) y gran cantidad de paquetes distintos. El sistema es configurable en gran cantidad de detalles, lo que permite cumplir con la especificación de modularidad en tiempo de compilación. En tiempo de ejecución eCos es capaz de crear y destruir hilos. Lo cual permite pensar también en modularidad en tiempo real. Respecto al tamaño y al rendimiento de los ejecutables, eCos da un nivel semejante al del resto de sistemas operativos aunque queda en la gama baja-media de los sistemas operativos en tiempo real, el footprint (huella en memoria) de entre 20k y 200k. 1.2.6. eCos Las funcionalidades ofrecidas son:

• Gratis • Sin Royalties • Código fuente C es proporcionado • Manejo de interrupciones • Manejo de excepciones • Sistema de arranque completo (no necesita "bootloader") • Programador de tareas basado en hilos con prioridades • Contadores, relojes y alarmas • Semáforos, mutex, mutex asociados a variables y buzones de correo (o mail boxes),

banderas • "Pools" de memoria • API ITRON • API EL/IX • Interfaz con GDB • Librería C ISO 9899:1990 • Librería matemática compatible con ANSI/POSIX 1003.1, IEEE-754, XPG3, o System

V Definition Edition 3. • Rutinas de trazado y depuración

Arquitecturas Soportadas: • ARM • Hitachi H8/300 • Intel x86 • MIPS

Page 14: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

10

• Matsushita AM3x • Motorola 68k • PowerPC • SuperH • SPARC • NEC V8xx

Para este sistema operativo existe actualmente una gran variedad de paquetes desarrollados. Además el sistema operativo como tal, tiene un relativamente alto nivel de configurabilidad. El rendimiento temporal no es de los mejores, quedando una latencia de interrupciones del orden de 300 ciclos, pero es de los más transparentes a la hora de ofrecer datos de rendimiento. El sistema operativo, por otro lado, ocupa menos de 100k de ROM y 50k de RAM.

1.3. Hardware No es el objetivo de este documento el describir a profundidad los componentes que por lo general se esperan en una tarjeta de desarrollo o plataforma. Con el fin de ubicar al lector dentro de un contexto, se hará una breve definición de algunos componentes típicos. El objetivo, al final de este capitulo, es formular una arquitectura ideal que permita trabajar con software y hardware, individualmente y en conjunto, para esto es necesario conocer que tipo de dispositivos se pueden implementar en una arquitectura de desarrollo, primero como ya hemos descrito en los capítulos anteriores, la parte software se desarrolla para que sea ejecutada por un microcontrolador o microprocesador, y la parte hardware por un dispositivo de lógica programable, que por lo general es una FPGA. De los microprocesadores, existen varias familias en el mercado, pero nos centraremos en aquellos que pueden soportar eCos, que fueron mencionados en el capitulo anterior. 1.3.1. Lógica Programable: CPLD’s y FPGA’s En los inicios de la lógica discreta, los sistemas eran construidos a partir de una gran cantidad de chips individuales que eran conectados a través de muchos cables. Este tipo de dispositivos lógicos eran extremadamente difíciles de modificar después de haber sido fabricados con cierta estructura, y además era casi imposible recordar la función específica para la cual había sido diseñado cada uno de estos chips. La fabricación de estos dispositivos tomaba demasiado tiempo porque cada pequeño cambio en el diseño de estos requería un replanteamiento de todo el sistema de interconexión, lo que significaba la construcción de nuevos circuitos impresos. Este problema fue resuelto colocando un arreglo de compuertas and – or desconectadas dentro del chip, conocidas como Programmable Logic Device (PLD). El PLD contenía además un arreglo de fusibles que podían ser abiertos o dejados cerrados para generar la interconexión entre las diferentes entradas y cada una de las compuertas. Esto hizo posible programar el PLD utilizando ecuaciones de suma de productos Booleanos de tal forma que se podía desarrollar cualquier función lógica dentro del sistema. Como fue posible re-cablear de forma interna estos dispositivos, se hizo

Page 15: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

11

menos necesario el cambio de los circuitos impresos, representando menos consumo de tiempo y dinero en el cambio de estos.

Debido a que los PLD's solo podían manejar unas pocas ecuaciones lógicas, se hacía imposible la implementación de diseños que requerían lógica más compleja en solo uno de estos dispositivos. Era necesario por lo tanto fraccionar el diseño en piezas más pequeñas y que pudiera cada una independientemente ser desarrolladas en un PLD. Esto requería mucho tiempo y significaba que, como se hacía anteriormente, se debía recurrir al cableado externo para interconectar los PLD's. Esto constituía un gran impedimento, ya que siempre se llegaba a un punto en el que la reprogramación no era posible hacerla a través de los PLD's sino que se debía cambiar toda la tarjeta que contenía el circuito lógico. Para resolver este problema, se crearon chips programables de mucha mayor capacidad, y que son los que actualmente se conocen como Complex Logic Devices (CPLD's) y las Field-Programmable Gate Arrays (FPGA's). Con estas, se logró la posibilidad de desarrollar sistemas completos en un solo chip. Una CPLD se encuentra compuesta de bloques de PLD's cuyas entradas y salidas se encuentran conectadas a través de una matriz de interconexión global. De esta manera el CPLD tiene dos niveles de programabilidad: cada uno de los bloques de PLD's puede ser programado individualmente, y la interconexión entre estos bloques también puede ser programada. Una FPGA tiene una configuración diferente. Esta se encuentra compuesta por un grupo de bloques lógicos configurables muy sencillos organizados en forma de arreglo y cuyas interconexiones son manejadas por unos switches que permiten reconfigurar las interconexiones entre los bloques lógicos. Cada bloque lógico es programado individualmente para desarrollar una función lógica, y luego los switches son programados para conectar los bloques de forma que la función lógica completa se implemente.

Los fabricantes de FPGA’s y CPLD’s usan una variedad de métodos para hacer posibles las conexiones entre los bloques lógicos. Algunos fabrican integrados con fusibles o anti-fusibles que son programados por el paso de una corriente bastante alta a través de ellos.

Page 16: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

12

Este tipo de CPLD’s y FPGA’s son programable una sola vez, debido a que no se puede cablear de Nuevo una vez se han quemado los fusibles. Otros fabricantes hacen las conexiones usando transistores de paso que son cerrados o abiertos mediante la carga capacitiva en los electrodos del gate usando pulsos de alto voltaje. A este tipo de dispositivos programables se les conoce como EPROM o EEPROM, y pueden ser borrados y programados insertándolos en un programador usualmente costoso y complicado si el dispositivo se encuentra montado y soldado a una placa o tarjeta. Finalmente, algunos fabricantes usan memorias RAM estáticas o bits Flash para controlar los transistores de paso en cada conexión. Cargando cada bit con un 1 o 0 lógico, se puede controlar si el switch esta abierto o cerrado y, por consiguiente, si dos bloques lógicos están conectados o no. Los dispositivos construidos usando switches controlados por memorias pueden ser reprogramados sin remover el integrado del impreso o tarjeta, estos son llamados in-circuit programmable. Sin contar el método de conexiones usado, saber cuales switches abrir o cerrar no es una tarea sencilla, es por esto que los fabricantes, como Xilinx o Altera, desarrollan componentes software que toman las descripciones del diseño lógico y las implementan en la secuencia binaria que configura el CPLD o la FPGA, de forma que actúe de según el diseño. En las plataformas de desarrollo, generalmente el CPLD es usado para crear la interfaz con el usuario y ayudar en la configuración de los dispositivos a utilizar ya sea un microprocesador o una FPGA. De forma que la FPGA, es el dispositivo de reconfiguración hardware que se usa para implementar los sistemas lógicos a desarrollar. 1.3.2. Memoria FLASH La memoria Flash es una forma de memoria no volátil que permite escribir y borrar múltiples locaciones o bloques de memoria en una sola operación de programación, siendo reprogramada en el mismo sistema. Las memorias normales de su tipo (EPROM), solo permiten un bloque de escritura o lectura por programación, lo que hace a la memoria Flash más efectiva cuando los sistemas en que se usan leen y escriben en diferentes bloques a la vez, brindándole la posibilidad de operar a velocidades mas altas. Las memorias Flash son fabricadas en dos formas: Nor y Nand, dependiendo del tipo de lógica usada en su celda básica de almacenamiento. El tipo Nor fue el primer tipo de flash desarrollado, lanzado por Intel en 1988. Tiene ciertas desventajas en cuanto a los tiempos de lectura y escritura, pero consta de una completa interfaz de direcciones y datos que permite el acceso aleatorio a cualquier ubicación. Lo cual es atractivo para el almacenamiento de código que no necesita ser actualizado constantemente, como en las cámaras digitales o los PDA’s. El tipo Nand, fue lanzado por Toshiba en 1989. Este tiene mejores tiempos, mayor densidad y menor costo por bit que el tipo Nor. Sin embargo, su interfaz de I/O solo permite el acceso a los datos de forma secuencial. Esto hace que esta memoria pueda ser utilizada para almacenamientos masivos, como tarjetas de desarrollo, o formatos de media como los memory sticks. Las memorias Flash son usualmente usadas para almacenar el código de control y configuración, como el BIOS del sistema.

Page 17: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

13

1.3.3. Programación de Dispositivos Reconfigurables Ya que en el numeral pasado nos centramos en la FPGA como dispositivo reconfigurable a tratar durante el desarrollo de este documento, por ser el elemento utilizado por las compañías dedicadas a producir tarjetas de desarrollo, presentamos ahora, una de las formas en que comúnmente se realiza la programación de dicho dispositivo, que es la programación vía CPLD-Flash. La memoria Flash puede ser utilizada para almacenar configuraciones para la FPGA. La ventaja principal de este modo de utilización de la memoria (Flash) radica en que de esta manera no es necesario reprogramar de forma externa la FPGA cada vez que esta se desconecta de la fuente de alimentación, ya que el programa se encuentra almacenado en la memoria Flash y es desde aquí desde donde se vuelve a cargar. Cuando se utiliza de esta forma, existen tres pasos que permiten ajustar la Flash: Para este caso se tiene una CPLD para generar la interfaz entre los elementos involucrados en la configuración de la Flash con el código proveniente del PC a través del puerto paralelo, y la programación de la FPGA con el código ya almacenado.

• Se configura la CPLD con un circuito de programación que conecta la Flash con el puerto paralelo

• Se programa la Flash pasando las líneas de código de la configuración de la FPGA a través del puerto paralelo

• Se carga la CPLD con un circuito de configuración que va, en el ciclo inicial de la tarjeta, a cargar a la FPGA con el código almacenado en la Flash

Interfaz de Programación de la Memoria Flash El circuito de la CPLD que conecta la Flash con el puerto paralelo es simplemente una interfaz que le permite al PC leer y escribir en la Flash utilizando únicamente cuatro bits de datos y dos señales de control. El PC utiliza esta interfaz simple para controlar las funciones de programación de la Flash de alto nivel, tal como borrar sectores de la Flash antes de ser programados con nuevos datos. El circuito de programación de la Flash realiza las siguientes funciones:

• Recopila seis cadenas1 consecutivas provenientes del puerto paralelo y las concatena formando una dirección en la memoria Flash de 24 bits (16MBytes), que constituye la ubicación en la cual se pretende almacenar un dato

• Recopila dos cadenas consecutivas provenientes del puerto paralelo y las concatena formando un dato de un byte, el cual debe ser almacenado en la memoria Flash

• Escribe el dato en la Flash en la dirección asignada y luego regresa a esperar la llegada de otro grupo de cadenas correspondientes a dirección y a dato

• Mientras se encuentra recopilando las cadenas para conformar la dirección, también lee el byte de dato del ciclo anterior y lo pasa al puerto paralelo en segmentos de 3, 3 y 2 bits cada uno

La interfaz del circuito utiliza seis pines del puerto paralelo: cuatro para el paso de las cadenas que conforman tanto el dato como la dirección, uno más para la sincronización del reloj encargado del manejo de la máquina de estados en la CPLD, y el último como reset 1 Una cadena para este caso especí fico se encuentra compuesta por cuatro bits

Page 18: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

14

para la maquina de estados. Tres pines de estado del puerto paralelo son utilizados para enviar de vuelta al PC los datos de la Flash y para reportar el punto en el que se encuentra la maquina de estados de la CPLD. La CPLD sirve de interfaz con los pines de dirección, dato y control de la Flash, así como con el pin de PROGRAM de la FPGA. Para la programación de la Flash se definen ocho estados de la siguiente manera: seis estados son utilizados para reunir la dirección de 24 bits, y luego dos más son utilizados para recoger el byte de dato que será escrito en la Flash. La CPLD luego pone en bajo el pin de PROGRAM de la FPGA para que esta se mantenga en su estado de no-configurado. Esto aísla los pines de la FPGA para que esta no pueda interferir con la programación de la Flash. Después es necesario asegurarse que el reset de la Flash sea liberado para que esta pueda ser programada. Se implementan seis estados que concatenan las cadenas recibidas a través del puerto paralelo formando una dirección de 24 bits. Durante cada uno de los estados, la cadena proveniente del puerto paralelo es ubicada en un lugar apropiado en el registro de direcciones. El estado actual es reportado al PC a través de las líneas de estado; este es utilizado por el código de programación de la Flash que se encuentra en el PC para asegurarse que ambos se encuentran en concordancia. Sin embargo, durante tres estados las líneas de estado se encuentran siendo utilizadas para llevar los segmentos del byte de dato desde la Flash hasta el PC. La ubicación del dato en la Flash se almacena en un registro. Esta dirección aparece en las líneas de dirección de la Flash y se mantiene hasta que el registro sea modificado. Al forzar por lo tanto las líneas de chip_enable y output-enable a bajo, se obtiene el byte de dato que se encuentra en la Flash en la dirección determinada y se envía a través de las líneas de estado del puerto paralelo de la siguiente forma: primero los tres bits más significativos, luego los tres intermedios y por último los dos menos significativos completando así los 8 bits que constituyen el dato. El código de programación de la Flash en el PC reúne estas cadenas recibidas y reconstruye el byte de dato que se encuentra en la Flash. Se implementan dos estados que concatenan las cadenas correspondientes al byte de dato que es escrito en la Flash en la dirección cargada durante los seis estados anteriores. La escritura ocurre cuando el reloj se encuentra en bajo. Esto le da tiempo a la dirección para estabilizarse del ciclo anterior antes de que la escritura se realice. Cuando el reloj sube para concluir con el pulso de escritura, hay un cambio de estado. Es necesario en esta instancia asegurarse de que las líneas de datos de la Flash se encuentren transmitiendo todavía los mismos valores que al momento de llevarse acabo la escritura. Esto asegura por lo tanto, que el tiempo por el cual se mantuvo el dato es el correcto. Luego se actualizan los registros de estados, dirección y dato en el flanco de subida del reloj. Un reset proveniente del puerto paralelo limpiará el registro de dato y enviará a la maquina de estados a esperar otro ciclo de dirección. El reset no cambia el registro de dirección. Esto le permite al PC leer de la Flash sin necesidad de escribir sobre esta utilizando el reset. Cuando se activa el reset antes de que la Flash reciba el dato, se le permite al PC leer el dato que se encuentra en la dirección enviada en el ciclo anterior. Esto no sería posible si el registro de dirección fuera borrado mediante el reset. Las líneas de dirección cambian en el flanco de bajada del reloj con lo que se asegura que estas han alcanzado la estabilidad antes de que cualquier operación potencial de escritura sea inicializada en el siguiente flanco de subida del reloj.

Page 19: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

15

Configuración de la FPGA por la Flash En este caso el circuito de la CPLD le permite a la Flash configurar la FPGA con el código que había sido almacenado de la manera expuesta anteriormente. Este circuito simplemente incrementa un contador de dirección el cual permite la lectura de los datos que se encuentran almacenados en la memoria Flash y luego los pasa a la FPGA para su configuración. Cuando la FPGA emite la señal de configuración completa, la CPLD detiene todas las operaciones. El procedimiento que se sigue es el siguiente: Inicialmente se define la interfaz del circuito. Se utiliza un oscilador programable como reloj principal. La CPLD tiene interfaz con los pines de dirección y de control de la Flash para que de esta forma sea posible transferir el código para la configuración de la FPGA. En este caso no es necesario tener acceso a los pines de dato de la Flash, ya que estos se encuentran conectados de forma directa a la FPGA. La CPLD inserta el código en la FPGA utilizando los pines de control de configuración. Es necesaria la utilización de una señal proveniente de la FPGA que indique cuando esta se encuentre ocupada guardando los bytes de los datos de configuración. La CPLD por otro lado debe poner a la FPGA en modo de Slave Parallel Configuration, en el cual esta última acepta los bytes de los datos de configuración en los flancos de subida del reloj de configuración, mientras que chip-select y write-enable se encuentren activos. Los pines de control de la Flash son puestos de tal forma que esta permita la lectura de los datos para la configuración de la FPGA que esta contiene. Estos son luego liberados por la CPLD cuando la FPGA envía la señal indicando que el proceso de configuración ha concluido. La Flash tiene un tiempo de acceso de 90 ns. Por lo que, para el manejo de la configuración de la FPGA es necesario utilizar otro reloj que sea más lento. Cuando se enciende la fuente de energía que alimenta la FPGA esta necesita de cierto tiempo para estabilizarse antes del inicio de cualquier configuración. Por esta razón se debe tener una cuenta regresiva que se inicie con el encendido y que mantenga una señal de reset activa hasta que esta (cuenta) llegue a cero, permitiendo que se inicie la configuración. Esta señal de reset también puede ser utilizada para bajar el pin de PROGRAM de la FPGA al momento del encendido, manteniéndolo así hasta que termine la cuenta regresiva y subiéndolo para que se inicie la configuración. Se selecciona la FPGA para configuración cuando el pin de PROGRAM se encuentra en alto y esta no está indicando ningún error de configuración a través del pin INIT. Para realizar la configuración la CPLD toma control de los pines de chip-select y write-enable de la FPGA y los libera solo hasta que la configuración se complete. Se dispone un registro que contenga la dirección de la Flash en la cual se encuentre el dato de configuración asociado. Este registro es mantenido en cero mientras que la FPGA se mantenga en su estado de reset con el pin de PROGRAM en bajo. Luego de que el pin de PROGRAM es subido y se inicia la configuración, la dirección de la Flash que se encuentra en el registro es incrementado cada ciclo de reloj mientras que la FPGA se encuentre seleccionada y esta no se encuentre enviando señales que indiquen algún error en la configuración o que se encuentra ocupada procesando el último dato enviado para su configuración. La dirección debe ser pasada, como es obvio, a la Flash para indicar el lugar de lectura de los datos de configuración.

Page 20: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

16

Después de que la FPGA se encuentre configurada, se pasa el reloj del oscilador programable a la FPGA para su uso interno, y para lo que se encuentre destinado a hacer dentro de la lógica ahora activa en la tarjeta.

1.4. Arquitectura GBA1-Xport El laboratorio Charmed Labs ofrece al mercado la tarjeta Xport 2.0, con una documentación básica para el uso de la misma. Junto con la tarjeta viene un CD, “Xport Software Distribution” que contiene Cygwin, Xport Development Kit, Xport eCos 2.0, y la documentación. En cuanto a la documentación, presenta el manual completo de eCos, que también esta disponible en la red en los sitios que mencionamos anteriormente. Es importante destacar que para la naturaleza de este estudio, y el interés académico que este tiene, la documentación es corta y carece de detalles funcionales del s istema. Es por esto que con el apoyo del Grupo de Microelectrónica de la Universidad Nacional de Colombia, que realizo el trabajo que presentamos a continuación, mostramos, con fines académicos únicamente, el funcionamiento del sistema de la Xport 2.0 mediante diagramas de bloques. Reiteramos que este apartado no es de nuestra autoría, y que fue obtenido gracias al profesor Carlos Camargo, miembro del Grupo de Microelectrónica de la Universidad Nacional de Colombia. Las explicaciones y comentarios presentados con los diagramas son producto de nuestra experiencia personal con el uso de la tarjeta.

FPGASpartan I I

150K

Cport

CPLD

Flash4Mbytes

Conector I/O64 pines

SDRAM16Mbytes

ARM7TDMIGamePad10 Botones

Pantallaa Color

Parlante

JTAG

Xport 2.0

GBA

Figura 1-1. Diagrama de bloques GBA-Xport

1 GameBoy Advanced

Page 21: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

17

Figura 1-2. Diagrama de comunicación GBA-Xport

Page 22: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

18

2 CONTROL ADAPTATIVO

2.1. Introducción En general, las técnicas de diseño de sistemas de control, presumen un buen conocimiento tanto de la planta objeto de estudio como del ambiente en el que esta se encuentra. En algunos casos sin embargo, la complejidad de los procesos es demasiado alta, forzando a que el desarrollo de modelos matemáticos de estos sea muy costoso tanto en tiempo como en capital; o que por otro lado, simplemente no se tenga la suficiente claridad o información que permitan el completo entendimiento de dichos procesos. A esto se le sumó, la necesidad de contar con controladores capaces de responder de forma adecuada en un amplio rango de condiciones de operación, cosa que no se había logrado con controladores lineales de ganancia constante. Se introdujo entonces el control adaptativo, cuya razón principal de ser, era la de obtener controladores capaces de adaptarse a cambios tanto en la dinámica de los procesos como en las características de las perturbaciones sobre estos. Se encontró además, que era posible utilizar estas técnicas de adaptación para obtener controladores auto-ajustables. Para lograr una mejor comprensión de lo que es un controlador adaptativo, es necesario primero definirlo como “un controlador con parámetros ajustables y un mecanismo para ajustar estos parámetros” (Astrom & Wittenmark, 1995, p. 1). Así, un sistema de control adaptativo puede ser visualizado con dos ciclos; el primero sería el ciclo de realimentación normal conformado por el proceso y el controlador, y el otro sería el ciclo encargado del ajuste de los parámetros del controlador.

Controlador

Ajuste deParámetros

Planta SalidaEntrada

Señal deControl

ParámetrosControlador

Figura 2-1. Diagrama de bloques sistema adaptativo generalizado

A continuación se describen algunas aproximaciones al control adaptativo.

2.2. Ganancia Programada La introducción de este tipo de control adaptativo se dio en la década de los 50´s, en la cual se venían desarrollando sistemas de control para aeronaves de alto rendimiento. Los rangos de operación de estas aeronaves eran tan amplios que los sistemas de control tradicionales no eran capaces mantener su buen funcionamiento a lo largo de estos. Lo que llevó a la búsqueda de variables auxiliares que se correlacionaran bien con la dinámica del proceso y que permitieran compensar las variaciones en los parámetros de este, por medio del cambio de los parámetros del regulador en función de las variables auxiliares.

Page 23: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

19

Controlador Proceso

Programadorde Ganancia

ParámetrosControlador

Referencia

EntradaSalida

VariablesAuxiliares

Figura 2-2. Diagrama de bloques Control de Ganancia Programada

La ventaja que tiene el control por ganancia programada es que los parámetros del controlador pueden ser modificados de forma rápida y de acuerdo con los cambios de las variables auxiliares. Este tipo de control es conveniente siempre y cuando la dinámica del proceso dependa de unas pocas variables y cuya medición sea relativamente fácil. Además, la ganancia programada es una buena forma de compensar no linealidades en el proceso. Algunas de las desventajas son que en algunos casos este método pude requerir de mucho tiempo, que la modificación de los parámetros se realiza en lazo abierto sin realimentación del sistema, y que no es posible utilizarlo si tanto la dinámica del proceso como las perturbaciones sobre este son conocidas con la suficiente precisión.

2.3. Sistema Adaptativo por Modelo de Referencia (MRAS) El MRAS fue diseñado para solucionar el problema de tener ciertas especificaciones de funcionamiento expresadas en un modelo de referencia; el cual, expresa la respuesta que el sistema debe tener a determinadas entradas o estímulos. El fin de este sistema de control adaptativo, es lograr que la salida de la planta concuerde con la salida del modelo de referencia. Para lograr esto, se plantearon dos esquemas.

2.3.1. Esquema de Alta Ganancia en Serie Este esquema basa su funcionamiento en aumentar la ganancia lo suficiente para que la función de transferencia sea aproximadamente 1 sobre las frecuencias de interés, de tal forma que la salida se acerque a Ym. En este caso el ciclo de ajuste permite que la ganancia aumente hasta cuando se detecte algún grado de inestabilidad. Bajo ese límite se permite el incremento de la ganancia.

Model o d eReferen ci a Plan taR eferencia Salid a

+Ym

Ga nancia

DetectorL im ite de

cl ic lo

Aj ustede Gana nci a

+ u

-

Figura 2-3. Diagrama de bloques MRAS. Esquema de alta ganancia

Page 24: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

20

Desventajas de este esquema: - Oscilaciones se presentan de forma constante en este sistema. - Ruido en la banda de frecuencia del Detector puede generar decrecimiento de la

ganancia muy por debajo de su valor crítico. - La señal de Referencia puede causar saturación debido a la alta ganancia. - La saturación puede enmascarar oscilaciones límites, permitiendo que la ganancia

continúe creciendo por encima del valor crítico, llevando el sistema a la inestabilidad.

2.3.2. Esquema en Paralelo En este esquema el controlador puede considerarse en dos ciclos; el interno o ciclo del regulador que se encuentra conformado por la planta y por el controlador, y el externo o ciclo de adaptación que ajusta los parámetros del controlador de tal forma que el error, diferencia entre la salida real del proceso y la del modelo de referencia (respuesta deseada), sea cero.

Controlador Proceso

Mecanismode Ajuste

DiseñoControlador

ParámetrosControlador

Referencia

EntradaSalida

Ym

Figura 2-4. Diagrama de bloques MRAS. Esquema en paralelo

El planteamiento principal de este esquema, se basa en encontrar un mecanismo de ajuste que logre llevar el error a cero. El planteamiento inicial de solución, consistía en utilizar el método de actualización del gradiente, en el que era necesario contar con la función de variación de la salida de la planta debida a cambios en los parámetros del controlador. Luego se introdujo la regla MIT, en la cual ya no se utilizan estos parámetros desconocidos, sino que se utilizan aproximaciones a estos en un tiempo “t”; la desventaja principal de esta solución se encuentra en la imposibilidad de asegurar la estabilidad del sistema de lazo cerrado. Empíricamente se observó que esta solución se comportaba de forma correcta para ganancias y señales de referencia de magnitudes pequeñas. Por ultimo se rediseño el mecanismo de ajuste de los parámetros utilizando la teoría de Lyapunov, para de esta forma obtener esquemas estables y probablemente convergentes.

2.4. Reguladores Auto-Ajustables (STR) En el caso de esta técnica de control adaptativo, el ciclo encargado del ajuste de los parámetros del controlador esta conformado por dos bloques, el primero es el encargado de estimar los parámetros de la planta utilizando métodos recursivos de identificación; y el segundo se encarga del diseño del controlador utilizando los datos provenientes del bloque

Page 25: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

21

de identificación; para esto ultimo, se debe asumir que los parámetros estimados del proceso son los reales, conociéndose esto como el principio de equivalencia certera. En algunos casos sin embargo, no es posible lograr la correcta identificación de los parámetros del proceso sin que a este le sean introducidas señales de prueba o perturbaciones.

Controlador Planta

EstimaciónDiseñoControlador

Regulador auto-ajustable

ParámetrosControlador

Referencia

EntradaSalida

Parámetros del ProcesoEspecificación

Figura 2-5. Diagrama de bloques STR

El esquema STR es bastante flexible, ya que es posible utilizar combinaciones entre diferentes métodos tanto de identificación como de diseño. Además, dependiendo de estos, ambos bloques, el de “Estimación” y el de “Diseño Controlador”, pueden integrarse reduciendo la complejidad del algoritmo de ajuste de los parámetros del controlador.

2.5. Control Estocástico Los esquemas de control anteriormente descritos parecen aproximaciones heurísticas razonables. A pesar de esto, algunas limitaciones salen a relucir, como lo es el no tener en cuenta la incertidumbre en los parámetros utilizados. Así, se hace atractiva la idea de obtener estos esquemas desde ciertos principios básicos. Esto puede lograrse utilizando el control estocástico, en donde el sistema y su ambiente son descritos por un modelo estocástico, y en el cual, se formula un criterio para minimizar el valor esperado de la función de pérdida, que es una función escalar de las variables de estado y de control. La solución de estos controladores óptimos da como resultado la siguiente estructura.

Controlador

Cálculo deHiperestado

PlantaSalida

Entrada

Señal deControl

Hiperestado

Figura 2-6. Diagrama de bloques Control Estocástico

Page 26: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

22

De algunas pruebas con este tipo de control, se han observado resultados interesantes. El controlador, además de utilizar la señal de control para obtener de la planta la salida deseada, la utiliza para inducir señales de prueba que permitan el mejoramiento de la identificación y por consiguiente el control a futuro de la planta. De esta forma, se mantiene un equilibrio entre el control y la identificación, lo que se conoce como control dual.

Page 27: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

23

3 IDENTIFICACIÓN DE SISTEMAS

3.1. Introducción La identificación de un sistema o proceso desconocido, consiste en encontrar un modelo matemático que lo represente, utilizando solamente los datos correspondientes a entradas y salidas. Para el caso específico de este proyecto, los procesos a identificar son tipo SISO (una entrada, una salida), por lo que los datos utilizados para la identificación en línea (simultánea al control) se presentan en pares entrada-salida. Entre algunas de las utilidades principales de la identificación de sistemas, se encuentran: la predicción de comportamientos, la explicación de relaciones entre entradas y salidas; y el diseño de controladores basados en los modelos obtenidos. Es esta última característica, la que más nos interesa para el desarrollo del control adaptativo. Existen algunas pautas que se deben tener en cuenta para el correcto desarrollo de la identificación, estas son: selección de la estructura del modelo, diseño del tipo de experimentación, estimación de los parámetros y por último, la validación de los resultados. Selección de la estructura del modelo: Para seleccionar una estructura correcta, es necesario contar con un conocimiento previo del comportamiento general del proceso. De esta forma, es necesario enmarcar al sistema a identificar dentro de un grupo de modelos factibles, utilizando la experiencia y el conocimiento de las leyes físicas que lo rigen. Diseño de la experimentación: Este aspecto es crucial para la identificación, y se convierte en un punto neurálgico cuando se trata de control; ya que las señales de entrada deben ser escogidas cuidadosamente, teniendo en cuenta tanto la estructura del proceso como la utilización que de este se requiere. En los sistemas de control adaptativo existe una complicación mayor, puesto que la señal de entrada del proceso se encuentra generada por el controlador luego de la realimentación; lo que en ciertos casos, evita que los parámetros sean encontrados de forma única, haciéndose necesaria la utilización de señales de perturbación. Estimación de los parámetros: Este paso se encuentra dentro del algoritmo de identificación, el cual se vale de técnicas de optimización para determinar el vector de parámetros desconocidos, resultando una función aproximada de la salida con respecto a la entrada. Validación: Esta se realiza al comparar la salida real del proceso con la obtenida del modelo aproximado; haciendo posible la determinación el grado de precisión de los parámetros estimados.

Page 28: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

24

Figura 3-1. Diagrama de Bloques para la Identificación de Sistemas

3.2. Estimador de Mínimos Cuadrados El principio de los mínimos cuadrados se basa en la escogencia de los parámetros desconocidos del modelo matemático de forma tal, que la suma de los cuadrados de las diferencias entre los datos reales del proceso y los valores estimados, multiplicados por números que midan su grado de precisión, sea un mínimo. En general en el problema de los mínimos cuadrados, la salida de un modelo lineal “y” se encuentra dada en términos de una expresión parametrizada linealmente, así:

Ecuación 3-1: ( ) ( ) ( ) ( ) ( )θϕθϕθϕθϕ iiiiiy Tnn =+++= ...2211

Donde 1θ , 2θ ,…, nθ son los parámetros del modelo que deben ser determinados y

1ϕ , 2ϕ ,…, nϕ son funciones conocidas o variables de regresión, que dependen de las entradas del proceso. Definimos de la Ecuación 3-1 los siguientes vectores:

( ) ( ) ( ) ( )( )iiii nT ϕϕϕϕ ...21=

( )nT θθθθ ...21=

Para identificar los parámetros desconocidos kθ , es necesario que se realicen algunos experimentos de los cuales se obtenga el conjunto de datos de entrenamiento, compuesto por parejas de datos ( ) ( ) tiiiy ,...,2,1,, =ϕ , que representan el comportamiento deseado del sistema a ser modelado. Si reemplazamos cada una de estas parejas de datos en la Ecuación 3-1 vamos a tener un número t de ecuaciones lineales:

Proceso a ser Identificado

Modelo Matemático

Técnica de Identificación

iy

iy+

-

ii yy ˆ−

iu

Page 29: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

25

Ecuación 3-2:

( ) ( ) ( ) ( )( ) ( ) ( ) ( )

( ) ( ) ( ) ( )tyttt

yy

nn

nn

nn

=+++

=+++

=+++

θϕθϕθϕ

θϕθϕθϕθϕθϕθϕ

...

22...2211...11

2211

2211

2211

ΜΜΜ

Utilizando notación matricial, y rescribiendo la Ecuación 3-2, tenemos que: Ecuación 3-3: ( ) ( )tYt =Φ θ Donde “ ( )tΦ ”, es una matriz de t x n,

( )( ) ( )

( ) ( )⎥⎥⎥

⎢⎢⎢

⎡=Φ

ttt

n

n

ϕϕ

ϕϕ

ΛΜΟΜ

Λ

1

1 11

Y “Y(t)” un vector de t x 1,

( )( )

( )⎥⎥⎥

⎢⎢⎢

⎡=

ty

ytY Μ

1

Para hallar una solución única de la Ecuación 3-3 debe cumplirse que nt ≥ . Si A es cuadrada ( nt = ) y no singular, la solución estaría dada por Ecuación 3-4: ( ) ( )tYt1−Φ=θ Como por lo general nt > (se tienen más parejas de datos que parámetros a estimar), es posible no encontrar una solución que satisfaga todas las ecuaciones. Esto puede deberse a que algunos de los datos han sido contaminados por ruido, o a que, simplemente, el modelo escogido para realizar la identificación no describe de forma correcta el proceso. Se hace necesario entonces, la inclusión de un vector que represente el error generado por cualquiera de las dos causas anteriores, modificando la Ecuación 3-3 así Ecuación 3-5: ( ) ( ) ( )tYtt =Ε+Φ θ Donde,

Page 30: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

26

( )( )

( )⎥⎥⎥

⎢⎢⎢

⎡=Ε

tt

ε

εΜ1

Ahora, el problema se transforma de la Ecuación 3-3, en la cual se buscaban los valores exactos, a encontrar los parámetros en θ que minimicen la suma del cuadrado del error

Ecuación 3-6: ( ) ( ) ( )( ) ( ) ( )θθθϕθ Φ−Φ−=ΕΕ=−= ∑=

YYiiytV TTt

i

T

1

2,2

Expandiendo la Ecuación 3-6 tenemos que Ecuación 3-7: ( ) ( ) ( ) θθθθθθθ ΦΦ+Φ−Φ−=Φ−Φ−= TTTTTTT YYYYYYtV ,2 Es posible observar que YY TTT Φ=Φ θθ , que es un escalar. Rescribimos la Ecuación 3-7 Ecuación 3-8: ( ) ( ) ( ) θθθθθθ ΦΦ+Φ−=Φ−Φ−= TTTTT YYYYYtV 2,2 Ahora derivamos ( )tV ,2 θ

Ecuación 3-9: ( ) YtV TT Φ−ΦΦ=∂

∂ 22,2 θθθ

Igualando ( )θθ

∂∂ tV ,2 a cero con θθ ˆ= , obtenemos la siguiente ecuación:

Ecuación 3-10: YTT Φ=ΦΦ θ Si ΦΦT es no singular, entonces θ tiene una única solución dada por,

Ecuación 3-11: ( ) YTT ΦΦΦ=−1θ

NOTA: Es posible que se presenten problemas en la identificación de sistemas debido a la mala escogencia del modelo matemático que lo representa; ya que por un lado puede que los parámetros de éste no sean suficientes para explicar todo el comportamiento del sistema, o que por el otro, que sean demasiados y simplemente el modelo obtenido se ajuste bien al conjunto de datos del que se obtuvo, pero no a otros.

Page 31: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

27

3.3. Estimador Recursivo por Mínimos Cuadrados (RLS1)

3.3.1. Sistemas Invariantes en el Tiempo Suponiendo que para realizar la estimación de los parámetros del sistema contamos con t-1 parejas de datos, rescribimos la Ecuación 3-11 de tal manera que esto quede representado. Así, tendríamos que

Ecuación 3-12: ( ) ( ) Yt TT ΦΦΦ=−−11θ

Si adquiere una nueva pareja de datos ( ) ( ) tty ϕ, , es posible ahorrar el esfuerzo computacional que implicaría tomar nuevamente todos los datos para el cálculo de ( )tθ , por medio de la actualización de ( )1−tθ . A esto, se le conoce como identificación recursiva por mínimos cuadrados. Es posible representar a ( )tθ de la siguiente forma:

Ecuación 3-13: ( ) ( ) ( ) ( ) ( )⎥⎦⎤

⎢⎣

⎡⎥⎦

⎤⎢⎣

⎡ Φ⎟⎟

⎞⎜⎜

⎛⎥⎦

⎤⎢⎣

⎡ Φ⎥⎦

⎤⎢⎣

⎡ Φ=

tyY

tttt

T

TT

T

T ϕϕϕθ

1

Para simplificar la nomenclatura, se introducen dos matrices de dimensión n x n, definidas de la siguiente forma,

Ecuación 3-14: ( ) ( ) 11 −ΦΦ=− TtP

Ecuación 3-15:

( ) ( ) ( )

( )[ ] ( )( ) ( )( ) 1

1

1

+ΦΦ=

⎟⎟⎠

⎞⎜⎜⎝

⎛⎥⎦

⎤⎢⎣

⎡ ΦΦ=

⎟⎟⎠

⎞⎜⎜⎝

⎛⎥⎦

⎤⎢⎣

⎡ Φ⎥⎦

⎤⎢⎣

⎡ Φ=

tt

tt

tttP

TT

TT

T

T

T

ϕϕ

ϕϕ

ϕϕ

La relación entre estas dos matrices se encuentra dada por Ecuación 3-16: ( ) ( ) ( ) ( )tttPtP Tϕϕ−=− −− 11 1 Utilizando las matrices ( )1−tP y ( )tP en la Ecuación 3-12 y la Ecuación 3-13 se tiene que

Ecuación 3-17: ( ) ( ) YtPt TΦ−=− 11θ

1 Recursive Least-Square.

Page 32: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

28

Ecuación 3-18: ( ) ( ) ( ) ( )( )tytYtPt T ϕθ +Φ= Para expresar ( )tθ en función de ( )1−tθ , es necesario despejar el término YTΦ de la Ecuación 3-17 y reemplazarlo en la Ecuación 3-18. Utilizando además, la Ecuación 3-16 se obtiene

Ecuación 3-19: ( ) ( ) ( ) ( ) ( ) ( ) ( )( )11 −−+−= tttyttPtt T θϕϕθθ De la Ecuación 3-16 tenemos que

Ecuación 3-20: ( ) ( ) ( ) ( )( ) 11 1 −− +−= tttPtP Tϕϕ Para evitar la inversión matricial que implica la Ecuación 3-20, nos valemos de la siguiente formula

( ) ( ) 111111 −−−−−− +−=+ CABCAIBAABCA Tomando ( )11 −= − tPA , ( )tB ϕ= y ( )tC Tϕ= tenemos que

Ecuación 3-21: ( ) ( ) ( ) ( ) ( ) ( ) ( )( ) ( ) ( )

( ) ( ) ( ) ( ) ( )( ) ( ) ( )ttPtI

tPtttPtP

tPtttPtIttPtPtP

T

T

TT

ϕϕϕϕ

ϕϕϕϕ

1111

1111 1

−+−−−−=

−−+−−−=−

Las ecuaciones para la estimación recursiva por mínimos cuadrados pueden ser resumidas de la siguiente manera Ecuación 3-22: ( ) ( ) ( ) ( )ttKtt εθθ +−= 1ˆˆ Ecuación 3-23: ( ) ( ) ( ) ( )1ˆ −−= tttyt T θϕε

Ecuación 3-24: ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( )( ) 111 −−+−== ttPtIttPttPtK T ϕϕϕϕ

Ecuación 3-25: ( ) ( ) ( )( ) ( )1−−= tPttKItP Tϕ Así, los parámetros estimados en ( )tθ , para un número “t” de muestras, son obtenidos de sumarle a la estimación anterior ( )1ˆ −tθ cierta corrección proporcional al error (diferencia entre el valor real obtenido del proceso y el estimado por el modelo). El vector ( )tK (constante de adaptación) es el encargado a su vez, de indicar cual es la cantidad de esta corrección que debe ser hecha a cada componente de θ . La matriz ( )tP por otro lado, es proporcional a la matriz de covarianza de los estimadores.

Page 33: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

29

3.3.2. Sistemas Variantes en el Tiempo

De la Ecuación 3-14 tenemos que ( ) ( ) 11 −ΦΦ=− TtP , en donde t-1 es el numero de

muestras que han sido tomadas hasta ese momento. Sabemos también que la dimensión de Φ es de (t-1) x n, que es el número de muestras tomadas (t-1), por el número de parámetros a estimar n. En cada nueva iteración, el valor de t va a aumentar y por lo tanto la dimensión

de las filas de Φ . Ahora, a medida que t tiende al infinito, ΦΦ−

T

t 11 se aproxima a una

matriz constante y no singular. De esta forma,

Ecuación 3-26: ( ) 01

11

1lim1lim1

=⎟⎠⎞

⎜⎝⎛ ΦΦ

−−=−

∞→∞→

Ttt tt

tP

La implicación directa de la Ecuación 3-22, es que ( )tK (constante de adaptación) tiende a cero, y resultando en que ( ) ( )1ˆˆ −≈ tt θθ . Esto indica, que a medida que transcurre el tiempo, los estimadores se acercan al punto óptimo, aproximándose a los parámetros reales θ del sistema. Esto resulta positivo siempre y cuando, estos últimos no varíen en el tiempo; ya que de ser así, los estimadores no podrían seguir estos cambios de manera adecuada. A este punto regresaremos más adelante. “Una forma para solucionar este problema es introducir un factor de olvido λ que dé un mayor énfasis a los datos más recientes” (Jang, Sun & Mizutani, 1997, p. 116).

Ecuación 3-27: ( ) ( ) ( )( ) ( ) ( )θθθϕλθ Φ−Φ−=−=Ε ∑=

− YWYiiyt

i

TitW

2

1

2

donde W es una matriz diagonal:

⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢

=−

1000

000

2

1

ΛΟΟΜ

ΜΟΛ

t

t

W λλ

,

y 0<λ≤1. El estimador que minimiza el error ajustado, dado por la Ecuación 3-27 esta definido así:

Ecuación 3-28: ( ) WYW TT ΦΦΦ=−1θ

Si se realiza nuevamente el procedimiento para encontrar el estimador recursivo, pero esta vez cambiando la Ecuación 3-12 por la Ecuación 3-28, obtendríamos el siguiente conjunto de ecuaciones.

Page 34: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

30

Ecuación 3-29: ( ) ( ) ( ) ( )ttKtt εθθ +−= 1ˆˆ Ecuación 3-30: ( ) ( ) ( ) ( )1ˆ −−= tttyt T θϕε

Ecuación 3-31: ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( )( ) 111 −−+−== ttPtIttPttPtK T ϕϕλϕϕ

Ecuación 3-32: ( ) ( ) ( )( ) ( ) λϕ /1−−= tPttKItP T La Ecuación 3-31 y la Ecuación 3-32 serían exactamente iguales a la Ecuación 3-24 y a la Ecuación 3-25 respectivamente, si utilizamos λ=1; esto es equivalente a decir, que todas las muestras mantienen el mismo peso sin importar en que tanto tiempo atrás hayan sido tomadas. Al utilizar valores de λ pequeños, las muestras más recientes tendrán mucho más peso en comparación con las de tiempos anteriores a éstas, lo que resulta en una mayor capacidad de adaptación del algoritmo de identificación, logrando respuestas más rápidas a cambios en los parámetros del sistema. Esto sin embargo, no resulta del todo positivo, ya que al mismo tiempo, los estimadores se vuelven más sensibles y tienden a fluctuar para así reflejar cualquier variación debida a ruido o a perturbaciones. Una desventaja que se presenta al utilizar el factor de olvido es que “los datos son descartados aún cuando ( ) ( ) 0=ttP ϕ . Esta condición implica que y(t) no contiene ninguna nueva información sobre el parámetro θ”(Astrom & Wittenmark, 1995, p. 53).

3.4. Estimación de parámetros para sistemas dinámicos En el numeral 2.3.2 se mostró como era posible utilizar el método de los mínimos cuadrados de forma recursiva para estimar los parámetros de funciones variables en el tiempo, que es el primer paso para el diseño de un controlador STR. Ahora es necesario sin embargo, centrarnos en como podemos utilizar este método para estimar los parámetros de modelos de sistemas dinámicos, que son los que realmente nos interesan para efectos de este proyecto.

3.4.1. Modelos de función de transferencia Supongamos que el sistema se encuentra definido por el siguiente modelo: Ecuación 3-33: ( ) ( ) ( ) ( )tuqBtyqA = Donde q es el operador de adelanto, mientras que A(q) y B(q) son polinomios definidos de la siguiente manera,

( )( ) m

mmn

nn

bqbqbqBaqaqqA+++=

+++=−

Κ

Κ1

10

11

Page 35: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

31

Si tenemos lo anterior en mente y definimos d0=n-m, la Ecuación 3-33 podría ser rescrita así, Ecuación 3-34: ( ) ( ) ( ) ( ) ( )mdtubdtubntyatyaty mn −−++−+−−−−−= 0001 1 ΚΚ Se asume que u(t) es una entrada aplicada al sistema en algún tiempo t, y y(t) la salida correspondiente a ese mismo tiempo. Es posible observar que la Ecuación 3-34 se encuentra escrita de la misma forma que la Ecuación 3-1, y por lo tanto, es posible definir el vector de los parámetros y el de regresión de la siguiente manera, Ecuación 3-35: ( )mn

T bbaa ΚΚ 01=θ

Ecuación 3-36: ( ) ( ) ( ) ( ) ( )( )mdtudtuntytytT −−−−−−−=− 0011 ΚΚϕ A este tipo de modelos se le conoce como “modelo de auto regresión”, porque como es posible notar, el vector de regresión en la Ecuación 3-36 hace referencia a la salida y(t-1) en un tiempo pasado. El modelo representado por la Ecuación 3-34, puede escribirse así,

( ) ( )θϕ 1−= tty T Si rescribimos las ecuaciones encontradas para la estimación de parámetros por mínimos cuadrados con factor de olvido (Ecuación 3-29, Ecuación 3-30, Ecuación 3-31 y Ecuación 3-32), tendríamos el siguiente algoritmo Algoritmo 3-1: Mínimos Cuadrados con Olvido Exponencial

( ) ( ) ( ) ( )( ) ( ) ( ) ( )( ) ( ) ( ) ( ) ( ) ( )( )( ) ( ) ( )( ) ( ) λϕ

ϕϕλϕ

θϕεεθθ

/1111111

1ˆ11ˆˆ

1

−−−=

−−−+−−=

−−−=

+−=

tPttKItPttPtIttPtK

tttytttKtt

T

T

T

El hecho de que en este conjunto de ecuaciones, el vector de regresión ϕ se encuentre definido para un tiempo t-1, solo indica que los datos que lo conforman son obtenidos por completo en este tiempo. NOTA: Para utilizar el Algoritmo 3-1, es necesario primero definir la inicialización de los siguientes valores: grado del polinomio A, n=degA; grado del polinomio B, m=degB; vector de los parámetros estimados ( )0θ ; factor de olvido λ; y la matriz de varianza P(0). El vector de regresión )0(ϕ , va a encontrarse, por defecto, lleno de ceros. Sin embargo, es posible arrancar el algoritmo desde un tiempo t=n+1, en el cual, el vector de regresión

Page 36: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

32

)(nϕ ya se encuentre definido para el modelo que se este manejando. Otra forma de enfrentar este problema, es inicializar P(0) como una matriz diagonal αI con valores α muy altos, de tal forma que se obliga a una convergencia de arranque mucho más rápida.

3.5. Excitación persistente Uno de los aspectos más importantes para lograr una identificación satisfactoria, es la utilización de datos que aporten información relevante acerca del sistema. Resulta obvio además, que valores estáticos tanto de la entrada como de la salida, no contienen ninguna nueva información, y por lo tanto introducen errores a los estimadores. En este numeral se pretende realizar una observación rápida de las condiciones necesarias que deben cumplir las señales de entrada o control1 para que el sistema (proceso) sea identificable. Para que la tenga solución única, la matriz ΦΦT debe tener rango completo. A esta condición se le conoce como “condición de excitación” (Astrom & Wittenmark, 1995, p. 64). Para tiempos muy largos, tendríamos

Ecuación 3-37:

⎥⎥⎥⎥

⎢⎢⎢⎢

=ΦΦ=∞→

nnnn

n

n

T

tn

ccc

cccccc

tC

,2,1,

,22,21,2

,12,11,1

1lim

ΛΜΟΜΜ

ΛΛ

Donde

Ecuación 3-38: ( ) ( )∑=

∞→=

t

kjitji kk

tc

1,

1lim ϕϕ

( )( ) ( )

( ) ( )⎥⎥⎥

⎢⎢⎢

⎡=Φ

ttt

n

n

ϕϕ

ϕϕ

Λ

ΜΟΜ

Λ

1

1 11

( ) YTT ΦΦΦ=−1θ

Ejemplo 3-1: Identificación de modelos utilizando Mínimos Cuadrados con Olvido Exponencial

1 Para sistemas realimentados.

Page 37: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

33

Figura 3-2. Circuito Eléctrico de la Armadura y Diagrama de Cuerpo Libre del Rotor1

La función de transferencia del motor en la Figura 3-2 es como sigue a continuación,

Ecuación 3-39: ( )( ) 2KRLsbJsK

V +++=ω

En donde, J [kg.m^2/s^2]: Momento de inercia del rotor. b[Nms]: Cociente de amortiguación del sistema mecánico. K[Nm/Amp]: Constante de fuerza electromecánica. R[ohm]: Resistencia eléctrica. L[H]: Inductancia eléctrica. V[V]: Voltaje de entrada. ω[rad/s]: Velocidad angular del eje. Para efectos de este ejercicio se utilizaron los siguientes valores: J=0.01, b=0.1, K=0.01, R=1, L=0.5. Dado que el proceso de identificación que descrito por el Algoritmo 3-1 es discreto, se hace necesario definir un tiempo de muestreo para la obtención de los datos por un lado, y para transformar la Ecuación 3-39 a una función de transferencia discreta por el otro. Definiendo un tiempo de muestreo de 0.5 seg. Obtenemos que la función de transferencia discreta del motor DC es dada por

Ecuación 3-40: ( )( ) 002479.03742.0

008598.005417.02 +−

+=zz

ztuty

De donde tendríamos que los parámetros reales del proceso y a los que debe llegar la estimación deben ser b1=0.05417, b2=0.008598, a1=-0.3742 y a2=0.002479.

1 Figura disponible en: http://www.engin.umich.edu/group/ctm/examples/motor/motor.html

Page 38: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

34

Observamos las características de este sistema para tener una mejor perspectiva de lo que sucede con el Algoritmo 3-1 al momento de la identificación.

Figura 3-3. Lugar de la Raíz

Figura 3-4. Diagramas de Bode

Se inicializan los valores necesarios para correr el Algoritmo 3-1,

Page 39: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

35

( ) ( )( ) ( )

( )⎥⎥⎥⎥

⎢⎢⎢⎢

=

==

=

====

100000010000001000000100

0

100000

2.001.0000ˆ1deg

2deg

P

BmAn

T

T

λϕθ

Figura 3-5. Diagrama de bloques Ejemplo 3-1 en SIMULINK

Figura 3-6. Señal de entrada

Page 40: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

36

Salidas del Algoritmo 3-1, utilizado para la identificación del modelo de velocidad angular del motor DC; variando el factor de olvido λ.

Figura 3-7. Parámetros a2 y b2 estimados con (a) λ=1, (b) λ=0.99, (c) λ=0.95 y (d) λ=0.8.

Figura 3-8. Parámetro a1 estimado con (a) λ=1, (b) λ=0.99, (c) λ=0.95 y (d) λ=0.8.

Page 41: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

37

Figura 3-9. Parámetro b1 estimado con (a) λ=1, (b) λ=0.99, (c) λ=0.95 y (d) λ=0.8.

En las figuras anteriores se evidencia el comportamiento del algoritmo de identificación utilizado en este proyecto. Notamos como las variaciones del factor de olvido λ inciden directamente en la respuesta obtenida; a medida que éste disminuye la convergencia es más rápida, ya que como se había explicado anteriormente, los datos más recientes tienen un mayor peso y por lo tanto son estos los que definen el ajuste que debe ser hecho en cada tiempo de muestreo a los estimadores. Existe sin embargo, un efecto colateral negativo que se aprecia claramente en la Figura 3-3 (d), en la cual, el estimador a2 oscila alrededor del valor real del parámetro. Este efecto se debe a que además de estarse descartando los datos más antiguos, los nuevos son tomados en cuenta, a pesar de que en algunos casos, estos pueden no estar aportando información relevante, generando inestabilidad en los estimadores. Además, es posible, que por el efecto ya sea de ruido o de perturbaciones en el sistema las variaciones se vuelvan mucho más pronunciadas. El factor de olvido por lo tanto, debe ser escogido con mucho cuidado y teniendo en cuenta lo que se espera obtener del sistema de identificación. Para este ejemplo y dadas las gráficas, podríamos decir que el factor de olvido que mejor se ajusto al proceso fue el de 0.95.

Page 42: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

38

4 REGULADOR AUTO-AJUSTABLE (STR)

4.1. Diseño por posicionamiento de polos La idea principal de este método consiste en encontrar los parámetros del controlador a fin de lograr que la función de transferencia en lazo cerrado del sistema sea la deseada. El diagrama del proceso realimentado es como sigue:

Ru = Tuc -Sy A/By

ucControlador

u

Proceso

Figura 4-1. Controlador Lineal Generalizado

Donde

BA representa la función de transferencia discreta del proceso igual que en la

Ecuación 3-33,

( ) ( ) ( ) ( )tuqBtyqA =

Teniendo que,

( ) nnn aqaqqA +++= − Κ1

1 ( ) m

mm bqbqbqB +++= − Κ110

Resolviendo el sistema de lazo cerrado, se tienen las siguientes ecuaciones que lo representan

Ecuación 4-1: ( ) ( )tuBSAR

BTty c+=

Ecuación 4-2: ( ) ( )tuBSAR

ATtu c+=

La idea entonces del método de diseño es encontrar los polinomios R y S, tal que, el denominador de la Ecuación 4-1 tenga ciertas características deseadas expresadas por un polinomio Ac. Ecuación 4-3: cABSAR =+ A esta ecuación se le conoce como la ecuación de Diophantine.

Page 43: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

39

4.2. Seguimiento del modelo Solucionando la Ecuación 4-3, solo se determinan los polinomios R y S, por lo que es necesario recurrir a otras condiciones para encontrar T. Si tenemos que la respuesta de la salida del proceso y(t) con respecto a la referencia uc(t) se encuentra por los polinomios mA y mB . Se debe cumplir de la Ecuación 4-1 y la Ecuación 4-3 que

Ecuación 4-4: m

m

c AB

ABT

BSARBT

==+

Se factoriza el polinomio B Ecuación 4-5: −+= BBBm Con +B un polinomio cuyos ceros son estables y bien amortiguados, de manera que pueden ser cancelados por el controlador, y −B que corresponde a los factores inestables o muy poco amortiguados que no pueden ser cancelados. Queda entonces claro que −B debe ser un factor de mB Ecuación 4-6: mm BBB ′= −

Debido a que +B se cancela, este debe ser un factor de cA . De la Ecuación 4-4 se tiene que

mA debe ser también un factor de cA . De esta manera el polinomio característico de lazo cerrado queda Ecuación 4-7:

+= BAAA moc Dado que +B es un factor de B y de cA , tendríamos por la Ecuación 4-3 que ésta también divide a R. Y por lo tanto Ecuación 4-8:

+= BRR ' Y la Ecuación 4-3 se reduce a Ecuación 4-9: cmo AAASBAR '' ==+ − De introducir la Ecuación 4-5, la Ecuación 4-6 y la Ecuación 4-7 en la Ecuación 4-4 se tiene que

Page 44: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

40

Ecuación 4-10: mo BAT '= Algoritmo 4-1: Posicionamiento de polos con mínimo grado (MDPP) Para realizar el diseño debe tenerse la función de transferencia de lazo cerrado deseada, expresada por los polinomios mA y mB , denominador y numerador respectivamente. Y un polinomio de observación. oA . Se verifican las condiciones de compatibilidad:

AAm degdeg = BBm degdeg = ,

1degdegdeg 0 −−= +BAA

mm BBB ′= −

1. El polinomio numerador de la función de transferencia de lazo abierto debe factorizarse de la siguiente manera, −+= BBB con +B monica.

2. Se soluciona la ecuación de Diophantine

mAASBAR 0' =+ −

Teniendo en cuenta que AS degdeg <

3. Se obtienen los polinomios del controlador +′= BRR y mBAT ′= 0 . 4. Teniendo los valores de R, S y T, se calcula la señal de control u(t).

Ejemplo 4-1. Regulador Auto-Ajustable (MDPP con cancelación de ceros y RLS con olvido exponencial) Utilizando el mismo proceso que para el Ejemplo 3-1 y adicionando al modelo de SIMULINK los bloques de “Ajuste Control” y “Controlador” tenemos

Page 45: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

41

Figura 4-2. Diagrama de bloques Ejemplo 4-1 en SIMULINK

En la Figura 4-2 vemos como entre el bloque del controlador y el proceso se encuentra un elemento de saturación que impide que la señal de control suba de ciertos valores prefijados. Estos se escogen de tal forma que no se tengan problemas de sobre- excitación1. Las inicializaciones para el algoritmo de identificación las realizamos de la misma forma que en el Ejemplo 3-1. Para algoritmo de control definimos que nuestra función de transferencia deseada de lazo cerrado esta dada por

4.02 +−= qqAm Los resultados de la simulación se presentan a continuación,

1 Señales de entrada mayores a las toleradas por la planta real.

Page 46: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

42

Figura 4-3. Parámetros estimados para STR

Figura 4-4. Señal de referencia uc(t) (en verde) y salida del proceso y(t) (en rojo)

Page 47: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

43

Figura 4-5. Señal de control u(t)

En las figuras anteriores podemos observar el funcionamiento del controlador adaptativo STR. En la Figura 4-4 vemos como al inicio, durante los primeros 5 segundos, la señal de salida del proceso no sigue la referencia; esto se debe a que los parámetros no han sido identificados aún y los valores en los que se encuentran difieren significativamente de los reales. Es posible destacar sin embargo, que el sistema da una respuesta adecuada aunque los parámetros todavía se encuentren relativamente distantes de sus valores de convergencia. Notamos en la Figura 4-5 que existe una oscilación en la señal de control. Esto ocurre porque se están cancelando los ceros. Se realizaron pruebas variando el factor de olvido para el sistema de identificación; y lo que se encontró fue que, a pesar de presentarse las oscilaciones ya mencionadas en los estimadores, el sistema mantiene una respuesta aceptable para factores mayores a 0.7. Las pruebas anteriores solo demuestran la capacidad del control STR como arrancador de sistemas, pero para probar su adaptabilidad a cambios en los procesos se diseño la siguiente prueba. Se varió el parámetro J en función del tiempo así J(t<1000)=0.001, J(1000<=t<1200)=0.001+0.0005t, J(2000<t)=0.11 Se obtuvo el siguiente resultado

Page 48: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

44

Figura 4-6. Respuesta del sistema sin bloque de Identificación

Figura 4-7. Respuesta del sistema con bloque de Identificación

En estas figuras se observa como el controlador con el algoritmo completo Figura 4-7 después del tiempo en el que trascurre el cambio se ajusta a este (adapta), retornando a la respuesta deseada. En la Figura 4-6 vemos como el controlador no es capaz de ajustar sus parámetros para mantener la salida.

Page 49: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

45

5 ARQUITECTURA DE SOLUCIÓN

5.1. Identificación El sistema de identificación tiene como entradas; la entrada u(t) y la salida y(t) del proceso, y como salida, el vector de los estimadores θ. Definimos entonces, la arquitectura general del bloque de identificación por medio de un diagrama de Pirbhai-Hatley.

Interfaz del Bloque de Identificación Permite la inicialización de las variables que requiere el

sistema. Algoritmo de Identificación

Realiza la estimación de los parámetros del

sistema.

Procesamiento de la Entrada Transforma las

señales análogas

provenientes del proceso, en

señales digitales.

Control Interno Elementos que

permiten la sostenibilidad del

Bloque de Identi ficación.

Procesamiento

de Salida Separa el vector

de los estimadores en

las componentes de los polinomios

A y B.

Figura 5-1. Diagrama de Pirbhai-Hatley Bloque de Identificación En el diagrama de la Figura 5-1, el bloque de identificación se ha separado en subbloques, cada uno de los cuales se enfrenta como un problema independiente, pero sin olvidar el rol que éste tiene dentro de la solución general.

5.1.1. Conversor Análogo-Digital Para desarrollar la solución de este subbloque se debe suponer que las señales provenientes del proceso son de tipo análogo, y además, que son dos las señales que se deben manejar u(t) y y(t). Una alternativa de solución, es utilizar dos conversores en forma simultánea que manejen las señales por separado; lo que resultaría finalmente en un gasto innecesario de recursos, ya que se estarían utilizando el doble de líneas destinadas a la transmisión de datos; las de control sin embargo, o por lo menos las que van del dispositivo a los ADCs, pueden manejarse a través de un bus de control, de forma que ambos conversores trabajen paralelamente. Otra alternativa de solución, y por la cual se optó, fue la de utilizar un conversor con múltiples entradas análogas, y con una única salida de datos digitales para todas. El conversor escogido que cumple con las funciones requeridas es el ADC0808. A continuación se presenta una descripción general de su funcionamiento.

Entradas Señal de

entrada u(t) y señal de salida y(t)

del proceso.

Salidas Polinomio estimado A

y polinomio

estimado B.

Page 50: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

46

Figura 5-2. Diagrama de tiempos ADC

En el manual1 del conversor se puede encontrar una especificación más detallada de los tiempos a los que aquí se hace referencia.

1 ADC0808/ADC0809 8-Bit µP Compatible A/D Converters with 8-Channel Multiplexer, National Semiconductor.

Page 51: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

47

Figura 5-3. Diagrama de conexión ADC para una aplicación típica

Figura 5-4. Multiplexor de las señales análogas

El manejo del ADC0808 se realizó principalmente desde la FPGA Spartan II que se encuentra en la tarjeta Xport 2.0. Sin embargo, para definir la dirección de la entrada análoga se utiliza el ARM7TDMI del GBA; esto se debe a que es aquí en donde se pretende desarrollar el algoritmo de identificación y el cual, necesita tener control de la señal que recibe.

5.1.2. Algoritmo de identificación El muestreo es el primer aspecto a tener en cuenta al momento de plantear la solución de este subbloque. Para evitar cualquier problema debido a interrupciones en el

Page 52: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

48

microprocesador, se optó por desarrollar un contador dentro de la FPGA que mantuviera constante el período de muestreo, y que para efectos de este proyecto se tomó de 0.5seg. A pesar de haber decidido mantener fijo el tiempo de muestreo, se formuló la posibilidad de utilizar una variable definida al inicio del programa por el usuario y que se pudiera enviar a la FPGA para que esta realizara el conteo pertinente. El Algoritmo 3-1 utiliza tanto la entrada como la salida del proceso en cada iteración. Para obtenerlas ambas, se implementó el siguiente sistema:

- Se estableció, una variable de dirección (ADCaddr), que se encarga de apuntar a la entrada del ADC0808 de la que se desea obtener el dato; y otra de control, encargada de activar el muestreo con un flanco de subida.

- La señal de control se mantiene baja para que no se realice ninguna operación de muestreo. Por otro lado, ADCaddr apunta a la entrada cero del conversor, esperando a que, al cumplirse el tiempo de muestreo, se obtenga el dato proveniente de esta posición.

- Al cumplirse el tiempo de muestreo y mientras se realiza la conversión, ADCaddr pasa a apuntar a la posición uno.

- Cuando llega el dato, éste se almacena y la señal de control se pasa a alta activando un nuevo muestreo; pero ahora, la dirección sobre la que éste se realiza es la numero uno.

- ADCaddr regresa a apuntar a la posición cero y la señal de control se pasa a baja. - El dato entrante se almacena y se espera nuevamente a que se cumpla el tiempo de

muestreo. Teniendo ambos datos en cada tiempo de muestreo, se pasa a realizar las operaciones del algoritmo de identificación. El resultado de estas es el vector de los estimadores que luego separamos en los polinomios A y B, que a su vez sirven de entrada al bloque de ajuste de parámetros, justo como se indica en la Figura 2-5. Es por esta razón, que no se hace necesario plantear al subbloque de “Procesamiento de Salida” de la Figura 5-1 como un problema independiente.

5.2. Ajuste de parámetros y controlador El sistema de ajuste de parámetros y controlador, se encuentra conformado por los bloques de “diseño controlador” y “controlador” que se distinguen de la Figura 2-5; en donde se utilizan los métodos MDPP con cancelación de ceros y controlador R, S y T respectivamente. Éstos en conjunto, utilizan como entradas los valores de las señales de, referencia uc(t), y salida del proceso y(t); además de los polinomios A y B.

Page 53: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

49

Interfaz del Bloque de Ajuste de Parámetros y Controlador

Permite la inicialización de las variables que requiere el sistema.

Algoritmo Ajuste de Parámetros y Controlador

Obtiene la señal de control u(t) para

seguir la referenci a.

Procesamiento de la Entrada Digitaliza uc(t)

y y(t). Los polinomios

A y B no necesitan

procesamiento

Control Interno Elementos que

permiten el funcionamiento de

este bloque

Procesamiento

de Salida Transforma la

señal digital de control u(t) en

una señal análoga que va

al proceso

Figura 5-5. Diagrama de Pirbhai-Hatley Bloque de Ajuste de Parámetros y Controlador La función especifica y solución de cada uno de los subbloques en la Figura 5-5 se explora a continuación.

5.2.1. Conversor Análogo-Digital La conversión de la señal de salida del proceso y(t), ya fue trabajada dentro del bloque de identificación, por lo que es posible la utilización de esta misma en este bloque. Dado que el conversor escogido maneja hasta ocho entradas, se le puede incluir también la señal de referencia uc(t), utilizando el mismo protocolo de lectura desarrollado en el numeral 5.1.1. Es obvio pensar, que debido a que la señal de control u(t) sirve como entrada al bloque de identificación, no sea necesaria su conversión a través del ADC. Sin embargo, para mantener uniformidad en los datos se decidió realizar esta conversión, para asegurar en todo momento que las señales se mantienen dentro de la misma escala.

5.2.2. MDPP con cancelación de cero y Controlador R, S, T Se utilizó el Algoritmo 4-1 y se desarrolló completamente en eCos. Las señales que utiliza este algoritmo se obtuvieron de las que ya se tenía del bloque de identificación, por lo que la única diferencia funcional con este fue la implementación del conversor DAC. Este bloque es básicamente una transformación matemática de los valores de entrada a una señal de control o salida del controlador cuyo fin es mantener el proceso con una respuesta deseada y definida por el usuario.

5.2.3. Conversor Digital-Análogo Uno de los supuestos iniciales es que los procesos para los cuales está diseñado el dispositivo, son netamente análogos; haciéndose necesaria la conversión de la señal de control del dominio digital al análogo. Para cumplir con esta función se escogió el DAC1006, que cuenta con una entrada de 10 bits por dato. A continuación se presenta el diagrama de conexión de este dispositivo para aplicaciones típicas.

Entradas Polinomios

A y B. Señal de

referencia uc(t) y

salida del proceso y(t)

Salidas Señal

análoga de control u(t)

Page 54: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

50

Figura 5-6. Diagrama de conexión DAC para una aplicación típica

En la Figura 2-1 se observa como al lado derecho del conversor, se utiliza un amplificador operacional (AO); esto se debe a que la salida del DAC1006 es una señal de corriente. A la salida del amplificador se tiene la señal de voltaje que va, por un lado al proceso (planta), y por el otro a una de las entradas del ADC por la consideración expuesta anteriormente. El diagrama de tiempos para este dispositivo es como sigue:

Figura 5-7. Diagrama de tiempos DAC

El DAC1006 cuenta con algunas señales de control que permiten introducir un dato de 10 bits en forma secuencial, primero 8 y luego los 2 restantes. Esta funcionalidad no era necesaria sin embargo, pues desde la FPGA se podía realizar la construcción del dato, enviando los 10 bits en un solo ciclo. Si tenemos en cuenta que en la comunicación entre el GBA y la Xport cada dato está compuesto por 8 bits únicamente; y que además, la precisión máxima del DAC (10 bits) se pierde luego de introducir la señal de salida al ADC (conversión de 8 bits), es posible entonces reducir el problema a una conversión de datos de 8 bits, dejando en cero los menos significativos del DAC1006. El problema se reduce a tal punto que es posible manejar el conversor digital-análogo a través de una sola señal de control DACwr, que se envía a los pines de CS y a WR por igual. Otro aspecto importante es que la señal de referencia que recibe el conversor debe ser negativa para que la señal a la salida resulte positiva, lo que suponía la utilización de 3 señales de alimentación +12V (alimentación positiva amplificador), -5V (voltaje de referencia DAC) y GND, sin contar con la de +5V (alimentación teclado y ADC).

Page 55: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

51

Finalmente se optó por utilizar 3 señales que cumplieran con las mismas funciones, +5 (alimentación teclado, ADC, DAC y amplificador+), -5 (referencia DAC y amplificador-) y GND. Esta configuración acarreó un problema adicional, y era que el amplificador se saturaba y no era capaz de entregar toda la señal de salida que se le pedía a través del DAC, por lo que se debió reducir el voltaje de referencia del DAC a -4.5.

5.3. Interfaz El usuario del dispositivo desarrollado en este proyecto juega un papel importante en la utilización del mismo y es por esta razón que la interfaz posee una con Es obvio, que a pesar de que los dispositivos de control estén pensados para efectuar un manejo autónomo de los procesos, estos no pueden encontrarse asilados del usuario; que es quien finalmente realiza un seguimiento del sistema como tal (controlador-proceso).

5.3.1. Teclado ps2 5.3.1.1. DESCRIPCIÓN El Teclado consiste de un arreglo matricial utilizado para facilitar la interfaz entre el usuario y un computador. Para la finalidad de este proyecto es relevante considerar: Las Teclas:

Figura 5-8. Teclado Para el desarrollo de este proyecto, se utilizarán las teclas que se muestran en el circulo, teniendo en cuenta el funcionamiento de Shift y Caps Lock e ignorando Alt, Alt Gr, ctrl.. Caps Lock solo influye en las letras, mostrando minúsculas o mayúsculas, mientras que Shift cambia los caracteres de cada tecla. En resumen los caracteres pueden clasificarse así: Sin Shift:

| 1 2 3 4 5 6 7 8 9 0 ' ¿ q w e r t y u i o p ´ + a s d f g h j k l ñ < z x c v b n m , . -

Con Shift: ° ! " # $ % & / ( ) = ? ¡ Q W E R T Y U I O P ¨ * A S D F G H J K L Ñ [ ] > Z X C V B N M ; : _

Especiales

Page 56: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

52

Space Tab Enter Bspc Tabla 1. Clasificación teclas para teclado configurado en Inglés.

El conector

Macho Hembra

1 - DATO 2 - No Implementado 3 - GND 4 - Vcc (+5V) 5 - CLKT 6 - No Implementado

Figura 5-9. Conector Mini-DIN Los leds: Los leds nos indican si tenemos activados: El bloqueo de mayúsculas. (Caps Lock) El bloqueo de números. (Num Lock) El bloqueo de desplazamientos. (Scroll Lock) La palabra de control para encender los led en el teclado es:

0 0 0 0 0 Caps Num Scroll Figura 5-10. Palabra de control, manejo LEDs

Se encienden cuando al teclado se envía la señal de control de activación (“1”s en la posición correspondiente) y se apagan cuando al Teclado se envía la señal de desactivación (“0”s en la posición correspondiente). Para esta aplicación se debe tener en cuenta que se va ha encender el led de Caps Lock únicamente. Descripción de las líneas: Las líneas de DATO y CLKT deben encontrarse en configuración de colector abierto con resistencias de “pull up” a Vcc. En este caso se escogieron resistencias de 10KΩ, que permiten tener un menor consumo de potencia. Funciones del Teclado: El funcionamiento general del Teclado se divide en 4 grades tareas, las dos primeras son: Captura de las teclas oprimidas en la matriz: El microprocesador verifica el estado de la matriz, buscando dos eventos específicos: presionar o soltar una tecla. Cuando sucede el evento el microprocesador determina el “Scan Code” de la tecla mediante la posición de la tecla en la matriz y la búsqueda de su código en una tabla. Codificación del "Scan Code". Dependiendo del protocolo que se maneja, hay diferentes tipos de “Scan Code”, y cada tecla tiene un código especifico (“Make Code”), cuando una tecla es presionada, y mientras lo este, su código es enviado. Al liberarse la tecla, se envía el código de liberación de tecla (“Break Code”) y a continuación el código de la tecla. De modo que si por ejemplo la tecla “A” tiene código “1C”, al presionarla el código es enviado, si la tecla se mantiene presionada durante un tiempo nuevamente el código “1C” y se envía hasta que la tecla sea liberada u otra tecla sea presionada; en el caso en que la tecla sea liberada se envía el “Break Code” y el código “1C”. Si por lo contrario otra tecla es presionada el “Make

Page 57: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

53

Code” de la tecla que interrumpe es enviado, luego el “Break Code”, y por ultimo el “Break Code” de la tecla interrumpida, en este caso “1C”. Esta es la forma como se manejan las teclas Shift, y otras no relevantes en este trabajo. En el caso del protocolo PS/2 se maneja el paquete de “Scan Codes 2”. 5.3.1.2. DESCRIPCION DE LA COMUNICACIÓN: Las otras dos tareas que realiza el teclado están basadas en la comunicación es decir en la transmisión de los códigos al interfaz de teclado en el computador y la recepción los códigos enviados por el computador. Descripción general de la comunicación: El Teclado PS/2 implementa un protocolo serial, síncrono y bidireccional. El BUS esta en espera cuando ambas líneas están en Alto (colector abierto); este es el único estado en el que el Teclado puede iniciar la transmisión de datos. El Host tiene el control sobre el bus y puede inhibir la comunicación en cualquier momento llevando la línea de CLKT a Bajo. El Teclado siempre genera la señal de CLKT. Si el Host quiere enviar un dato, primero debe inhibir la comunicación del Teclado llevando el CLKT a Bajo, y luego debe hacer lo mismo con DATO y soltar CLKT; este es conocido como el estado “Request to Send”, que señala al Teclado que debe comenzar a generar pulsos. Estados del BUS: DATO = Alto, CLKT = Alto: Estado de espera (Teclado habilitado para transmitir). DATO = Alto, CLKT = Bajo: Comunicación inhibida. DATO = Bajo, CLKT = Alto: Request-to-Send Todos los datos se transmiten por Bytes y cada Byte es enviado en una trama consistente de 12 Bits. Estos Bits son: 1 Bit de inicio. Es siempre 0. 8 Bits de DATO, LSB primero. 1 Bit de paridad (impar). 1 Bit de parada. Siempre 1. 1 Bit de reconocimiento (únicamente en la comunicación del Host al Teclado). El Bit de paridad es puesto en 1 si hay un número par de unos en el Byte de DATO y en 0 de lo contrario, de forma tal que el número de unos de la trama es siempre un número impar (sin tener en cuenta el Bit de parada). Esto es utilizado para la detección de errores; el Teclado revisa este Bit y si es incorrecto responde como si hubiese recibido un comando inválido. Los datos enviados desde el Teclado al Host son leídos en el flanco de bajada de la señal de CLKT; los datos enviados desde el Host al Teclado son leídos en el flanco de subida. La frecuencia del CLKT debe estar en el rango entre 10 y 16.7 kHz. Esto significa que CLKT debe permanecer en Alto de 30 a 50 us y en Bajo lo mismo. Al diseñar un emulador de Host se debe asegurar que el cambio de la línea de DATO se de en la mitad del ancho de un pulso de CLKT. Además, el tiempo desde un flanco de CLKT a la transición de DATO debe ser de por lo menos 5 us y no mayor de 25 us. Comunicación del Teclado al PC:

Page 58: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

54

Cuando el Teclado desea enviar información, primero revisa la línea de CLKT y se asegura de que esta se encuentre en un nivel Alto; si no lo esta, el Host esta inhibiendo la comunicación, y el Teclado debe almacenar el dato a enviar hasta que el Host libere CLKT. El Teclado cuenta con un BUFFER que almacena hasta 16 Bytes, cualquier dato generado después de este límite será ignorado. La línea CLKT debe estar continuamente en Alto por al menos 50 us antes de que el Teclado pueda empezar a transmitir datos. Todos los datos se transmiten por Bytes y cada Byte es enviado en una trama consistente de 11 Bits. Estos Bits son: 1 Bit de inicio. Es siempre 0. 8 Bits de DATO, LSB primero. 1 Bit de paridad (impar). 1 Bit de parada. Siempre 1.

Figura 5-11. Diagrama de tiempos comunicación teclado-host

El Teclado escribe un Bit en la línea de DATO cuando CLKT se encuentra en Alto, y es leído por el Host cuando CLKT se encuentra en Bajo. El Host puede inhibir la comunicación en cualquier momento manteniendo la línea de CLKT por al menos 100 us. Si la transmisión es interrumpida el Teclado debe abortar la transmisión y prepararse para retransmitir el faltante. Ese dato faltante puede generar un error, ya que puede ser asimilado como un mensaje independiente. Comunicación del Host al Teclado: Si el Host desea enviar algún dato al Teclado, primero debe llevar las líneas de CLKT y DATO al estado "Request-to-Send" de la siguiente manera: Inhibir la comunicación llevando a CLKT a Bajo por al menos 100 us. Hacer "Request-to-Send" llevando DATO a Bajo y luego liberando CLKT. El Teclado debe revisar este estado en intervalos que no excedan los 10 ms. Cuando el Teclado detecta este estado, empezará a generar señales de CLKT por el espacio del Byte de DATO y el Bit de parada. El Host cambia la línea de DATO únicamente cuando CLKT esta en Bajo; y DATO es leído por el Teclado cuando CLKT esta en Alto. Esto es lo contrario a lo que ocurre cuando se realiza la comunicación del Teclado al PC. Después de que es recibido el Bit de parada el Teclado reconocerá el Byte recibido llevando la línea de DATO a Bajo y generando un último pulso en CLKT. Si el Host no libera la línea de DATO después del onceavo pulso, el Teclado continuara generando pulsos hasta que la línea de DATO sea liberada y luego generara una señal de error. El Host puede abortar la transmisión antes de que se genere el onceavo pulso llevando CLKT a Bajo por al menos 100 us.

Page 59: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

55

Figura 5-12. Diagrama de tiempos comunicación host-teclado

5.3.2. Visualización Existen varias formas de visualizar el resultado que se está obteniendo del controlador, así como también, variables que pueden parecer significativas dentro del sistema de control adaptativo. Por un lado se decidió finalmente que la visualización debía ser gráfica; que es mucho más sencilla de apreciar (entender) y hace al dispositivo mucho más amigable al usuario. Por el otro, de todas las variables posibles1, se decidió utilizar tan solo la señal de referencia y la de salida del proceso; esto se debe principalmente a que el supuesto de partida es que el usuario común2 (en la industria) mantiene su interés centrado en la repuesta del proceso como tal. Sin embargo, si el dispositivo hubiera sido pensado con fines educativos, esta escogencia hubiera sido totalmente diferente. A continuación se presenta el diagrama de Pirbhai-Hatley del bloque de visualización:

Interfaz de Visualización Permite la inicialización de las variables que requiere el

sistema. Visualización

Actualiza y grafi ca las coordenadas

recibidas.

Procesamiento de la Entrada Transformación de los datos a

coordenadas de visualización.

Control Interno Elementos que

permiten el funcionamiento de

este bloque

Procesamiento

de Salida Impresión en la

pantalla del GBA.

Figura 5-13. Diagrama de Pirbhai-Hatley Bloque de Visualización Ya definidas las variables y el método de visualización, surgió la siguiente pregunta, ¿cada cuánto tiempo se deben imprimir los datos? O lo que es lo mismo que preguntar,¿cuál debe ser la escala en el eje temporal? La repuesta más simple a estas preguntas fue la de utilizar el mismo tiempo de muestreo que se tenía para la adquisición de los datos y así evitar tener que utilizar ciclos de espera. Seguramente alguien pensará que no es necesaria la utilización 1 Variables que pueden ser visualizadas. 2 Que no maneja el tema de Control Adaptativo.

Entradas Señales

digitales de referencia

uc(t) y salida del

proceso y(t)

Salidas Gráfi ca de magnitud

vs. tiempo. Señal de

referencia y salida del proceso.

Page 60: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

56

de ciclos de espera ya que tanto el sistema de identificación como el de control son indiferentes al tiempo de muestreo. Esto no es del todo cierto, ya que como hemos visto, el método utilizado aquí para el ajuste de lo parámetros del controlador genera oscilaciones alrededor de cero, y que al tener tiempos de muestreo pequeños afecta de manera directa el algoritmo de identificación, ya que u(t) no sería una señal de excitación persistente.

Figura 5-14. Ejemplo de Visualización

En la Figura 5-14 se muestra como se presenta la visualización en el GBA. Tanto la señal de referencia como la salida del proceso, se toman directamente del ADC; logrando así, que mantengan la misma escala independientemente de su procedencia.

Page 61: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

57

CONCLUSIONES El control adaptativo constituye una herramienta de control útil, cuyas capacidades es necesario explotar. La plataforma utilizada, presenta muchas ventajas que pueden se aprovechadas tanto para el aprendizaje de sistemas embebidos como para la implementación de herramientas con fines comerciales. El trabajo hasta ahora realizado, abre una puerta para la exploración de aplicaciones en este tipo de sistemas. Es posible realizar mejoras al proyecto, especialmente en lo que a identificación se refiere. La introducción de señales de prueba por ejemplo. La introducción de algoritmos en paralelo para evitar singularidades. La ventaja de los controladores STR es que permiten combinar diferentes métodos para cada bloque, permitiendo probar las capacidades de cada uno. La principal ventaja que ofrece este proyecto, es la posibilidad de incursionar en áreas tan importantes en el desarrollo tecnológico actual, como lo son, los sistemas de control, que se encuentran prácticamente en todos los procesos de nuestra sociedad; y los sistemas embebidos, que brindan ventajas en cuanto a costos, rendimiento, tiempos al mercado, etc.

Page 62: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

58

BIBLIOGRAFIA [1] Astrom K. J. and B. Wittenmark, 1995. Adaptive Control, 2a edición. Addison-Wesley. [2] Sastry S. and M. Bodson, 1989. Adaptive Control: stability, convergence and

robustness. Englewood Cliffs, N.J.: Prentice-Hall. [3] Ljung L., 1998. System Identification: Theory for the User. 2a edición. Prentice-Hall. [4] Ogata K., 1994. Discrete-Time Control Systems. 2a edición. Pearson Education. [5] Vélez C. M., 2003. Control Adaptativo aplicado a un Péndulo Invertido. Universidad

EAFIT. Medellín. [6] Rodríguez, Rafael. Sistema Operativo en Tiempo Real (RTOS) para MicroPP-ARM. [7] Charmed Labs., 2003. Xport 2.0 User Guide. Versión 1.4. Disponible en:

www.charmedlabs.com. [8] Charmed Labs., Xport 2.0 Custum Configuration Tutorial. Versión 2.2.Disponible en:

www.charmedlabs.com. [9] University of Michigan., 1997. Control Tutorials for Matlab. Disponible en:

http://www.engin.umich.edu/group/ctm/examples/examples.html [10] Programa para el curso de Adaptive Control. Lund Institute of Technology. Disponible

en: http://www.control.lth.se/~kursar/ [11] A course in Neural Networks for System Identification and Control. Technical

University of Denmark. Disponible en: http://www.iau.dtu.dk/nnbook/Files/course5.pdf

[12]“eCos Manual” Red Hat Disponible en: http://sources.redhat.com [13]“XSA Flash Programming and SpartanII Configuration”, Xess. Disponible en:

www.xess.com [14]Intel Flash Memory Embedded Aplication Solutions. Disponible en:

http://www.intel.com/design/flash/embedded.htm

Page 63: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

59

ANEXOS

A Dispositivo El dispositivo desarrollado se encuentra compuesto por tres componentes: GBA, Xport y la Tarjeta de Expansión.

Figura A-1. Foto GBA-Xport

Figura A-2. Foto Tarjeta de Expansión (vista superior)

Page 64: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

60

Los diagramas de conexión de la Tarjeta de Expansión se presentan a continuación.

Figura A-3. Diagrama de conexión de la Tarjeta de Expansión

Figura A-4. Tarjeta de Expansión, vista superior

Page 65: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

61

Figura A-5. Tarjeta de Expansión, vista inferior

La tarjeta de expansión queda acoplada al GBA-Xport a través del conector de 64 pines User 1.

Figura A-6. Foto Dispositivo de Control Adaptativo

Page 66: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

62

B Código eCos /**************************************************************** * Archivo : AdaptiveControl.c * Descripción : Maneja el algoritmo de Control Adaptativo STR, que * incluye, la interfaz con el usuario (Grafica y teclado), * sistema de identificación RLS con factor de olvido, * sistema de ajuste MDPP con cancelación de cero y * controlador lineal R,S,T. Además, maneja la comunicación * con la FPGA. * Autor : Fernán Pedraza * Fecha : 01/11/2004 ****************************************************************/ #include <cyg/kernel/kapi.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <stdlib.h> #include <float.h> #include <cyg/hal/hal_intr.h> #include <gba.h> #include "include/gba.h" //GBA register definitions #include "include/screenmode.h" //REG_DISPCNT register #defines #include "include/keypad.h" //gba button registers #include "include/sprite.h" //sprite definitions #include "bg.pal.c" //cotains data and palette for the background #include "bg.raw.c" //cotains data and palette for the background #define control *((volatile unsigned short*)0x9ffc400) //controla las interrupciones de los periféricos #define keyboard *((volatile unsigned short*)0x9ffc402) //dirección teclado #define AdcData *((volatile unsigned short*)0x9ffc404) //dirección dato ADC #define AdcAddr *((volatile unsigned short*)0x9ffc406) //dirección pin de entrada ADC #define DacData *((volatile unsigned short*)0x9ffc408) //dirección salida DAC #define Nmax 3 //máximo grado de A(q) //////////////////////////////// cyg_thread thread; char stack[4096]; cyg_handle_t simple_thread; cyg_thread_entry_t program; cyg_mutex_t cliblock; cyg_handle_t int_0_ISR_H; cyg_interrupt intr; cyg_mutex_t cliblock; ///////////////////////////// int i,j,k,n=2,m=1,key,prueba=0; double *M,*M1,*M2,*coc,*res; double VrefMax=5,VrefMin=0; //Voltajes de referencia para los conversores cyg_uint32 int_0_isr(cyg_vector_t vector,cyg_addrword_t data) i+=1; prueba=prueba+1; cyg_interrupt_acknowledge(vector); //return CYG_ISR_CALL_DSR; return CYG_ISR_HANDLED; /* this is the DSR for ext 0 interrupts */ void int_0_dsr(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) // Mode 4 is 240(120)x160 by 8bit void PlotPixel(int x,int y, unsigned short int c)

Page 67: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

63

VideoBuffer[(y)*120 + (x)] = (c); //loads the palette of the objects /*void LoadOBJPalette() int x; for( x = 0; x < 256; x++ ) OBJPaletteMem[x] = arrow_Palette[x]; */ //draws the background picture to the screen (also initializes palette) void DrawBG() int x,y; for(x = 0; x < 256; x++) BGPaletteMem[x] = bg_Palette[x]; for(y=0; y < 160; y++) for(x=0; x < 120; x++) PlotPixel(x, y, ( bg_Bitmap[y*240 + ( 2*x + 1) ] << 8 ) + ( bg_Bitmap[y*240 + 2*x]) ); double get_value(void) int neg=1,punto=0,oldi=0, keyaux=0; double value=0; i=0; while(i==0 || keyaux!=32) //esperar a que se ingrese todo el numero if(i!=oldi) //debe haber un nuevo dato key=keyboard/256; keyaux=key; if(oldi==0 && key==45) //es negativo? neg=-1; else if(key==46 || key==62) //hay punto? punto=1; i=0; else if(key>=48 && key<=57) key=key-48; //convertir ASCII a entero if(punto==0) value=value*10+key; else value=value+key*pow(10,-i); oldi=i; value=value*neg; printf("%lf\n",value); return value; void matrix_addition(int rM, int cM, int operand) for (i = 0; i < rM; i++) for (j = 0; j < cM; j++) *(M+cM*i+j)=*(M1+cM*i+j)+operand**(M2+cM*i+j);

Page 68: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

64

void matrix_multiplication(int rM1, int cM1, int rM2, int cM2) for (i = 0; i < rM1; i++) for (j = 0; j < cM2; j++) *(M+cM2*i+j)=0; for (k = 0; k < cM1; k++) *(M+cM2*i+j)=*(M+cM2*i+j)+*(M1+cM1*i+k)**(M2+cM2*k+j); void scalar_multiplication(int rM1, int cM1, double scalar) for (i = 0; i < rM1; i++) for (j = 0; j < cM1; j++) *(M+cM1*i+j)=scalar**(M1+cM1*i+j); void polinomial_multiplication(int deg1, int deg2) for (i = 0; i < n+m; i++) //inicialización *(M+i)=0; for (i = 0; i <= deg1; i++) for (j = 0; j <= deg2; j++) *(M+i+j)=*(M+i+j)+*(M1+i)**(M2+j); void polinomial_division(int deg1, int deg2) for(i=0;i<=deg1;i++) *(res+i)=*(M1+i); for(i=0;i<=(deg1-deg2);i++) *(coc+i)=*(res+i)/(*(M2)); for(j=0;j<=deg2;j++) *(res+i+j)=*(res+i+j)-*(coc+i)**(M2+j); void cyg_user_start(void) printf("\n\n Control Adaptativo\n Programa V1.0\n\n"); control=0x04; //deshebilitar muestreo del ADC cyg_mutex_init(&cliblock); cyg_thread_create(4, program, (cyg_addrword_t) 0, "Thread", (void *) stack, 4096, &simple_thread, &thread); /* create an interrupt handler with int_0_isr() as the ISR and int_0_dsr() as the DSR.*/ cyg_interrupt_create(CYGNUM_HAL_INTERRUPT_CART, 99, 0, &int_0_isr, &int_0_dsr, &int_0_ISR_H, &intr); cyg_interrupt_attach(int_0_ISR_H); cyg_interrupt_unmask(CYGNUM_HAL_INTERRUPT_CART); cyg_interrupt_enable(); cyg_thread_resume(simple_thread); void program(cyg_addrword_t data) /*ESTIMACIÓN - denominador función de transferencia planta A(q)=q n+a1q^(n-1)+a2q^(n-2)+...+an deg(A)=n - numerador función de transferencia planta B(q)=b0q^m+b1q (m-1)+b2q^(m-2)+...+bm deg(B)=m - parámetros estimados theta=a1 a2 ... an b0 ... bm deg(theta)=n+m+1

Page 69: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

65

- d0=deg(A)-deg(B) d0=n-m - vector de regresión phi=-y(t-1) ... -y(t-n) u(t-d0) ... u(t-d0-m) deg(phi)=n+m+1 DISEÑO - denominador función de transferencia lazo cerrado Am(q)=q^n+am1q (n-1)+am2q (n-2)+...+amn deg(Am)=deg(A)=n - numerador función de transferencia lazo cerrado Bm(q)=bm0q m+bm1q^(m-1)+bm2q (m-2)+...+bmm deg(Bm)=deg(B)=m CONTROLADOR - función del controlador lineal RST Ru(t)=Tuc(t)-Sy(t) */ cyg_uint16 value; //cyg_uint16 sample1=0xFFFF,sample2,sample3; int N=n+m+1,oldi,xcoor,xf=10,xl=110,ycoor1,ycoor2,yf=20,yl=140,cont; double yGain=1,yDC=0,uGain=1,uDC=0,Umax,Umin; double y,lambda=0.999,e,Ke[2*Nmax+1], old_theta[2*Nmax+1]=0,0,0.01,0.2, theta[2*Nmax+1],phi[2*Nmax+1]=0,0,0,0, K[2*Nmax+1],old_P[2*Nmax+1][2*Nmax+1]=1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1, P[2*Nmax+1][2*Nmax+1]; double Ao[Nmax]=1,A[Nmax+1],Am[Nmax+1]=1,-1,0.1,B[Nmax+1],AoAm[2*Nmax+1], Rp[Nmax],R[2*Nmax],S[Nmax],T[Nmax+1],am; double ut,uc,U[Nmax-1]=0,Uc[Nmax-1]=0,0; double matrix_aux[2*Nmax+1][2*Nmax+1],vector_aux[2*Nmax+1],scalar_aux; /****************************************************************************/ // ADQUISICIÓN DE DATOS (Inicialización Variables) // /****************************************************************************/ /* //CONVERSIÓN //inicialización ganancia y nivel DC printf("ADCin = Gain*y(t)+DClevel\nGain = ?\n "); yGain=get_value(); printf("DClevel = ?\n "); yDC=get_value(); */ //PARÁMETROS RLS //inicialización de theta printf("A(q)=q^n+a1q^(n-1)+...+an\ndeg(A) = n? "); n=get_value(); for(j=1;j<=n;j++) printf("a%d =\n ",j); old_theta[j-1]=get_value(); printf("\nB(q)=b0q^m+b1q (m-1)+...+bm\ndeg(B) = m? "); m=get_value(); for(j=0;j<=m;j++) printf("b%d =\n ",j); old_theta[n+j]=get_value(); N=n+m+1; //inicialización factor de olvido printf("\nForgetting factor 0<lambda<=1\n"); printf("lambda =\n "); lambda=get_value(); //inicialización matriz de covarianza printf("\nMatriz de covarianza P\n"); for(j=0;j<N;j++) printf("P(%d,%d) =\n ",j+1,j+1); *(*old_P+(N+1)*j)=get_value(); //PARÁMETROS MDPP with zero cancellation //inicialización Am printf("\nAm(q)=q^n+am1q (n-1)+...+amn\n");

Page 70: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

66

Am[0]=1; for(j=1;j<=n;j++) printf("am%d =\n ",j); Am[j]=get_value(); //inicialización Ao printf("\nAo(q)=q l+ao1q (l-1)+...+aol\ndeg(Ao) = %d\n",n-m-1); Ao[0]=1; for(j=1;j<=n-m-1;j++) printf("ao%d =\n ",j); Ao[j]=get_value(); printf("\n Iniciando Control... \n"); cyg_thread_delay(50); /***************************************************************************/ // ALGORITMO DE CONTROL (Indirect Self-Tuning Regulator) // /***************************************************************************/ Umax=4.4*uGain+uDC; Umin=uDC; M=&AoAm; //deg(AoAm)=2*n-m-1 M1=&Ao; //deg(Ao)=n-m-1 M2=&Am; //deg(Am)=n polinomial_multiplication(n-m-1,n); //Ao*Am SetMode(MODE_4 | OBJ_ENABLE | OBJ_MAP_1D | BG2_ENABLE); DrawBG(); //inicialización coordenadas xcoor=xf; ycoor1=xf+(xl+xf)/2; ycoor2=xf+(xl+xf)/2; //*************/ control=0x00; AdcAddr=0x00; //lectura de u(t) //for(cont=0;cont<5;cont++) while(1) control=0x00; oldi=i; while(oldi==i) uc=AdcData/255; AdcAddr=0x02; //lectura de y(t) ycoor1=yl-uc/255*(yl-yf); uc=uc*(VrefMax-VrefMin)/255+VrefMin; //conversión debida al ADC uc=(uc-yDC)/yGain; //conversión debida al ajuste externo for(i=n-1;i>=1;i--) Uc[i]=Uc[i-1]; Uc[0]=uc; oldi=i; control=0x02; while(oldi==i) y=AdcData/255; AdcAddr=0x01; //lectura de uc(t) //control=0x01; //deshabilitar interrupciones //oldi=prueba; ycoor2=yl-y/255*(yl-yf); y=y*(VrefMax-VrefMin)/255+VrefMin; //conversión debida al ADC y=(y-yDC)/yGain; //conversión debida al ajuste externo /* cyg_mutex_lock(&cliblock); printf("u: %lf y:%lf\n",uc,y);

Page 71: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

67

cyg_mutex_unlock(&cliblock); */ //cyg_mutex_lock(&cliblock); if(xcoor>xl) xcoor=xf; DrawBG(); //PlotPixel(xcoor,ycoor1,10); PlotPixel(xcoor,ycoor2,1); PlotPixel(xcoor,ycoor1,10); xcoor=xcoor+1; //cyg_mutex_unlock(&cliblock); /***************************************************************************/ //ESTIMACIÓN DE PARÁMETROS EN TIEMPO REAL (RLS with exponential forgetting)// //error e(t)=y(t)-phiT(t-1)*theta(t-1) M=&scalar_aux; M1=&phi; M2=&old_theta; matrix_multiplication(1,N,N,1); // phiT(t-1)*theta(t-1) e=y-scalar_aux; /* cyg_mutex_lock(&cliblock); printf("error: %lf\n",e); cyg_mutex_unlock(&cliblock); */ //K K(t)=P(t-1)*phi(t-1)*(lambda+phiT(t-1)*P(t-1)*phi(t-1)) -1 M=&vector_aux; M1=&old_P; M2=&phi; matrix_multiplication(N,N,N,1); // P(t-1)*phi(t-1) M=&scalar_aux; M1=&phi; M2=&vector_aux; matrix_multiplication(1,N,N,1); // phiT(t-1)*P(t-1)*phi(t-1) scalar_aux=1/(scalar_aux+lambda); M=&K; M1=&vector_aux; M2=&scalar_aux; matrix_multiplication(N,1,1,1); // P(t-1)*phi(t-1)*(lambda+phiT(t-1)*P(t-1)*phi(t-1))^-1 //P P(t)=(I-K(t)*phiT(t-1))*P(t-1)/lambda M1=&K; M2=&phi; for(i=0;i<N;i++) for(j=0;j<N;j++) matrix_aux[0][N*i+j]=*(M1+i)**(M2+j); // I-K(t)*phiT(t-1) if(i==j) // (I-K(t)*phiT(t-1)) matrix_aux[0][N*i+j]=1-matrix_aux[0][N*i+j]; else matrix_aux[0][N*i+j]=-matrix_aux[0][N*i+j]; M=&P; M1=&matrix_aux; M2=&old_P; matrix_multiplication(N,N,N,N); // (I-K(t)*phiT(t-1))*P(t-1) M=&old_P; M1=&P; scalar_multiplication(N,N,1/lambda); // (I-K(t)*phiT(t-1))*P(t-1)/lambda //theta theta(t)=theta(t-1)+K(t)*e(t) M=&Ke; M1=&K; scalar_multiplication(N,1,e); // K(t)*e(t)

Page 72: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

68

M=&theta; M1=&Ke; M2=&old_theta; matrix_addition(N,1,1); // theta(t-1)+K(t)*e(t) /*printf("Phi: "); for(i=0;i<N;i++) printf("%lf ",phi[i]); printf("\n"); printf("P: "); for(i=0;i<4;i++) printf("%lf ",old_P[0][i]); printf("\n"); */ //printf("theta:\n"); //actualización theta for(i=0;i<N;i++)// old_theta[i]=theta[i]; //printf(" %5.4lf ",theta[i]); //printf("\n"); /***************************************************************************/ // DISEÑO DEL CONTROLADOR (MDPP with zero cancellation) // A[0]=1; for(i=0;i<=n;i++) if(i<n) A[i+1]=theta[i]; if(i<=m) B[i]=theta[n+i]; coc=&Rp;//deg(Rp)=deg(Ao)=n-m-1 res=&S; //deg(S)=n-1 M1=&AoAm; M2=&A; polinomial_division(2*n-m-1,n); //Ao*Am/A=Rp+b0*S //printf("b0s: %lf\n",S[1]); M=&R; //deg(R)=n-1 M1=&Rp; M2=&B; polinomial_multiplication(n-m-1,m); //Rp*B am=0; for(i=0;i<=n;i++) am=am+Am[i]; for(i=0;i<=n-1;i++) //deg(R)=deg(S)=deg(T)=n-1 R[i]=R[i]/B[0]; //R=Rp*B/b0 S[i]=S[i+1]/B[0]; if(i==m-1) T[i]=am/B[0]; //T=Am(1)*q^d0/b0 else T[i]=0; /* printf("R: "); for(i=0;i<=n-1;i++) printf(" %lf",R[i]); printf("\nS: "); for(i=0;i<=n-1;i++) printf(" %lf",S[i]); printf("\nT: "); for(i=0;i<=n-1;i++)

Page 73: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

69

printf(" %lf",T[i]); printf("\n\n"); /***************************************************************************/ // CONTROLADOR LINEAL RST // ut=S[0]*(-y); for(i=0;i<=n-1;i++) ut=ut+T[i]*Uc[i]-R[i+1]*U[i]; if(i>0) ut=ut+S[i]*phi[i-1]; //printf("+ut= %lf\n",ut); //printf("ut: %lf\n",ut); for(i=0;i<=n-1;i++) if(i<n-1) if(n>1) U[n-1-i]=U[n-2-i]; phi[n-1-i]=phi[n-2-i]; //actualización phi if(i<=m-1) if(m>0) phi[n+m-i]=phi[n+m-i-1]; //actualización phi /* cyg_mutex_lock(&cliblock); printf("Uc= %lf\n",ut); cyg_mutex_unlock(&cliblock); */ U[0]=ut; //conversión ut=(ut-uDC)/uGain; ut=(ut*255)/4.4; if(ut>255) U[0]=Umax; value=255; else if(ut<0) U[0]=Umin; value=0; else value=ut; //printf("value: %d\n",value); phi[0]=-y; phi[n]=U[n-m-1]; /* cyg_mutex_lock(&cliblock); printf("Uc: %lf %lf\n\n",Uc[0],Uc[1]); cyg_mutex_unlock(&cliblock); */ /*cont=cont+40; if(cont>=255) cont=0; value=cont; */ DacData = value; //DacData = 0xFF; //PlotPixel(xcoor,ycoor1,10); //xcoor=xcoor+1;

Page 74: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

70

C Código VHDL --*************************************************************** -- Archivo : AdaptiveControl.vhd -- Descripción : Este archivo maneja la intefaz del sistema -- de control adaptativo STR desarrollado para -- el GBA-Xport 2.0 -- Autor : Fernán Pedraza -- Fecha : 01/11/2004 --*************************************************************** PS2.vhd library IEEE; use IEEE.std_logic_1164.ALL; use IEEE.std_logic_ARITH.ALL; use IEEE.std_logic_UNSIGNED.ALL; --------------------------------------------------------------------------------------- -- Declaración de las variables de entrada y salida de la FPGA -- --------------------------------------------------------------------------------------- entity PS2 is port( --Señales de conexión con el cartucho del GBA CartData : inout std_logic_vector(15 downto 0); --Data CartAddr : in std_logic_vector(7 downto 0); --Address CartCs : in std_logic; --Chip Select CartRd : in std_logic; --Read CartWr : in std_logic; --Write CartIReq : out std_logic; --Interrupt Request CartClk : out std_logic; --Clock -- Señales de conexión con la memoria Flash (4M) FData : inout std_logic_vector(7 downto 0); --Data FAddr : out std_logic_vector(20 downto 0); --Address FCe : out std_logic; --Chip Enable FOe : out std_logic; --Output Enable FWe : out std_logic; --Write Enable --Reloj de la tarjeta Xport 2.0 de 50 MHz clk : in std_logic; --Habilitador de la memoria SDRAM RCs : out std_logic; --Reset externo Reset : in std_logic; --Global Asinchronous reset --Señales relacionadas con la comunicación ps2 (control de errores)

err_clr_i : in std_logic; -- Clear error flags frame_err_o : out std_logic; -- Error receiving data parity_err_o : out std_logic; -- Error IN received data parity busy_o : out std_logic; -- uart busy wdt_o : out std_logic; -- Watchdog timer out every 400uS --Señales de conexión con el teclado PS2 ps2_data_io : inout std_logic; ps2_clk_io: inout std_logic; --Señales de conexión con el ADC0808 AdcData : in std_logic_vector(7 downto 0); --ADC digital data AdcAdd : out std_logic_vector(2 downto 0); --ADC address signal AdcRd : out std_logic; --ADC read AdcWr : out std_logic; --ADC write AdcInt : in std_logic; --ADC interrupt AdcClk : out std_logic; --ADC clock --Señales de conexión con el DAC1008 DacData : out std_logic_vector(9 downto 0); --DAC data DacWr : out std_logic); --DAC write end PS2; --------------------------------------------------------------------------------------- -- Arquitectura -- --------------------------------------------------------------------------------------- architecture Behavioral of PS2 is

Page 75: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

71

----------------------------------------------------------------------------------------- --primary se encarga de la comunicación básica entre el GBA y la Xport, ----------------------------------------------------------------------------------------- component primary is port( --GBA cartridge CartData : inout std_logic_vector(15 downto 0); --Data CartAdd : in std_logic_vector(7 downto 0); --Address CartCs : in std_logic; --Chip Select CartRd : in std_logic; --Read CartWr : in std_logic; --Write --Flash FData : inout std_logic_vector(7 downto 0); --Data FAddr : out std_logic_vector(20 downto 0); --Address FCe : out std_logic; --Chip Enable FOe : out std_logic; --Output Enable FWe : out std_logic; --Write Enable --50 MHz Clock Clk : in std_logic; --Bus Decoder Addr : out std_logic_vector(23 downto 0); --Address Rd : out std_logic; --Read Wr : out std_logic; --Write DataRd : in std_logic_vector(15 downto 0)); --Data Read end component primary; --------------------------------------------------------------------------------------- -- Variables Auxiliares -- --------------------------------------------------------------------------------------- --Variables para la comunicación con primary signal Addr : std_logic_vector(23 downto 0); signal Rd : std_logic; signal Wr : std_logic; signal DataRd : std_logic_vector(15 downto 0); --Tablas para el manejo del teclado TYPE tb1 IS ARRAY (0 TO 3) OF std_logic_vector(7 downto 0); CONSTANT tabla1:tb1:=(x"29",x"0d",x"5a",x"66"); TYPE tb2 IS ARRAY (0 TO 25) OF std_logic_vector(7 downto 0); CONSTANT tabla2:tb2:=( x"15",x"1d",x"24",x"2d",x"2c",x"35",x"3c",x"43",x"44",x"4d", x"1c",x"1b",x"23",x"2b",x"34",x"33",x"3b",x"42",x"4b",x"1a", x"22",x"21",x"2a",x"32",x"31",x"3a"); TYPE tb3 IS ARRAY (0 TO 20) OF std_logic_vector(7 downto 0); CONSTANT tabla3:tb3:=( x"0e",x"16",x"1e",x"26",x"25",x"2e",x"36",x"3d",x"3e",x"46", x"45",x"4e",x"55",x"5d",x"54",x"5b",x"4c",x"52",x"41",x"49", x"4a"); TYPE rom IS ARRAY (0 TO 97) OF std_logic_vector(7 downto 0); CONSTANT tabla:rom:=( x"20",x"09",x"20",x"08",x"71",x"77",x"65",x"72",x"74",x"79", x"75",x"69",x"6F",x"70",x"61",x"73",x"64",x"66",x"67",x"68", x"6A",x"6B",x"6C",x"7A",x"78",x"63",x"76",x"62",x"6E",x"6D", x"7E",x"31",x"32",x"33",x"34",x"35",x"36",x"37",x"38",x"39", x"30",x"2D",x"2B",x"7C",x"5B",x"5D",x"3A",x"22",x"3C",x"3E", x"3F",x"51",x"57",x"45",x"52",x"54",x"59",x"55",x"49",x"4F", x"50",x"41",x"53",x"44",x"46",x"47",x"48",x"4A",x"4B",x"4C", x"5A",x"58",x"43",x"56",x"42",x"4E",x"4D",x"60",x"21",x"40", x"23",x"24",x"25",x"5E",x"26",x"2A",x"28",x"29",x"5F",x"3D", x"5C",x"7B",x"7D",x"3B",x"27",x"2C",x"2E",x"2F");

Page 76: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

72

--Definición de estados para los diferentes procesos TYPE states IS (idle, write_request, start, data, parity, stop); TYPE debounce_states IS (stable, rise, fall, wait_stable); TYPE control_states IS (stable, rise, fall, wait_stable); TYPE STATE_TYPE IS (s0, s1, s2, s3, s4, s5, s6, s7, s9); TYPE bustabs IS (buscar,bustabla1,bustabla2,bustabla3,indice); TYPE ADC_state IS (stable,start,EOC_down,EOC_up,read,get_value,keep_value,wait_stable); TYPE DAC_state IS (stable,start,write); signal bustab : bustabs; CONSTANT DEBOUNCE_BITS : INTEGER := 8; CONSTANT WATCHDOG_BITS : INTEGER := 8; signal control_state : control_states; signal AdcControl : ADC_state; signal DacControl : DAC_state; signal estado : STATE_TYPE; signal state : states; signal debounce_state : debounce_states; signal envia : std_logic_vector(7 downto 0); -- Data out signal nvo_ok : std_logic; -- Ifb flag clear input signal habtx : std_logic; -- Obf flag set input signal nvo : std_logic; -- Received data available signal obf_o : std_logic; -- Data ready to sent signal debounce_cnt : std_logic_vector(DEBOUNCE_BITS-1 downto 0); signal debounce_cao : std_logic; signal ps2_clk_syn : std_logic; -- PS2 clock input syncronized signal ps2_clk_clean : std_logic; -- PS2 clock debounced and clean signal ps2_clk_fall : std_logic; -- PS2 clock fall edge signal ps2_clk_rise : std_logic; -- PS2 clock rise edge signal ps2_data_syn : std_logic; -- PS2 data input syncronized signal ps2_clk_out : std_logic; -- PS2 clock output signal ps2_data_out : std_logic; -- PS2 clock output signal writing : std_logic; -- read / write cycle flag signal shift_cnt : std_logic_vector(2 downto 0); signal shift_cao : std_logic; -- Shift counter carry out signal shift_reg : std_logic_vector(8 downto 0); signal shift_in : std_logic; -- Shift register to right signal shift_load : std_logic; -- Shift register parallel load signal shift_calc_parity : std_logic; -- Shift register set parity signal wdt_cnt : std_logic_vector(WATCHDOG_BITS-1 downto 0); signal wdt_rst : std_logic; -- watchdog reset signal wdt_cao : std_logic; -- watchdog carry out signal shift_parity : std_logic; -- Current parity OF shift_reg signal ibf : std_logic; -- IBF, IN Buffer Full signal obf : std_logic; -- OBF, Out Buffer Full signal parity_err : std_logic; -- Parity error signal frame_err : std_logic; -- Frame error signal fa : std_logic; signal nvoaux : std_logic; signal cpsaux : std_logic; signal bc : std_logic; signal datoin : std_logic_vector(7 downto 0); signal led : std_logic_vector(7 downto 0); signal datout : std_logic_vector(7 downto 0); signal cps : std_logic; --bandera de caps signal shf : std_logic; signal i : INTEGER RANGE 0 TO 200; signal ascii_ok : std_logic; signal PS2En : std_logic; signal Control : std_logic_vector(7 downto 0); signal ControlEn : std_logic; signal AdcEn : std_logic; signal micro_cao : std_logic; signal ADCclk_cnt : std_logic_vector(7 downto 0); signal ADCclk_cao : std_logic; signal sampleclk_cao : std_logic; signal sampleclk_cnt : std_logic_vector(27 downto 0);

Page 77: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

73

signal tWS : std_logic_vector(7 downto 0); signal tW : std_logic_vector(7 downto 0); signal AdcData_aux : std_logic_vector(7 downto 0); signal AdcData_ok : std_logic; signal AdcAddrEn : std_logic; signal control_clean : std_logic; signal adc_eoc_syn : std_logic; signal control_cnt : std_logic_vector(3 downto 0); signal control_rise : std_logic; signal control_cnt_cao : std_logic; signal DacEn : std_logic; begin --Instanciación del bloque primary ----------------------------------------------------------------------------------------------------------- X1: primary port map (CartData, CartAddr, CartCs, CartRd, CartWr, FData, FAddr, FCe, FOe, FWe, Clk, Addr, Rd, Wr, DataRd); -- Sincronizaición de las señales de entrada del ps2 ----------------------------------------------------------------------------------------------------------- syn_ps2 : process (clk, reset) begin if reset = '0' then -- asynchronous reset (active low) ps2_clk_syn <= '0'; ps2_data_syn <= '0'; elsif clk'event and clk = '1' then -- rising clock edge ps2_clk_syn <= TO_X01(ps2_clk_io); ps2_data_syn <= TO_X01(ps2_data_io); end if; end process syn_ps2; -- clk debounce timer ----------------------------------------------------------------------------------------------------------- debounce_count : process (clk, reset) begin if reset = '0' then -- asynchronous reset (active low) debounce_cnt <= (others => '0'); elsif clk'event and clk = '1' then -- rising clock edge if (ps2_clk_fall or ps2_clk_rise or debounce_cao) = '1' then debounce_cnt <= (others => '0'); else debounce_cnt <= debounce_cnt + 1; end if; end if; end process; debounce_cao <= debounce_cnt(DEBOUNCE_BITS-1); debounce_stm : process (clk, reset) begin if reset = '0' then debounce_state <= stable; ps2_clk_clean <= '0'; elsif clk'event and clk = '1' then CASE debounce_state is when stable => if ps2_clk_clean /= ps2_clk_syn then if ps2_clk_syn = '1' then debounce_state <= rise; else debounce_state <= fall; end if; end if; when wait_stable => if debounce_cao = '1' then debounce_state <= stable;

Page 78: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

74

end if; when rise => debounce_state <= wait_stable; ps2_clk_clean <= '1'; when fall => debounce_state <= wait_stable; ps2_clk_clean <= '0'; when others => NULL; end CASE; end if; end process; ps2_clk_fall <= '1' when debounce_state = fall else '0'; ps2_clk_rise <= '1' when debounce_state = rise else '0'; -- ps2 watchdog ---------------------------------------------------------------------------------------------------------- wdt_proc : process(clk, reset) begin if reset = '0' then -- asynchronous reset (active low) wdt_cnt <= (others => '0'); elsif clk'event and clk = '1' then -- rising clock edge if (wdt_rst or wdt_cao) = '1' then wdt_cnt <= (others => '0'); elsif debounce_cao = '1' then wdt_cnt <= wdt_cnt + 1; end if; end if; end process; wdt_cao <= wdt_cnt(WATCHDOG_BITS-1); wdt_rst <= ps2_clk_fall; -- Registro de cambio ---------------------------------------------------------------------------------------------------------- shift : process (clk, reset) begin if reset = '0' then -- reset asíncrono (activo bajo) shift_reg <= (others => '0'); elsif clk'event and clk = '1' then -- rising clock edge if shift_load = '1' then shift_reg(7 downto 0) <= envia; shift_reg(8) <= '0'; elsif shift_calc_parity = '1' then shift_reg(8) <= NOT shift_parity; elsif shift_in = '1' then shift_reg(7 downto 0) <= shift_reg(8 downto 1); shift_reg(8) <= ps2_data_syn; end if; end if; end process; -- Contador de cambio ---------------------------------------------------------------------------------------------------------- sft_cnt : process(clk, reset) begin if reset = '0' then -- asynchronous reset (active low) shift_cnt <= (others => '0'); elsif clk'event and clk = '1' then -- rising clock edge if state = start then shift_cnt <= (others => '0'); elsif state = data and ps2_clk_fall = '1' then shift_cnt <= shift_cnt + 1; end if; end if; end process; shift_cao <= '1' when shift_cnt = "111" else '0'; -- Generador de bit de paridad (impar) ---------------------------------------------------------------------------------------------------------- shift_parity <= (shift_reg(0) xor shift_reg(1) xor shift_reg(2) xor shift_reg(3) xor

Page 79: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

75

shift_reg(4) xor shift_reg(5) xor shift_reg(6) xor shift_reg(7)); -- Máquina de estado principal para la comunicación con el teclado ---------------------------------------------------------------------------------------------------------- stm : process (clk, reset) begin if reset = '0' then -- asynchronous reset (active low) state <= idle; writing <= '0'; elsif clk'event and clk = '1' then -- rising clock edge CASE state IS -- Espera reloj when idle => if habtx = '1' and writing = '0' then state <= write_request; writing <= '1'; elsif ps2_clk_fall = '1' then state <= start; end if; -- Solicitud de escritura, bajando ps2_clk when write_request => if wdt_cao = '1' then state <= idle; end if; -- bit de inicio, pulso 1 when start => if wdt_cao = '1' then state <= idle; elsif ps2_clk_fall = '1' then state <= data; end if; -- Clocks 2-9, Data bits (LSB first) when data => if wdt_cao = '1' then state <= idle; elsif ps2_clk_fall = '1' and shift_cao = '1' then state <= parity; end if; -- bit de paridad, pulso 10 when parity => if wdt_cao = '1' then state <= idle; elsif ps2_clk_fall = '1' then state <= stop; end if; -- bit de stop, pulso 11 when stop => writing <= '0'; state <= idle; when others => NULL; end CASE; end if; end process; -- Banderas de estado ---------------------------------------------------------------------------------------------------------- flags_proc : process (clk, reset, state, writing) begin -- Bandera de escritura en registro de entrada if reset = '0' then ibf <= '0'; parity_err <= '0'; frame_err <= '0'; elsif clk'event and clk = '1' then -- rising clock edge -- Bandera de error de paridad if err_clr_i = '1' then

Page 80: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

76

parity_err <= '0'; elsif writing = '0' and state = stop then if shift_reg(8) /= NOT shift_parity then parity_err <= '1'; end if; end if; -- Bandera de error de marco if err_clr_i = '1' then frame_err <= '0'; elsif (state = start or state = data or state = parity) and wdt_cao = '1' then frame_err <= '1'; end if; -- Bandera de registro de entrada lleno if nvo_ok = '1' then ibf <= '0'; elsif writing = '0' and state = stop then if shift_reg(8) = NOT shift_parity then ibf <= '1'; datoin <= shift_reg(7 downto 0); end if; end if; end if; end process; obf <= writing; -- Control del registro de cambio ---------------------------------------------------------------------------------------------------------- shift_load <= '1' when habtx = '1' else '0'; shift_calc_parity <= '1' when state = idle and writing = '1' else '0'; shift_in <= ps2_clk_fall when state = data or state = start else '0'; -- Salida del ps2 ---------------------------------------------------------------------------------------------------------- syn_ps2_out : process (clk, reset) begin if reset = '0' then -- asynchronous reset (active low) ps2_data_out <= '1'; ps2_clk_out <= '1'; elsif clk'event and clk = '1' then -- rising clock edge -- Dato de salida ps2 if writing = '1' then if state = idle then ps2_data_out <= '0'; elsif state = data or state = start then ps2_data_out <= shift_reg(0); else ps2_data_out <= '1'; end if; end if; -- Reloj de salida ps2 if state = write_request then ps2_clk_out <= '0'; else ps2_clk_out <= '1'; end if; end if; end process; --Señales de control de error ------------------------------------------------------------------------------------------------

nvo <= ibf; obf_o <= obf; --busy_o <= '1' when state = idle and writing = '0' else '0'; parity_err_o <= parity_err; frame_err_o <= frame_err;

Page 81: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

77

wdt_o <= wdt_cao; --Control líneas de dato y clk del teclado ------------------------------------------------------------------------------------------------

ps2_clk_io <= '0' when ps2_clk_out = '0' else 'Z'; ps2_data_io <= '0' when ps2_data_out = '0' else 'Z'; --Controlador teclado ------------------------------------------------------------------------------------------------

driver : process (clk, reset, nvo) varible aux : std_logic; begin if reset = '0' then fa <= '0'; shf <= '0'; cps <= '0'; cpsaux <= '0'; bc <= '0'; habtx <= '0'; envia <= x"FF"; datout <= "00000000"; led <= "00000000"; aux := '0'; estado <= s0; elsif clk'event and clk = '1' then CASE estado IS when s0 => nvo_ok <= '0'; nvoaux <= '0'; if nvo = '0' then habtx <= '0'; estado <= s0; elsif nvo = '1' then estado <= s1; end if; when s1 => nvo_ok <= '1'; if datoin = x"FA" then --teclado recibe correctamente estado <= s2;

elsif datoin = x"EF" or datoin = x"FE" then --teclado --recibe comando incorrecto

estado <= s2; elsif datoin = x"F0" then --llega un break code estado <= s3; elsif bc = '1' then estado <= s4; elsif bc = '0' then estado <= s5; else estado <= s0; end if; when s2 => if fa = '0' then envia <= led; habtx <= '1'; fa <='1'; estado <= s7; else fa <= '0'; estado <= s0; end if; when s3 => habtx <= '0'; bc <= '1'; estado <= s0;

Page 82: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

78

when s4 => bc <= '0'; if datoin = x"59" then --shift 1 shf <= '0'; elsif datoin = x"12" then --shift 2 shf <= '0'; elsif datoin = x"58" then cpsaux <= '0'; end if; estado <= s0; when s5 => if datoin = x"59" then --shift 1 shf <= '1'; estado <= s0; elsif datoin = x"12" then --shift 2 shf <= '1'; estado <= s0; elsif datoin = x"58" then --caps estado <= s6; else datout <= datoin; nvoaux <= '1'; estado <= s0; end if; when s6 => if cpsaux = '0' then cpsaux <= '1'; habtx <= '1'; envia <= x"ED"; aux := NOT aux; led(2) <= aux; cps <= aux; estado <= s7; else estado <= s0; end if; when s7 => if obf_o = '0' then habtx <= '0'; estado <= s0; else estado <= s7; end if; when others => estado <=s0; end CASE; end if; end process; --Búsqueda en las tablas ------------------------------------------------------------------------------------------------

busqueda : process (clk, reset, nvoaux) varible index : INTEGER RANGE 0 TO 25; varible tbl1 : std_logic; varible tbl2 : std_logic; varible tbl3 : std_logic; begin if reset = '0' then index :=0; tbl1:='0'; tbl2:='1'; tbl3:='0'; ascii_ok <= '1';

Page 83: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

79

bustab <= buscar; elsif clk'event and clk = '1' then CASE bustab is when buscar => if nvoaux = '1' then index :=0; tbl1:='0'; tbl2:='1'; tbl3:='0'; ascii_ok <= '0'; bustab <= bustabla2; end if; when bustabla2 => if datout = tabla2(index) then bustab <= indice; elsif index = 25 then index :=0; tbl1:='0'; tbl2:='0'; tbl3:='1'; bustab <= bustabla3; else index := index + 1; end if; when bustabla3 => if datout = tabla3(index) then bustab <= indice; elsif index = 20 then index :=0; tbl1:='1'; tbl2:='0'; tbl3:='0'; bustab <= bustabla1; else index := index + 1; end if; when bustabla1 => if datout = tabla1(index) then bustab <= indice; elsif index > 3 then index :=0; bustab <= indice; else index := index + 1; end if; when indice => if tbl2 = '1' then if shf = cps then i <= index+4; else i <= index+51; end if; elsif tbl3 = '1' then if shf = '1' then i <= index+77; else i <= index+30; end if; else i <= index; end if; ascii_ok <= '1'; bustab <= buscar; when others => bustab <= buscar;

Page 84: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

80

end CASE; end if; end process; --Reloj de período de muestreo ---------------------------------------------------------------------------------------------------------- SampleClk_count : process(clk,reset) begin if reset = '0' or Control(2) = '1' then sampleclk_cnt <= (others => '0'); elsif clk'event and clk = '1' then if sampleclk_cnt = x"17d783f" then sampleclk_cnt <= (others => '0'); else sampleclk_cnt <= sampleclk_cnt+1; end if; end if; end process SampleClk_count; sampleclk_cao <= '1' when sampleclk_cnt = x"17d783f" else '0'; --Reloj de 500kHz para el ADC ---------------------------------------------------------------------------------------------------------- ADCclk_count : process(clk,reset) begin if reset = '0' then ADCclk_cnt <= (others => '0'); elsif clk'event and clk = '1' then if ADCclk_cnt = x"28" then ADCclk_cnt <= (others => '0'); ADCclk_cao <= not ADCclk_cao; else ADCclk_cnt <= ADCclk_cnt+1; end if; end if; end process ADCclk_count; AdcClk <= 'Z' when ADCclk_cao = '1' else '0'; -- Sincronización señales de entrada ADC ---------------------------------------------------------------------------------------------------------- syn_adc_eoc : process (clk, reset) begin if reset = '0' then adc_eoc_syn <= '0'; elsif clk'event and clk = '1' then adc_eoc_syn <= TO_X01(AdcInt); end if; end process syn_adc_eoc; -- process(clk,reset) begin if reset = '0' then control_cnt <= x"0"; elsif clk'event and clk = '1' then if control_cnt_cao = '1' or control_state = rise or control_state = fall then control_cnt <= (others => '0'); else control_cnt <= control_cnt+1; end if; end if; end process; control_cnt_cao <= '1' when control_cnt = x"2" else '0'; --Flancos de la señal de control 1(relectura del ADC) proveniente del GBA ---------------------------------------------------------------------------------------------------------- process(clk,reset)

Page 85: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

81

begin if reset = '0' then control_state <= stable; control_clean <= '0'; elsif clk'event and clk = '1' then case control_state is when stable => if control_clean /= Control(1) then if Control(1) = '1' then control_state <= rise; else control_state <= fall; end if; end if; when wait_stable => if control_cnt_cao = '1' then control_state <= stable; end if; when rise => control_state <= wait_stable; control_clean <= '1'; when fall => control_state <= wait_stable; control_clean <= '0'; when others => null; end case; end if; end process; control_rise <= '1' when control_state = rise else '0'; --Lectura dato del ADC ----------------------------------------------------------------------------------------------------------- ADC_read : process(clk,reset) begin if reset = '0' then AdcData_ok <= '1'; AdcControl <= stable; elsif clk'event and clk = '1' then case AdcControl is when stable => tWs <= (others=> '0'); AdcWr <= '0'; AdcRd <= '0'; if sampleclk_cao = '1' or control_rise = '1' then AdcControl <= start; AdcData_ok <= '0'; end if; when start => --tWALE = 160ns (8*20ns) --AdcWr <= 'Z'; if tWS = x"28" then AdcWr <= '0'; tWS <= (others=> '0'); AdcControl <= EOC_down; else AdcWr <= 'Z'; tWS <= tWS+1; end if; when EOC_down => if adc_eoc_syn = '0' then AdcControl <= EOC_up; end if; when EOC_up => if adc_eoc_syn = '1' then AdcControl <= read; end if; when read =>

Page 86: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

82

AdcRd <= 'Z'; if tWS = x"28" then tWS <= (others=> '0'); AdcControl <= get_value; else tWS <= tWS+1; end if; when get_value => AdcData_ok <= '1'; AdcData_aux <= AdcData; AdcControl <= keep_value; when keep_value => if tWS = x"28" then tWS <= (others=> '0'); AdcControl <= wait_stable; else tWS <= tWS+1; end if; when wait_stable => AdcRd <= '0'; if tWS = x"28" then tWS <= (others=> '0'); AdcControl <= stable; else tWS <= tWS+1; end if; when others => AdcControl <= stable; end case; end if; end process ADC_read; --Escritura dato en el DAC ---------------------------------------------------------------------------------------------------------- DAC_write : process(clk,reset) begin if reset = '0' then DacControl <= stable; elsif clk'event and clk = '1' then case DacControl is when stable => tW <= (others=> '0'); DacWr <= '1'; if DacEn = '1' then DacControl <= write; end if; when start => if tW = x"1" then tW <= (others=> '0'); DacControl <= write; else tW <= tW+1; end if; when write => DacWr <= '0'; if tW = x"28" then tW <= (others=> '0'); DacControl <= stable; else tW <= tW+1; end if; when others => DacControl <= stable; end case; end if; end process DAC_write;

Page 87: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

83

--Habilitador de direcciones de los diferentes componentes ---------------------------------------------------------------------------------------------------------- ControlEn <= '1' when Addr(23 downto 0) = x"ffe200" else '0'; PS2En <= '1' when Addr(23 downto 0) = x"ffe201" else '0'; AdcEn <= '1' when Addr(23 downto 0) = x"ffe202" else '0'; AdcAddrEn <= '1' when Addr(23 downto 0) = x"ffe203" else '0'; DacEn <= '1' when Addr(23 downto 0) = x"ffe204" else '0'; --Lectura dato del ps2 por parte del GBA ---------------------------------------------------------------------------------------------------------- ps2_read : process (PS2En) begin if PS2En = '1' then DataRd(15 downto 8) <= tabla(i); elsif AdcEn = '1' then DataRd(15 downto 8) <= AdcData_aux; else DataRd(15 downto 8) <= (others => 'Z'); end if; end process ps2_read; DataRd(7 downto 0) <= (others => '0'); --Escritura de datos por parte del GBA en los diferentes componentes ---------------------------------------------------------------------------------------------------------- write_data : process (Wr) begin if Wr'event and Wr = '0' then if ControlEn = '1' then Control <= CartData(7 downto 0); elsif DacEn = '1' then DacData(9 downto 2) <= CartData(7 downto 0); elsif AdcAddrEn = '1' then AdcAddr <= CartData(2 downto 0); end if; end if; end process write_data; DacData(1 downto 0) <= (others => '0'); --Manejo de la interrupción del microprocesador CartIReq <= '1' when (AdcData_ok and ascii_ok and not control(0)) = '1' else '0'; CartClk <= 'Z'; RCs <= '1'; end Behavioral; primary.vhd library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity primary is port( --GBA cartridge CartData : inout std_logic_vector(15 downto 0); --Data CartAddr : in std_logic_vector(7 downto 0); --Address CartCs : in std_logic; --Chip Select CartRd : in std_logic; --Read CartWr : in std_logic; --Write --Flash FData : inout std_logic_vector(7 downto 0); --Data FAddr : out std_logic_vector(20 downto 0); --Address FCe : out std_logic; --Chip Enable FOe : out std_logic; --Output Enable FWe : out std_logic; --Write Enable

Page 88: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

84

--50 MHz Clock Clk : in std_logic; --Bus Decoder Addr : out std_logic_vector(23 downto 0); --Address Rd : out std_logic; --Read Wr : out std_logic; --Write DataRd : in std_logic_vector(15 downto 0)); --Data Read end primary; --------------------------------------------------------------------------------------- -- Arquitectura -- --------------------------------------------------------------------------------------- architecture Behavioral of primary is ----------------------------------------------------------------------------------------- --decodebus1 Se encarga de decodificar las señales provenientes GBA ----------------------------------------------------------------------------------------- component DecodeBus Port(

CartData : in std_logic_vector(15 downto 0); CartAddr : in std_logic_vector(7 downto 0); CartCs : in std_logic; CartRd : in std_logic; CartWr : in std_logic; Addr : out std_logic_vector(23 downto 0); Rd : out std_logic; Wr : out std_logic); end component DecodeBus; --------------------------------------------------------------------------------------- -- Variables Auxiliares -- --------------------------------------------------------------------------------------- --Variables de comunicación con decodebus signal Addr_aux : std_logic_vector(23 downto 0); signal Rd_aux : std_logic; signal Wr_aux : std_logic; begin -- Instanciación de decodebus ---------------------------------------------------------------------------------------------------------- X1: DecodeBus Port map (CartData, CartAddr, CartCs, CartRd, CartWr, Addr_

aux, Rd_aux, Wr_aux); --Control de la memoria Flash FAddr <= Addr_aux(20 downto 0); FCe <= Addr_aux(23) or CartCs; --Escritura en la Flash FWe <= not Wr_aux; FData <= (others => 'Z') when Wr_aux /= '1' else CartData(7 downto 0); --Lectura de la Flash FOe <= not Rd_aux; Flash_Read : process (Rd_aux, Addr_aux(23)) begin if Rd_aux = '1' then if Addr_aux(23) = '1' then CartData <= DataRd; else CartData(7 downto 0) <= Fdata; CartData(15 downto 8) <= (others => 'Z'); end if;

1 Esta función se encuent ra en el CD que envía Charmedlabs con la tarjeta Xport 2.0 en el siguiente directorio: …\xport\logic\src

Page 89: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

85

else CartData <= (others => 'Z'); end if; end process Flash_Read; --Retorno de los valores decodificados a ps2 ---------------------------------------------------------------------------------------------------------- Addr <= Addr_aux; Rd <= Rd_aux; Wr <= Wr_aux; end Behavioral; xport.ucf #PACE: Start of Constraints generated by PACE #PACE: Start of PACE I/O Pin Assignments NET "AdcAddr<0>" LOC = "P30" ; NET "AdcAddr<1>" LOC = "P33" ; NET "AdcAddr<2>" LOC = "P35" ; NET "AdcClk" LOC = "P23" ; NET "AdcData<0>" LOC = "P15" ; NET "AdcData<1>" LOC = "P27" ; NET "AdcData<2>" LOC = "P10" ; NET "AdcData<3>" LOC = "P20" ; NET "AdcData<4>" LOC = "P17" ; NET "AdcData<5>" LOC = "P206" ; NET "AdcData<6>" LOC = "P42" ; NET "AdcData<7>" LOC = "P37" ; NET "AdcInt" LOC = "P22" ; NET "AdcRd" LOC = "P21" ; NET "AdcWr" LOC = "P24" ; NET "busy_o" LOC = "P205" ; NET "CartAddr<0>" LOC = "P191" ; NET "CartAddr<1>" LOC = "P192" ; NET "CartAddr<2>" LOC = "P193" ; NET "CartAddr<3>" LOC = "P194" ; NET "CartAddr<4>" LOC = "P195" ; NET "CartAddr<5>" LOC = "P199" ; NET "CartAddr<6>" LOC = "P200" ; NET "CartAddr<7>" LOC = "P201" ; NET "CartCs" LOC = "P164" ; NET "CartData<0>" LOC = "P165" ; NET "CartData<10>" LOC = "P179" ; NET "CartData<11>" LOC = "P180" ; NET "CartData<12>" LOC = "P181" ; NET "CartData<13>" LOC = "P187" ; NET "CartData<14>" LOC = "P188" ; NET "CartData<15>" LOC = "P189" ; NET "CartData<1>" LOC = "P166" ; NET "CartData<2>" LOC = "P167" ; NET "CartData<3>" LOC = "P168" ; NET "CartData<4>" LOC = "P172" ; NET "CartData<5>" LOC = "P173" ; NET "CartData<6>" LOC = "P174" ; NET "CartData<7>" LOC = "P175" ; NET "CartData<8>" LOC = "P176" ; NET "CartData<9>" LOC = "P178" ; NET "CartIReq" LOC = "P203" ; NET "CartRd" LOC = "P163" ; NET "CartWr" LOC = "P162" ; NET "clk" LOC = "P185" ; NET "DacData<0>" LOC = "P29" ; NET "DacData<1>" LOC = "P31" ; NET "DacData<2>" LOC = "P34" ; NET "DacData<3>" LOC = "P36" ; NET "DacData<4>" LOC = "P41" ; NET "DacData<5>" LOC = "P18" ;

Page 90: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

86

NET "DacData<6>" LOC = "P16" ; NET "DacData<7>" LOC = "P14" ; NET "DacData<8>" LOC = "P5" ; NET "DacData<9>" LOC = "P3" ; NET "DacWr" LOC = "P43" ; NET "FAddr<0>" LOC = "P150" ; NET "FAddr<10>" LOC = "P133" ; NET "FAddr<11>" LOC = "P129" ; NET "FAddr<12>" LOC = "P127" ; NET "FAddr<13>" LOC = "P125" ; NET "FAddr<14>" LOC = "P123" ; NET "FAddr<15>" LOC = "P122" ; NET "FAddr<16>" LOC = "P121" ; NET "FAddr<17>" LOC = "P120" ; NET "FAddr<18>" LOC = "P114" ; NET "FAddr<19>" LOC = "P113" ; NET "FAddr<1>" LOC = "P149" ; NET "FAddr<20>" LOC = "P112" ; NET "FAddr<2>" LOC = "P148" ; NET "FAddr<3>" LOC = "P147" ; NET "FAddr<4>" LOC = "P141" ; NET "FAddr<5>" LOC = "P140" ; NET "FAddr<6>" LOC = "P139" ; NET "FAddr<7>" LOC = "P138" ; NET "FAddr<8>" LOC = "P136" ; NET "FAddr<9>" LOC = "P134" ; NET "FCe" LOC = "P132" ; NET "FData<0>" LOC = "P153" ; NET "FData<1>" LOC = "P146" ; NET "FData<2>" LOC = "P142" ; NET "FData<3>" LOC = "P135" ; NET "FData<4>" LOC = "P126" ; NET "FData<5>" LOC = "P119" ; NET "FData<6>" LOC = "P115" ; NET "FData<7>" LOC = "P108" ; NET "FOe" LOC = "P152" ; NET "FWe" LOC = "P151" ; NET "ps2_clk_io" LOC = "P6" ; NET "ps2_data_io" LOC = "P8" ; NET "RCs" LOC = "P45" ; NET "Reset" LOC = "P4" ; #PACE: Start of PACE Area Constraints #PACE: Start of PACE Prohibit Constraints #PACE: End of Constraints generated by PACE La localización física de los pines del conector (User 1) se encuentra descrita en: XPORT 2.0 USER GUIDE versión 1.4, septiembre 22 de 2003. Charmed Labs.

Page 91: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

87

D TECLADO PS2 Tabla Scan Codes KEY MAKE BREAK ---

-- KEY MAKE BREAK ---

-- KEY MAKE BREAK

A 1C F0,1C 9 46 F0,46 [ 54 FO,54 B 32 F0,32 ` 0E F0,0E INSERT E0,70 E0,F0,70 C 21 F0,21 - 4E F0,4E HOME E0,6C E0,F0,6C D 23 F0,23 = 55 FO,55 PG UP E0,7D E0,F0,7D E 24 F0,24 \ 5D F0,5D DELETE E0,71 E0,F0,71 F 2B F0,2B BKSP 66 F0,66 END E0,69 E0,F0,69 G 34 F0,34 SPACE 29 F0,29 PG DN E0,7A E0,F0,7A H 33 F0,33 TAB 0D F0,0D U

ARROW E0,75 E0,F0,75

I 43 F0,43 CAPS 58 F0,58 L ARROW

E0,6B E0,F0,6B

J 3B F0,3B L SHFT 12 FO,12 D ARROW

E0,72 E0,F0,72

K 42 F0,42 L CTRL 14 FO,14 R ARROW

E0,74 E0,F0,74

L 4B F0,4B L GUI E0,1F E0,F0,1F NUM 77 F0,77 M 3A F0,3A L ALT 11 F0,11 KP / E0,4A E0,F0,4A N 31 F0,31 R SHFT 59 F0,59 KP * 7C F0,7C O 44 F0,44 R CTRL E0,14 E0,F0,14 KP - 7B F0,7B P 4D F0,4D R GUI E0,27 E0,F0,27 KP + 79 F0,79 Q 15 F0,15 R ALT E0,11 E0,F0,11 KP EN E0,5A E0,F0,5A R 2D F0,2D APPS E0,2F E0,F0,2F KP . 71 F0,71 S 1B F0,1B ENTER 5A F0,5A KP 0 70 F0,70 T 2C F0,2C ESC 76 F0,76 KP 1 69 F0,69 U 3C F0,3C F1 05 F0,05 KP 2 72 F0,72 V 2A F0,2A F2 06 F0,06 KP 3 7A F0,7A W 1D F0,1D F3 04 F0,04 KP 4 6B F0,6B X 22 F0,22 F4 0C F0,0C KP 5 73 F0,73 Y 35 F0,35 F5 03 F0,03 KP 6 74 F0,74 Z 1A F0,1A F6 0B F0,0B KP 7 6C F0,6C 0 45 F0,45 F7 83 F0,83 KP 8 75 F0,75 1 16 F0,16 F8 0A F0,0A KP 9 7D F0,7D 2 1E F0,1E F9 01 F0,01 ] 5B F0,5B 3 26 F0,26 F10 09 F0,09 ; 4C F0,4C 4 25 F0,25 F11 78 F0,78 ' 52 F0,52 5 2E F0,2E F12 07 F0,07 , 41 F0,41 6 36 F0,36 PRNT

SCRN E0,12, E0,7C

E0,F0, 7C,E0, F0,12

. 49 F0,49

7 3D F0,3D SCROLL 7E F0,7E / 4A F0,4A 8 3E F0,3E PAUSE E1,14,77,

E1,F0,14, F0,77

-NONE-

Page 92: PROYECTO DE GRADO FERNAN PEDRAZA

IEL2-II-04-26

88

Scan Codes Utilizados

KEY MAKE BREAK ----- KEY MAKE BREAK A 1C F0,1C 0 45 F0,45 B 32 F0,32 1 16 F0,16 C 21 F0,21 2 1E F0,1E D 23 F0,23 3 26 F0,26 E 24 F0,24 4 25 F0,25 F 2B F0,2B 5 2E F0,2E G 34 F0,34 6 36 F0,36 H 33 F0,33 7 3D F0,3D I 43 F0,43 8 3E F0,3E J 3B F0,3B 9 46 F0,46 K 42 F0,42 ` 0E F0,0E L 4B F0,4B - 4E F0,4E M 3A F0,3A = 55 FO,55 N 31 F0,31 \ 5D F0,5D O 44 F0,44 [ 54 FO,54 P 4D F0,4D ] 5B F0,5B Q 15 F0,15 ; 4C F0,4C R 2D F0,2D ' 52 F0,52 S 1B F0,1B , 41 F0,41 T 2C F0,2C . 49 F0,49 U 3C F0,3C / 4A F0,4A V 2A F0,2A CAPS 58 F0,58 W 1D F0,1D L SHFT 12 FO,12 X 22 F0,22 R SHFT 59 F0,59 Y 35 F0,35 BKSP 66 F0,66 Z 1A F0,1A SPACE 29 F0,29

ENTER 5A F0,5A TAB 0D F0,0D