【智能车新手入门】-位置式、增量式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
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
相关文章推荐
- 【智能车新手入门】-如何提高C代码效率
- 400行代码实现双人对战五子棋(适合新手入门)
- web content management新手入门--分页功能的实现
- 新手入门常用代码集锦
- 入门代码教程第二节 如何:实现服务协定
- PHP常用代码大全(新手入门必备)
- PHP常用代码大全(新手入门必备)
- 新手入门常用代码集锦(1)
- 【新手入门教程】简洁纯CSS下拉导航菜单代码
- ASP实现智能搜索实现代码
- 一个智能指针的实现(代码)
- 新手入门:巧用Webbrowser实现网络数据采集
- AjaxPro.NET实现TextBox智能获取服务端数据功能(Asp.net 2.0)(示例代码下载)
- 一个智能指针的实现(代码)
- AjaxPro.NET实现TextBox智能获取服务端数据功能(Asp.net 2.0)(示例代码下载)
- ASP实现智能搜索实现代码
- 新手入门常用代码集锦
- websphere portal新手入门--动态下拉菜单的实现
- asp.net和ajax实现智能搜索功能代码
- 基于Jquery的标签智能验证实现代码