资源简介

一个模糊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;


评论

共有 条评论