智能车制作

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 519|回复: 0

关于PID模糊控制算法的一个小问题

[复制链接]

2

主题

3

帖子

0

精华

注册会员

Rank: 2

积分
154
威望
96
贡献
58
兑换币
57
注册时间
2019-6-30
在线时间
0 小时
发表于 2020-2-18 16:28:56 | 显示全部楼层 |阅读模式
模糊自适应程序如下,在网上找到的程序,其中“先确定偏差位置,并求出占相邻点比重”什么意思?我不理解的是“位置”和“相邻点比重”,希望大佬可以帮我解释以下,万分感谢!


  • #include "include.h"
  • #include "fuzzy.h"
  • void fuzzyout(const FUZTAB *l_tab,s16 l_EE,s16 l_EEC,s16 *pout,s16 *iout,s16 *dout)
  • {
  •    unsigned char  i,j;
  •    long psum=0,isum=0,dsum=0;
  •    s16 l_BP[10]={0,0,0,0,0,0,0,0,0,0};
  •    s16 l_BD[10]={0,0,0,0,0,0,0,0,0,0};
  •    //先确定偏差位置,并求出占相邻点比重
  •    for(i=0;i<l_tab->cntrow;i++)
  •    {
  •      if(l_EE<=l_tab->Edot)break;
  •    };
  •    if(i==0)l_BP[0]=100;
  •    else if(i==l_tab->cntrow)l_BP[l_tab->cntrow-1]=100;
  •    else if(i>0 && i<l_tab->cntrow)
  •    {
  •      l_BP=(long)100*(l_EE-l_tab->Edot[i-1])/(l_tab->Edot-l_tab->Edot[i-1]);
  •      l_BP[i-1]=(long)100*(l_tab->Edot-l_EE)/(l_tab->Edot-l_tab->Edot[i-1]);
  •    }
  •    //同理求出偏差微分的位置,并求出占相邻点比重
  •    for(j=0;j<l_tab->cntcolume;j++)
  •    {
  •      if(l_EEC<=l_tab->ECdot[j])break;
  •    };
  •    if(j==0)l_BD[0]=100;
  •    else if(j==l_tab->cntcolume)l_BD[l_tab->cntcolume-1]=100;
  •    else if(j>0 && j<l_tab->cntcolume)
  •    {
  •      l_BD[j]=(long)100*(l_EEC-l_tab->ECdot[j-1])/(l_tab->ECdot[j]-l_tab->ECdot[j-1]);
  •      l_BD[j-1]=(long)100*(l_tab->ECdot[j]-l_EEC)/(l_tab->ECdot[j]-l_tab->ECdot[j-1]);
  •    }
  •    //求出该点在这个二维结构中所占比重
  •    for(i=0;i<l_tab->cntrow;i++)
  •    {
  •      for(j=0;j<l_tab->cntcolume;j++)
  •      {
  •        psum+=(long)l_BP*l_BD[j]*l_tab->ptab[j];
  •        isum+=(long)l_BP*l_BD[j]*l_tab->itab[j];
  •        dsum+=(long)l_BP*l_BD[j]*l_tab->dtab[j];
  •      }
  •    }
  •    if(Mid_pro>-8&& Mid_pro<8 )
  •    {
  •    *pout=(s16)(0.9*psum/100);
  •    *iout=(s16)(isum/100);
  •    *dout=(s16)(1.1*dsum/100);
  •    }
  •    if(Mid_pro>8&& Mid_pro<16)
  •    {
  •    *pout=(s16)(1.1*psum/100);
  •    *iout=(s16)(isum/100);
  •    *dout=(s16)(0.8*dsum/100);
  •    }
  •    if(Mid_pro>-16&& Mid_pro<-8)
  •    {
  •    *pout=(s16)(1.1*psum/100);
  •    *iout=(s16)(isum/100);
  •    *dout=(s16)(0.8*dsum/100);
  •    }
  •    else
  •    {
  •    *pout=(s16)(psum/100);
  •    *iout=(s16)(isum/100);
  •    *dout=(s16)(dsum/100);
  •    }
  • }



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 京ICP备14023231号-8

GMT+8, 2020-4-9 14:34 , Processed in 0.042515 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表