|
本帖最后由 qianshan 于 2016-3-22 16:46 编辑
本人大二,从二月份开始弄到现在,调了差不多一个月的参数,现在小车基本可以比较稳的停住,但抗干扰能力还是不够强,因为还有其他项目忙和学习任务,先缓一下,打算学完自动控制理论再回来完善。在这里向大家分享一下我调试自平衡小车的一些经验之谈吧,水平有限,有错误的地方希望大家帮我更正一下。
一开始的时候,我在网上查了挺多自平衡小车的代码和资料,基本都是单纯的PD角度环加PI速度环,我一开始也是照着这个思路去调,然后调了好久的参数,虽然小车可以立起来,但小车总是在某一个地方来回振荡。一开始效果就像下面的第一个视频一样(新人不能发表视频链接,视频网址已经打包到附件里,有兴趣的朋友可以去看下),我调了好久PD,还是无法解决,接着加了角度积分,虽然解决振荡的问题,但是即使加上速度环,小车好像几乎没有抗干扰能力,所以一直卡在这里,一直在想如何只用PD让小车稳定的立起来,最后神奇的发现滑动PD算法可以很好的解决这一类问题,同时调试起来也不是很难。
滑动PD算法思路:当小车倾斜角度不同时,分别取用不同的PD参数。角度比例P只与小车倾斜角度有关,只有当小车倾斜角度比较大时,他的作用就比较明显。而D只取决于小车倾斜的角速度,而与其角度大小无关。如果小车要稳定的立起来时,其倾斜角度必定是在0附近,此时比例P起的作用很小,起作用的主要是微分参数D,所以这时候电机主要是由参数D控制。所以有一个规律,小车倾斜角度应与参数D成反比,与参数P成正比。所以我们需要根据小车不同的倾斜角度分几个档次。
代码如下:
- float Kp[5] ={170.0,120.0,100.0,80.0,60.0};
- float Kd[5] = {5.0,8.0,10.0,15.0,20.0};
- void Slide_PD(void)
- {
- if(fliter_angle < 1.0 && fliter_angle > -1.0)
- i = 4;
- else if(fliter_angle < 2.0 && fliter_angle > -2.0)
- i = 3;
- else if(fliter_angle < 3.0 && fliter_angle > -3.0)
- i = 2;
- else if(fliter_angle < 4.0 && fliter_angle > -4.0)
- i = 1;
- else
- {
- i = 0;
- }
-
- if(n_PID->v_angle > 20.0 || n_PID->v_angle < -20.0 || speed > 3.0 || speed < -3.0) //预防小车收到外界人为干扰
- {
- i = 0;
- }
- }
- n_PID->PWM_Out = Kpp * speed + Kii * position + Kp[i] * fliter_angle + Kd[i] * n_PID->v_angle + Ki * error_angle;
复制代码
上面代码是关于这次滑动PD算法的核心部分,一点都不复杂,很好理解,在上面的程序中,我把角度分为五个档次,即Kd与Kp一共有五组,10个参数,看起来参数数量十分庞大,其实很简单,你会发现,每组参数都是成递减和递增关系。在进行设计滑动PD算法时,我是先建议大家先粗略找到一组能让小车立起来不剧烈抖动但不求很稳的PD参数,把这组参数作为倾斜角度最大的档次中的参数,其余各组参数按照P,D与倾斜角度大小的正反比关系逐个增加或递减。就像上面的代码一样,i越大,档次的倾斜角度越小,P就越小,D就越大。有了这个关系,其余都很好调了,调试建议:先粗调,后细调,这样速度会快很多。
总结:之前开始调试自平衡小车时,曾经看过一篇关于调试小车文章,里面曾经说过P的值应该是D的七十多倍左右,然后这句话在当时束缚了我,搞得调试的时候蹑手蹑脚,调了很久还是没什么好的进展,然后自己思考了好一段时间,才决定抛弃原来那边文章调试的思路,按照自己的想法去调,然后效果好多了,不知道大家有没有发现上面代码中的Kp[4]与Kd[4]之间只是三倍关系左右,而没有七十多倍,所以我想说,以后做什么事情,学习别人方法的同时,要学会去思考,不要去照搬,要大胆去实践!
关于本人的自平衡小车程序已经打包到附件了,前期小车与滑动PD调出来的小车视频链接也在压缩包里面,有兴趣的朋友可以去看看,谢谢!还是那句,水平有限,如有不足,请大家指导下。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|