#include "fis_header.h"
//for voltage sensing
const int voltageSensorPin=A8;
float vOut;
float voltageSensorVal; // (0-1023) value read by arduino
//PID constants
double kp = 1; //propotional gain
double ki = 0.1; //integrator gain
unsigned long currentTime, previousTime;
double elapsedTime;
double error;
double lastError;
double input, outputP,outputI;
double Setpoint;
double cumError, rateError;
// Number of inputs to the fuzzy inference system
const int fis_gcI = 2;
// Number of outputs to the fuzzy inference system
const int fis_gcO = 1;
// Number of rules to the fuzzy inference system
const int fis_gcR = 121;
FIS_TYPE g_fisInput[fis_gcI];
FIS_TYPE g_fisOutput[fis_gcO];
// Setup routine runs once when you press reset:
void setup()
{
Serial.begin(9600);
DDRA = B11111111;
Setpoint = 1;
}
// Loop routine runs over and over again forever:
void loop()
{
// Voltage Sensor
voltageSensorVal=analogRead(voltageSensorPin);
vOut=(voltageSensorVal/614);
input=vOut;
outputP=computePro(input);
outputI=computeIntr(input);
// Read Input: Error_Ve
g_fisInput[0] = outputP;
// Read Input: integral_of_error
g_fisInput[1] = outputI;
g_fisOutput[0];
fis_evaluate();
// Set output vlaue: Terminal_Voltage
float ab=g_fisOutput[0]*100;
float f=map(ab,-100,100,0,255);
PORTA=f;
Serial.print(f);
Serial.print(" ");
Serial.println(vOut);
}
//***********************************************************************
// Support functions for Fuzzy Inference System
//***********************************************************************
// Triangular Member Function
FIS_TYPE fis_trimf(FIS_TYPE x, FIS_TYPE* p)
{
FIS_TYPE a = p[0], b = p[1], c = p[2];
FIS_TYPE t1 = (x - a) / (b - a);
FIS_TYPE t2 = (c - x) / (c - b);
if ((a == b) && (b == c)) return (FIS_TYPE) (x == a);
if (a == b) return (FIS_TYPE) (t2*(b <= x)*(x <= c));
if (b == c) return (FIS_TYPE) (t1*(a <= x)*(x <= b));
t1 = min(t1, t2);
return (FIS_TYPE) max(t1, 0);
}
FIS_TYPE fis_min(FIS_TYPE a, FIS_TYPE b)
{
return min(a, b);
}
FIS_TYPE fis_max(FIS_TYPE a, FIS_TYPE b)
{
return max(a, b);
}
FIS_TYPE fis_array_operation(FIS_TYPE *array, int size, _FIS_ARR_OP pfnOp)
{
int i;
FIS_TYPE ret = 0;
if (size == 0) return ret;
if (size == 1) return array[0];
ret = array[0];
for (i = 1; i < size; i++)
{
ret = (*pfnOp)(ret, array[i]);
}
return ret;
}
//***********************************************************************
// Data for Fuzzy Inference System
//***********************************************************************
// Pointers to the implementations of member functions
_FIS_MF fis_gMF[] =
{
fis_trimf
};
// Count of member function for each Input
int fis_gIMFCount[] = { 11, 11 };
// Count of member function for each Output
int fis_gOMFCount[] = { 11 };
// Coefficients for the Input Member Functions
FIS_TYPE fis_gMFI0Coeff1[] = { -1, -1, -0.8 };
FIS_TYPE fis_gMFI0Coeff2[] = { -0.4, -0.2, 0 };
FIS_TYPE fis_gMFI0Coeff3[] = { 0.6, 0.8, 1 };
FIS_TYPE fis_gMFI0Coeff4[] = { -1, -0.8, -0.6 };
FIS_TYPE fis_gMFI0Coeff5[] = { -0.8, -0.6, -0.4 };
FIS_TYPE fis_gMFI0Coeff6[] = { -0.6, -0.4, -0.2 };
FIS_TYPE fis_gMFI0Coeff7[] = { -0.2, 0, 0.2 };
FIS_TYPE fis_gMFI0Coeff8[] = { 0, 0.2, 0.4 };
FIS_TYPE fis_gMFI0Coeff9[] = { 0.2, 0.4, 0.6 };
FIS_TYPE fis_gMFI0Coeff10[] = { 0.4, 0.6, 0.8 };
FIS_TYPE fis_gMFI0Coeff11[] = { 0.8, 1, 1 };
FIS_TYPE* fis_gMFI0Coeff[] = { fis_gMFI0Coeff1, fis_gMFI0Coeff2, fis_gMFI0Coeff3, fis_gMFI0Coeff4, fis_gMFI0Coeff5, fis_gMFI0Coeff6, fis_gMFI0Coeff7, fis_gMFI0Coeff8, fis_gMFI0Coeff9, fis_gMFI0Coeff10, fis_gMFI0Coeff11 };
FIS_TYPE fis_gMFI1Coeff1[] = { -0.4, -0.2, 0 };
FIS_TYPE fis_gMFI1Coeff2[] = { -0.2, 0, 0.2 };
FIS_TYPE fis_gMFI1Coeff3[] = { 0.8, 1, 1 };
FIS_TYPE fis_gMFI1Coeff4[] = { -0.8, -0.6, -0.4 };
FIS_TYPE fis_gMFI1Coeff5[] = { -1, -1, -0.8 };
FIS_TYPE fis_gMFI1Coeff6[] = { -1, -0.8, -0.6 };
FIS_TYPE fis_gMFI1Coeff7[] = { -0.6, -0.4, -0.2 };
FIS_TYPE fis_gMFI1Coeff8[] = { 0, 0.2, 0.4 };
FIS_TYPE fis_gMFI1Coeff9[] = { 0.2, 0.4, 0.6 };
FIS_TYPE fis_gMFI1Coeff10[] = { 0.4, 0.6, 0.8 };
FIS_TYPE fis_gMFI1Coeff11[] = { 0.6, 0.8, 1 };
FIS_TYPE* fis_gMFI1Coeff[] = { fis_gMFI1Coeff1, fis_gMFI1Coeff2, fis_gMFI1Coeff3, fis_gMFI1Coeff4, fis_gMFI1Coeff5, fis_gMFI1Coeff6, fis_gMFI1Coeff7, fis_gMFI1Coeff8, fis_gMFI1Coeff9, fis_gMFI1Coeff10, fis_gMFI1Coeff11 };
FIS_TYPE** fis_gMFICoeff[] = { fis_gMFI0Coeff, fis_gMFI1Coeff };
// Coefficients for the Output Member Functions
FIS_TYPE fis_gMFO0Coeff1[] = { -1, -0.8, -0.6 };
FIS_TYPE fis_gMFO0Coeff2[] = { -0.4, -0.2, 0 };
FIS_TYPE fis_gMFO0Coeff3[] = { 0.6, 0.8, 1 };
FIS_TYPE fis_gMFO0Coeff4[] = { -1, -1, -0.8 };
FIS_TYPE fis_gMFO0Coeff5[] = { -0.8, -0.6, -0.4 };
FIS_TYPE fis_gMFO0Coeff6[] = { -0.6, -0.4, -0.2 };
FIS_TYPE fis_gMFO0Coeff7[] = { -0.2, 0, 0.2 };
FIS_TYPE fis_gMFO0Coeff8[] = { 0, 0.2, 0.4 };
FIS_TYPE fis_gMFO0Coeff9[] = { 0.2, 0.4, 0.6 };
FIS_TYPE fis_gMFO0Coeff10[] = { 0.4, 0.6, 0.8 };
FIS_TYPE fis_gMFO0Coeff11[] = { 0.8, 1, 1 };
FIS_TYPE* fis_gMFO0Coeff[] = { fis_gMFO0Coeff1, fis_gMFO0Coeff2, fis_gMFO0Coeff3, fis_gMFO0Coeff4, fis_gMFO0Coeff5, fis_gMFO0Coeff6, fis_gMFO0Coeff7, fis_gMFO0Coeff8, fis_gMFO0Coeff9, fis_gMFO0Coeff10, fis_gMFO0Coeff11 };
FIS_TYPE** fis_gMFOCoeff[] = { fis_gMFO0Coeff };
// Input membership function set
int fis_gMFI0[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int fis_gMFI1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int* fis_gMFI[] = { fis_gMFI0, fis_gMFI1};
// Output membership function set
int fis_gMFO0[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int* fis_gMFO[] = { fis_gMFO0};
// Rule Weights
FIS_TYPE fis_gRWeight[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
// Rule Type
int fis_gRType[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
// Rule Inputs
int fis_gRI0[] = { 1, 5 };
int fis_gRI1[] = { 1, 6 };
int fis_gRI2[] = { 1, 4 };
int fis_gRI3[] = { 1, 7 };
int fis_gRI4[] = { 1, 1 };
int fis_gRI5[] = { 1, 2 };
int fis_gRI6[] = { 1, 8 };
int fis_gRI7[] = { 1, 9 };
int fis_gRI8[] = { 1, 10 };
int fis_gRI9[] = { 1, 11 };
int fis_gRI10[] = { 1, 3 };
int fis_gRI11[] = { 4, 5 };
int fis_gRI12[] = { 4, 6 };
int fis_gRI13[] = { 4, 4 };
int fis_gRI14[] = { 4, 7 };
int fis_gRI15[] = { 4, 1 };
int fis_gRI16[] = { 4, 2 };
int fis_gRI17[] = { 4, 8 };
int fis_gRI18[] = { 4, 9 };
int fis_gRI19[] = { 4, 10 };
int fis_gRI20[] = { 4, 11 };
int fis_gRI21[] = { 4, 3 };
int fis_gRI22[] = { 5, 5 };
int fis_gRI23[] = { 5, 6 };
int fis_gRI24[] = { 5, 4 };
int fis_gRI25[] = { 5, 7 };
int fis_gRI26[] = { 5, 1 };
int fis_gRI27[] = { 5, 2 };
int fis_gRI28[] = { 5, 8 };
int fis_gRI29[] = { 5, 9 };
int fis_gRI30[] = { 5, 10 };
int fis_gRI31[] = { 5, 11 };
int fis_gRI32[] = { 5, 3 };
int fis_gRI33[] = { 6, 5 };
int fis_gRI34[] = { 6, 6 };
int fis_gRI35[] = { 6, 4 };
int fis_gRI36[] = { 6, 7 };
int fis_gRI37[] = { 6, 1 };
int fis_gRI38[] = { 6, 2 };
int fis_gRI39[] = { 6, 8 };
int fis_gRI40[] = { 6, 9 };
int fis_gRI41[] = { 6, 10 };
int fis_gRI42[] = { 6, 11 };
int fis_gRI43[] = { 6, 3 };
int fis_gRI44[] = { 2, 5 };
int fis_gRI45[] = { 2, 6 };
int fis_gRI46[] = { 2, 4 };
int fis_gRI47[] = { 2, 7 };
int fis_gRI48[] = { 2, 1 };
int fis_gRI49[] = { 2, 2 };
int fis_gRI50[] = { 2, 8 };
int fis_gRI51[] = { 2, 9 };
int fis_gRI52[] = { 2, 10 };
int fis_gRI53[] = { 2, 11 };
int fis_gRI54[] = { 2, 3 };
int fis_gRI55[] = { 7, 5 };
int fis_gRI56[] = { 7, 6 };
int fis_gRI57[] = { 7, 4 };
int fis_gRI58[] = { 7, 7 };
int fis_gRI59[] = { 7, 1 };
int fis_gRI60[] = { 7, 2 };
int fis_gRI61[] = { 7, 8 };
int fis_gRI62[] = { 7, 9 };
int fis_gRI63[] = { 7, 10 };
int fis_gRI64[] = { 7, 11 };
int fis_gRI65[] = { 7, 3 };
int fis_gRI66[] = { 8, 5 };
int fis_gRI67[] = { 8, 6 };
int fis_gRI68[] = { 8, 4 };
int fis_gRI69[] = { 8, 7 };
int fis_gRI70[] = { 8, 1 };
int fis_gRI71[] = { 8, 2 };
int fis_gRI72[] = { 8, 8 };
int fis_gRI73[] = { 8, 9 };
int fis_gRI74[] = { 8, 10 };
int fis_gRI75[] = { 8, 11 };
int fis_gRI76[] = { 8, 3 };
int fis_gRI77[] = { 9, 5 };
int fis_gRI78[] = { 9, 6 };
int fis_gRI79[] = { 9, 4 };
int fis_gRI80[] = { 9, 7 };
int fis_gRI81[] = { 9, 1 };
int fis_gRI82[] = { 9, 2 };
int fis_gRI83[] = { 9, 8 };
int fis_gRI84[] = { 9, 9 };
int fis_gRI85[] = { 9, 10 };
int fis_gRI86[] = { 9, 11 };
int fis_gRI87[] = { 9, 3 };
int fis_gRI88[] = { 10, 5 };
int fis_gRI89[] = { 10, 6 };
int fis_gRI90[] = { 10, 4 };
int fis_gRI91[] = { 10, 7 };
int fis_gRI92[] = { 10, 1 };
int fis_gRI93[] = { 10, 2 };
int fis_gRI94[] = { 10, 8 };
int fis_gRI95[] = { 10, 9 };
int fis_gRI96[] = { 10, 10 };
int fis_gRI97[] = { 10, 11 };
int fis_gRI98[] = { 10, 3 };
int fis_gRI99[] = { 3, 5 };
int fis_gRI100[] = { 3, 6 };
int fis_gRI101[] = { 3, 4 };
int fis_gRI102[] = { 3, 7 };
int fis_gRI103[] = { 3, 1 };
int fis_gRI104[] = { 3, 2 };
int fis_gRI105[] = { 3, 8 };
int fis_gRI106[] = { 3, 9 };
int fis_gRI107[] = { 3, 10 };
int fis_gRI108[] = { 3, 11 };
int fis_gRI109[] = { 3, 3 };
int fis_gRI110[] = { 11, 5 };
int fis_gRI111[] = { 11, 6 };
int fis_gRI112[] = { 11, 4 };
int fis_gRI113[] = { 11, 7 };
int fis_gRI114[] = { 11, 1 };
int fis_gRI115[] = { 11, 2 };
int fis_gRI116[] = { 11, 8 };
int fis_gRI117[] = { 11, 9 };
int fis_gRI118[] = { 11, 10 };
int fis_gRI119[] = { 11, 11 };
int fis_gRI120[] = { 11, 3 };
int* fis_gRI[] = { fis_gRI0, fis_gRI1, fis_gRI2, fis_gRI3, fis_gRI4, fis_gRI5, fis_gRI6, fis_gRI7, fis_gRI8, fis_gRI9, fis_gRI10, fis_gRI11, fis_gRI12, fis_gRI13, fis_gRI14, fis_gRI15, fis_gRI16, fis_gRI17, fis_gRI18, fis_gRI19, fis_gRI20, fis_gRI21, fis_gRI22, fis_gRI23, fis_gRI24, fis_gRI25, fis_gRI26, fis_gRI27, fis_gRI28, fis_gRI29, fis_gRI30, fis_gRI31, fis_gRI32, fis_gRI33, fis_gRI34, fis_gRI35, fis_gRI36, fis_gRI37, fis_gRI38, fis_gRI39, fis_gRI40, fis_gRI41, fis_gRI42, fis_gRI43, fis_gRI44, fis_gRI45, fis_gRI46, fis_gRI47, fis_gRI48, fis_gRI49, fis_gRI50, fis_gRI51, fis_gRI52, fis_gRI53, fis_gRI54, fis_gRI55, fis_gRI56, fis_gRI57, fis_gRI58, fis_gRI59, fis_gRI60, fis_gRI61, fis_gRI62, fis_gRI63, fis_gRI64, fis_gRI65, fis_gRI66, fis_gRI67, fis_gRI68, fis_gRI69, fis_gRI70, fis_gRI71, fis_gRI72, fis_gRI73, fis_gRI74, fis_gRI75, fis_gRI76, fis_gRI77, fis_gRI78, fis_gRI79, fis_gRI80, fis_gRI81, fis_gRI82, fis_gRI83, fis_gRI84, fis_gRI85, fis_gRI86, fis_gRI87, fis_gRI88, fis_gRI89, fis_gRI90, fis_gRI91, fis_gRI92, fis_gRI93, fis_gRI94, fis_gRI95, fis_gRI96, fis_gRI97, fis_gRI98, fis_gRI99, fis_gRI100, fis_gRI101, fis_gRI102, fis_gRI103, fis_gRI104, fis_gRI105, fis_gRI106, fis_gRI107, fis_gRI108, fis_gRI109, fis_gRI110, fis_gRI111, fis_gRI112, fis_gRI113, fis_gRI114, fis_gRI115, fis_gRI116, fis_gRI117, fis_gRI118, fis_gRI119, fis_gRI120 };
// Rule Outputs
int fis_gRO0[] = { 4 };
int fis_gRO1[] = { 4 };
int fis_gRO2[] = { 4 };
int fis_gRO3[] = { 4 };
int fis_gRO4[] = { 4 };
int fis_gRO5[] = { 4 };
int fis_gRO6[] = { 1 };
int fis_gRO7[] = { 5 };
int fis_gRO8[] = { 6 };
int fis_gRO9[] = { 2 };
int fis_gRO10[] = { 7 };
int fis_gRO11[] = { 4 };
int fis_gRO12[] = { 4 };
int fis_gRO13[] = { 4 };
int fis_gRO14[] = { 4 };
int fis_gRO15[] = { 4 };
int fis_gRO16[] = { 1 };
int fis_gRO17[] = { 5 };
int fis_gRO18[] = { 6 };
int fis_gRO19[] = { 2 };
int fis_gRO20[] = { 7 };
int fis_gRO21[] = { 8 };
int fis_gRO22[] = { 4 };
int fis_gRO23[] = { 4 };
int fis_gRO24[] = { 4 };
int fis_gRO25[] = { 4 };
int fis_gRO26[] = { 1 };
int fis_gRO27[] = { 5 };
int fis_gRO28[] = { 6 };
int fis_gRO29[] = { 2 };
int fis_gRO30[] = { 7 };
int fis_gRO31[] = { 8 };
int fis_gRO32[] = { 9 };
int fis_gRO33[] = { 4 };
int fis_gRO34[] = { 4 };
int fis_gRO35[] = { 4 };
int fis_gRO36[] = { 1 };
int fis_gRO37[] = { 5 };
int fis_gRO38[] = { 6 };
int fis_gRO39[] = { 2 };
int fis_gRO40[] = { 7 };
int fis_gRO41[] = { 8 };
int fis_gRO42[] = { 9 };
int fis_gRO43[] = { 10 };
int fis_gRO44[] = { 4 };
int fis_gRO45[] = { 4 };
int fis_gRO46[] = { 1 };
int fis_gRO47[] = { 5 };
int fis_gRO48[] = { 6 };
int fis_gRO49[] = { 2 };
int fis_gRO50[] = { 7 };
int fis_gRO51[] = { 8 };
int fis_gRO52[] = { 9 };
int fis_gRO53[] = { 10 };
int fis_gRO54[] = { 3 };
int fis_gRO55[] = { 4 };
int fis_gRO56[] = { 1 };
int fis_gRO57[] = { 5 };
int fis_gRO58[] = { 6 };
int fis_gRO59[] = { 2 };
int fis_gRO60[] = { 7 };
int fis_gRO61[] = { 8 };
int fis_gRO62[] = { 9 };
int fis_gRO63[] = { 10 };
int fis_gRO64[] = { 3 };
int fis_gRO65[] = { 11 };
int fis_gRO66[] = { 1 };
int fis_gRO67[] = { 5 };
int fis_gRO68[] = { 6 };
int fis_gRO69[] = { 2 };
int fis_gRO70[] = { 7 };
int fis_gRO71[] = { 8 };
int fis_gRO72[] = { 9 };
int fis_gRO73[] = { 10 };
int fis_gRO74[] = { 3 };
int fis_gRO75[] = { 11 };
int fis_gRO76[] = { 11 };
int fis_gRO77[] = { 5 };
int fis_gRO78[] = { 6 };
int fis_gRO79[] = { 2 };
int fis_gRO80[] = { 7 };
int fis_gRO81[] = { 8 };
int fis_gRO82[] = { 9 };
int fis_gRO83[] = { 10 };
int fis_gRO84[] = { 3 };
int fis_gRO85[] = { 11 };
int fis_gRO86[] = { 11 };
int fis_gRO87[] = { 11 };
int fis_gRO88[] = { 6 };
int fis_gRO89[] = { 2 };
int fis_gRO90[] = { 7 };
int fis_gRO91[] = { 8 };
int fis_gRO92[] = { 9 };
int fis_gRO93[] = { 10 };
int fis_gRO94[] = { 3 };
int fis_gRO95[] = { 11 };
int fis_gRO96[] = { 11 };
int fis_gRO97[] = { 11 };
int fis_gRO98[] = { 11 };
int fis_gRO99[] = { 2 };
int fis_gRO100[] = { 7 };
int fis_gRO101[] = { 8 };
int fis_gRO102[] = { 9 };
int fis_gRO103[] = { 10 };
int fis_gRO104[] = { 3 };
int fis_gRO105[] = { 11 };
int fis_gRO106[] = { 11 };
int fis_gRO107[] = { 11 };
int fis_gRO108[] = { 11 };
int fis_gRO109[] = { 11 };
int fis_gRO110[] = { 7 };
int fis_gRO111[] = { 8 };
int fis_gRO112[] = { 9 };
int fis_gRO113[] = { 10 };
int fis_gRO114[] = { 3 };
int fis_gRO115[] = { 11 };
int fis_gRO116[] = { 11 };
int fis_gRO117[] = { 11 };
int fis_gRO118[] = { 11 };
int fis_gRO119[] = { 11 };
int fis_gRO120[] = { 11 };
int* fis_gRO[] = { fis_gRO0, fis_gRO1, fis_gRO2, fis_gRO3, fis_gRO4, fis_gRO5, fis_gRO6, fis_gRO7, fis_gRO8, fis_gRO9, fis_gRO10, fis_gRO11, fis_gRO12, fis_gRO13, fis_gRO14, fis_gRO15, fis_gRO16, fis_gRO17, fis_gRO18, fis_gRO19, fis_gRO20, fis_gRO21, fis_gRO22, fis_gRO23, fis_gRO24, fis_gRO25, fis_gRO26, fis_gRO27, fis_gRO28, fis_gRO29, fis_gRO30, fis_gRO31, fis_gRO32, fis_gRO33, fis_gRO34, fis_gRO35, fis_gRO36, fis_gRO37, fis_gRO38, fis_gRO39, fis_gRO40, fis_gRO41, fis_gRO42, fis_gRO43, fis_gRO44, fis_gRO45, fis_gRO46, fis_gRO47, fis_gRO48, fis_gRO49, fis_gRO50, fis_gRO51, fis_gRO52, fis_gRO53, fis_gRO54, fis_gRO55, fis_gRO56, fis_gRO57, fis_gRO58, fis_gRO59, fis_gRO60, fis_gRO61, fis_gRO62, fis_gRO63, fis_gRO64, fis_gRO65, fis_gRO66, fis_gRO67, fis_gRO68, fis_gRO69, fis_gRO70, fis_gRO71, fis_gRO72, fis_gRO73, fis_gRO74, fis_gRO75, fis_gRO76, fis_gRO77, fis_gRO78, fis_gRO79, fis_gRO80, fis_gRO81, fis_gRO82, fis_gRO83, fis_gRO84, fis_gRO85, fis_gRO86, fis_gRO87, fis_gRO88, fis_gRO89, fis_gRO90, fis_gRO91, fis_gRO92, fis_gRO93, fis_gRO94, fis_gRO95, fis_gRO96, fis_gRO97, fis_gRO98, fis_gRO99, fis_gRO100, fis_gRO101, fis_gRO102, fis_gRO103, fis_gRO104, fis_gRO105, fis_gRO106, fis_gRO107, fis_gRO108, fis_gRO109, fis_gRO110, fis_gRO111, fis_gRO112, fis_gRO113, fis_gRO114, fis_gRO115, fis_gRO116, fis_gRO117, fis_gRO118, fis_gRO119, fis_gRO120 };
// Input range Min
FIS_TYPE fis_gIMin[] = { -1, -1 };
// Input range Max
FIS_TYPE fis_gIMax[] = { 1, 1 };
// Output range Min
FIS_TYPE fis_gOMin[] = { -1 };
// Output range Max
FIS_TYPE fis_gOMax[] = { 1 };
//***********************************************************************
// Data dependent support functions for Fuzzy Inference System
//***********************************************************************
FIS_TYPE fis_MF_out(FIS_TYPE** fuzzyRuleSet, FIS_TYPE x, int o)
{
FIS_TYPE mfOut;
int r;
for (r = 0; r < fis_gcR; ++r)
{
int index = fis_gRO[r][o];
if (index > 0)
{
index = index - 1;
mfOut = (fis_gMF[fis_gMFO[o][index]])(x, fis_gMFOCoeff[o][index]);
}
else if (index < 0)
{
index = -index - 1;
mfOut = 1 - (fis_gMF[fis_gMFO[o][index]])(x, fis_gMFOCoeff[o][index]);
}
else
{
mfOut = 0;
}
fuzzyRuleSet[0][r] = fis_min(mfOut, fuzzyRuleSet[1][r]);
}
return fis_array_operation(fuzzyRuleSet[0], fis_gcR, fis_max);
}
FIS_TYPE fis_defuzz_centroid(FIS_TYPE** fuzzyRuleSet, int o)
{
FIS_TYPE step = (fis_gOMax[o] - fis_gOMin[o]) / (FIS_RESOLUSION - 1);
FIS_TYPE area = 0;
FIS_TYPE momentum = 0;
FIS_TYPE dist, slice;
int i;
// calculate the area under the curve formed by the MF outputs
for (i = 0; i < FIS_RESOLUSION; ++i){
dist = fis_gOMin[o] + (step * i);
slice = step * fis_MF_out(fuzzyRuleSet, dist, o);
area += slice;
momentum += slice*dist;
}
return ((area == 0) ? ((fis_gOMax[o] + fis_gOMin[o]) / 2) : (momentum / area));
}
//***********************************************************************
// Fuzzy Inference System
//***********************************************************************
void fis_evaluate()
{
FIS_TYPE fuzzyInput0[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
FIS_TYPE fuzzyInput1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
FIS_TYPE* fuzzyInput[fis_gcI] = { fuzzyInput0, fuzzyInput1, };
FIS_TYPE fuzzyOutput0[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
FIS_TYPE* fuzzyOutput[fis_gcO] = { fuzzyOutput0, };
FIS_TYPE fuzzyRules[fis_gcR] = { 0 };
FIS_TYPE fuzzyFires[fis_gcR] = { 0 };
FIS_TYPE* fuzzyRuleSet[] = { fuzzyRules, fuzzyFires };
FIS_TYPE sW = 0;
// Transforming input to fuzzy Input
int i, j, r, o;
for (i = 0; i < fis_gcI; ++i)
{
for (j = 0; j < fis_gIMFCount[i]; ++j)
{
fuzzyInput[i][j] =
(fis_gMF[fis_gMFI[i][j]])(g_fisInput[i], fis_gMFICoeff[i][j]);
}
}
int index = 0;
for (r = 0; r < fis_gcR; ++r)
{
if (fis_gRType[r] == 1)
{
fuzzyFires[r] = FIS_MAX;
for (i = 0; i < fis_gcI; ++i)
{
index = fis_gRI[r][i];
if (index > 0)
fuzzyFires[r] = fis_min(fuzzyFires[r], fuzzyInput[i][index - 1]);
else if (index < 0)
fuzzyFires[r] = fis_min(fuzzyFires[r], 1 - fuzzyInput[i][-index - 1]);
else
fuzzyFires[r] = fis_min(fuzzyFires[r], 1);
}
}
else
{
fuzzyFires[r] = FIS_MIN;
for (i = 0; i < fis_gcI; ++i)
{
index = fis_gRI[r][i];
if (index > 0)
fuzzyFires[r] = fis_max(fuzzyFires[r], fuzzyInput[i][index - 1]);
else if (index < 0)
fuzzyFires[r] = fis_max(fuzzyFires[r], 1 - fuzzyInput[i][-index - 1]);
else
fuzzyFires[r] = fis_max(fuzzyFires[r], 0);
}
}
fuzzyFires[r] = fis_gRWeight[r] * fuzzyFires[r];
sW += fuzzyFires[r];
}
if (sW == 0)
{
for (o = 0; o < fis_gcO; ++o)
{
g_fisOutput[o] = ((fis_gOMax[o] + fis_gOMin[o]) / 2);
}
}
else
{
for (o = 0; o < fis_gcO; ++o)
{
g_fisOutput[o] = fis_defuzz_centroid(fuzzyRuleSet, o);
}
}
}
double computePro(double inp){
currentTime = millis(); //get current time
elapsedTime = (double)(currentTime - previousTime); //compute time elapsed from previous computation
error = Setpoint - inp; // determine error
double out = kp*error; //P output
lastError = error; //remember current error
previousTime = currentTime; //remember current time
return out; //have function return the PID output
}
double computeIntr(double ini){
currentTime = millis(); //get current time
elapsedTime = (double)(currentTime - previousTime); //compute time elapsed from previous computation
error = Setpoint - ini; // determine error
cumError += error * elapsedTime; // compute integral
double out =ki*cumError; //I output
lastError = error; //remember current error
previousTime = currentTime; //remember current time
return out; //have function return the PID output
}