您的位置:首页 > 编程语言

【智能车新手入门】-位置式、增量式PID实现代码

2014-10-19 17:11 393 查看
PID控制是大家在智能车制作中碰到最常见的算法,它主要分两种:位置式和增量式。下面来谈谈这两种PID的特点以及代码实现。

1. 位置式PID
特点:位置式PID用到了过去所有误差值的积分,因此与过去的整个状态有关。
代码实现:
typedef struct PID //定义结构体

{

float LastError; //上一次误差

float SumError; //误差积分项

} PID;

static PID sPID;

static PID *sptr=&sPID;

void PID_init(void) //指针初始化

{

sptr->LastError = 0;

sptr->SumError = 0;

}

float PIDCalc(float NextPoint)

{

float dError,Error;

Error = SetPoint - NextPoint; // 偏差

sptr->SumError += Error; // 积分

dError = Error - sptr->PrevError; // 当前微分

sptr->LastError = Error;

return ( KP* Error // 比例项

+KI * sptr->SumError // 积分项

+KD* dError ); // 微分项

}

2. 增量式PID

特点:由于增量式PID输出的是控制量增量,误动作影响较小
代码实现:
typedefstruct PID
{
float V_lasterror; //Error[-1]
float V_preserror; //Error[-2]
}PID;

staticPID sPID;
staticPID *sptr=&sPID;

voidPID_Init(void) //指针初始化
{
sptr->V_lasterror = 0; //Error[-1]
sptr->V_preserror = 0; //Error[-2]
}

voidPID_caculate(u16 Set_Value,float Get_Value)
{
float g_fDirectionControlOut1=0;
V_error=Get_Value-Set_Value;
g_fDirectionControlOut1= P *(V_error-sptr->V_lasterror) + I * V_error + D(V_error-2*sptr->V_lasterror+sptr->V_preserror);//计算当前输出增量
sptr->V_preserror =sptr->V_lasterror; //存储误差,用于下次计算
sptr->V_lasterror = V_error;

g_fDirectionControlOut2 += g_fDirectionControlOut1;//上一次输出量加上当前输出增量
g_fDirectionControlOutOld = g_fDirectionControlOutNew;
g_fDirectionControlOutNew =g_fDirectionControlOut2;
}

关于P、I、D三个环节的选择,一般只会用到PI控制或者PD控制,例如速度控制要求稳态无误差,那么就需要积分环节,所以使用PI控制;而使用方向控制的时候,由于不需要无稳态误差,所以使用PD控制即可,D的作用是消除P环节所带来震荡。

联系我们

淘宝店铺 : http://shop60443799.taobao.com/

技术交流QQ群 :108190422 摄像头群

132879827 光电群

118404899 电磁群

技术交流邮箱 : demok@vip.qq.com

技术论坛 : http://blog.csdn.net/demok2010

官方网站 : www.demok.com.cn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: