ALCIDES ACOSTA ORTEGA DARIO PUELLO JULIO
DISEÑO DE UN CONTROLADOR DIFUSO EMBEBIDO A PARTIR DE MODELO DIFUSO INTERPRETABLE DE DATOS DE ENTRADA Y SALIDA
ALCIDES ACOSTA ORTEGA DARIO PUELLO JULIO
UNIVERSIDAD ANTONIO NARIÑO FACULTAD DE INGENIERÍAS PROGRAMA DE INGENIERÍA ELECTRÓNICA CARTAGENA D. T. Y C. 2009
DISEÑO DE UN CONTROLADOR DIFUSO EMBEBIDO A PARTIR DE MODELO INTERPRETABLE DE DATOS DE ENTRADA Y SALIDA
ALCIDES ACOSTA ORTEGA DARIO PUELLO JULIO
Proyecto de Grado para optar por el título de Ingeniero Electrónico
Asesores: Luís Fernando Murillo Facultad de Ingeniería Electrónica y Biomédica Universidad Antonio Nariño Cartagena Juan Torres Valdés Docente cátedra Facultad de Ingeniería Electrónica y Biomédica
UNIVERSIDAD ANTONIO NARIÑO FACULTAD DE INGENIERÍAS PROGRAMA DE INGENIERÍA ELECTRÓNICA CARTAGENA D. T. Y C. 2009
Notas de Aceptación
_________________________________ _________________________________ _________________________________ _________________________________ _________________________________ _________________________________
_________________________________ Presidente del Jurado _________________________________ Firma del Jurado _________________________________ Firma del jurado
CARTAGENA, D. T Y C, 2009.
DEDICATORIA
A mis padres Por quitarse el pan de la boca para ponerlo en la mía. Por dejar de vestir bien para darme abrigo todos los días. Por renunciar a muchas cosas para llevarme a donde estoy ahora. Por no perder la fe en que podría llegar tan lejos. Gracias por todo y que Dios los bendiga eternamente.
“Camina con paso firme y constante, con profunda fe y absoluta convicción de que alcanzarás cualquier meta que te hayas fijado y conseguirás todo lo que te propongas.” Anónimo
AGRADECIMIENTOS
A dios. A mi abuelita Al profesor luis murillo. Al profesor juan torres.
CONTENIDO Pág. Introducción Planteamiento del problema Formulación del problema Objetivos Objetivo general Objetivo especifico Justificación Marco teórico Diseño de ingeniería Conclusiones Recomendaciones Bibliografía Anexos
Lista de figuras pag
Fig 1 Fig 2 Fig 3 Fig 4
Lista de tablas pag
Tabla 1 Tabla 2 Tabla 3
Lista de anexos pag Anexo 1 Anexo 2 Anexo 3 Anexo 4
RESUMEN
El presente proyecto tiene como propósito fundamental el diseño y desarrollo de un controlador difuso embebido a partir de un modelo difuso interpretable de datos de entrada y salida Este diseño es una herramienta práctica para el aprendizaje fundamental del funcionamiento de los sistemas de control difuso embebidos. Se diseñó y construyó
un controlador difuso
a partir de un
algoritmo del
controlador a partir de modelo difuso interpretable de datos de entrada y salida. Se realizó la implementación de este sobre el microcontrolador Freescale MCF51QE128 con el fin de lograr cierto grado de automatización durante la realización de un proceso y evaluar su respuesta frente a un controlador PID clásico. El sistema cuenta con los componentes necesarios para su operación, fuente de poder, sistema de control embebido en el microcontrolador, y un sistema de control de entrada y visualización de respuesta desarrollada con el software de instrumentación virtual LabVIEW. El diseño y desarrollo del controlador difuso embebido esta centrado en el uso de un modelo difuso interpretable de datos de entrada y salida el cual será desarrollado como un algoritmo en lenguaje de alto nivel, para ser implementado en un dispositivo programable con núcleo de 32 bits, evaluar su funcionamiento y comparar su respuesta
frente a un controlador clásico, la novedad de este
proyecto se halla en la implementación del algoritmo del controlador a partir de modelo difuso interpretable de datos de entrada y salida, y el uso de los microcontroladores de 32 bits y su aplicabilidad para el control de variables.
ABSTRACT This project aims at designing and developing fundamental of a fuzzy controller embedded from an interpretable fuzzy model input and output data This design is a practical tool for learning basic operation of the embedded fuzzy control systems. Was designed and built a fuzzy controller from a controller algorithm for interpretable fuzzy model from data input and output. And was carried out on the implementation of this MCF51QE128 Freescale microcontroller in order to achieve a degree of automation during the implementation of a process and evaluate their response to a classical PID controller. The system has the components necessary for operation, power supply, control system embedded in the microcontroller and a control system input and display of response developed in LabVIEW virtual instrumentation software. The design and development of embedded fuzzy controller is centered on the use of an interpretable fuzzy model input and output data which will be developed as an algorithm in high-level language, to be implemented in a programmable device with 32-bit kernel, evaluate their performance and compare their response to a classic controller the novelty of this project is in the controller algorithm implementation from fuzzy model interpretable data input and output, and using 32-bit microcontrollers and their applicability to control variables.
INTRODUCCION Los sistemas de control que manejan los procesos industriales están sufriendo cambios significativos en el manejo de variables, modo de intervención del usuario y velocidad de respuesta…
PLANTEAMIENTO DEL PROBLEMA
DESCRIPCION DEL PROBLEMA. La lógica difusa día a día adquiere gran importancia en nuestras vidas a nivel doméstico, teniendo un gran impacto en
el
desarrollo socio cultural y
tecnológico. Una de las áreas de la lógica difusa con mayor proyección hacia el futuro
es el control difuso orientado a la industria, el cual por su sencillez
conceptual, su facilidad para adaptarse a casos particulares con pocas variaciones de parámetros, su habilidad para combinar en forma unificada expresiones lingüísticas con datos numéricos, y el no requerir de algoritmos muy sofisticados para su implementación lo han convertido paulatinamente en una alternativa frente al control clásico que ha permanecido vigente estos últimos años como soporte de la mayoría de sistemas tanto industriales como domésticos y que poco a poco cede terreno ante los nuevos desarrollos orientados en materia del control avanzado de variables.
En la actualidad la implementación de sistemas de control difuso industriales ha sido un reto grande, puesto que su reciente aparición en el mundo de la electrónica industrial lo ha hecho poco conocido en dicho ámbito y algunas de las aplicaciones que han podido ser desarrollados presentan inconvenientes a la hora de su uso, dado que gran parte de los desarrollos hechos son modelos difusos que funcionan utilizando una tarjeta de control y un computador para la realización del cálculo de inferencia (ver Fig.1), lo cual en un ambiente robusto seria un punto de fallo.
Modelo difuso
adquisición de datos
proceso
Fig. 1 implementación de controladores difusos industrial Adicionalmente la tecnología que se requiere para realizar un controlador difuso embebido adecuado para el entorno industrial resulta costosa en comparación con la tecnología usada para controles difusos más básicos que no requieren de módulos o capacidades más avanzadas y que sus algoritmos resultan menos complejos. Intentar hacer uso de dispositivos de baja capacidad con modelos difusos complejos se convierte en algo difícil de lograr si se desean obtener mejores respuestas del sistema. Así el uso de dispositivos más potentes es necesario. En la actualidad el boom de los equipos con “Fuzzy logic” se presenta principalmente en los equipos para el hogar tales como: lavadoras, aires acondicionados entre otros (véase fig. 2)
ha conducido a mucha búsqueda e
investigación en el uso de modelos difusos que ofrezcan mejores capacidades para las tecnologías que siguen avanzando con cada día que pasa.
Fig. 2 electrodomésticos con “Fuzzy Logic” Cortesía de Samsung Electronics Colombia
Investigaciones recientes han propuesto nuevos modelos difusos para el control de variables, entre estos se encuentra un modelo difuso llamado modelo interpretable de procesos dinámicos a partir de datos de entrada y salida, este diseño pretende implementar un modelo de controlador difuso adaptivo, el cual puede modificar sus parámetros y su estructura de forma algorítmica. Hasta el
momento sus resultados han podido ser vistos a través de implementaciones donde la computadora gestiona los cálculos y utilizando software especializado se realiza la visualización y control de las variables presentes. FORMULACION DEL PROBLEMA ¿Cómo diseñar un controlador difuso embebido a partir de modelo interpretable de datos de entrada y salida?
OBJETIVOS. OBJETIVO GENERAL. Diseñar e implementar de un controlador difuso embebido a partir de un modelo difuso interpretable de datos de entrada y salida en la universidad Antonio Nariño mediante las técnicas apropiadas para facilitar el aprendizaje y fortalecimiento de competencias a los estudiantes de los programas de ingeniería electrónica, electromecánica y sistemas en esta área. OBJETIVOS ESPECIFICOS. • Realizar la selección del sistema embebido a usar basado en las características requeridas por el diseño y su disponibilidad. • Realizar la selección del proceso a simular por medio del controlador, con el
propósito
de
establecer
los
parámetros
necesarios
para
su
funcionamiento y evaluación de desempeño. • Elaborar la estructura
física de la planta del controlador, para poder
evaluar los resultados del sistema. • Diseñar la tarjeta principal del controlador y todos los módulos adicionales
necesarios para su funcionamiento. • Elaborar el algoritmo de control para la tarjeta principal. • Implementar el algoritmo de control con el fin de observar su puesta en marcha inicial. • Realizar las pruebas pertinentes de todo el sistema una vez finalizado su diseño. Y evaluar su rendimiento contra la implementación hecha vía PC
6. JUSTIFICACION. El propósito de este proyecto es diseñar e implementar un sistema de control embebido desde un modelo difuso interpretable de datos de entrada y salida, el cual a través de las pruebas que se realizaran se evaluara su rendimiento frente a sistemas desarrollados bajo interfase con PC, beneficiando de forma directa los procesos industriales complejos existentes incentivando el desarrollo del área del control difuso en las instituciones de educación superior. Los
sistemas
de
control
embebido
han
sido
implementados
con
microcontroladores de baja capacidad lo que ha limitado su aplicabilidad, pero todo esto ha cambiado en vista de la reciente aparición en el mercado de microcontroladores de 32 bits que cubren muchas de las carencias que presentan los de 8 y 16 bits (mucha más memoria, funciones avanzadas, velocidades de procesamiento más altas) respectivamente, para aquel que busca realizar aplicaciones donde se requieran un mejor uso de memoria y mayores velocidades de procesamiento de datos. Un punto clave en estos dispositivos es el bajo costo que tienen actualmente De muchos microcontroladores de 32 bits existentes en el mercado tales como la
familia PIC32 de la empresa Microchip, los AVR 32 de Atmel, los PICCOLO de la Texas Semiconductor , se escogió para la implementación en el desarrollo del proyecto
el
microcontrolador
COLDFIRE
de
la
empresa
Freescale
Semiconductors puesto que sus especificaciones tales como tamaños de palabra y memoria (Flash y SRAM), arquitectura, set de instrucciones y unidades funcionales avanzadas tales como: convertidor A/D, PWM, I2C resultan importantes y a la vez se adaptan a los requerimientos necesarios del proyecto. Adicionalmente este dispositivo posee diversos modos de direccionamiento que permiten el tratamiento de los datos en forma matricial lo cual hace su selección de gran importancia para el modo de trabajo del controlador porque el esquema en que se basa su funcionamiento, hace indispensable el uso de esta característica. Este proyecto resulta viable porque en la mayoría de casos donde se ha implementado control difuso se limita al uso de un algoritmo que por medio de una interface del computador con el medio hace determinado proceso, son contados los sistemas que son manipulados de forma autónoma sin depender directamente de un PC. Así pues, como resultado final, este trabajo de investigación pretende proponer una estructura general para la elaboración de nuevos mecanismos o procesos, que pueden ser utilizados para implementación a una planta dándole mayor eficacia en su proceso de trabajo, basado en la lógica difusa.
La problemática planteada anteriormente, evidencia la necesidad de es diseñar e implementar un sistema de control embebido desde un modelo difuso interpretable de datos de entrada y salida, el cual a través de las pruebas que se realizaran se evaluara su rendimiento frente a sistemas desarrollados bajo
interface con PC, beneficiando de forma directa los procesos industriales complejos existentes incentivando el desarrollo del área del control difuso en las instituciones de educación superior.
De igual forma, se determinará que el sistema de control con comunicación vía TCP/IP, se proyectará como una herramienta tecnológica gestora de nuevos conocimientos, en el campo de la Instrumentación Industrial. Además este proyecto, servirá de base a nuevas investigaciones tecnológicas propiciadas por estudiantes y personas comprometidas con el desarrollo de esta línea de investigación. En el mercado se encuentra una gran variedad de controladores y sistemas de instrumentación virtual, pero con precios muy elevados, por ende se hace necesario que los Ingenieros de Electrónicos participen de manera activa en la creación e implementación de estos, con la finalidad de incrementar la implantación de sistemas de monitoreo que utilicen instrumentación virtual en nuestro país. En este proyecto se pretende desarrollar un sistemas microcontrolado que permita el monitoreo de las variables físicas de temperatura salinidad y nivel líquidos, brindando así, la posibilidad de subsanar una deficiencia que posee el centro de producción de sal marina en la Empresa IFI Salinas de Galerazamba.
MARCO TEORICO
Marco teórico 9. APROXIMACION AL MARCO TEORICO. Para entender con mayor claridad este proyecto se trabajará con los conceptos más relevantes relacionados, algunos de estos son:
TEORIA DEL CONTROL: La Teoría de Control es un campo interdisciplinario de la ingeniería y las matemáticas, que trata con el comportamiento de sistemas dinámicos. A la salida deseada de un sistema se la llamada referencia. Cuando una o más variables de salida de un sistema necesitan seguir cierta referencia sobre el tiempo, un controlador manipula la entrada al sistema para obtener el efecto deseado en la salida del sistema.
SISTEMA DE CONTROL: Son aquellos dedicados a obtener la salida deseada de un proceso. En un sistema general se tienen una serie de entradas que provienen del sistema a controlar, llamado planta, y se diseña un sistema para que, a partir de estas entradas, modifique ciertos parámetros en el sistema planta, con lo que las señales anteriores volverán a su estado normal ante cualquier variación. Estos se han desarrollado para manejar máquinas o procesos, de modo que se reduzcan las probabilidades de fallos y se obtengan los resultados buscados. Básicamente, existen sistemas de control abierto y de control cerrado. Los sistemas de control abierto o también llamados sistemas de control lazo abierto, en estos sistemas los cuales la salida no afecta la acción de control, esto no es más que en este sistema no se mide salida ni sé realimenta para compararla con la entrada. Por tanto, a cada de referencia le corresponde una condición operativa fija; como resultado, la presión del sistema depende de la calibración.
Los sistemas de circuito cerrado o sistema de control realimentado, es un sistema que mantiene una relación prescrita entre la salida y la entrada de referencia, comparándolas y usando la diferencia como medio de control, este sistema no se limita a la ingeniería, sino que también se encuentran en diversos campos
ajenos
a esta. Un sistema de control básico es mostrado en la siguiente figura:
Fig.3 Estructura de un sistema de control. Hay varias clasificaciones dentro de los sistemas de control. Atendiendo a su naturaleza son analógicos, digitales o mixtos; atendiendo a su estructura (número de entradas y salidas) puede ser control clásico o control moderno; atendiendo a su diseño pueden ser •
On/Off: En este sistema el controlador enciende o apaga la entrada y es utilizado, por ejemplo, en el alumbrado público, ya que éste se enciende cuando la luz ambiental es más baja que un nivel predeterminado de luminosidad.
•
Proporcional (P): En este sistema la amplitud de la señal de entrada al sistema afecta directamente la salida, ya no es solamente un nivel prefijado sino toda la gama de niveles de entrada. Algunos sistemas automáticos de iluminación utilizan un sistema P para determinar con qué
intensidad
encender
lámparas
dependiendo
directamente
de
la
luminosidad ambiental. •
Proporcional derivativo (PD): En este sistema, la velocidad de cambio de la señal de entrada se utiliza para determinar el factor de amplificación, calculando la derivada de la señal.
•
Proporcional integral (PI): Este sistema es similar al anterior, solo que la señal se integra en vez de derivarse.
•
Proporcional integral derivativo (PID): Este sistema combina los dos tipos anteriores. Es el más utilizado en la industria por su versatilidad y facilidad de implementación.
•
Sistema experto: Este sistema modela el proceso de aprendizaje semejante al ser humano para aprender a controlar la señal de salida
LOGICA DIFUSA: es una técnica de la inteligencia computacional que permite trabajar información con alto grado de imprecisión, en esto se diferencia de la lógica convencional que trabaja con información bien definida y precisa. Es una metodología que proporciona una manera simple y elegante de obtener una conclusión a partir de información de entrada vaga, ambigua, imprecisa, con ruido o incompleta, en general la lógica difusa imita como una persona toma decisiones basada en información con las características mencionadas. Una de las ventajas de la lógica difusa es la posibilidad de implementar sistemas basados en ella tanto en hardware como en software o en combinación de ambos. El concepto de Lógica Difusa fue concebido por Lofti Zadeh un profesor de la Universidad de California en Berkeley, quien inconforme con los conjuntos clásicos (crisp sets), que solo permiten dos opciones, la pertenencia o no de un elemento a dicho conjunto la presentó como una forma de procesar información permitiendo pertenencias parciales a unos conjuntos que en contraposición a los
clásicos los denominó Conjuntos Difusos (Fuzzy sets), el concepto de conjunto difuso fue expuesto por Lofti Zadeh en un papel hoy clásico en la literatura de la lógica difusa en el año de 1965, el artículo se titula "Fuzzy Sets" y fue publicado en la revista Information and Control. El mismo Zadeh publica en 1971 el artículo, "Quantitative Fuzzy Semantics", en donde Introduce los elementos formales que acabarían componiendo el cuerpo de la doctrina de la lógica difusa y sus aplicaciones tal como se conocen en la actualidad. Algunos de los conceptos básicos de esta área son los siguientes: Crisp Sets o conjuntos clásicos: estos son valores que el ser humano establece para clasificar objetos y conceptos. Estos se establecen en función de la pertenencia o no a un grupo especifico de un elemento. (Ej.: un conjunto de prendas de vestir: suéter, camisa, pantalón.
Fuzzy Sets o conjuntos difusos: son valores que desde el punto de vista de que se aplican palabras a la definición de cualquier propiedad por ejemplo: mujeres altas, edificios viejos, hombres bajos, elevada inteligencia, baja velocidad, viscosidad moderada… Desde este punto de vista estos valores no podrían ser definidos solo con 2 valores, 0 y 1, se ha de establecer un peso para la característica estableciendo valores intermedios (ejemplo entre 0 y 1 tomando todos los valores intermedios, o bien estableciendo una escala de 0 a 100). Grado de pertenencia: este valor establece el punto de transición entre 0 y 1 entre las condiciones del conjunto difuso, por ejemplo si se establece que un edificio en el aspecto de lo nuevo que es tiene un valor de 7, este será el grado de pertenencia entre los nuevos edificios. Un ejemplo de uso del grado de pertenencia podría ser el siguiente, en el control de la velocidad de un vehículo, se contemplaría la pertenencia en el aspecto de velocidad excesiva y no existe necesidad de cambio en la velocidad. Con estos dos aspectos se podría calcular cual es la acción que se ha de llevar a cabo según los valores de entrada de estos. Variable difusa: es cualquier valor que está basado en la percepción humana más que en valores precisos de medición (Ej. un color, que está compuesto
en realidad por varias tintas, si la presión de la caldera es excesiva, si la temperatura del agua es la adecuada, si la cantidad de sal que lleva la tortilla es excesiva, si la velocidad de un tren es elevada…) todas estas dependen de la percepción. Universo de discurso: Este es el conjunto de elementos que vamos a tener en consideración, por ejemplo si se considera que las personas de una comunidad, este universo estará formado por las personas bajas, las personas altas, los hombres con gafas…
SISTEMAS DIFUSOS Son los mecanismos que se encargan de manejar los parámetros de entrada, realizar los debidos cálculos y generar la acción de control correspondiente La figura muestra como está compuesto de un sistema difuso tal como el que se muestra en la figura.
Fig.4 Estructura básica de un sistema difuso
Fuzzificacion: es la entrada al sistema, la cual toma los valores numéricos provenientes del exterior y los convierte en valores "difusos" que pueden ser procesados por el mecanismo de inferencia. Estos valores difusos son los niveles
de pertenencia de los valores de entrada a los diferentes conjuntos difusos en los cuales se ha dividido el universo de discurso de las diferentes variables de entrada al sistema. Base de reglas: La base de reglas es la manera que tiene el sistema difuso de guardar el conocimiento lingüístico que le permite resolver el problema para el cual ha sido diseñado. Estas reglas son del tipo SI-ENTONCES. Una regla de la base de reglas o base de conocimiento tiene dos partes, el antecedente y el consecuente como se observa en la siguiente figura:
Fig.5 Regla o condición del sistema Inferencia difusa: Teniendo los diferentes niveles de pertenencia entregados por el fuzzificador, los mismos deben ser procesados para general una salida difusa. La tarea del sistema de inferencia es tomar los niveles de pertenencia y apoyado en la base de reglas generar la salida del sistema difuso. Defuzzificacion: La salida que genera el mecanismo de inferencia es una salida difusa, lo cual significa que no puede ser interpretada por un elemento externo (por ejemplo un controlador) que solo manipule información numérica. Para lograr que la salida del sistema difuso pueda ser interpretada por elementos que solo procesen información numérica. En la lógica difusa los sistemas mas conocidos son: los sistemas tipo mamdani que cuentan con una estructura como la mostrada mas arriba (véase fig.4).
Y los sistemas Takagi-Sugeno (ver figura 6) que cuentan con una estructura semejante al sistema mamdani pero con la diferencia de que este no requiere defuzzificacion, debido a que la salida que entrega el mecanismo de inferencia en estos sistemas arroja un consecuente en valor numérico.
Fig.6 Sistema difuso Takagi-Sugeno (5)
MODELO BORROSO INTERPRETABLE A PARTIR DE LOS DATOS(3): La novedad del método propuesto en este documento radica en la consecución de modelos borrosos interpretables con alta precisión y bajo número de parámetros, y a que no es un método Híbrido ya que no requiere de otras técnicas de inteligencia artificial para su entrenamiento. La metodología empleada en este trabajo es presentada en tres fases: en la primera, se emplea el error de inferencia para generar un sistema borroso interpretable y, además, detectar clases o agrupamientos posibles en los datos; en la segunda, mediante el empleo de mínimos cuadrados, para ajuste de consecuentes; en la tercera, se emplea el método para la identificación de procesos dinámicos.
ERROR DE INFERENCIA.
En lógica borrosa es común tratar con reglas del tipo “Si u es A, entonces y es B”, donde u e y representan dos variables numéricas, A c U y B c Y, son dos conjuntos borrosos de entrada y salida respectivamente, definidos en los universos U e Y. La regla mencionada es equivalente a la inecuación (1) Donde uA( u ) y uB ( y ) se refieren a las funciones de pertenencia de los valores lingüísticos que pueden tomar las variables u e y respectivamente. El error de inferencia , concebido como la distancia conceptual al conjunto conclusión de la regla
(2) En el método propuesto, el primer paso es construir la partición de la(s) variable(s) de entrada empleando conjuntos triangulares con solapamiento en 0.5. Posteriormente se procede a generar la ubicación de los consecuentes de cada regla buscando que el error de inferencia sea nulo, según la ecuación (2), lo cual conllevaría a un infinito número de soluciones posibles. En la búsqueda de una única solución se restringe la condición de error de inferencia nulo a la presentada en la ecuación (3)
(3) Si el sistema tiene p entradas se debe representar por reglas del tipo “Si u1 es A1 , u2 es A2 , …, up es Ap, entonces y es B”, la regla j deberá cumplir con la condición.
(4)
Donde se representa un operador de combinación de la lógica borrosa de la clase promedio ponderado, (i) kx ,con k=1,…,p; i=1,…,N, es el vector entrada p-dimensional, con N datos por variable de entrada, y yi es el vector unidimensional de salida. Si se emplean consecuentes tipo singleton, solo se consideran los valores modales de las funciones de pertenencia del antecedente, considerando que la ubicación del valor modal de la función de pertenencia triangular en el consecuente se puede asimilar a un singleton.
IDENTIFICACIÓN BORROSA. Estructura del Modelo Borroso Buscando un equilibrio entre la aproximación numérica y la interpretabilidad del sistema borroso resultante se consideran los siguientes criterios para la selección de los parámetros Funciones de Pertenencia La partición de los universos de las variables de entrada en el proceso de aprendizaje se hace con conjuntos triangulares normalizados con solapamiento específico de 0.5. Las funciones de pertenencia triangulares permiten la reconstrucción del valor lingüístico en el mismo valor numérico, luego de aplicar un método de concreción; además, el solapamiento en 0.5 asegura que los soportes de los conjuntos borrosos sean diferentes. Los conjuntos borrosos generados para la variable de salida son tipo singleton.
Distribución de las Funciones de Pertenencia Los conjuntos borrosos triangulares de las variables de entrada se distribuyen uniformemente en cada universo respectivo de manera tal que cada uno de los elementos de los universos de discurso de cada variable debe pertenecer, al menos, a un conjunto borroso. Operadores Para la combinación de los antecedentes se emplea un operador de combinación de la clase OWA, cuya denominación obedece a sus siglas en inglés (Ordered Weighted Averaging operators) Método de Inferencia El método de inferencia empleado está dado por
(5)
Donde
(6) Es el grado de la salida de la j-ésima regla de un sistema borroso tipo Mamdani, f xi es la función que aproxima a la función real de salida, y- j es el valor del singleton correspondiente a la regla. j A n son los conjuntos borrosos del
antecedente de la regla j activada, y L
corresponde al número de reglas activadas.
Algoritmo De Identificación Borrosa El algoritmo para generación de sistemas borrosos interpretables a partir de los datos se basa en la minimización del error de inferencia. El usuario solo debe introducir los datos de las variables de entrada y salida. El algoritmo determina los rangos de cada variable, distribuye las funciones de pertenencia en los universos de cada variable de entrada, ubica los consecuentes tipos singleton en el espacio de salida, determina las reglas y ajusta la ubicación de los consecuentes, empleando mínimos cuadrados, para minimizar el error de aproximación. El algoritmo se detiene cuando se ha alcanzado una métrica de error menor a la requerida por el usuario o cuando el número de Conjuntos borrosos por variable de entrada es mayor a 9. La distribución de las funciones de pertenencia en cada universo de entrada se hace de manera uniforme para garantizar que la partición resultante sea suma 1; es decir, la suma de los grados de pertenencia de un dato en una variable de entrada será siempre igual a 1. Dado una colección de datos experimentales de entrada y salida
Con i = 1…N; k = 1…. P, donde
es el vector de entrada
p-dimensional
Es el vector unidimensional de salida
a.
Organización del conjunto de p variables
de entrada y una variable de salida, cada una con N datos.
Figura 1. Organización del conjunto de datos.
b. Determinación de los rangos de los universos de cada variable de acuerdo a los valores máximos y mínimos de los datos asociados. c. Distribución de las funciones de pertenencia triangulares sobre cada universo. Se tiene como condición general que el vértice con valor de pertenencia uno (valor modal) cae en el centro de la región cubierta por la función de pertenencia mientras que los otros dos vértices, con valor de pertenencia iguales a cero, caen en los centros de las dos regiones vecinas. Para poder aproximar eficientemente los extremos inferior y superior de una función representada por los datos es necesario que en la partición triangular las funciones de pertenencia que cubren el inicio y final del universo coincidan sus vértices con valor de pertenencia uno con sus vértices izquierdo y derecho respectivamente, como se aprecia en la figura 2. Se inicia con n = 2 conjuntos triangulares.
Figura 2. Partición triangular suma 1. a) Partición inicial, n =2; b) partición con n = 5
d. Cálculo de la posición de los valores modales de la(s) variable(s) de entrada, de acuerdo a:
(7) Donde ys(n)k corresponde a la proyección sobre el espacio de salida de la evaluación del dato x(i) de la k-ésima variable de entrada en el n-ésimo conjunto
de la partición correspondiente. El valor de la salida correspondiente a dicha proyección está dado por el valor de la i-ésima posición del vector de salida y, el cual se constituye en el singleton asociado a ese conjunto. De esta manera se aplica el criterio de error de inferencia nulo empleando consecuentes tipo singleton. e. Determinación de las reglas. El número máximo de reglas está determinado por el número de conjuntos de cada variable de entrada multiplicado por el número de variables; es decir igual a n × k, que es igual al número de singletons generados en el paso anterior. Cuando existen singletons ubicados en la misma posición, se combinan los antecedentes de acuerdo a (4) en una sola regla, lo que permite reducir el número de reglas. f. Validación del modelo empleando el método de inferencia descrito por (5), donde y -j es el valor del singleton correspondiente a la regla j. g. Ajuste de los parámetros, reubicando los singletons de salida mediante el empleo del método de mínimos cuadrados. La ecuación (5) puede expresarse de la forma.
(8) Donde (9)
La ecuación (8) puede expresarse en forma matricial como Y =Wq + E, donde Y representa los valores de salida reales, Wq representa la salida del modelo
borroso, siendo W es la matriz de grados de pertenencia obtenida de (9) y q el vector de consecuentes, y E es el error de aproximación que debe ser minimizado. Es decir:
(10) Empleando la norma del error cuadrático se tiene E2 = ( Y −Wθ )
2
= ( Y2− 2YWθ
2
+ ( Wθ ) )
( 11)
La solución a este problema de mínimos cuadrados está dada por: 2
∂ Ε /∂ θ = 0 = −2 YW + 2W
Τ
Wθ
( 12)
De donde se obtiene θ =Y
Τ
W/W
Τ
W = (W
Τ
W)-1 Y T W
Esta solución es válida si (WTW) es no singular, lo que quiere decir que todas las reglas deben recibir suficiente excitación durante el entrenamiento. En la práctica esto no es siempre posible, por lo que es recomendable recurrir a la aplicación de mínimos cuadrados recursivos, buscando garantizar que la adaptación solo afecte las reglas excitadas h. Terminar si la medida del error cuadrático medio MSE es n menor a una medida previamente establecida ó si el número de conjuntos por variable de entrada es mayor a 9. De otra manera, incrementar en 1 el número n de conjuntos de la variable de entrada y volver al paso c).
Con el algoritmo descrito se consigue un modelo borroso interpretable con una buena precisión y solo se requiere del ajuste de los parámetros del consecuente, que son tipo singleton, lo que disminuye el tiempo de entrenamiento. Es posible lograr una mayor aproximación (“ajuste fino”) si al finalizar el proceso mencionado se aplica el método del gradiente descendiente para ajustar la ubicación de los valores modales de los conjuntos triangulares del antecedente, conservando la partición suma 1 y, por lo tanto la interpretabilidad del sistema MICROCONTROLADOR: Es un dispositivo electrónico capaz de llevar a cabo procesos lógicos. Estos procesos o acciones son programados en lenguaje ensamblador por el usuario, y son introducidos en este a través de un programador. (Véase fig.7)
Fig.7 forma física de un microcontrolador Cortesía de Freescale Semiconductor
Inicialmente cuando no existían los microprocesadores las personas se ingeniaban en diseñar sus circuitos electrónicos y los resultados estaban expresados en diseños que implicaban muchos componentes electrónicos y cálculos matemáticos. Un circuito lógico básico requería de muchos elementos electrónicos basados en transistores y resistencias, lo cual desembocaba en circuitos con muchos ajustes y fallos; pero en el año 1971 apareció el primer microprocesador el cual originó un cambio decisivo en las técnicas de diseño de la mayoría de los equipos. Al principio se creía que el manejo de un microprocesador era para aquellas personas con un coeficiente intelectual muy alto; por lo contrario con la aparición de este circuito integrado todo sería mucho más fácil de entender y los diseños electrónicos serian mucho más pequeños y simplificados. Entre los microprocesadores más conocidos tenemos el popular Z-
80 y el 8085. Los diseñadores de equipos electrónicos ahora tenían equipos que podían realizar mayor cantidad de tareas en menos tiempo y su tamaño se redujo considerablemente; sin embargo, después de cierto tiempo aparece una nueva tecnología llamada micro controlador que simplifica aun más el diseño electrónico.
El microcontrolador MCF51QE128
DISEÑO DE INGENIERIA
DISEÑO DE INGENIERÍA El principio de funcionamiento del controlador difuso embebido se basa en la captura de una o varias variables de entrada a través del microcontrolador, estas a su vez son cambiadas de señales análogas a información digital y sometidas a un proceso de escalizado (conversión a unidades de ingeniería), para luego ser convertidas en valores difusos (grados de pertenencia), seguido esto el sistema aplica un mecanismo a través del cual define los valores con los que se obtienen las condiciones para obtener una posible salida (maquina de inferencia), estos valores se aplican a una base que contiene reglas definidas por el usuario que en conjunto con los valores obtenidos por el mecanismo de inferencia difusa se encargan de generar un numero especifico de valores que se operan para obtener la salida de control con respecto al valor definido por la entrada del sistema. Para iniciar la explicación del controlador, se parte de la estructura típica de un sistema de control, de esta manera se facilita su comprensión puesto que se desglosa su contenido general llevándolo a términos específicos y detallados sobre su funcionamiento. El modelo general del controlador se puede apreciar en la figura.
Fig. El esquema anterior, es el punto de referencia del que parte el controlador, a continuación se procederá a describir cada uno de los bloques internos, haciendo énfasis en detallar lo mas posible cada uno de estos.
BLOQUE DE CONTROL En el diagrama general es el equivalente a la entrada de referencia, el sumador y el bloque del controlador. Aquí se encuentra el corazón del sistema de control, cuya labor es la de tomar las entradas y realizar todas las operaciones pertinentes para obtener la salida deseada en función de las entradas ingresadas. A continuación la figura TAL muestra en términos generales la estructura interna del bloque de control:
Fig. TAL
DESCRIPCIÓN GENERAL DEL CONTROLADOR
El sistema de control difuso a diseñar esta fundamentado en el uso de un controlador difuso mínimo
o mamdani,
implementado en lenguaje de
programación C, el cual se puede ver con mayor claridad en la Fig. ¿ . Para la construcción de este controlador se parte de la siguiente estructura grafica tal como se puede apreciar en la siguiente figura.
Fig. El diagrama anterior muestra el orden de ejecución del programa, los elementos que contienen datos que se usan para las diversas operaciones de cada bloque (funciones del programa). A continuación se explicara con más detalle la estructura lógica del controlador difuso embebido función por función.
FUNCION LECTURA, CONVERSIÓN Y ESCALIZADO.
Este bloque de funciones es el encargado de tomar el valor de la entrada del sensor, realizar la conversión de valor análogo en datos digitales y proporcionar un escalado para determinar el ángulo en relación con el número de bits usados.
Fig. Inicialmente, el programa captura el dato presente en la entrada destinada para tal propósito, una vez se compruebe que hay un dato se procede a convertir el dato análogo en información digital utilizando para esto el convertidor interno del microcontrolador. La estructura interna de esta función es la siguiente:
Fig. PROCESO DE ESCALIZADO: esta parte de la función se encarga de tomar el valor de entrada previamente convertido y normalizarlo a unidades de ingeniería. Para ello se debe tener en cuenta lo siguiente. 1.
la resolución (2n) a la que va a trabajar el conversor análogo-digital, para este caso se configura para trabajar tanto 8 como 12 bits.
2.
la medida de unidades desde el punto mínimo hasta el máximo, la medida es tomada en grados y va desde 0° hasta 360°.
. Una vez se tienen estos datos preliminares se realiza el siguiente procedimiento para obtener el valor de escalado para el dato ingresado. Para hallar el valor de escalado a 8 bits consideramos las parejas ( x1, x 2) = (0,360 ) (1) y
( y1, y 2) = (0,255 ) (2), las ecuaciones
y − y1 =
y 2 − y1 x 2 − x1
(3) y y = mx + b (4) Reemplazando 1 y 2 en la ecuación 3 nos queda.
y − y1 =
360 − 0 = 1.41 (5) 255 − 0
Pero y − y1 = m entonces de la ecuación 5 tenemos que. m =1.41 (6)
Reemplazando 6 en la ecuación 4 nos queda. y = (1.41 ) x + b (7)
Donde y representa el valor en grados (A), x representa el valor de la entrada en bits(n) reemplazando 7 nos queda: A = (1,41 ) n + b (8)
Para hallar el valor de escalado a 12 bits reemplazamos el valor obtenido de resolución 2n, (en este caso 4096) junto con el valor del Angulo máximo (360) Se reemplazan en la ecuación 3 y el resultado se reemplaza en 4, obteniendo el siguiente resultado. Donde y representa el valor en grados (A), x representa el valor de la entrada en bits(n), reemplazando nos queda. A = (0,0878 ) n + b
Estas ecuaciones obtenidas son usadas por el programa para realizar la operación de escalado con el valor previamente digitalizado, el valor resultante se almacena en un registro para que pueda ser usado por el siguiente bloque de funciones del programa.
FUNCION FUZZIFICACION.
Fig. Esta es una de las operaciones principales que realiza el programa, cuya función es tomar el valor de entrada, evaluarlo sobre los conjuntos definidos y entregar a su salida la pertenencia asociada a cada uno de estos esta bloque parte de los siguientes parámetros: 1.
variable de entrada, (la cual proviene del bloque de lectura, conversión y escalizado) y se define como valor de tipo entero
2.
variables de entrada difusas (error [e] y derivada error [De]) con 3 conjuntos de tipo triangular (negativo, cero y positivo), los cuales se encuentran precargados en la programación del controlador como tipo de dato arrays.
3.
variables declaradas para especificar Tipo y cantidad de conjuntos.
4.
array declarado para almacenar los resultados obtenidos de las operaciones de este bloque.
La configuración usada para establecer los conjuntos de entrada (error y derror) es la que se muestra a continuación, aunque esta puede variar como se vera más adelante:
Fig.
El funcionamiento de esta sección del programa tiene en cuenta los datos mencionados anteriormente y un mecanismo para realizar el recorrido de los conjuntos tomando la configuración de la Fig. y las zonas marcadas en la parte inferior del mismo. . Esto se explica a continuación.
ESTRUCTURA ALGORITMICA: Fuzzificacion (CerrorTG, dato) Int dato; Int TG; Int numC; Dato= n; TG= n;
NumC= n; Mientras (dato!=0 && TG==1&& numC!=0) haga if (dato >= array conjunto 0 pos 0) entonces P1= array conjunto 0 pos 0; Si (dato <= array conjunto 0 pos1) entonces { P2=array conjunto 0 pos 1; Pneg (dato, P1, P2) Grado pertenencia= resultado Pneg } If (dato > array conjunto 0 pos 1) entonces Grado pertenencia=0; If (dato >= array conjunto 1 pos 0) entonces P1= array conjunto 1 pos 0; If (dato <= array conjunto 1 pos1) entonces { P2=array conjunto 1 pos 1; Ppos (dato, P1, P2); Grado pertenencia= resultado Ppos; } Else P1= array conjunto 1 pos 1; Si (dato <= array conjunto 1 pos2) entonces { P2=array conjunto 1 pos 2; Pneg (dato, P1, P2);
Grado pertenencia= resultado Pneg; } El algoritmo descrito anteriormente muestra el procedimiento seleccionado para tomar el dato de entrada proveniente de la función lectura y lo evalúa sobre el array de conjuntos siguiendo el patrón de delimitación de zonas. La explicación de su funcionamiento es la siguiente: Inicialmente se declaran todas las variables (dato, TG , numC) donde dato representa el registro que almacena el resultado entregado por la función lectura, TG es la representación del tipo de conjunto a utilizar, en este caso triangular, y numC que representa el numero de conjuntos que se van a usar. Luego de esto se crea un ciclo que opera mientras se cumpla la condición establecida (dato sea diferente de cero, TG sea igual a 1 y numC sea diferente de cero). Una vez se cumple la condición inicial el programa inicia su operación, para esto hay que saber como se hace la representación de un triangulo analíticamente para su uso en el programa esto se puede apreciar en la fig.
Fig. Representación de conjunto como un array y análisis Como se puede observar los conjuntos triangulares tienen tres puntos y cada uno de ellos es representado por un valor (A, B y C) ubicado en las columnas del
array de la figura, el valor 0 en la fila representa el conjunto sobre el cual se esta evaluando el dato.
CRITERIO DE EVALUACION DE CONJUNTOS:
1.
se pregunta si el valor a evaluar es menor o igual que el valor de la primera posición del array (A) si es cierto el valor de pertenencia que guarda en el array correspondiente es cero, si ocurre lo contrario, el valor A
se guarda en el registro P1 y la pertenencia comprendida por los
valores menores o iguales a A se hace cero y se guarda en el array de pertenencias.
2.
Se pregunta si el valor a evaluar es menor o igual que el valor de la segunda posición del array (B) si es cierto el valor B se guarda en el registro P2 y se llama una función que calcula la pendiente positiva una vez realizada la operación retorna con el resultado y lo guarda en el array de pertenencias, si ocurre lo contrario, el valor B se guarda en el registro P1 y la pertenencia comprendida por los puntos A y B se hace cero y se guarda en el array de pertenencias.
3.
Se pregunta si el valor a evaluar es menor o igual que el valor de la tercera posición del array (C) si es cierto el valor C se guarda en el registro P2 y se llama una función que calcula la pendiente negativa una vez realizada la operación retorna con el resultado y lo guarda en el array de pertenencias, si ocurre lo contrario, las pertenencias comprendidas por los puntos B, C y posiciones superiores hace cero y se guarda en el array de pertenencias.
En la figura tal se tiene una información adicional de vital importancia para el funcionamiento de esta sección del programa, se trata de la representación analítica de la pendiente de un conjunto triangular, este análisis es de gran utilidad para realizar el algoritmo de evaluación de valores que se encuentren ubicados en uno o varios conjuntos. Visto desde la figura el calculo de la pendiente se presenta en dos casos diferentes, cuando el valor de entrada se ubica entre los puntos A y B de la figura (pendiente ascendente o positiva) y cuando se encuentra entre los puntos B y C (pendiente descendente o negativa). Caso # 1 Pendiente Ascendente: Haciendo referencia al punto 2 del criterio de evaluación de conjuntos, esta función (PPOS) toma los dos puntos de inflexión establecidos como límites (P1 y P2) y el valor de entrada, y realiza el cálculo de la pendiente positiva para obtener el valor de pertenencia en función de la ubicación del valor de entrada en esa zona. Su funcionamiento parte de la siguiente formula:
p=
x−y m−y
Donde
p = pendiente x = valor de entrada m = punto de inflexión
inferior, y y = punto de inflexión superior.
El algoritmo establecido se modifica de forma que los datos utilizados por el programa coincidan de manera adecuada, el resultado es el siguiente:
U=
dato − P 2 P 2 − P1
Donde u= pendiente obtenida, dato= registro de valor
almacenado, p1= punto de inflexión mínimo y p2= punto de inflexión máximo. El algoritmo que detalla esta explicación es el siguiente:
PPOS (dato, p1, p2) { Int P1 Int P2 Int U P1= dato – p1; P2= p2 – p1; U= P1/P2; Return (U) } Inicialmente se declaran los valores a utilizar por esta función, P1 que es la representación del numerador en el calculo de la pendiente, P2 como representación del denominador y u como el resultado de la pendiente. Luego de esto se procede con la primera expresión que es la diferencia entre el valor de la entrada y el punto de inflexión mínimo, y es representada como P1, después de esto se coloca la segunda expresión, que es la diferencia entre el punto de inflexión máximo y el punto de inflexión mínimo, y es representada como P2. Luego de esto se ubica la última expresión, la cual es una división entre las expresiones P1 y P2 respectivamente, de donde se obtiene el valor de la pendiente positiva que es representada por U, finalmente la función retorna a la fuzzificacion este valor y lo almacena en un array para representar los grados de pertenencia del conjunto evaluado.
Caso # 2 Pendiente Descendente: Haciendo referencia al punto 2 del criterio de evaluación de conjuntos, esta función (PNEG) toma los dos puntos de inflexión establecidos como límites (P1 y P2) y el valor de entrada, y realiza el cálculo de
la pendiente negativa para obtener el valor de pertenencia en función de la ubicación del valor de entrada en esa zona. Su funcionamiento parte de la siguiente formula:
p=
m −x m−y
Donde
p = pendiente x = valor de entrada m = punto de inflexión
inferior, y y = punto de inflexión superior.
El algoritmo establecido es modificado de forma que los datos utilizados por el programa coincidan de manera adecuada, el resultado es el siguiente:
U=
P 2 − dato P 2 − P1
Donde u= pendiente obtenida, dato= registro de valor
almacenado, p1= punto de inflexión superior y p2= punto de inflexión inferior. El algoritmo que detalla esta explicación es el siguiente: PPOS (dato, p1, p2) { Int P1 Int P2 Int U P1= p2 - dato; P2= p2 – p1; U= P1/P2; Return (U) }
Inicialmente se declaran los valores a utilizar por esta función, P1 que es la representación del numerador en el calculo de la pendiente, P2 como representación del denominador y U como el resultado de la pendiente. Luego de esto se procede con la primera expresión que es la diferencia entre el punto de inflexión mínimo y el valor de la entrada, y es representada como P1, después de esto se coloca la segunda expresión, que es la diferencia entre el punto de inflexión mínimo y el punto de inflexión máximo, y es representada como P2. Luego de esto se ubica la última expresión, la cual es una división entre las expresiones P1 y P2 respectivamente, de donde se obtiene el valor de la pendiente positiva que es representada por U, finalmente la función retorna a la fuzzificacion este valor y lo almacena en un array para representar los grados de pertenencia del conjunto evaluado. ALMACENAMIENTO DE LOS GRADOS DE PERTENENCIA
Durante el proceso de fuzzificacion los valores resultantes del recorrido de conjuntos son almacenados dentro de estructuras tipo array que son utilizadas por la maquina de inferencia y la base de reglas para establecer los lineamientos necesarios en la defuzzificacion A continuación se muestra en la tabla tal la forma de almacenamiento de los grados de pertenencia de las entradas error y Derror (GPEe y GPEd respectivamente). Fila = i columna = j Fila 0 Fila 1 Fila 2
Tabla tal
Columna 0 Pertenencia conjunto 0 Pertenencia conjunto 1 Pertenencia conjunto 2
Una vez estos arrays son definidos se llama una nueva función la cual se explica a continuación.
FUNCION MAQUINA DE INFERENCIA
Fig. Tal La figura muestra el bloque de la maquina de inferencia, Esta es una de las operaciones principales que realiza el programa, la función de bloque es tomar los grados de pertenencia arrojados por el bloque de fuzzificacion, cargar la base de reglas, definir cuales de estas se encuentran activas en relación con los grados de pertenencia obtenidos en la fuzzificacion, evaluar utilizando los criterios de inferencia conocidos y entregar un valor difuso de salida que se opera en el siguiente bloque funcional (defuzzificacion). Los parámetros y variables principales que gobiernan la operación de este bloque son los siguientes:
1.
Grados de pertenencia tanto del conjunto error como la derivada del error, estos se presentan como tipo de dato array, la forma como están organizados se puede apreciar en la tabla tal
2.
Definición de la base de reglas (Bas_reg), se presenta como tipo de dato array donde están almacenadas las reglas que definen la salida en función de los conjuntos de entrada
3.
Definición de reglas activas (Reg_Act), se presenta como tipo de dato array bidimensional, donde se establecen las reglas que se encuentran activas al momento del proceso.
Para obtener el valor de salida de este bloque se detalla un procedimiento que consta de 3 etapas a seguir estas son: 1. Obtención del mínimo de los antecedentes. 2. Detección de reglas activas. 3.
Aplicación del mecanismo de implicación y agregación
A continuación se explica con detalle cada uno de las etapas mencionadas. OBTENCIÓN DEL MÍNIMO DE LOS ANTECEDENTES Es la primera etapa del proceso general de la maquina de inferencias, este procedimiento se lleva a cabo con fin de obtener información sobre los valores de los grados de pertenencia diferentes de cero presentes en las estructuras de datos entregadas por la fuzzificacion, Antes de iniciar esta explicación es necesario saber que existe una estructura adicional donde serán almacenados los valores obtenidos del cálculo del mínimo
entre los arrays de pertenencia, esta es la matriz de reglas activas (Reg_Act), representada como un array bidimensional. El procedimiento que se ha planteado para obtener el mínimo de los antecedentes es el que se muestra a continuación.
Mínimo 1(GPEe, GPEd) Int i; Int min; For (i = 0, i <= 2, i + 1) { If (GPEe[i] &&GPEd [0]!=0) If (GPEe[i] <=0) { Min=GPEe[i]; Else Min=GPEd [0]; Min = Reg_Act [i] [0]; } Else Reg_Act [i] [0]=0; If (GPEe[i] &&GPEd [1]!=0) If (GPEe[i] <=0) { Min=GPEe[i]; Else Min=GPEd [0]; Min = Reg_Act [i] [1];
} Else Reg_Act [i] [1]=0; If (GPEe[i] &&GPEd [2]!=0) If (GPEe[i] <=0) { Min=GPEe[i]; Else Min=GPEd [0]; Min = Reg_Act [i][2]; } Else Reg_Act [i] [2]=0; I ++; } El algoritmo descrito anteriormente, muestra el planteamiento del mecanismo que realiza el recorrido de los grados de pertenencia entregados por el bloque fuzzificador, calcula el valor minimo entre estos y lo entrega a la estructura definida para las reglas activas, a continuación se explica con mas detalle el funcionamiento de esta etapa. Antes de iniciar la explicación es necesario saber que existe definida una estructura donde serán almacenados los mínimos de los antecedentes obtenidos de las operaciones entre los grados de pertenencia, esta es la matriz de reglas activas (Reg_Act), la cual es definida como un array bidimensional a donde son ingresados los mínimos resultantes, que ayudan a definir cuales son las reglas que se encuentran activas en ese momento.
Inicialmente se declaran las variables a utilizar, una variable i definida para iteraciones y una variable min para definir el minimo obtenido. Una vez hecho esto se procede con el programa principal el cual inicia con un ciclo FOR que establece el recorrido de los grados de pertenencia y la matriz de reglas activas, el recorrido se realiza estableciendo un valor que cambie frente a uno fijo. En este caso GPEe será el valor cambiante representado por (i) y GPEd incrementa en valores unitarios iniciando desde cero igualmente se utiliza este proceso con la matriz de reglas activas usando la variable de iteración, inicialmente se pregunta si los valores iniciales de los arrays de pertenencia (GPEe [i] y GPEd [0]) son diferentes de cero. Si la afirmación es cierta realiza el calculo del valor minimo entre estos dos y almacena el valor en la posición definida de la matriz de reglas activas (Reg_Act [i][0]), de lo contrario el valor en la posición definida de la matriz de reglas activas se hace igual a cero, este mismo procedimiento se realiza entre las siguientes posiciones de los arrays de pertenencia hasta recorrer la totalidad de estos. CALCULO DEL MINIMO Este procedimiento es equivalente a la aplicación del operador difuso en los antecedentes. El operador aplicado en esta etapa parte del conector lógico entre antecedentes. Ejemplo: “si antecedente 1 (conector lógico) antecedente 2 entonces…” Existen dos opciones de conectores lógicos (AND y OR). Si se utiliza AND entre antecedentes, el operador difuso aplicado es el mínimo y si es OR se aplica el máximo. Para este diseño los antecedentes utilizan AND como conector lógico por lo tanto se aplica el cálculo del mínimo a los antecedentes. Esta sección del programa define el valor menor entre los dos valores operados de los grados de pertenencia y lo entrega a la matriz de reglas activas
If (GPEe[i] <=0) Min=GPEe[i]; Else Min=GPEd [0]; Esta parte del código pregunta si el valor de la posición del array de pertenencia que se esta iterando (GPEe [i]) es menor o igual a cero, si la afirmación es cierta su valor es entregado como minimo a la matriz de reglas activas, de lo contrario el segundo array de pertenencia que se evalúa (GPEd [0]) pasa a ser el minimo entregado. Este procedimiento se realiza hasta recorrer las pertenencias y cargar las reglas determinadas como activas en la matriz correspondiente. Gráficamente el proceso puede ser visto en la figura tal
Fig. Tal. Donde las estructuras del lado derecho representan las pertenencias y la del lado izquierdo representa la matriz de reglas activas, las pertenencias diferentes de cero se operan para obtener el mínimo y entregarlo a la siguiente etapa.
DETECCIÓN DE REGLAS ACTIVAS
Una vez obtenidos los mínimos de los antecedentes, se debe determinar a partir de estos cuales son las reglas activas, para aplicar el mecanismo de implicación – agregación y de esta forma entregar el valor resultante al bloque de defuzzificacion.
Para el correcto funcionamiento de esta etapa se hace necesario definir lo siguiente: BASE DE REGLAS
Es un tipo de dato array que contiene las salidas correspondientes
de las
entradas definidas, generalmente una base de reglas difusas es definida en términos lingüísticos, sin embargo los lenguajes de programación manejan los datos internamente como números y se hace complejo definirlos lingüísticamente, se hace uso del siguiente mecanismo para definir internamente la base de reglas, se puede observar con mas claridad en la Fig.
Fig. Tal La figura muestra en el lado izquierdo la base de reglas original, que se define al iniciar el diseño del controlador, del lado derecho se muestra el sistema implementado para la base de reglas al momento de ser declarada en el
programa. Lo que se ha hecho es relacionar cada conjunto con un valor, este valor funciona como una etiqueta que determina el subconjunto actual, las etiquetas son definidas con base a los conjuntos de salida con los números mostrados (0=N, 1=Z, 2=P), de esta manera se garantiza una representación precisa de las reglas para ser usadas en el proceso de implicación. La estructura para detección de reglas activas es la siguiente: Detección Reg_Act (Reg_Act) Int i Int j For (i=0, i=2, i+1) { For (j=0, j=2, j+1) { If (Reg_Act [i] [j] == 0) Goto incremento If (Bas_Reg [i] [j] == 0) “implicación Vneg” Else If (Bas_Reg [i] [j] ==1) “implicación Vcer” Else If (Bas_Reg [i] [j] == 2) “implicación Vpos” Else Incremento
I ++ J ++ } } En esta sección del código pregunta si la regla activa evaluada es igual a cero, si la afirmación es cierta, significa que en la posición actual la regla no esta activa y salta hacia la etiqueta de incremento para continuar evaluando las reglas activas. Si ocurre lo contrario, procede a preguntar por el valor almacenado en la base de reglas, si el valor es cero, se procede a realizar la implicación con el subconjunto de salida Vneg si el valor es uno, realiza la implicación con el subconjunto de salida Vcer, y si el valor es dos, lo hace con el subconjunto de salida Vpos La función de implicación y su realización completa se detalla a continuación:
MECANISMO DE IMPLICACIÓN Es el procedimiento clave para obtener valores de salida a entregar para defuzzificar. Para este controlador el mecanismo aplicado se conoce como “operador de implicación de mamdani”, este método es el más utilizado en aplicaciones puesto que posee una estructura de operaciones muy simple. La estructura operativa de este sistema de implicación consta de dos partes: 1.
calculo de la implicación (mínimo).
2.
calculo de la agregación (máximo).
Estas dos operaciones se realizan tomando el conjunto de salida (Voltaje), subconjunto por subconjunto y se evalúa cada valor establecido, en función de la pertenencia. Para explicarlo con más claridad se puede observar la Fig. TAL a continuación.
Fig. TAL La grafica muestra la forma en la cual se obtienen los valores de salida que utiliza El operador de implicación, la manera de evaluación se realiza discretizando los voltajes establecidos previo diseño, representados por los valores en el eje X de la grafica, y obteniendo su respectiva pertenencia en el eje Y tomando como referencia la función establecida para cada subconjunto (en este caso triangular). Y almacenando estos resultados en variables
tipo array unidimensional que
representan cada subconjunto (Vneg, Vcer y Vpos) El proceso de discretizacion conlleva a la creación de un algoritmo por cada conjunto definido para obtener su representación, la estructura de estos algoritmos es similar a la utilizada para la fuzzifificacion. Y se muestra a continuación el algoritmo de modo general para la discretizacion de todo el conjunto de salida Voltaje [6]= {0, 1, 2, 3, 4,5} Discretiza (Voltaje) Int i; Int p0, p1, p2, p3, p4, p5, p6;
P0=Voltaje [0]; P1=Voltaje [2]; P2=Voltaje [0]; P3=Voltaje [2]; P4=Voltaje [5]; P5=Voltaje [2]; P6=Voltaje [5]; For (i=0, i=5, i+1) { If (voltaje [i] <= p0) Vneg [i]=1; Else If (voltaje [i] <= p1) Vneg [i]= Pneg; Else Vneg[i]=0; If (voltaje [i] <= p2) Vcer[i]=0; Else If (voltaje [i] <= p3) Vcer[i]=Ppos; Else If (voltaje [i] <= p4) Vcer[i]=Pneg; Else Vcer[i]=0; If (voltaje [i] <= p5) Vpos [i]=0; Else
If (voltaje [i] <= p6) Vpos [i]= Ppos; Else Vpos [i]=1; I++ } Inicialmente se ha colocado la referencia desde la que parte esta sección de código, el array Voltaje que contiene todo el universo de discurso que va a ser discretizado. Se han seleccionado pocos valores para que el procedimiento sea más corto, después viene la declaración de variables, que en este caso son: la variable de iteración y los puntos de inflexión de todos los conjuntos, después de esto se asignan a cada punto su valor respectivo que sirve de límite para obtener los valores que se buscan. Esta sección del programa inicia evaluando los puntos p0 hasta p6 de la siguiente forma: Si el valor del conjunto a evaluar (Voltaje [i]) es menor o igual a p0 entonces el valor que se va a almacenar en el array asignado para este subconjunto (Vneg [i]) es uno, si ocurre lo contrario pregunta si el valor del conjunto a evaluar es menor a p1 y si es cierto calcula la pendiente respectiva (Pneg) y el valor obtenido se almacena en el array Vneg. En el caso contrario el valor a almacenar es cero. Seguidamente se pregunta Si el valor del conjunto a evaluar (Voltaje [i]) es menor o igual a p2 entonces el valor que se va a almacenar en el array asignado para este subconjunto (Vcer [i]) es cero si ocurre lo contrario pregunta si el valor del conjunto a evaluar es menor a p3 y si es cierto calcula la pendiente respectiva (Ppos) y el valor obtenido se almacena en el array Vcer. En el caso contrario pregunta si el valor a evaluar es menor o igual a p4, si se cumple esto se calcula la pendiente respectiva (Pneg) en entre los puntos mencionados y el valor a evaluar, y su resultado es almacenado en el array respectivo. En el caso contrario el valor a almacenar es cero.
Después pregunta Si el valor del conjunto a evaluar (Voltaje [i]) es menor o igual a p5 entonces el valor que se va a almacenar en el array asignado para este subconjunto (Vpos [i]) es cero, si ocurre lo contrario pregunta si el valor del conjunto a evaluar es menor o igual a p6 y si es cierto calcula la pendiente respectiva (Ppos) y el valor obtenido se almacena en el array Vpos. En el caso contrario el valor a almacenar es uno. Una vez realizado todo esto se procede con el incremento del ciclo. Hasta abarcar todos los valores de salida, con esto se ha llevado a valores discretos cada array subconjunto de salida (Vneg, Vcer y Vpos respectivamente). A partir de esto se procede con la primera parte del operador de mamdani, la implicación, cuyo procedimiento se detalla a continuación FUNCION IMPLICACION Esta se encarga de obtener el mínimo valor entre la regla activa evaluada y la representación del subconjunto de salida determinado. Nota: El subconjunto de salida lo entrega el recorrido realizado sobre la base de reglas y la etiqueta que se encuentre en la posición que se este leyendo (ver detección de reglas activas) Esta función esta ligada directamente a la detección de reglas activas, dado que los valores diferentes de cero que se encuentran en la matriz de reglas activas son los que se operan con los conjuntos de salida, además la base de reglas entrega la información sobre que subconjunto se va a operar. Estas dos informaciones y la función realizan el proceso completo de implicación. A continuación se explica la estructura algorítmica planteada para la obtención de los mínimos: Implicación (Reg_Act, Subco){
Int conteo For (conteo=0, conteo=5, conteo+1) { If (Reg_Act [i] [j] <=subco [conteo]) Implica [0] [conteo]= Reg_Act[i] [j] Else Implica [0] [conteo]= subco [0] [conteo] Conteo ++ Return } } Esta función inicia declarando la variable de iteración (conteo), después de esto se coloca un IF para evaluar si la posición en la matriz de reglas activas (Reg_Act) es menor a la posición del subconjunto de salida (subco). Si la condición se cumple significa que el valor de regla activa es menor, entonces se designa una variable de tipo array para almacenar los resultados de la implicación (Implica). Si ocurre lo contrario significa que el valor del subconjunto es menor y por lo tanto este se almacena en el array designado, este proceso se realiza hasta recorrer la totalidad de valores del subconjunto de salida. Como dato adicional hay que decir que este algoritmo aplica para los demás subconjuntos, solo basta con reemplazar el termino subco con la variable que se haya asignado como subconjunto de salida, en este caso Vneg, Vcer o Vpos según sea el caso, y incrementar el valor fijo de la variable implica en uno por cada subconjunto. FUNCION AGREGACION
Esta se encarga de operar los valores de cada posición de salida representada, con el fin de obtener el máximo individual y almacenarlo en una única estructura
de datos que se entrega al bloque de defuzzificacion, gráficamente se representa de la siguiente forma:
Fila 0 Fila 1 Fila 2 Fila 3
Columna
Columna
Columna
Columna
Columna
Columna5
0
1 Imp A1 Imp B1 Imp C1 Imp D1
2 Imp A2 Imp B2 Imp C2 Imp D2
3 Imp A3 Imp B3 Imp C3 Imp D3
4 Imp A4 Imp B4 Imp C4 Imp D4
Imp A5 Imp B5 Imp C5 Imp D5
Imp A0 Imp B0 Imp C0 Imp D0 Max col 0
Tabla tal En la tabla tal se puede apreciar la manera como se almacena el resultado de la implicación, partiendo de esto se toma cada columna y se calcula el máximo valor de esta, se realiza individualmente este procedimiento y al final se obtiene una estructura como la mostrada en la tabla tal.
Fila 0
Columna
Columna
Columna
Columna
Columna
Columna5
0 Max col 0
1 Max col 1
2 Max col 2
3 Max col 3
4 Max col 4
Max col 5
Tabla tal La estructura algorítmica del procedimiento mencionado antes se muestra a continuación:
Agregación (implicación) { Int p Int n Int max Max = 0 For (p=0, p=5, p+1) { For (n=0, n=3, n+1) { If (implica[p] [n]>max) Max= implica [p] [n] N++ } Max = salida [p] P++ } } Se declaran inicialmente las variables de iteración (p y n) para el recorrido de filas y columnas, y una variable adicional para establecer el máximo inicializada en cero. Se sigue con un ciclo For externo para el recorrido de las columnas del array de implicación y uno interno para las filas, seguido esto se pregunta si la posición a evaluar del array de implicación es mayor al máximo, Si la condición es cierta e valor evaluado es igual al máximo y se incrementa el ciclo interno. Una vez finalizado el ciclo interno el valor final de máximo se almacena en una variable de tipo array que indica la salida de este bloque el cual incrementa en función del ciclo externo, este último incrementa para evaluar la siguiente columna. Este proceso se repite hasta abarcar la totalidad de valores de la matriz de implicación, con lo cual el array de salida ha sido completado y puede ser entregado al defuzzificador.
FUNCION DEFUZZIFICACION
Fig. tal
La Fig. Tal muestra el bloque de defuzzificacion, Este bloque se encarga de convertir el conjunto de valores difusos entregados por la maquina de inferencia en un resultado numérico concreto que es la utilizada para definir la salida del sistema. Para la aplicación de la defuzzificacion se utilizan diversos métodos entre estos están: centro de gravedad, centro de sumas, media de máximos entre otros. El método que se aplica en este controlador es el Centro de gravedad o COG, cuya es la siguiente:
COG =
∫ µ(i ) ∗ x(i) ∫ µ(i)
Donde
∫µ(i ) ∗x(i ) representa el momento de la función y ∫x(i ) representa el
área de la función Sin embargo el cálculo de integrales por software (integración numérica) resulta un procedimiento relativamente complejo, es por ello que en este diseño se utiliza el método discreto para hallar el COG el cual se muestra a continuación:
COG =
∑µ( xi ) ∗ x(i ) ∑u ( xi )
Donde µ(xi ) representa el conjunto de valores originales de salida y x(i ) el conjunto de consecuentes discretizado. Con esta expresión se utilizan las variables equivalentes y se obtiene la formula para hallar el centro de gravedad de la siguiente forma:
COG =
∑voltaje ∗ salida ∑ salida
Donde la variable voltaje es el array de valores de del universo de discurso para la salida y salida es el array de resultado de la agregación. El procedimiento algorítmico para hallar el centro de gravedad es el siguiente:
Centro _ gravedad (voltaje, salida) { Int prodn Int num Int den Int z Int COG Prodn=0 Num=0 Den=0 For (z=0, z=5, z+1) { Prodn = voltaje[z] * salida[z]
Num= num+prodn Den= den+ voltaje[z] Z++ } COG= num / den }
Esta función inicia declarando las variables necesarias para su funcionamiento (prodn, num, den, COG y z), prodn es la variable para operar el producto del numerador en el COG, num es asignada para contener la sumatoria de los productos, den es quien contiene la operación de sumatoria del denominador, COG es la variable que guarda el resultado del centro de gravedad, y z es la variable de iteración, hecho esto se inicializan todas las variables de operación en cero y se comienza un ciclo For para recorrer los arrays que se van a operar para obtener el centro de gravedad, Estos son voltaje [z] y salida[z]. Dentro del ciclo For la variable prodn se hace igual al producto de los arrays mencionados sigue la variable num que almacena la sumatoria del producto mencionado antes, y la variable den que guarda la sumatoria del array voltaje. Se hace el respectivo incremento del ciclo y una vez sale de este los valores finales de numerador y denominador (num y den) la variable COG los opera por medio de una división y se obtiene el valor de salida para la planta a controlar.
IMPLEMENTACIÓN DEL CONTROLADOR
En este punto es donde se lleva todo el algoritmo planteado
a un software
compatible con las herramientas de hardware seleccionadas. En este caso el hardware seleccionado es la tarjeta de desarrollo de la empresa Freescale DEMOQE128, la cual contiene un microcontrolador de referencia MCF51QE128, Ver Fig. Tal. Este posee una estructura que parte de registros, memoria y dispositivos de E/S de gran utilidad para la implementación de este diseño.
Fig. Tal. (?) El diseño de este controlador parte inicialmente de la captura del valor de referencia utilizando un sensor y transfiriendo esa señal a un puerto especifico. Para dar inicio a un programa se trabaja con tres registros que ayudan a cumplir ese propósito, estos son: SOPT1, SCGC1 y SCGC2 de los cuales se habla a continuación.
Registro SOPT1 (registro de opciones del sistema): este registro define principalmente características como habilitación de reset, depuración de fondo o (BDM) y habilitación del perro guardián. Su forma interna es la que se muestra a continuación en la Fig.:
Fig. Tal De este registro solo se configuran los bits 0, 1 y 5 que son descritos a continuación: Bit RSTPE (Habilitación de pin de reset): Este bit individual se configura para habilitar el reset por medio del pin PTA5, si se coloca en uno el reset se habilita, si esta en cero el pin funciona en configuración de entrada/salida. Bit BKGDPE (Habilitación de modo de depuración): Este bit individual se configura para habilitar el pin del modo de depuración de fondo que se encuentra como función adicional del pin PTA4, el cual es el modo de programación utilizado en la mayoría de sistema de desarrollo de Freescale. Si se coloca en uno el BKGDP se habilita, si esta en cero el pin funciona en configuración de entrada/salida. Bit STOPE (Habilitación de pin STOP): Este bit en conjunto con el bit WAITE activan el modo de operación a utilizar por el programa a implementar (modo Run) (¿), si no se habilitan es posible que el microcontrolador no opere correctamente. Como nota adicional, estos bits mencionados a excepción del bit WAITE solo pueden ser escritos una vez, es decir después de hacer un reset, solo la primera escritura hecha a estos bits será reconocida y almacenada.
Registro SCGC1 y SCGC2 (control de reloj de sincronización de sistema): estos registro son dos los encargados de habilitar o deshabilitar los buses de
sincronización de reloj de los módulos periféricos (ADC, SPI, I2C, real time clock , timers entre otros) Sus estructuras internas son las que se muestran a continuación en la Fig. tal
Fig. tal Con los registros anteriores se garantiza la inicialización de este microcontrolador bajo los parámetros mas básicos de operación necesarios para la implementación del código del controlador la captura de una señal del medio y el envío de datos del controlador hacia la planta se hace utilizando las entradas y salidas del microcontrolador llamadas puertos, Internamente un puerto típico (tomando de ejemplo el puerto A para efectos explicativos) de este microcontrolador funciona configurando los siguientes registros: Registro PTAD (Registro de datos): este es un registro para el almacenamiento de los datos que se leen o escriben en el puerto, contiene ocho bits que pueden ser configurados en forma individual o completa su estructura es la que se observa en la figura tal:
Fig. Tal Dato que entra o sale es almacenado en este registro para que el programa de acuerdo a la configuración que posee disponga de ellos donde sea necesario Registro PTADD (Registro de dirección de datos): Este registro se encarga de la dirección de datos para los bits del puerto A, es decir como se va configurar el puerto (entrada o salida), Su estructura se observa en la figura tal.
Fig. Tal La configuración interna de este registro es la siguiente: •
Si se escribe un uno este registro, el comportamiento del puerto es de entrada.
•
Si se escribe un cero este registro, el comportamiento del puerto es de salida.
También se puede configurar individualmente cada BIT para asignarlo como entrada o salida igualmente. REGISTRO PTAPE (registro de habilitación de pull-up/down): este registro internamente habilita un dispositivo de pull-up o pull-down en cada pin del puerto A según sea el caso. En la Fig. Tal se observa su forma interna.
Fig. Tal La configuración interna de este registro es la siguiente: •
Si se escribe un uno este registro, habilita internamente los dispositivos de pull –up /down.
•
Si se escribe un cero este registro, deshabilita internamente los dispositivos de pull –up /down.
Registro PTASE (registro de habilitación de slew rate): Este registro configura el slew rate de salida asociado a cada pin del puerto A, internamente esta dispuesto como se muestra en la Fig. tal
Fig. Tal
Internamente se configura de la siguiente forma: •
Si se escribe un uno este registro, habilita internamente el slew rate para el bit n del puerto A.
•
Si se escribe un cero este registro, deshabilita internamente el slew rate para el bit n del puerto A
El dato capturado como su naturaleza es análogo, se hace necesario que sea convertido a información digital, para ello, este microcontrolador posee un convertidor análogo digital, con el cual se puede realizar este procedimiento. Los registros asociados internamente para la conversión son los siguientes. Registro ADCSC1: (registro de estado y control 1) es el encargado de abortar una conversión y dar inicio a una nueva, esto ocurre escribiendo los bits destinados para ese propósito, Internamente este registro esta descrito tal y como se puede ver en la figura:
Fig. Donde los bits 0-4 (ADCH) están destinados para la selección del canal de conversión, como se menciona anteriormente el MCF51QE128 cuenta con 28 canales organizados desde el 00000 hasta el 11011 para su respectivo uso como entradas analógicas, el bit 5 (ADCO) habilita conversiones continuas escribiendo en este. Si se encuentra en cero solo se realizara una conversión al escribir en el registro ADCSC1, si se encuentra en 1 se realizara continuamente la conversión al escribir sobre este registro, el bit 6 (AIEN) activa la interrupción por conversión completa, esta se activa cuando el bit COCO se coloca en 1 mientras este bit se encuentre en 1, cuando se encuentra en cero la interrupción esta deshabilitada. el bit 7 (COCO) es la bandera que indica una conversión completa, este bit es de solo lectura y se aclara solo cuando este registro es escrito o cuando el registro de datos del conversor es leído. Registro ADCSC2: (registro de estado y control 2) es el encargado controlar las funciones de comparación del modulo ADC, el disparo de conversión y la
conversión activa, Internamente este registro esta descrito tal y como se puede ver en la figura:
Fig. El conversor utiliza solo 2 bits de este registro de los cuales solo uno es configurable, este es el bit 6 (ADTRG) que indica el tipo de disparo que inicia una conversión. Si esta en cero quiere decir que la conversión inicia por software, si esta en uno la conversión se inicia por hardware, esto es escribiendo en los bits del registro ADCSC1 y adicionalmente habilitando la entrada ADHWT,El otro bit es el bit 7 (ADACT) que funciona como indicador para hacer saber si hay o no una conversión en proceso. Registro ADCCFG: (registro de configuración) es el encargado de seleccionar el modo de operación la fuente y el divisor de reloj, también se configura para bajo consumo o periodo de muestreo largo. Internamente este registro esta descrito tal y como se puede ver en la figura:
Fig. Los bits 0-1 (ADICLK) seleccionan la fuente de reloj de entrada para generar el reloj interno ADCLK (nota al pie),Los bits 2-3 (MODE) seleccionan el modo de operación del conversor A/D sea 8,10 o 12 bits (nota al pie), El bit 4 (ADLSMP)
configura el periodo de muestreo largo, esto sirve para ajustar el periodo de muestreo para permitir que las entradas de alta impedancia sean muestreadas de forma precisa o para maximizar la velocidad de conversión para entradas de baja impedancia. Si esta en cero habilita periodos de muestreo corto, si esta en uno habilita periodos de muestreo largo., Los bits 5 y 6 (ADIV) seleccionan el divisor de reloj es decir la relación de división usada por el ADC para generar el reloj interno ADCK, El bit 7 (ADLPC) configura la velocidad y consumo del conversor, (nota al pie). Registros ADCR: (registros de datos de resultado) estos se encargan de almacenar los datos obtenidos al realizar una conversión exitosa, se pueden usar directamente desde aquí o se pueden ubicar en otro registro para ser usados en otro momento. Se dividen en dos (ADCRL y ADCRH) tal y como se puede apreciar en la figura.
Fig. Donde el registro ADCRL almacena los 8 bits de una conversión sencilla o los primeros 8 bits de una de 10 o 12 bits y el registro ADCRH almacena los 2 últimos bits de una conversión de 10 bits o los 4 últimos de una de 12 bits respectivamente. Registros APCTL: (registros de control de pin) la función de esto registros es deshabilitar el control de puertos E/S de los pines del microcontrolador usados
como entradas análogas. En total son 3 registros (APCTL 1, 2 y 3) Internamente estos registros están descritos tal y como se puede apreciar en la figura:
Fig. Registros APCTL 1, 2 y 3. Cada BIT de estos registros se configura de la siguiente forma, tomando como ejemplo el BIT ADPC0 del registro APCTL1. Si ADPC0 esta en cero (valor por defecto) el control de pin de E/S esta activo, esto quiere decir que el pin relacionado a este bit se comporta como entrada y salida de datos dependiendo de cómo se configure. Si ADPC0 esta en uno, el control de pin de E/S esta inactivo, a partir de este momento el pin relacionado a este bit se comporta como entrada análoga para el convertidor.
ESTRUCTURA DE PROGRAMACION
Todo el proceso de control difuso por parte algorítmica sigue un orden lógico que parte de su descripción general, de igual manera al transformar los algoritmos a código para el microcontrolador se debe seguir un orden que garantice la ejecución del programa en el orden correcto, para ello se define el siguiente orden de ejecución: •
Un programa principal que contiene las funciones necesarias para el correcto funcionamiento del controlador
•
Subrutinas que son llamadas desde el programa principal de acuerdo al modo en que hayan sido organizadas.
Todo esto va organizado en un mismo archivo debidamente ordenado para evitar confusión, la forma como queda todo esto se puede apreciar a continuación. ******************************************* Declaraciones ******************************************* Variables Tipo variable 1 Tipo variable 2 Tipo variable n ******************************************* Programa principal ******************************************* Main { Ciclo Estructura interna Llamado a funciones }
******************************************** Funciones ******************************************** Nombre función 1 Nombre función 2 Nombre función n Esta es la organización planteada y aplicada a la implementación de este código, podrá ser visto con más claridad en la siguiente parte donde son mostrados los algoritmos mencionados en el capitulo anterior ya implementados para ingresarlos al microcontrolador
IMPLEMENTACION EN LENGUAJE MAQUINA Para la implementación de los algoritmos en el microcontrolador designado se hizo uso del lenguaje ANSI C dado su gran compatibilidad con este dispositivo y también por el hecho de a pesar de que este micro cuenta con un set de instrucciones en lenguaje ensamblador, el solo hecho de realizar un programa en este lenguaje resulta en un código extremadamente largo y mas complejo de analizar, donde el objetivo primordial de un programa es hacerlo relativamente corto y fácil de entender. A continuación se muestra la estructura inicial del programa con algunas declaraciones incluidas. /*********************************************************************************************/ /*Controlador difuso embebido V0.0 /*********************************************************************************************/ /* cabecera */
# include
// macro incluida para interrupciones
# include "derivative.h" // macro incluida para declaracion de perifericos
/*********************************************************************************************/ /* variables */ int i;
// variable para iteracion
int j;
// variable para iteracion
/*variables globales*/ extern int temp; extern int dato;
// variable que define valor de entrada
extern int Tg;
// variable que define el tipo de conjunto ( triangular)
int p1; int p2; extern int U; extern int C; extern int numC;
// variable que define el numero de conjuntos
/****************************************************************************/ /*ARRAYS */ int Cerror_Tg [3][3]={{0,5,0},{0,5,9},{0,5,9}};// array de conjuntos para Error ( triangular) int CDerror_Tg[3][3]={{0,5,0},{0,5,9},{0,5,9}};// array de conjuntos para derivada de error ( triangular) int Voltaje [6] = {0,1,2,3,4,6};
int GPEe [3][4]={0}; // array para almacenar grados de pertenencia de error int GPEd [3][4]={0}; // array para almacenar grados de pertenencia de derivada error int Vneg [6]={0};// array para discretizacion int Vcer [6]={0};// array para discretizacion int Vpos [6]={0};// array para discretizacion int salida [6]={0}; //array para almacenar agregación int implica[6]={0};//array para almacenar implicación /********************************************************************************************/ /*Definiciones*/ #define Disable_COP() SOPT1 &=0x3F; /***************************************************************************/ /*Funciones*/ void MCU_init(void); void ADC_init(void); void GPIO_init(void); void Fuzzificacion(void); void Delay(void); void delay(void); void P_Pos(void); void P_Neg(void); void lectconvescal(void); void mínimo(void); void detección Reg_Act(void); void discretiza (void); void implicación (void);
void agregación(void); void centro _ gravedad(void); después de esta sección se continua con el programa principal que es sencillamente el que se encarga de llamar uno a uno los bloques del controlador representados como funciones y repetir este proceso secuencialmente de forma continua. /*Programa Principal*/ Void main (void) { MCU_init (); GPIO_init (); ADC_init (); Disable_COP (); EnableInterrupts; ADCSC1_AIEN = 1; APCTL1_ADPC0 = 1; For (;;){
//deshabilita el COP //habilita interrupciones
Lectconvescal (); Fuzzificacion (); Mínimo (); Detección Reg_Act (); Implicación (); Discretiza (); Agregación (); Centro _ gravedad (); } } DISEÑO ARQUITECTONICO Planta y sensor implementados Para la observación del controlador en funcionamiento es necesaria la utilización de un medio físico donde se pueda experimentar esto. Se hizo uso de una
pequeña planta prototipo para posicionamiento angular, esta se describe a continuación a través de la figura tal.
Fig tal
BIBLIOGRAFIA Baturone Illuminada y otros, MICROELECTRONIC DESIGN OF FUZZY LOGICBASED SYSTEMS, CRC Press, 2000 315 páginas.
Jan Jantzen, FOUNDATIONS OF FUZZY CONTROL, John Wiley & Sons 2007 220p.
Ahmad Ibrahim, FUZZY LOGIC FOR EMBEDDED SYSTEMS APPLICATIONS, Publicado por Newnes, 2004, 293 p.
Leonid Reznik, FUZZY CONTROLLERS Publicado por Newnes, 1997 287 p.
Kevin M. Passino, Stephen Yurkovich, Fuzzy Control, Addison-Wesley 1998 475 p [1] Agenor Polo Zabaleta, Mario Esmeral Palacio, CONTROLADOR DIFUSO PARAMETRIZABLE
BASADO
EN
UN
NÚCLEO
DE
PROCESAMIENTO
RECONFIGURABLE DESCRITO EN VHDL, INGENIERÍA & DESARROLLO Número 22 Julio-Diciembre, 2007 [2] Spartacus Gomáriz, Francesc Guinjoan, DISEÑO DE UN CONTROLADOR DIFUSO SUPERVISOR PARA LA REGULACIÓN DE UN CONVERTIDOR CONMUTADO ELEVADOR, Revista de ingeniería #28 Universidad de los Andes. Bogotá, Colombia. Noviembre de 2008 [3] Juan Contreras Montes, Roger Misa Llorca, Luís F. Murillo Fernández, OBTENCIÓN DE MODELOS BORROSOS INTERPRETABLES DE PROCESOS DINÁMICOS, Revista iberoamericana de Automática e Informática Industrial vol5, num. 3, julio 2008, pp. 70-77