我觉得你上面的代码用的是位置式的算法,放到了增量式上 |
前面两篇帖子具体介绍了 PID 和 PID 参数的具体调节,这节具体向大家展示 PID 的具体应用实例。 我们一般需要电机以一定的转速运转,但电机具体的转速往往并不是我们设定的那个转速,也就是说一般会有一般的误差。在有些地方我们必须需要电机快速而且精确的达到我们需要的转速,这种情况下我们就需要 PID 去控制电机。 我们知道 PID 控制,需要反馈值, 在这里我们一般使用编码器去测电机的实际转速。 PID 控制具体代码如下: void speed_ctrl(float SPEED) //SPEED 就是你具体想要电机达到的转速 { Speed_error=SPEED-zhuanshu; // zhuansu 就是编码器测回来的电机的具体转速,这一块是偏差,作用是瞬间做出反应,偏差一旦产生控制器立即产生控 制作用,使控制量向减少偏差的方向变化。 Speed_error_I+=Speed_error; //这块是将存在的偏差不在的自加,相当于数学表达式的积分部分,作用是消除系统的误差, Speed_Now_error=Speed_error; Speed_Last_error=Speed_Now_error; Speed_deviation=Speed_Now_error-Speed_Last_error; // 这一块是控制的微分部分,实际控制系统除了希望消除静态误差外,还要对偏差做出立即响应, 而且还要根据偏差的变化趋势预先给出适当的纠正,为了达到这个目的我们引入 微分。 Speed_PID=SPEED+Speed_error*Speed_P+Speed_error_I*Speed_I+Speed_deviation*Speed_D; Speed_PID/=30; if(Speed_PID>=100) // 为了让调节后的值不会超过 PWM 波的百分之百。 Speed_PID=100; if(Speed_PID<=0) //为了让调节后的值不会低于 PWM 波的最低值。 Speed_PID=0; Motor_forward((int) Speed_PID) ; //将调节后的值赋予电机转速的函数。 } P、I、D 参数的具体调节在前面的帖子有介绍,不会的可以去翻阅。 参数调好后,通过编码器就可以看到电机会以我们设定的转速在旋转了。如果还和你想要的有些出入或者出入比较大,那就是参数还没有调好,再好好调节参数。 |
-
QQ截图20150706173307.png (11.54 KB, 下载次数: 171)