首先我采用的是PD控制,积分I部分虽然写了,但仍存在问题,故不作介绍。
1. 从零开始增大比例部分Kp,一定要记住,只要使电机从超调变为收敛即可,因为过大的Kp虽然也能使电机收敛,但是会对之后调其他参数产生极大的影响,我今天刚开始一直把Kp调是的30+,不论怎么调Kd也不能解决震荡的问题,最后降低Kp到20时调节Kd才终于有效,最后获得的完美参数是 5,0,4。说明30明显过大了。
2. Kd不能比Kp大,不晓得为什么,但是一旦超过Kp电机就会停转,尚待解决。
3. 一定要注意公式的对错,一直调不出来的伙伴们也可以检查几遍自己的公式,公式一旦错误,参数怎么调都不能成功。这里列出我今天犯的错误:
(1)第一处红线(比例部分):Target与Encoder写反,图中写的是对的,可以这样理解,首先我们设置的三个参数均为正值,假设目标是T=60,第一次实际值Ex1=40,必须用(60-40)*Kp才有效,否则就是反的,即T-Ex,下图中就是 Target-Encoder
(2)第二处红线(微分部分):也是正反的问题,一样的理解,结果如图。
从这两处错误可以知道,学习控制算法必须深入了解推导步骤,理解每一个公式,每一个变量,否则就会像我一样迷茫了几个月,不理解原理,就算一次成功,也不能保证之后的每次成功,更不能做出更好的优化版本。
4. 仍然存在的问题:
(1)积分项不能用,我通过串口助手观察下图中出现的I变量,每次的误差平均值都在0~3,但是不知道为什么就算Kd取1,一旦加入积分项,系统就会超调,电机转速拉满。积分项的缺失使得当控制目标是快接近系统的最大值时,误差变大。
(2)电机起步超调,需要给单片机复位2~3遍才能实现正常的控制目的。