Sunteți pe pagina 1din 94

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


xi 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

2 2
E2 = ( Y −Wθ ) = ( Y2− 2YWθ + ( 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

y 2 − y1
( x1, x 2) = (0,360 ) (1) y ( y1, y 2) = (0,255 ) (2), las ecuaciones y − y1 =
x 2 − x1
(3) y y = mx + b (4)

Reemplazando 1 y 2 en la ecuación 3 nos queda.

360 − 0
y − y1 = = 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:

x−y
p= Donde p = pendiente x = valor de entrada m = punto de inflexión
m−y

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:

dato − P 2
U= Donde u= pendiente obtenida, dato= registro de valor
P 2 − P1
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:

m −x
p= Donde p = pendiente x = valor de entrada m = punto de inflexión
m−y

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:

P 2 − dato
U= Donde u= pendiente obtenida, dato= registro de valor
P 2 − P1
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 Columna 0


Fila 0 Pertenencia conjunto 0
Fila 1 Pertenencia conjunto 1
Fila 2 Pertenencia conjunto 2

Tabla tal
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:

Columna Columna Columna Columna Columna Columna5


0 1 2 3 4
Fila 0 Imp A0 Imp A1 Imp A2 Imp A3 Imp A4 Imp A5
Fila 1 Imp B0 Imp B1 Imp B2 Imp B3 Imp B4 Imp B5
Fila 2 Imp C0 Imp C1 Imp C2 Imp C3 Imp C4 Imp C5
Fila 3 Imp D0 Imp D1 Imp D2 Imp D3 Imp D4 Imp D5
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.

Columna Columna Columna Columna Columna Columna5


0 1 2 3 4
Fila 0 Max col 0 Max col 1 Max col 2 Max col 3 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 <hidef.h> // 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 (); //deshabilita el COP
EnableInterrupts; //habilita interrupciones
ADCSC1_AIEN = 1;
APCTL1_ADPC0 = 1;
For (;;){

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 LOGIC-


BASED 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

S-ar putea să vă placă și