一直以来,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
-
-
- #include "stdio.h"
- void pid_init();
- float pid_realise(float speed);
-
- 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)
- {
- float speed = pid_realise(200.0);
- printf("%f\n",speed);
- 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.kp = 0.2;
- pid.ki = 0.01;
- pid.kd = 0.2;
- }
-
-
- float pid_realise(float speed)
- {
- 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;
-
- }