Autor Tema: Pasar lógica difusa a lenguaje C  (Leído 21392 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado udolpho

  • PIC10
  • *
  • Mensajes: 2
Pasar lógica difusa a lenguaje C
« Respuesta #15 en: 26 de Noviembre de 2009, 09:40:59 »
hermano ¿puedes compartir tu programa con el resto de los mortales?, jejeje. Gracias

Desconectado sebastianfpr

  • PIC10
  • *
  • Mensajes: 30
Re: Pasar lógica difusa a lenguaje C
« Respuesta #16 en: 12 de Febrero de 2010, 11:33:42 »
Dejame tu correo
Todos los días la gente se arregla el cabello, ¿Por qué no el Corazón? - Che Guevara -

Sebastián Puente R.

Desconectado udolpho

  • PIC10
  • *
  • Mensajes: 2
Re: Pasar lógica difusa a lenguaje C
« Respuesta #17 en: 13 de Febrero de 2010, 11:40:37 »
Oye te lo agradesco mucho, el correo es udoalejandro@gmail.com

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Re: Pasar lógica difusa a lenguaje C
« Respuesta #18 en: 13 de Febrero de 2010, 11:53:56 »
Tambien estoy muy interesado, si puedes el correo de aqui serviria
Mil gracias

Desconectado sebastianfpr

  • PIC10
  • *
  • Mensajes: 30
Re: Pasar lógica difusa a lenguaje C
« Respuesta #19 en: 18 de Febrero de 2010, 15:33:25 »
Bueno, Hola a todos

Que pena por tener tan abandonado este foro, pero por cuestiones de mi Maestría no he tenido mucho tiempo de sentarme aquí y seguir compartiendo con todos ustedes.

Bueno ante la solicitud de algunos participantes del foro de que les envié el programa, tome la siguiente decisión:

Voy a poner acá en el foro, como pueden hacer un Sistema Lógico Difuso tipo Mamdani en C, especialmente para el PIC18F452, pero igual haciendo algunas modificaciones pues podrá ser valido para cualquier PIC 18F. no pondre el programa total que realize (FuzzyPic 1.0) por el momento, cuestiones de derecho de autor, pero si les pondre un ejemplo de un Sistema Lógico Difuso hecho en C y lo iré explicando paso a paso.

El siguiente programa en C, lo generó la herramienta que diseñe (FuzzyPic 1.0) de acuerdo a un SLD configurado con el ToolBox de Logica Difusa de Matlab, mas adelante les explico en mas detalle, por ahora se los pongo para que lo miren bien y tengan una idea general de la manera como esta hecho el Sistema Lógico Difuso tipo Mamdani en C y me comenten.

Como buenos colegas, caballeros y personas de bien que somos, y como estudiante de Maestría y amante de la Ciencia, les digo que saber reconocer el trabajo de los demás es cuestión de ética y honradez, así que si a alguien le sirve lo mencionado acá, sepan referenciar y respetar los derechos de autor. Muchas gracias.

El siguiente Sistema Lógico Difuso es un Control de Temperatura para una Incubadora, mas adelante les visualizo bien los conjuntos difusos, las reglas, etc.

/********************************************************************************
*   FUZZY PIC 1.0 - SISTEMA LOGICO DIFUSO TIPO MAMDANI PARA EL PIC18F452        *
*   Entradas: 2 Salidas: 1                                          *
*********************************************************************************
*   Autor: Sebastian F. Puente Reyes                      *
*   Trabajo De Grado: Modulo de desarrollo para la implementacion en   *
*                     microcontrolador,de Sistemas Logicos Difusos tipo Mamdani   *
*   Universidad de los Llanos. Mayo de 2007, Villavicencio - Colombia                  *
********************************************************************************/

//-------------------------------------------------------------------------------
#include <p18f452.h>
#include <adc.h>
#include <math.h>
#include <delays.h>

//-------------------------------------------------------------------------------
#pragma config OSC = HSPLL, OSCS = OFF
#pragma config WDT = OFF
#pragma config PWRT = ON
#pragma config LVP = OFF

//-------------------------------------------------------------------------------
int in1,in2;
float norma1,norma2;
char tipo_conjunto;
unsigned char n;
unsigned char f;
unsigned char limite;
unsigned char muestras = 80;
const float paso = 0.0125;
float maxana = 1023;
float maxdig = 255;
float a,b,c,d;
float
grado,
area,
pond,
sal_regla,
soporte,
tempo,
crisp
;

//-------------------------------------------------------------------------------
#pragma udata bigdata
float salida[80];
#pragma udata

#pragma romdata segdata1
rom float conj11[] = {0.2017,0.138,0,0,3};
rom float conj12[] = {0.1062,0.5,0,0,3};
rom float conj13[] = {0.1168,0.863,0,0,3};
#pragma romdata

#pragma romdata segdata2
rom float conj21[] = {0.1344,0.092,0,0,3};
rom float conj22[] = {0.07088,0.333,0,0,3};
rom float conj23[] = {0.07219,0.5,0,0,3};
rom float conj24[] = {0.07054,0.667,0,0,3};
rom float conj25[] = {0.07797,0.908,0,0,3};
#pragma romdata

#pragma idata consal = 0x100
float sal1[] = {0,0,0.12667,0.5,2,0,0.5};
float sal2[] = {0.12667,0.5,0.87333,0,1,0.12667,0.87333};
float sal3[] = {0.5,0.87333,1,1,2,0.5,1};
#pragma idata

#pragma idata grado = 0x200
float per1[] = {0,0,0};
float per2[] = {0,0,0,0,0};
#pragma idata

//-------------------------------------------------------------------------------
void setup(void);
void salida_cero(void);
void conversor(void);
void fusificacion(void);
void reglas(void);
void inferencia(float uno, float dos, float *conjsal);
float desfusificacion(float *fp);
float evaluafp(float num, rom float *param, float *parametros);

//-------------------------------------------------------------------------------
void main(void)
{
   setup();
   while(1)
   {
      salida_cero();
      conversor();
      fusificacion();
      reglas();
      crisp = desfusificacion(salida);
      PORTD = crisp * 255;
   }
}

//-------------------------------------------------------------------------------
void setup(void)
{
   TRISD = 0;
}

//-------------------------------------------------------------------------------
float evaluafp(float num, rom float *param, float *parametros)
{
   if(param == 0)
   {
      a = parametros[0];
      b = parametros[1];
      c = parametros[2];
      d = parametros[3];
      tipo_conjunto = parametros[4];
   }
   else
   {
      a = param[0];
      b = param[1];
      c = param[2];
      d = param[3];
      tipo_conjunto = param[4];
   }

   switch(tipo_conjunto)
   {
      case 1:      if(num < a)
               { grado = 0; break; }
               if(num > c)
               { grado = 0; break; }
               if(num >= a && num <=b)
               { grado = (num - a) / (b - a); break; }
               if(num >= b && num <= c)
               { grado = (c - num) / (c - b); break; }
               break;

      case 2:      if(num < a)
               { grado = 0; break; }
               if(num > d)
               { grado = 0; break; }
               if(num >= b && num <=c)
               { grado = 1; break; }
               if(num >= a && num <= b)
               { grado = (num - a) / (b - a); break; }
               if(num >= c && num <= d)
               { grado = (d - num) / (d - c); break; }
               break;

      case 3:      grado = ((num - b) * (num - b)) / (2 * a * a);
               grado = exp(-grado);
               break;

      default:   grado = 0;
               break;
   }
   return(grado);
}

//-------------------------------------------------------------------------------
void fusificacion(void)
{
   norma1 = in1 / maxana;
   norma2 = in2 / maxana;

   per1[0] = evaluafp(norma1,conj11,0);
   per1[1] = evaluafp(norma1,conj12,0);
   per1[2] = evaluafp(norma1,conj13,0);

   per2[0] = evaluafp(norma2,conj21,0);
   per2[1] = evaluafp(norma2,conj22,0);
   per2[2] = evaluafp(norma2,conj23,0);
   per2[3] = evaluafp(norma2,conj24,0);
   per2[4] = evaluafp(norma2,conj25,0);
}

//-------------------------------------------------------------------------------
void reglas(void)
{
   inferencia(per1[0],per2[0],sal3);
   inferencia(per1[0],per2[1],sal3);
   inferencia(per1[0],per2[2],sal3);
   inferencia(per1[0],per2[3],sal2);
   inferencia(per1[0],per2[4],sal1);
   inferencia(per1[1],per2[0],sal2);
   inferencia(per1[1],per2[1],sal2);
   inferencia(per1[1],per2[2],sal1);
   inferencia(per1[1],per2[3],sal1);
   inferencia(per1[1],per2[4],sal1);
   inferencia(per1[2],per2[0],sal1);
   inferencia(per1[2],per2[1],sal1);
   inferencia(per1[2],per2[2],sal1);
   inferencia(per1[2],per2[3],sal1);
   inferencia(per1[2],per2[4],sal1);
}

//-------------------------------------------------------------------------------
void inferencia(float uno, float dos, float *conjsal)
{
   if(uno == 0 || dos == 0) return;

   if(uno > 0 && dos > 0)
   {
      if(uno < dos) sal_regla = uno;
      else sal_regla = dos;
   }

   soporte = conjsal[5];
   f = conjsal[5] * muestras;
   limite = conjsal[6] * muestras;

   for(f; f < limite; f++)
   {
      tempo = evaluafp(soporte,0,conjsal);
      if(tempo >= sal_regla) tempo = sal_regla;
      if(tempo > salida[f]) salida[f] = tempo;
      soporte = soporte + paso;
   }
}

//-------------------------------------------------------------------------------
float desfusificacion(float *fp)
{
   area = 0;
   pond = 0;
   soporte = 0;

   for(n = 0; n < muestras; n++)
   {
      if(fp[n] == 0)
      {
         soporte = soporte + paso;
         continue;
      }
      area = fp[n] + area;
      pond = fp[n]*soporte + pond;
      soporte = soporte + paso;
   }

   if(pond == 0 && area == 0) return(0);
   else return(pond / area);
}

//-------------------------------------------------------------------------------
void conversor(void)
{
   OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_7ANA_1REF,
         ADC_CH0 & ADC_INT_OFF);
   Delay10TCYx(10);
   ConvertADC();
   while ( BusyADC() );
   in1 = ReadADC();

   SetChanADC( ADC_CH1 );
   Delay10TCYx(10);
   ConvertADC();
   while( BusyADC() );
   in2 = ReadADC();
}

//-------------------------------------------------------------------------------
void salida_cero(void)
{
   for(n = 0; n < muestras; n++)
   {
      salida[n] = 0;
   }
}

Este programa es propiedad intelectual de Sebastian Puente Reyes
y hace parte del trabajo de grado: Módulo de desarrollo para la implementación
en microcontrolador, de Sistemas Lógicos Difusos tipo Mamdani del mismo autor.

Villavicencio, Bogotá, COLOMBIA
« Última modificación: 28 de Abril de 2010, 18:59:19 por sebastianfpr »
Todos los días la gente se arregla el cabello, ¿Por qué no el Corazón? - Che Guevara -

Sebastián Puente R.

Desconectado sebastianfpr

  • PIC10
  • *
  • Mensajes: 30
Re: Pasar lógica difusa a lenguaje C
« Respuesta #20 en: 13 de Abril de 2010, 15:36:17 »
Buenas a todos, tengo un poco abandonado esto, pero son muchas ocupaciones. pero bueno.

Aqui les voy a dejar los conjuntos difusos para las dos entradas de este control difuso de temperatura para una incubadora, asi como tambien las reglas difusas.
Este es un ejemplo de Control de temperatura para una incubadora donde las entradas son: Temperatura del Neonato y Temperatura del Habitaculo.
La Salida es el tiempo en que la carga que calienta el habitaculo debe de estar funcionando.

Conjuntos para la Entrada Uno (Temperatura Neonato):


Conjuntos para la Entrada Dos (Temperatura Habitaculo):


Conjuntos para la Salida (Tiempo Activación Carga):


y Estas son las Reglas del Sistema:



« Última modificación: 13 de Abril de 2010, 15:50:45 por sebastianfpr »
Todos los días la gente se arregla el cabello, ¿Por qué no el Corazón? - Che Guevara -

Sebastián Puente R.

Desconectado turok_gt

  • PIC10
  • *
  • Mensajes: 2
Re: Pasar lógica difusa a lenguaje C
« Respuesta #21 en: 23 de Mayo de 2010, 14:25:44 »
Dejame tu correo



Amigo yo tambien necesito implementar un controlador fuzzy en un pic, me podrias compartir tu programa?, muchas gracias

Desconectado sebastianfpr

  • PIC10
  • *
  • Mensajes: 30
Re: Pasar lógica difusa a lenguaje C
« Respuesta #22 en: 27 de Mayo de 2010, 01:51:34 »
Amigo en la pagina anterior esta el programa en C
del Sistema lógico difuso teniendo en cuenta los conjuntos de entrada, de salida y las reglas difusas, guíate de el.
Todos los días la gente se arregla el cabello, ¿Por qué no el Corazón? - Che Guevara -

Sebastián Puente R.

Desconectado ncasadiego

  • PIC10
  • *
  • Mensajes: 1
Re: Pasar lógica difusa a lenguaje C
« Respuesta #23 en: 08 de Enero de 2011, 02:34:04 »
Hola a todos... verán creo que soy la unica niña  del foro  y creanme estoy muy interesada en este tema...
Sebastian estuve leyendo tus comentarios y me interesa mucho el algoritmo en lenguaje c que has mostrado; la verdad no entiendo mucho de c o c++ así que tambien tengo para mi tesis de pregrado un conjunto difuso y hasta ahora solo he desarrolado un modelo en matlab generalizado pues la planta a controlar aun no ha sido montada (es una planta real). sin embargo mi tutor me exige un algoritmo basico de logica difusa en c, y es por eso que me interesa tu trabajo. aclaro que no es el programa de conversion el que necesito, sino la explicacion del algoritmo que colgaste y la planta que controlaste, pues basicamente estos sld utilizan los mismos pasos que en este caso serian las subrutinas.
Agradezco tu colaboración, tu disculpa te agregue en el facebook en realidad es urgente , asi que cuando veas alguien desconocida de barranquilla, pues esa soy yo...

Desconectado hector915

  • PIC12
  • **
  • Mensajes: 78
    • Blog Personal.
Re: Pasar lógica difusa a lenguaje C
« Respuesta #24 en: 17 de Abril de 2013, 23:45:39 »
Realmente interesante podrias explicar procedimientos para el desarrollo.
if you can imagine it, you can embed it