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.
|
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:
- 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.
- 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.
- 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.
- 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.
- 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. - 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,Esta última tarea habilita la tarea 2 (previamente bloqueada), mediante la instrucción _task_ready().
- 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 esDonde:Posteriormente el dato
No hay comentarios:
Publicar un comentario