智能车制作

标题: PID [打印本页]

作者: 一叶落尘    时间: 2012-2-15 15:10
标题: PID
各位大神帮我看看,三个偏差值基本正确但输出chang1不正确,这是什么原因?


//申明变量
//定义变量
float Kp;//PID 比例系数常数
float Ti;//PID 积分系数常数
float Td;//PID 微分系数常数
#define T;//PID 采样周期
float pid_E0;//偏差e[k]
float pid_E1;//偏差e[k-1]
float pid_E2;//偏差e[k-2]
float a0;
float a1;
float a2;
float chang1;//变化量
int chang;//对chang1取整
int setpoint;//目标值
//PID初始化
void PID_init(void)
{  
     Kp=;
     Ti=;
     Td=;
     T=;
     a0=Kp*(1+T/Ti+Td/T);
     a1=-Kp*(1+2*Td/T);
     a2=Kp*Td/T;
    // Ki=KpT/Ti=0.8,微分系数Kd=KpTd/T=0.8,Td=0.0002,根据实验调得的  

  //结果确定这些参数
     pid_E0=0;
     pid_E1=0;
     pid_E2=0;
     chang1=0;
     chang=0;
     setpoint=0;

}
//增量计算
void PID_cal(int nextpoint)
{   
    pid_E0 = SetPoint - nextPoint;//当前误差
    chang1 =  ao* pid_E0 //E[k]项
             - a1* pid_E1//E[k-1]项
             + a2 * pid_E2; //E[k-2]项
    //存储误差,用于下次计算
    pid_E2 = pid_E1;
    pid_E1 = pid_E0;
    gabs(float chang1);
    //返回增量值
    chang=(int)chang1;
    return(chang);

}
//增量为负值时的处理
float gabs(float chang1)
{
if(chang1<0)
{
chang1=0-chang1;
}
return chang1;
}


作者: ◆|detrrr|    时间: 2012-2-21 21:06
void 怎么 return的??是这个 原因么。。。
作者: qq185334563    时间: 2012-2-27 17:52
楼主好人 楼主一生平安

作者: 周洪水    时间: 2012-3-1 19:37
如二楼所说,你的无返回值函数哪来的返回值。。。
作者: xu735456    时间: 2012-3-1 19:38
程序怎么这么简单??
作者: 樱花流年    时间: 2012-3-5 21:29
楼主的程序似乎有点问题,change1应该等于chang1 =  ao* pid_E0+a1* pid_E1+ a2 * pid_E2吧,楼主试一下哈,我看的资料上这么写的哦!当然,void函数也是没有return的
作者: xufang    时间: 2012-3-7 22:20
乱七八糟
作者: 王谦623    时间: 2012-3-8 21:34

作者: 一毛钱~~~~~~    时间: 2012-5-5 21:43
这是想干嘛、、、、




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2