初级会员

- 积分
- 132
- 金钱
- 132
- 注册时间
- 2015-6-12
- 在线时间
- 0 小时
|
#include "pid.h"
struct _pid{
float SetSpeed; //定义设定值
float ActualSpeed; //定义输出实际值
float err; //定义偏差值
float err_last; //定义上一个偏差值
float Kp,Ki,Kd; //定义比例、积分、微分系数
float voltage; //定义电压值?控制执行器的变量?
float integral; //定义积分值
}pid;
void PID_init(float Kp,float Ki,float Kd)
{
pid.SetSpeed=0.0;
pid.ActualSpeed=0.0;
pid.err=0.0;
pid.err_last=0.0;
pid.voltage=0.0;
pid.integral=0.0;
pid.Kp=Kp;
pid.Ki=Ki;
pid.Kd=Kd;
}
float PID_realize(float SetSpeed,float ActualSpeed){
float index;
float umax=120; //最大上限
float umin=-10; //最大下限
pid.err=SetSpeed-ActualSpeed;
if(ActualSpeed>umax) // 实际速度大于最大上限制,只累负的差值
{
if(pid.err>200||pid.err<-200) //积分分离,差值过大的时候,不启用积分;
{
index=0.0;
}
else
{
index=1.0;
if(pid.err<0)
{
pid.integral+=pid.err;
}
}
}
else if(pid.ActualSpeed<umin) //实际速度小于最大下限制,只累正的差值
{
if(pid.err>200||pid.err<-200) //积分分离,差值过大的时候,不启用积分;
{
index=0.0;
}
else
{
index=1.0;
if(pid.err>0)
{
pid.integral+=pid.err;
}
}
}
else
{
if(pid.err>200||pid.err<-200) //积分分离过程
{
index=0.0;
}
else
{
index=1.0;
pid.integral+=pid.err;
}
}
pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
pid.err_last=pid.err;
pid.ActualSpeed=pid.voltage*1.0;
return pid.ActualSpeed;
}
|
|