当前位置:   article > 正文

总结实操Pid速度环出问题时的解决步骤与原理_pid速度环位置环控制实现原理

pid速度环位置环控制实现原理

目录

前言

问题

步骤

1、 检查定时器中断和PWM周期的参数配置

2、 在新的定时器配置下重新调整速度环Pid参数值

2.1 P、I、D各参数值的作用 

2.2 先调P值

2.3 再调I值

2.4 最后调D值

调车的其他收获


前言

1、本教程涉及的问题是基于我这篇文章

【手把手带你用pid算法控制电机】——(2)PID速度环的代码的实操,但是思考问题的思路完全可以推广到不同代码中,因为速度环原理是同一个,只不过是代码不一样罢了。

2、今天又在调一个比赛循迹的Pid,调完以后才发现我之前调出来的pid是错的(我今天发现我实际上两个定时器的配置和我的教程不一样,并且我今天改成我教程那样的配置以后,现象还是不正常),尽管能够循迹,但是小车摆动得很厉害,我开始没有意识到不正常;直到我今天看到车循迹得很不稳,抖得厉害,再用手尝试阻止轮子转动,稍微给点力轮子就不转了,我当时就想:“这哪是Pid啊!”,其实我上次调出来得pid通过vofa显示得曲线还挺正常,就是有点抖,但是vofa上反映得挺正常的,我就没管了。今天发现,同一个电机,第一次没有调对pid的话,使用久了以后,会越来越差,所以pid一定要会调,要调对,调好!

3、本教程所谈到的曲线均是将电机速度的测量值和目标值两值反映到软件VOFA上去的曲线。

问题

照我的文章配置好3个定时器的参数,并且移植好代码后,可能电机的转动情况反映出到vofa中的曲线不正常,例如是较大的波浪形,亦或者是电机转起来一卡一卡,这都是属于移植好Pid后不正常的现象,正常的是移植好代码以后,电机可以转的正常,只不过是速度实际值与目标值有差距,而曲线的波动应该是不大的;只要是与此现象相悖,那都是不正常的现象,不同电机适用的值是不同的。解决思路如下几种:

步骤

1、 检查定时器中断和PWM周期的参数配置

这是我那篇文章配置的PWM和定时器中断参数,周期分别位1ms和10ms。

 今天用一样的配置和电机,出来的现象是轮子运行有点抖,只要轮子转的速度大小差距太大都是不正常的,所以我就开始找解决的问题,不用想,肯定要改定时器的配置,我这里改了PWM的配置以后就好了,没有改中断时间的配置

新的PWM的配置改成了:72,100;周期为0.0001s=0.1ms,原来周期是1ms

2、 在新的定时器配置下重新调整速度环Pid参数值

我调出来的参数为:
float Velocity_KP=10,Velocity_KI=0.0005,Velocity_KD=0.001; //速度PID系数

这个要以实际为主,下面教大家怎么调。

Question:为什么参数值要以实际为主,受实际情况影响:(很重要,敲重点)

Answer:(1)因为不同的PWM周期配置与定时器中断的配置会使每次中断获取到的脉冲值不一样,每次中断获取到的脉冲值与PWM值是两个不同的东西:脉冲值有正有负,电机正转时,脉冲值为正,反转时为负,脉冲值只受PWM值和定时器中断时间的影响;而PWM值只能是正数,通过改变控制电机的两个引脚高低电平来决定电机正反转,PWM值的大小会影响每次中断采集到的脉冲值的大小,电机正反转会影响脉冲值的正负;PWM值的大小与脉冲值的大小有一个正相关的关系,PWM值越大,每次中断采集到的脉冲值也会更大,因为转得更快嘛,反之,同理,例如:PWM=4000,每次采集到得脉冲值是60,那当PWM给到5000时,采集到得脉冲值可能就是75左右(按3/2的倍数粗略估计)。

(2)驱动电机的是PWM值,而不是电机值,所以要达到脉冲值为60的速度,要给电机6000的PWM,P的作用在我们的这一句代码就很好理解了:

Moto = Incremental_PI(encoder_counter,Target_Velocity);

encoder_counter是实际的脉冲值,反映的是实际速度值,Target_Velocity是目标速度值,Moto是最后要输入给电机的值;一般我们先在不用PID算法的情况下给电机一个PWM值,去观察中断每次采集到的脉冲值为多大,例如给PWM=4000,采集到的脉冲值为60,所以你心里就有数了,你的Target_Velocity可以先给60这个值,P给值为1,因为是由速度环算法算出来的Moto给到电机,从数值的大小来看encoder_counter与Moto 本来就有一个倍数关系,Moto 可能要比encoder_counter大很多倍,也可能就是几倍,要看情况。P先给1,去看看PID算法的效果,由算出来如果电机不转就加大P值,直到电机转起来,那么中断就可以采集到脉冲值了,假设采集到的脉冲值是40,离目标值60还有一段距离,那么你可以再增大一点P值,使实际值再靠近60一点点,大概到50左右,这时候,P值就调完了。接下来开始调I值,同样先给值为1,看看实际值有没有朝60靠近,慢慢增大I值,同时观察曲线积分效果明不明显,如果实际值积分效果明显(就是实际值一直在增大,还会超过目标值),那么I值就不能再大了,可以先将其调小,如果积分效果不明显了,就不用给D值了,如果还有积分现象明显,就给D值为1,去压制积分效果,最后把P、I、D各值调整到一个合适的大小,是实际值响应速度快、大小准确、震荡现象小并且抗干扰能力强,比如这种样子。 

(3)PID各参数整定完毕以后,建议大家要去找出PID速度环的速度目标值的可行区域;因为整定参数值时是以一个目标值去整定出来的参数,可能换成其他目标值就不准确了,但是很多情况都是一个目标值整定出来的参数值非常适合PWM满值以内的所有速度值,但是也有例外的情况,以防万一大家要去测出固定速度环各参数值下,速度目标值的可行区域。

怎么测呢:

例如:用目标值为60整定出来的速度环参数,我们可以先把目标值改为40,看看实际值还能不能贴合目标值;再把目标值改为80,观察实际值的情况,以此类推,目标值改为10、20、30、100,120...都测试一下;如果这些目标值下,我们的实际值都可以去贴合不同目标值,那么我们要测出满值PWM下,对应的脉冲值就是我们速度目标值的最大值;如果满值PWM下,速度环依然完美运行,实际值可以贴近目标值,那我们的可行区域就包括了我们PWM的所有值,如果实际值与目标值贴合不是很好(当然这种情况很少),我们要对应找出可行区域,不可行的速度目标值,我们在比赛或者项目里面尽量避免使用,当然出现此情况的原因大概率是你的PID参数还没整定好,可以换一个目标值重新整定一次PID参数,再来测出对应的可行区域。

2.1 P、I、D各参数值的作用 

P:比例环直接作用在偏差上,一般不可或缺,一般占PID控制器的主要输出部分根据输出预估比例环参数量级,按保守参数逐渐增大比例环参数KP。

I:积分项是偏差在时间维度上的累积效应,有响应时间。对于抑制静差有良好的作用,比较容易引起震荡,对于一般系统来说积分项参数与比例环参数有一定的比例关系,根据系统上升时间,静差,阶跃响应不断调整。

D:微分项是反应当前控制目标的变化率,对于“未来”的变化有一定的预测作用。根据系统的响应决定是否增加微分项,微分项一般作用是增加系统阻尼,抑制震荡。

2.2 先调P值

 先把P值先给为1,观察测量值与目标值的差距,根据差距大小逐渐增大P值,直到测量值比较靠近目标值但未到目标值时,P值给定。

2.3 再调I值

I值一般都比较小,作用是通过用I值来弥补测量值与目标值静差,不过I值稍微过大,测量值就会随着积分的作用,慢慢超过目标值,所以I值不能过大,重要的是测量值的曲线一定要平缓。

2.4 最后调D值

根据测量值的曲线决定是否需要给D值,如果效果已经比较好了:测量值接近目标值,曲线平缓且电机有一定的抵抗阻力作用;就不用给D值了,若曲线震荡还比较严重,则需要D值的作用。

调车的其他收获

 1、光感循迹的各路况条件在写程序的时候,一定要注意仔细检查,不要重复一个判断条件,不然车跑着跑着也许会“癫狂”。

2、PID一定要调好,调好的效果是车走起来很平稳,看起来很舒服,不会有较大的左右摆动。

3、PID调参时是给定一个目标值来调参的,现实中,PID效果好,且整个系统不出错,循迹的速度目标值只能是在此值上下一定范围内,我称之为目标速度值可行范围;例如调参时目标值是20,那么速度目标值可以赋值到10—40(实测知:速度目标值往上多取,还没测试出错误,但是取到一个电机的目标值取到6的话,电机会不按此值来转动,它直接反转了,所以速度目标值不能过小,此原因有可能还是我pid没有完全调好的原因,以后深入研究有了新发现,再分享出来,目前是觉得速度目标取值有一个可行范围,小于此范围,电机不按pid控制运转

4、中断里不要有延时函数,按键扫描中也不要有延时函数。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/929609
推荐阅读
相关标签
  

闽ICP备14008679号