[提要] 从我构思圆梦小车的第一天起,我就把实现小车速度PID控制作为目标之一,前面虽做过多次尝试,但均不满意,故无意示人,此次总算是基本如愿了,在此与大家分享。
一、背景
从我构思圆梦小车的第一天起,我就把实现小车速度PID控制作为目标之一,也许是我出身于自动控制专业的情结吧。
在我写的第一组关于智能小车的文章中(“寻迹小车 FollowMe”),就期望能实现小车 PID 调速,并且参照《电动机的单片机控制》一书写了相应的测速和控制程序,但不幸的是,没有实现 ,当初以为是测速的分辨率过低(只有10个脉冲/轮子转一圈)。
后来将小车升级,用开模具方式大大提高了测速的精度,推出了圆梦小车第一代。测速精度达到了每转 50个脉冲(如果用前后沿检测,可以达到100个脉冲),但略作尝试后还是没有实现,似乎没有找到问题的根源。
准确的说应该是我没有掌握PID控制程序,我虽是学习自动控制出身,但毕业后从未实际应用过PID控制,所有知识局限于当初学校的实验,这也是我一直想在小车上实现PID的动机之一:一个学自控的居然没有在现实中运用PID的能力,汗颜啊!
因为无力而为,所以在“圆梦小车StepByStep”系列文章中,就跳过了这一段内容。但心未死,想借助小车客户中的高手之力完成之,为我打破这个僵局,可小车倒是送出去几套,PID调速还是杳无音讯,无语!
随着小车进化至第三代(轮式驱动单元)、第四代(FIRA小车),将PID调速的梦想实现的愿望越加强烈!为此,还找了朋友介绍个熟人帮忙,本来信心满满,因为朋友说这个人参加了 Freescale 智能车大赛,其中就用到了PID调速。为此我又送出了一套第四代圆梦小车,更令我失望,连回音都没有,郁闷!
这一切迫使我自己去尝试!看来这种没有多少经济利益的事少有人问津,但愿是这个原因,而不是由于无能。
转机缘于一个买了“轮式驱动单元”的客户(现在是朋友了),他告诉我,参考 Arduino 所提供的 PID 库函数实现了“轮式驱动单元”的调速,而且效果不错。(Arduino 是一个基于AVR单片机的开源平台,经过几年发展,目前资源十分丰富)
我急切的下载了 Arduino 的PID 库函数 ,发现很有价值,就着手尝试了,以下便是实施的过程。
二、PID库函数的消化和移植
(由于排版麻烦,略,有兴趣可下载 PDF 文档)
三、嵌入程序前的准备
……
因为PID控制的基础是以周期T测量,计算出偏差后修正输出。而测量周期不能太长,那样响应将滞后;但过短也没有意义,因为对象的惯性特征,导致极小的时间间隔中不会有变化。
根据小车电机的驱动特性,100ms左右的周期比较合适。
但小车的测速码盘是直接设计在轮毂上的,虽说每转有100个脉冲(轮式驱动单元),但相对于那些设计在电机输出轴上的高级编码器而言,分辨率远远不够。按 目前小车的减速箱设计,对于1:48减速箱,最快时100ms 约34个脉冲,而1:120减速箱才不到14个脉冲,如果调速范围设置为50% 到 100% ,则脉冲数更少,分辨率无法满足控制的要求,如果再降低周期,则更无法得到可靠的控制反馈了。
为此,首先得解决测速的分辨率问题,因为控制速度属于运转稳态时的任务,在起、停过程通常不需要。而正常运转时,相邻2个脉冲的周期不会变化很大,故可以 据此利用前一周期的数值作为倍频的依据,详细算法此处不再赘述,有兴趣者可以到我在GoogleCode上设立的开源项目:http://code.google.com/p/fira-mirosot-robot/中下载:
http://code.google.com/p/fira-mirosot-robot/downloads/detail?name=Introduction%20B%20-%20Hardware%20of%20the%20Smart%20Car.pdf&can=2&q=
其原理示意如下图:
四、将PID计算嵌入程序
……
五、PID参数整定前的准备
从搜集的PID参数整定方法的资料看,多数需要能记录速度变化的趋势,也就是所谓的“对象动态特性”测量,或者说是“冲击响应”测量。
既然小车内部已经实现了数字化的速度检测,且有通讯接口,为何不将速度送到PC机上,利用PC机显示速度变化曲线,从而得到整定参数的依据。
可我PC机上的图形编程能力太菜,亏得有个好友帮忙,为我写了一个图形显示程序,使速度显示成为现实。(由衷表示感谢!)
为了配合这个功能,在小车控制程序中增加了速度输出,每次测量(20ms)都将速度结果送出,PC机根据这些速度数据绘出速度随时间的变化曲线:
六、参数整定过程
轮式驱动单元第二版驱动很方便,用串口可以容易的控制,为了简化操作,是空载方式测试的,我用无线方式试验过,有载(装在小车上)效果更好。下图为空载调试方式:
从各类参数整定方式中,我感觉那个“齐格勒—尼克尔斯经验法”比较容易实施,就按那个进行了参数调整,先关闭积分和微分作用,只保留P,在电机可以工作的 下限速度进行整定(因为我试过,如果在偏高的速度整定,则在低速工作时会振荡,还无能力解释),逐渐加大P使速度发生振荡,如下图:
此时得到临界比例系数Pd,从图上得到振荡周期T ,根据“齐格勒—尼克尔斯经验法”:
Kp Ki Kd
P 控制: 0.5Pd
PI控制: 0.45Pd 0.83T
PID控制: 0.6Pd 0.5T 0.125T
计算出PID系数,Pd = 22 ,T = 300ms ,按PID控制计算,得到:
Kp = 1.3, Ki = 0.15秒 Kd = 0.03秒
设置到程序中后,基本可以了,只是微分系数需要略作调整(降低到0.02秒,否则有些振荡),设置后的速度曲线为:
七、结语
当时得到这个结果时,我倍感很神奇!
因为早期的一件事让我对PID系数的配比感到神秘莫测:曾经按照老外的示例做了个LEGO的两轮平衡车,他也是用的PID控制,区区几行程序,小车就站起来了。可是我将他的三个系数随便一改,哪怕是略作调整,小车就趴下了,很是灵验。
那时我就对PID系数的整定心存敬畏,同时也一直想尝试利用程序使其变得不那么神秘。
这次尝试总算了结了我的心愿,爽!
借助这个工具,应该可以解决许多需要PID控制的问题,如两轮平衡、差分驱动小车走直线等,只要程序中能测出偏差;而这是必须的,否则PID控制也无从谈起。
但愿此尝试能起到抛砖引玉作用,使我们的爱好者们、多数大学生们所做的小车也能像那个外国人做的绕着茶杯转的小车那样流畅:
而不是只有参加FreeScale智能车大赛的同学才能做到。
————————————————
南京嵌入之梦工作室
2011年4月23日星期六
用 CamStudio 录制的 PID 调速动态过程:
使用 1:120 减速箱:
评分
有一种泥头小车是4个轮子的
前边2只负责转向
后面2只轮子由一个电机带动做驱动(带差速器)
我的问题是:
如果不用差速器
后面2个轮子各自又一个电机带动做驱动
那么当前进中小车转向时
有啥办法改变后2个驱动电机的速度?
以便小车在转向时不会翻车?
谢谢!