資源簡介
一個模糊PID溫度控制算法源代碼 (親測可用)
代碼片段和文件信息
#include?
#include?
#include?
#include?“pid_fuzzy.h“
//注1:自適應模糊pid最重要的就是論域的選擇,要和你應該控制的對象相切合
//注2:以下各閥值、限幅值、輸出值均需要根據具體的使用情況進行更改
//注3:因為我的控制對象慣性比較大,所以以下各部分取值較小
//論域e:[-55]??ec:[-0.50.5]
//誤差的閥值,小于這個數值的時候,不做PID調整,避免誤差較小時頻繁調節引起震蕩
#define?Emin?0.0
#define?Emid?0.08
#define?Emax?0.6
//調整值限幅,防止積分飽和
#define?Umax?5
#define?Umin?-5
//輸出值限幅
#define?Pmax?7200
#define?Pmin?0
#define?NB?0
#define?NM?1
#define?NS?2
#define?ZO?3
#define?PS?4
#define?PM?5
#define?PB?6
int?kp[7][7]=?{??{PBPBPMPMPSZOZO}
????{PBPBPMPSPSZOZO}
????{PMPMPMPSZONSNS}
????{PMPMPSZONSNMNM}
????{PSPSZONSNSNMNM}
????{PSZONSNMNMNMNB}
????{ZOZONMNMNMNBNB}
};
int?kd[7][7]=?{??{PSNSNBNBNBNMPS}
????{PSNSNBNMNMNSZO}
????{ZONSNMNMNSNSZO}
????{ZONSNSNSNSNSZO}
????{ZOZOZOZOZOZOZO}
????{PBNSPSPSPSPSPB}
????{PBPMPMPMPSPSPB}
};
int?ki[7][7]=?{??{NBNBNMNMNSZOZO}
????{NBNBNMNSNSZOZO}
????{NBNMNSNSZOPSPS}
????{NMNMNSZOPSPMPM}
????{NMNSZOPSPSPMPB}
????{ZOZOPSPSPMPBPB}
????{ZOZOPSPMPMPBPB}
};
/**************求隸屬度(三角形)***************/
float?FTri(float?xfloat?afloat?bfloat?c)//FuzzyTriangle
{
????if(x<=a)
????????return?0;
????else?if((a ????????return?(x-a)/(b-a);
????else?if((b ????????return?(c-x)/(c-b);
????else?if(x>c)
????????return?0;
????else
????????return?0;
}
/*****************求隸屬度(梯形左)*******************/
float?FTraL(float?xfloat?afloat?b)//FuzzyTrapezoidLeft
{
????if(x<=a)
????????return?1;
????else?if((a ????????return?(b-x)/(b-a);
????else?if(x>b)
????????return?0;
????else
????????return?0;
}
/*****************求隸屬度(梯形右)*******************/
float?FTraR(float?xfloat?afloat?b)//FuzzyTrapezoidRight
{
????if(x<=a)
????????return?0;
????if((a ????????return?(x-a)/(b-a);
????if(x>=b)
????????return?1;
????else
????????return?1;
}
/****************三角形反模糊化處理**********************/
float?uFTri(float?xfloat?afloat?bfloat?c)
{
????float?yz;
????z=(b-a)*x+a;
????y=c-(c-b)*x;
????return?(y+z)/2;
}
/*******************梯形(左)反模糊化***********************/
float?uFTraL(float?xfloat?afloat?b)
{
????return?b-(b-a)*x;
}
/*******************梯形(右)反模糊化***********************/
float?uFTraR(float?xfloat?afloat?b)
{
????return?(b-a)*x?+a;
}
/**************************求交集****************************/
float?fand(float?afloat?b)
{
????return?(a}
/**************************求并集****************************/
float?forr(float?afloat?b)
{
????return?(a}
float?ec;
/*==========???PID計算部分???======================*/
int?PID_realize(PID?*structpiduint16_t?suint16_t?in)
{
????float?pwm_var;//pwm調整量
????float?iError;//當前誤差
????float?setinput;
????//計算隸屬度表
????float?es[7]ecs[7]e;
????float?form[7][7];
????int?i=0j=0;
????int?MaxX=0MaxY=0;
評論
共有 條評論