C 语言实现增量式PID

来源:互联网 发布:大阿亚图拉知乎 编辑:程序博客网 时间:2024/05/22 03:17

一直以来,pid都是控制领域的经典算法,之前尝试理解了很久,但还是一知半解,总是不得要领,昨天模仿着别人的代码写了一个增量式pid的代码。

我的理解就是pid其实就是对你设置的预定参数进行跟踪。在控制领域,他先采集目前的实时参数,与设定的参数进行比较,计算出误差,然后进行积分微分运算,计算出控制器需要的增量(正负),

然后与实际参数相加,使他尽可能的接近设定值 。没有D参数的称为PI控制器,也比较常用。具体公式其实不理解也没关系,只要对照着差分方程,写出相应的算法即可,然后上网查查pid调节的经验。

程序中的count为需要计算的次数,有兴趣的读者可以尝试着修改一下这个数值,当count值为100的时候,你会发现他最后迭代的值并不是设定值200.0.而是一个比他小的数,

这是因为100次计算并不能使他达到设定值,毕竟我们设置的初始实际值为0,要让0直接跟踪到200需要一段跳跃时间。这个跳跃时间并不是100计算就能达到的;可以尝试几次试试。http://blog.dqccc.com/s/article_9257184.html

当然实际控制领域应用的时候,并没有这个count,他会一直进行 动态运算,使实际值一直保持在设定值附近。

找到最适的pid参数。http://blog.dqccc.com/s/article_9257571.html



[cpp] view plain copy
  1. //实现增量式PID算法   
  2.   
  3. #include "stdio.h"   
  4. void pid_init();//PID参数初始化   
  5. float pid_realise(float speed);//实现PID算法     
  6.   
  7. struct {  
  8.     float set_speed;//设定速度   
  9.     float actual_speed;//实际速度  
  10.     float error;//偏差    
  11.     float error_next;//上一个偏差    
  12.     float error_last;//上上一个偏差   
  13.     float kp,ki,kd;//定义比例,积分,微分参数    
  14.        
  15. }pid;  
  16.   
  17.   
  18. int main()  
  19. {  
  20.     pid_init();  
  21.     int count = 0;  
  22.     while(count<400)//进行400次 PID 运算,使初始值从0开始接近200.0     
  23.     {  
  24.         float speed = pid_realise(200.0);//设定值设定为200.0    
  25.         printf("%f\n",speed);//输出每一次PID 运算后的结果    
  26.         count++;  
  27.     }  
  28. }  
  29.   
  30.   
  31. void pid_init()  
  32. {  
  33.     pid.set_speed = 0.0;  
  34.     pid.actual_speed = 0.0;  
  35.     pid.error = 0.0;  
  36.     pid.error_next = 0.0;  
  37.     pid.error_last = 0.0;  
  38.     //可调节PID 参数。使跟踪曲线慢慢接近阶跃函数200.0 //   
  39.     pid.kp = 0.2;  
  40.     pid.ki = 0.01;  
  41.     pid.kd = 0.2;  
  42. }  
  43.   
  44.   
  45. float pid_realise(float speed)//实现pid    
  46. {  
  47.     pid.set_speed = speed;//设置目标速度    
  48.     pid.error = pid.set_speed - pid.actual_speed;  
  49.     float increment_speed;//增量  
  50.        
  51.     increment_speed = pid.kp*(pid.error-pid.error_next)+pid.ki*pid.error+\  
  52.     pid.kd*(pid.error-2*pid.error_next+pid.error_last);//增量计算公式    
  53.       
  54.     pid.actual_speed+= increment_speed;  
  55.     pid.error_last = pid.error_next;//下一次迭代    
  56.     pid.error_next = pid.error;  
  57.     return pid.actual_speed;   
  58.       
  59. }  

原创粉丝点击