汞是什么| 双恋是什么意思| 爬山有什么好处| 糖尿病吃什么主食| 南京菜属于什么菜系| 胎盘吃了对身体有什么好处| 经常头晕是什么原因| 夏枯草有什么作用| 血热皮肤瘙痒吃什么药| 平肝潜阳是什么意思| 山东特产是什么生肖| 脑门发黑是什么原因| 少尉是什么级别| 竹棉和纯棉有什么区别| 蔓越莓有什么功效| 咳嗽有痰吃什么水果| 脾虚湿盛吃什么中成药| 为什么咳嗽| m k是什么牌子| 磺胺是什么药| 白绫是什么意思| 医院院长什么级别| 坐小月子可以吃什么水果| 幽门螺杆菌阴性是什么意思| 不成功便成仁的仁是什么意思| 高血压1级是什么意思| 羊水污染是什么原因造成的| 为什么经常长口腔溃疡| 立flag是什么意思| 16 5是什么码| 肌无力是什么病| 玄武是什么动物| 西地那非是什么| 右边偏头痛什么原因| 更年期一般在什么年龄| 家庭主妇是什么意思| 排卵期出血是什么样的| 墙内开花墙外香是什么意思| 愚不可及是什么意思| 身上长肉疙瘩是什么原因| 口中发甜是什么原因| 1971属什么生肖| 血脂高是什么原因| 高血压用什么药| 肚子胀气老放屁是什么原因| 谵语是什么意思| 什么的豆角| 腐竹是什么| 一般细菌培养及鉴定是检查什么| 戊土是什么土| 小孩热感冒吃什么药好| 风疹病毒是什么意思| hcg下降是什么原因| 湿热吃什么食物| 螺子黛是什么| 孕吐严重是什么原因| 呵呵呵呵是什么意思| 男人前列腺在什么位置| 维生素k是什么| 天秤座女和什么星座最配| 什么花什么门的成语| 这个季节适合种什么菜| 六月飞雪是什么意思| 什么是外阴白斑| 华人是什么意思| efw是胎儿的什么意思| mopar是什么牌子| 碳十四检测是查什么的| 清新的什么| 心悸是什么原因造成的呢| 甘油三酯什么意思| 觊觎什么意思| 邕是什么意思| 涵是什么意思| 雌激素分泌过多是什么原因引起的| 丝芙兰是什么品牌| 畈是什么意思| 空气炸锅什么牌子好| 海参补什么| 八字带什么的长寿| 大舌头是什么意思| 什么脱口秀| 梦见新房子是什么意思| 彗星为什么有尾巴| 什么动物倒着走| 婚检都检查什么| 拍档是什么意思| 梅毒rpr是什么| 五月26日是什么星座| 三尖瓣反流什么意思| 胃黏膜受损吃什么药| 眉梢有痣代表什么| 李连杰什么病| 通马桶的工具叫什么| 低血钾吃什么药| 类风湿阳性是什么意思| 偏官是什么意思| 秀五行属什么| 950是什么金| 同比增长是什么意思| prc什么意思| 别有洞天是什么生肖| 急性肠胃炎打什么点滴| 什么人容易老年痴呆| 蝴蝶效应是什么| 什么东西补铁效果好而且最快| 经常拉肚子是什么原因| xpe是什么材料| 门对门有什么说法| 围棋九段是什么水平| 女性外阴痒用什么药| 妇科臭氧治疗的作用是什么| 吃什么补红细胞最快| 蓝莓什么味道| 腱鞘囊肿是什么原因| 海狗是什么动物| 为什么最近一直下雨| 钙化是什么意思啊| 两融是什么意思| 右手掌心有痣代表什么| 晚上睡觉尿多是什么原因| 灰指甲用什么药效果好| 做喉镜能检查出什么病| 皮肤一碰就红是什么原因| 什么布剪不断| 低gi是什么意思| 阿昔洛韦片是什么药| 米线配菜都有什么| 夜盲症是什么| 检查肝功能挂什么科| 胆红素阴性是什么意思| 痛风喝酒会有什么后果| 带下病是什么病| 使徒是什么意思| 投诉医生打什么电话| 宝宝反复发烧是什么原因引起的| 为什么单位不愿意申请工伤| 肾阴虚是什么症状| 社康是什么| pick什么意思| 花裙子配什么上衣好看| 眼压低是什么原因| 脂肪肝吃什么药治疗| 占有欲什么意思| 补体c3偏高说明什么| 口出狂言是什么生肖| 男士睾丸疼是什么原因| abo溶血症是什么| 尿酸高是什么原因导致的| 什么时间进伏| 梦房子倒塌什么预兆| 中耳炎去药店买什么药| 喝姜粉有什么好处| 萎缩性胃炎吃什么药能治好| 大便不成形是什么原因造成的| 抑郁症看什么科| 苏打水什么牌子的好| 将军指什么生肖| 不假思索的假是什么意思| 鬼一般找什么人压床| 七月二十八什么星座| 指甲起层是什么原因| 家里有壁虎是什么征兆| 就诊是什么意思| 长期便秘吃什么药好| 4.9是什么星座| 迪奥是什么| 荔枝适合什么地方种植| 胰岛素抵抗有什么症状| 软下疳是什么症状| 青蒜是什么| 生理盐水有什么作用| 梦见自己结婚了是什么意思| 丘疹性荨麻疹吃什么药| lucy是什么意思| 阴谋是什么意思| 醉酒第二天吃什么才能缓解难受| zuczug是什么牌子| 什么是跨境电商| 棕色裤子搭配什么颜色上衣| hpv感染用什么药| 陈坤为什么地位那么高| 胎盘中药叫什么| 辐照食品是什么意思| 均码是什么码| 膝盖疼做什么检查最好| hco3-是什么意思| 为什么德牧不能打| 什么方法可以快速排便| 彼岸花代表什么星座| 丹毒是什么病| 司法鉴定是干什么的| 世界第一大河是什么河| 白细胞低吃什么食物好| 月亏念什么| 十一月一号是什么星座| 屈髋是什么姿势| 犹太人说什么语言| 呵呵什么意思| 按摩spa是什么意思| 妇科菌群失调吃什么药| 自五行属什么| 1950年属什么生肖| 舌头边疼是什么原因| 宝宝屁多是什么原因| 电解水是什么水| from是什么意思| 什么地眨眼| 绞丝旁奇念什么| 尼麦角林片治什么病| 射不出来是什么原因| 感悟是什么意思| 非洲有什么动物| 冬瓜烧什么好吃| 罹患率是什么意思| 血氨高是什么原因| 咕咕咕咕叫是什么鸟| 沙中土命什么意思| 男性尿道痒吃什么药| 用什么泡脚好| 1989年五行属什么| 2014年五行属什么| 蜘蛛侠叫什么名字| 丝光棉是什么面料| 抽动症是什么原因引起的| 芒果什么人不能吃| 一杆进洞叫什么球| 惊恐发作是什么病| 甘胆酸偏高是什么原因| 看淋巴挂什么科室| 孕妇缺维生素D对胎儿有什么影响| 印度什么时候独立的| 什么什么一什么| 经常落枕是什么原因引起的| 黑天鹅是什么意思| 智齿什么时候拔最好| 阴囊湿疹用什么药| 杨梅泡酒有什么功效| 剧情是什么意思| 背靠背协议是什么意思| 为什么一动就满头大汗| 足癣用什么药最快好| 吃什么可以增强抵抗力和免疫力| 小便无力吃什么药| 梦见自己生病了是什么意思| 乳房边缘一按就疼是什么原因| 甘油三酯低是什么原因| 寸止什么意思| 吃什么补羊水最快| diss是什么意思| 什么的云彩| 什么是活珠子| 灰什么丧什么| 男人喝红糖水有什么好处| 嫌恶是什么意思| 已售罄是什么意思| 老年人缺钾吃什么好| 农历又叫什么| journey是什么意思| 烤麸是什么做的| 医院为什么不推荐腹膜透析| 为什么会得肩周炎| 纳财适合做什么| 芒果不能和什么食物一起吃| 百度
打印

林斐:“金砖+”的世界性意义

[复制链接]
1298|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
primojones|  楼主 | 2024-2-18 21:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


#include <string.h>
#include <stdio.h>
#include <math.h>
#include "pid_fuzzy.h"

//注1:自适应模糊pid最重要的就是论域的选择,要和你应该控制的对象相切合
//注2:以下各阀值、限幅值、输出值均需要根据具体的使用情况进行更改
//注3:因为我的控制对象惯性比较大,所以以下各部分取值较小
//论域e:[-5,5]  ec:[-0.5,0.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]= {  {PB,PB,PM,PM,PS,ZO,ZO},
    {PB,PB,PM,PS,PS,ZO,ZO},
    {PM,PM,PM,PS,ZO,NS,NS},
    {PM,PM,PS,ZO,NS,NM,NM},
    {PS,PS,ZO,NS,NS,NM,NM},
    {PS,ZO,NS,NM,NM,NM,NB},
    {ZO,ZO,NM,NM,NM,NB,NB}
};

int kd[7][7]= {  {PS,NS,NB,NB,NB,NM,PS},
    {PS,NS,NB,NM,NM,NS,ZO},
    {ZO,NS,NM,NM,NS,NS,ZO},
    {ZO,NS,NS,NS,NS,NS,ZO},
    {ZO,ZO,ZO,ZO,ZO,ZO,ZO},
    {PB,NS,PS,PS,PS,PS,PB},
    {PB,PM,PM,PM,PS,PS,PB}
};

int ki[7][7]= {  {NB,NB,NM,NM,NS,ZO,ZO},
    {NB,NB,NM,NS,NS,ZO,ZO},
    {NB,NM,NS,NS,ZO,PS,PS},
    {NM,NM,NS,ZO,PS,PM,PM},
    {NM,NS,ZO,PS,PS,PM,PB},
    {ZO,ZO,PS,PS,PM,PB,PB},
    {ZO,ZO,PS,PM,PM,PB,PB}
};

/**************求隶属度(三角形)***************/
float FTri(float x,float a,float b,float c)//FuzzyTriangle
{
    if(x<=a)
        return 0;
    else if((a<x)&&(x<=b))
        return (x-a)/(b-a);
    else if((b<x)&&(x<=c))
        return (c-x)/(c-b);
    else if(x>c)
        return 0;
    else
        return 0;
}
/*****************求隶属度(梯形左)*******************/
float FTraL(float x,float a,float b)//FuzzyTrapezoidLeft
{
    if(x<=a)
        return 1;
    else if((a<x)&&(x<=b))
        return (b-x)/(b-a);
    else if(x>b)
        return 0;
    else
        return 0;
}
/*****************求隶属度(梯形右)*******************/
float FTraR(float x,float a,float b)//FuzzyTrapezoidRight
{
    if(x<=a)
        return 0;
    if((a<x)&&(x<b))
        return (x-a)/(b-a);
    if(x>=b)
        return 1;
    else
        return 1;
}
/****************三角形反模糊化处理**********************/
float uFTri(float x,float a,float b,float c)
{
    float y,z;
    z=(b-a)*x+a;
    y=c-(c-b)*x;
    return (y+z)/2;
}
/*******************梯形(左)反模糊化***********************/
float uFTraL(float x,float a,float b)
{
    return b-(b-a)*x;
}
/*******************梯形(右)反模糊化***********************/
float uFTraR(float x,float a,float b)
{
    return (b-a)*x +a;
}
/**************************求交集****************************/
float fand(float a,float b)
{
    return (a<b)?a:b;
}
/**************************求并集****************************/
float forr(float a,float b)
{
    return (a<b)?b:a;
}
float ec;
/*==========   PID计算部分   ======================*/
int PID_realize(PID *structpid,uint16_t s,uint16_t in)
{
    float pwm_var;//pwm调整量
    float iError;//当前误差
    float set,input;

    //计算隶属度表
    float es[7],ecs[7],e;
    float form[7][7];
    int i=0,j=0;
    int MaxX=0,MaxY=0;

    //记录隶属度最大项及相应推理表的p、i、d值
    float lsd;
    int temp_p,temp_d,temp_i;
    float detkp,detkd,detki;//推理后的结果

    //输入格式的转化及偏差计算
    set=(float)s/100.0;
    input=(float)in/100.0;
    iError = set - input; // 偏差

    e=iError;
    ec=iError-structpid->LastError;

    //当温度差的绝对值小于Emax时,对pid的参数进行调整
    if(fabs(iError)<=Emax)
    {
        //计算iError在es与ecs中各项的隶属度
        es[NB]=FTraL(e*5,-3,-1);  //e
        es[NM]=FTri(e*5,-3,-2,0);
        es[NS]=FTri(e*5,-3,-1,1);
        es[ZO]=FTri(e*5,-2,0,2);
        es[PS]=FTri(e*5,-1,1,3);
        es[PM]=FTri(e*5,0,2,3);
        es[PB]=FTraR(e*5,1,3);

        ecs[NB]=FTraL(ec*30,-3,-1);//ec
        ecs[NM]=FTri(ec*30,-3,-2,0);
        ecs[NS]=FTri(ec*30,-3,-1,1);
        ecs[ZO]=FTri(ec*30,-2,0,2);
        ecs[PS]=FTri(ec*30,-1,1,3);
        ecs[PM]=FTri(ec*30,0,2,3);
        ecs[PB]=FTraR(ec*30,1,3);

        //计算隶属度表,确定e和ec相关联后表格各项隶属度的值
        for(i=0; i<7; i++)
        {
            for(j=0; j<7; j++)
            {
                form[i][j]=fand(es[i],ecs[j]);
            }
        }

        //取出具有最大隶属度的那一项
        for(i=0; i<7; i++)
        {
            for(j=0; j<7; j++)
            {
                if(form[MaxX][MaxY]<form[i][j])
                {
                    MaxX=i;
                    MaxY=j;
                }
            }
        }
        //进行模糊推理,并去模糊
        lsd=form[MaxX][MaxY];
        temp_p=kp[MaxX][MaxY];
        temp_d=kd[MaxX][MaxY];
        temp_i=ki[MaxX][MaxY];

        if(temp_p==NB)
            detkp=uFTraL(lsd,-0.3,-0.1);
        else if(temp_p==NM)
            detkp=uFTri(lsd,-0.3,-0.2,0);
        else if(temp_p==NS)
            detkp=uFTri(lsd,-0.3,-0.1,0.1);
        else if(temp_p==ZO)
            detkp=uFTri(lsd,-0.2,0,0.2);
        else if(temp_p==PS)
            detkp=uFTri(lsd,-0.1,0.1,0.3);
        else if(temp_p==PM)
            detkp=uFTri(lsd,0,0.2,0.3);
        else if(temp_p==PB)
            detkp=uFTraR(lsd,0.1,0.3);

        if(temp_d==NB)
            detkd=uFTraL(lsd,-3,-1);
        else if(temp_d==NM)
            detkd=uFTri(lsd,-3,-2,0);
        else if(temp_d==NS)
            detkd=uFTri(lsd,-3,1,1);
        else if(temp_d==ZO)
            detkd=uFTri(lsd,-2,0,2);
        else if(temp_d==PS)
            detkd=uFTri(lsd,-1,1,3);
        else if(temp_d==PM)
            detkd=uFTri(lsd,0,2,3);
        else if(temp_d==PB)
            detkd=uFTraR(lsd,1,3);

        if(temp_i==NB)
            detki=uFTraL(lsd,-0.06,-0.02);
        else if(temp_i==NM)
            detki=uFTri(lsd,-0.06,-0.04,0);
        else if(temp_i==NS)
            detki=uFTri(lsd,-0.06,-0.02,0.02);
        else if(temp_i==ZO)
            detki=uFTri(lsd,-0.04,0,0.04);
        else if(temp_i==PS)
            detki=uFTri(lsd,-0.02,0.02,0.06);
        else if(temp_i==PM)
            detki=uFTri(lsd,0,0.04,0.06);
        else if (temp_i==PB)
            detki=uFTraR(lsd,0.02,0.06);

        //pid三项系数的修改
        structpid->Kp+=detkp;
        structpid->Ki+=detki;
        //structpid->Kd+=detkd;
        structpid->Kd=0;//取消微分作用

        //对Kp,Ki进行限幅
        if(structpid->Kp<0)
        {
            structpid->Kp=0;
        }
        if(structpid->Ki<0)
        {
            structpid->Ki=0;
        }

        //计算新的K1,K2,K3
        structpid->K1=structpid->Kp+structpid->Ki+structpid->Kd;
        structpid->K2=-(structpid->Kp+2*structpid->Kd);
        structpid->K3=structpid->Kd;

    }

    if(iError>Emax)
    {
        structpid->pwm_out=7200;
        pwm_var = 0;
        structpid->flag=1;//设定标志位,如果误差超过了门限值,则认为当控制量第一次到达给定值时,应该采取下面的 抑制超调 的措施
    }
    else if(iError<-Emax)
    {
        structpid->pwm_out=0;
        pwm_var = 0;
    }
    else if( fabs(iError) < Emin ) //误差的阀值(死区控制??)
    {
        pwm_var = 0;
    }
    else
    {
        if( iError<Emid && structpid->flag==1 )//第一次超过(设定值-Emid(-0.08)摄氏度),是输出为零,防止超调,也可以输出其他值,不至于太小而引起震荡
        {
            structpid->pwm_out=0;
            structpid->flag=0;
        }
        else if( -iError>Emid)//超过(设定+Emid(+0.08)摄氏度)
        {
            pwm_var=-1;
        }
        else
        {
            //增量计算
            pwm_var=(structpid->K1 * iError  //e[k]
                     + structpid->K2 * structpid->LastError  //e[k-1]
                     + structpid->K3 * structpid->PrevError);    //e[k-2]
        }
        if(pwm_var >= Umax)pwm_var = Umax;      //调整值限幅,防止积分饱和
        if(pwm_var <= Umin)pwm_var = Umin;      //调整值限幅,防止积分饱和

    }
    structpid->PrevError=structpid->LastError;
    structpid->LastError=iError;

    structpid->pwm_out += 360*pwm_var;        //调整PWM输出

    if(structpid->pwm_out > Pmax)structpid->pwm_out = Pmax;    //输出值限幅
    if(structpid->pwm_out < Pmin)structpid->pwm_out = Pmin;    //输出值限幅

    return (int)(structpid->pwm_out); // 微分项
}

void PID_Set(PID *structpid,float Kp,float Ki,float Kd,float T)
{
    (*structpid).Kp=Kp;//Kp*(1+(Td/T));
    (*structpid).Ki=Ki;
    (*structpid).Kd=Kd;
    (*structpid).T=T;

    structpid->K1=structpid->Kp*(1+structpid->Ki+structpid->Kd);
    structpid->K2=-(structpid->Kp+2*structpid->Kp*structpid->Kd);
    structpid->K3=structpid->Kp*structpid->Kd;
}

void PID_Init(PID *structpid)
{
    PID_Set(structpid,8.3,1.2,0,1);
    structpid->flag=0;
    structpid->pwm_out=0;
}

#ifndef PID_H_
#define PID_H_
#include "stm32f10x.h"

typedef struct PID
{
        float Kp; // 增量式积分系数
        float Ki;
        float Kd;
        float T;
      
        float K1; // 增量式积分系数
        float K2;
        float K3;
        float LastError; //Error[-1]
        float PrevError; // Error[-2]
        float pwm_out;
      
        uint16_t flag;//温度状态标志位
}PID;

//void PID_init(PID *structpid);
void PID_Set(PID *structpid,float Kp,float Ki,float Kd,float T);
int PID_realize(PID *structpid,uint16_t s,uint16_t in);
void PID_Init(PID *structpid);
#endif /* PID_H_ */


沙发
weifeng90| | 2024-2-19 08:05 | 只看该作者
PID算法果然永不过时啊,太经典了。
板凳
jw__liu| | 2024-2-19 16:04 | 只看该作者
mark
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

1505

帖子

0

粉丝
aqi是什么意思 葡萄又什么又什么 梦见大青蛇是什么预兆 吃什么瘦肚子 来字五行属什么
为什么拉尿会刺痛 丝状疣是什么 学制是什么 鹅口疮用什么药效果好 diy是什么
比五行属什么 小熊是什么牌子 好吃懒做是什么生肖 甘油三酯高吃什么食物好 什么情况吃通宣理肺丸
yw是什么 逍遥丸适合什么人吃 生蛇是什么原因引起的 什么叫甲沟炎 白带多用什么药效果好
三大产能营养素是什么hcv7jop6ns0r.cn 早上6点到7点是什么时辰hcv9jop7ns1r.cn 舌头发麻是什么原因引起的hcv8jop5ns7r.cn 射精无力吃什么药最佳hcv8jop1ns8r.cn 4月16日是什么星座youbangsi.com
走路腿软没劲是什么原因引起的hkuteam.com 朱元璋为什么不杀朱棣hcv9jop6ns7r.cn 比五行属什么jiuxinfghf.com 石榴石是什么材质hcv8jop0ns2r.cn 绿豆和什么一起煮好gangsutong.com
中午12点是什么时辰hcv8jop9ns4r.cn 命运多折 什么生肖chuanglingweilai.com 焦糖色上衣配什么颜色裤子hcv7jop9ns7r.cn 为什么会长肉粒hcv9jop6ns6r.cn 吃茶油对身体有什么好处yanzhenzixun.com
流口水是什么病hcv9jop2ns1r.cn 牧师是什么意思hcv9jop2ns3r.cn 知了是什么hcv8jop8ns1r.cn 酒精过敏有什么症状hcv7jop4ns8r.cn 眼睛发蓝是什么原因hcv8jop7ns9r.cn
百度