viernes, 24 de enero de 2014

Control Difuso tipo Mamdani de un modelo en Simulink.

OBJETIVO

Realizar un control difuso discreto tipo Mamdani en lazo cerrado de un modelo en Simulink,  utilizando comunicación serial entre el Simulink y el Kinetis KL25Z, de forma tal que el algoritmo de control difuso discreto y ajuste de la referencia sea ejecutado mediante el  microcontrolador.

DESARROLLO

El modelo implementado en Simulink y las configuraciones son en forma idéntica al utilizado en la practica
del control proporcional.

Figura 1. Modelo implementado en Simulink.

Figura 2. Subsistema para el modelo del motor DC.


En la figura 1 el lazo de control se encuentra abierto entre los bloques to instrument y Query Instrument, el microcontrolador es el encargado de cerrar ese lazo mediante la aplicación de un control difuso discreto tipo Mamdani. El programa se basa en la interacción de 6 tareas y 3 eventos descritos en las tablas siguientes.

Name
Stack Size
Priority
MQX_AUTO_START_TASK
Task1 (initialization)
512
8
ENABLE
Task2 (main_task)
512
8
ENABLE
Task3 (fuzzification_task)
512
8
DISABLE
Task4 (norm_t_min_task)
512
8
DISABLE
Task5 (maxumum_task)
512
8
DISABLE
Task6(defuzzification_task)
512
8
DISABLE
Tabla 1. Lista de eventos para la práctica de control difuso.


Name
Description
AD1_OnMeasurementComplete
Evento que es invocado cuando una medición ha sido realizada.
AS1_OnRxChar
Evento que es invocado cuando un carácter ha sido recibido correctamente.
AS1_OnTxChar
Evento que es invocado después que un carácter ha sido transmitido.
Tabla 2. Lista de eventos para la práctica de control difuso.

El programa básicamente lee el valor de referencia (setpoint) mediante un Potenciómetro en el puerto del ADC, el cual es controlado por un temporizador que actúa cada 10ms. La tarea 1 es la encargada de la inicialización de los periféricos, creación de un evento, semáforo y las cuatro tareas secuenciales para el proceso del control difuso tipo Mamdani, una vez realizadas estas acciones la tarea es destruida, mediante la instrucción _task_abort(Initialization).
El algoritmo sigue los pasos siguientes:
  1. El evento de recepción de datos se encarga de recibir los caracteres en formato ASCII y almacenarlos en un buffer circular de 16 posiciones, este evento habilita la tarea 2 (Main_task), mediante un evento.
  2. La tarea 2, por su parte llama a la función Str2Int para convertir la cadena recibida a un valor entero, solicita un dato al ADC, calcula las variables error y cambio del error, aumenta el contador del semáforo para poder ejecutar las 4 tareas siguientes y se coloca en estado de tarea bloqueada, esperando se ejecuten las cuatro tareas restantes.
  3. La tarea 3 (fuzzification_task), es la primera que se encuentra en la cola del semáforo por lo que es la primera a ejecutarse cuando el contador del semáforo es incrementado. Esta tarea es la encargada de llamar a función membership_grade(), la cual modifica dos arreglos del tipo globales (uno para cada variable de entrada), los cuales en sus primeras columnas se encuentran los valores de membresía y en sus segundas columnas el número del conjunto perteneciente de acuerdo con: (0) primer conjunto, (1) segundo conjunto, (2) tercer conjunto, y (3) ningún conjunto, este último indica que la variable correspondiente tiene un grado de pertenencia nulo para un determinado conjunto. Por último la tarea 3, aumenta el contador del semáforo poder ejecutar la siguiente tarea con base a la cola de tareas en espera. 
    (a)                                                         (b)
    Figura 3. Arreglos de tarea 3. (a) variable del error, (b) variable del cambio del error.
  4.         La tarea 4 (normT_min), llama a la función minimo(), para obtener los valores mínimos al combinar los grados de pertenencia de los conjuntos de la variable del error con cada uno de los grados de pertenencia de los conjuntos de la segunda variable. Es decir aplica la norma t con la operación mínimo. Posteriormente aumenta el contador del semáforo para la ejecución de la tarea siguiente.  
     Figura 4. Arreglo normT_min de tarea 4.
  5.        La tarea 5 (maximum_task), llama a la función máximo(); para evaluar si existen reglas difusas con el mismo consecuente en base al proceso de fuzzificación del valor actual de las variables de entrada. Si existen reglas con el mismo consecuente toma el valor máximo de pertenencia para un determinado conjunto difuso de salida. La función modifica un nuevo arreglo denominado Tnorm, arreglo de tipo global. Finalmente la tarea 5 incrementa el contador del semáforo para la siguiente tarea en espera.
    Figura 5. Arreglo Tnorm de tarea 5.
  6.        La tarea 6 (dedifuzzification_task), invoca por su parte a la función dedifusificacion(); enviando como argumento al arreglo Tnorm, modificado en la tarea anterior. Esta función es la que realiza el proceso de dedifusificación mediante el método de barras, mediante la ecuación siguiente. Donde: y, es la valor del proceso de dedifusificación; xi, son las distancias sobre el eje horizontal donde se encuentran hallados los centros de los conjuntos difusos, pudiendo ser estos negativos,  es el grado de membresía final del conjunto difuso de salida obtenida en la tarea 5. Como es de observarse este método representa una aproximación del centroide de las áreas de los conjuntos difusos de salida en estado discreto, es posible tomar N muestras según la ecuación anterior pero tomando los centros de los conjuntos difusos de salida, N será igual al número de conjuntos difusos de salida definidos por el usuario.
    Esta última tarea habilita la tarea 2 (previamente bloqueada), mediante la instrucción _task_ready().
  7.        La tarea dos puede entonces continuar el proceso de ejecución, obteniendo el valor de la salida a enviar por el puerto serie, la salida del controlador difuso implementado es , por lo que la salida final será:
    Donde: es la salida obtenida por el proceso difuso aplicado.
    Posteriormente el dato , es convertido a cadena con el correspondiente terminador, se envía el primer dato al puerto serie mediante AS1_SendChar(); y el evento de transmisión se encarga de continuar el envío de datos. De esta forma el lazo de control difuso tipo Mamdani es realizado por el microcontrolador.Para poder tener mejor precisión en las operaciones y en base a que el microcontrolador es de punto fijo. La señal de respuesta del modelo en el MatLab antes de ser enviada por el puerto serie es multiplicada por una ganancia, la cual debe ser compensada por otra en forma inversa al momento recibir los datos en el MatLab y poder darle entrada al modelo.

No hay comentarios:

Publicar un comentario