因为一些事情耽搁了几天,如今总算空出时间续写了。第一篇主要讲运动学分析,接下来讲PID控制与调速。
有关PID的形象描述有很多,最多的就是那个万恶的利用水龙头控制水箱水量,很容易理解,公式也很简单,而有关于其代码实现我主要靠这篇文章
/wzhCAlex/article/details/69951159
作者:丫就是熊个猫猫
该作者的PID控制算法专栏有很多文章,感兴趣可以从头开始看。有关位置式增量式的选择我觉得问题不大,本质上都是一样的,我选的是位置式PID主要是为了好理解。毕竟抽象思考能力不足一直是我的硬伤。
这里要说的是我的队伍用的电机是普通直流电机,依靠所给电压调速,主要方案是输出PWM,通过控制板放大后供给电机。所以实际是我输出的是电压,而通过编码器反馈回来的却是速度,对于这个问题,我的方案是测量电压与速度的关系曲线,然后要用哪个速度就换成对应的比例,不过后来由于太懒就直接把它近似为直线了,直接按同一比例换算。
而关于编码器的使用,由于我用的就是龙邱家的编码器,故直接用它的参考例程来初始化,也就是对应的IO口改为定时器计数功能而已,这里用的是FTM飞思卡尔高级定时器,有专门的解码函数,直接用就是了。先用PIT周期性中断每隔一个周期触发一次中断,大概15ms吧,然后在中断函数里读定时器的计数,然后清空计数。不清的话也可以,不过就是溢出然后程序跑飞轮子疯转而已,想必诸位不会介意。这里得到的是一个周期时间里的脉冲累计值,除以对应编码器线数以及周期时间可以得到转速,不过不想那么麻烦的话可以直接用累计值当速度,而不用m/s。
这里又出现问题了,由于我用的MKV58板子里的FTM的正交解码接口只有两个,所以只能测两个轮子的速度,这对付三轮组双电机驱动当然是可以,但是信标组是四个轮子,四个轮子啊!
但是做车嘛就是逢山开山遇水开水,这里查找到的解决方法有两种,一.双主控,每块板子控制两个电机。二.DMA计数。为了省钱当然果断选了第二组,编码器的输出无非两种,一种输出AB相正交解码,这个当时困扰了我好一会儿才理解明白,另一种是输出步进脉冲和方向,我花了许多时间去理解正交解码,但结果这编码器输出的居然是第二种,方法也简单,就是将它的脉冲输出口接到DMA计数口,方向输出口接到普通IO口,到时候在周期性中断里相乘就是了。据说这样做不太精确,但我用的时候没多大感觉,也可能是我没做极致吧!这样的话就够用了。
通过以上方法就可以实现输出一个速度设定值,然后PID调控轮子到目标速度,这样便是基本的控制过程了。我用了四套PID,一套PID对应一个轮子,恰好有4个PIT中断,当然是一个中断对一个PID,然后又出现问题了!就算是用了PID控制单个轮子的速度还是会在你的设定值上波动,当然波动很小,但是四个轮子一起波动的话…
这车子就走不了直线了,所以每次跑的时候,总可以看到我们的车子如蛇一般沿着一条近似直线蜿蜒前进,不知道的人还以为这是我们特意搞出来的效果。
这时就应该再加一套总体式PID,一般车身倾斜就给它扳回去,但是信标组又没有固定赛道,所以也就懒得加上去了。
其实仔细想想对于这个比赛我花的时间太少,很多可以优化的地方都由于太懒而没有做,等想做的时候已经快比赛了,只能空自叹息。