C 语言实现增量式PID
2017-09-24 18:09
211 查看
一直以来,pid都是控制领域的经典算法,之前尝试理解了很久,但还是一知半解,总是不得要领,昨天模仿着别人的代码写了一个增量式pid的代码。
我的理解就是pid其实就是对你设置的预定参数进行跟踪。在控制领域,他先采集目前的实时参数,与设定的参数进行比较,计算出误差,然后进行积分微分运算,计算出控制器需要的增量(正负),
然后与实际参数相加,使他尽可能的接近设定值 。没有D参数的称为PI控制器,也比较常用。具体公式其实不理解也没关系,只要对照着差分方程,写出相应的算法即可,然后上网查查pid调节的经验。
程序中的count为需要计算的次数,有兴趣的读者可以尝试着修改一下这个数值,当count值为100的时候,你会发现他最后迭代的值并不是设定值200.0.而是一个比他小的数,
这是因为100次计算并不能使他达到设定值,毕竟我们设置的初始实际值为0,要让0直接跟踪到200需要一段跳跃时间。这个跳跃时间并不是100计算就能达到的;可以尝试几次试试。
当然实际控制领域应用的时候,并没有这个count,他会一直进行 动态运算,使实际值一直保持在设定值附近。
找到最适的pid参数。
//实现增量式PID算法
#include "stdio.h"
void pid_init();//PID参数初始化
float pid_realise(float speed);//实现PID算法
struct {
float set_speed;//设定速度
float actual_speed;//实际速度
float error;//偏差
float error_next;//上一个偏差
float error_last;//上上一个偏差
float kp,ki,kd;//定义比例,积分,微分参数
}pid;
int main()
{
pid_init();
int count = 0;
while(count<400)//进行400次 PID 运算,使初始值从0开始接近200.0
{
float speed = pid_realise(200.0);//设定值设定为200.0
printf("%f\n",speed);//输出每一次PID 运算后的结果
count++;
}
}
void pid_init()
{
pid.set_speed = 0.0;
pid.actual_speed = 0.0;
pid.error = 0.0;
pid.error_next = 0.0;
pid.error_last = 0.0;
//可调节PID 参数。使跟踪曲线慢慢接近阶跃函数200.0 //
pid.kp = 0.2;
pid.ki = 0.01;
pid.kd = 0.2;
}
float pid_realise(float speed)//实现pid
{
pid.set_speed = speed;//设置目标速度
pid.error = pid.set_speed - pid.actual_speed;
float increment_speed;//增量
increment_speed = pid.kp*(pid.error-pid.error_next)+pid.ki*pid.error+\
pid.kd*(pid.error-2*pid.error_next+pid.error_last);//增量计算公式
pid.actual_speed+= increment_speed;
pid.error_last = pid.error_next;//下一次迭代
pid.error_next = pid.error;
return pid.actual_speed;
}
我的理解就是pid其实就是对你设置的预定参数进行跟踪。在控制领域,他先采集目前的实时参数,与设定的参数进行比较,计算出误差,然后进行积分微分运算,计算出控制器需要的增量(正负),
然后与实际参数相加,使他尽可能的接近设定值 。没有D参数的称为PI控制器,也比较常用。具体公式其实不理解也没关系,只要对照着差分方程,写出相应的算法即可,然后上网查查pid调节的经验。
程序中的count为需要计算的次数,有兴趣的读者可以尝试着修改一下这个数值,当count值为100的时候,你会发现他最后迭代的值并不是设定值200.0.而是一个比他小的数,
这是因为100次计算并不能使他达到设定值,毕竟我们设置的初始实际值为0,要让0直接跟踪到200需要一段跳跃时间。这个跳跃时间并不是100计算就能达到的;可以尝试几次试试。
当然实际控制领域应用的时候,并没有这个count,他会一直进行 动态运算,使实际值一直保持在设定值附近。
找到最适的pid参数。
//实现增量式PID算法
#include "stdio.h"
void pid_init();//PID参数初始化
float pid_realise(float speed);//实现PID算法
struct {
float set_speed;//设定速度
float actual_speed;//实际速度
float error;//偏差
float error_next;//上一个偏差
float error_last;//上上一个偏差
float kp,ki,kd;//定义比例,积分,微分参数
}pid;
int main()
{
pid_init();
int count = 0;
while(count<400)//进行400次 PID 运算,使初始值从0开始接近200.0
{
float speed = pid_realise(200.0);//设定值设定为200.0
printf("%f\n",speed);//输出每一次PID 运算后的结果
count++;
}
}
void pid_init()
{
pid.set_speed = 0.0;
pid.actual_speed = 0.0;
pid.error = 0.0;
pid.error_next = 0.0;
pid.error_last = 0.0;
//可调节PID 参数。使跟踪曲线慢慢接近阶跃函数200.0 //
pid.kp = 0.2;
pid.ki = 0.01;
pid.kd = 0.2;
}
float pid_realise(float speed)//实现pid
{
pid.set_speed = speed;//设置目标速度
pid.error = pid.set_speed - pid.actual_speed;
float increment_speed;//增量
increment_speed = pid.kp*(pid.error-pid.error_next)+pid.ki*pid.error+\
pid.kd*(pid.error-2*pid.error_next+pid.error_last);//增量计算公式
pid.actual_speed+= increment_speed;
pid.error_last = pid.error_next;//下一次迭代
pid.error_next = pid.error;
return pid.actual_speed;
}
相关文章推荐
- C 语言实现增量式PID
- C 语言实现增量式PID
- 如何在STM32上实现增量式PID转
- 【智能车新手入门】-位置式、增量式PID实现代码
- 增量式PID推导及C语言实现
- 增量式PID的stm32实现(转)
- 增量式PID的matlab实现
- STM32学习笔记7(增量式PID的实现)
- 用VS2005实现软件多语言版本的迅捷开发(转载)
- 一个小语言的词法分析程序原理及其实现(2)
- WPF UI多国语言的实现
- 利用资源文件实现多语言的系统
- Java语言实现简单FTP软件------>远程文件管理模块的实现(十)
- 各种语言HMAC SHA256实现
- (转)如何在linux C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理
- 语言识别和聊天机器人的实现
- vc中多国语言的实现
- quicksort快速排序(3种语言实现 c/java/python)
- 用 C 语言实现程序的多态性
- 一般PID的C语言实现