智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 8347|回复: 27
打印 上一主题 下一主题

PID控制经验,回复别人问题时不小心写的,觉得有必要以自己名义发帖

    [复制链接]

3

主题

170

帖子

1

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
13366
威望
10461
贡献
2555
兑换币
649
注册时间
2012-8-25
在线时间
175 小时
跳转到指定楼层
1#
发表于 2015-3-17 10:59:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 淡定戈 于 2015-3-17 11:12 编辑

   在回复别人问题时不小心写了这么多,觉得有必要以自己名义发帖.
   PID控制很简单,但初学者可能比较晕.
   控制转向一般用位置式PD(也有用PID的,建议不用I), 控制速度一般用增量式PI(也可以加D). 注意别忘了限制最大最小输出!!!

参数设置要根据具体对象而定. 一般原则如下:
这里先假设系统参数如下:
   输入数据(如温度值,速度,代表被控对象的指标)范围[InMin,InMax] = [0,1]
   输出数据范围[OutMin,OutMin] = [-1,1]
   控制周期dt=1ms
   系统时间常数为T=3s

---------------------------------------------------------------------------------------------------------
对于位置式PD,  OutVal = P*(InNew-InSet) + D*(InNew-InOld);
参数调节:
   1. 一般先调P, 初次设参数时, 估计单独的"P*(InMax-InMin)"能使输出达到最大. 此处建议初始值P = (OutMax-OutMin)/(InMax-InMin). 然后修改参数P已达到一个较好效果, 很可能达不到要求, 调到效果无法明显改善为止.
   2. 接着调D, 先注意InOld很可能不是上一次采集的值, 可能是10次甚至20次前的值(视情况而定), 以削弱随机误差的影响.  若采用上面的计算式, D一般设置成P的好几倍, 初始设定, 可设置成3P.
   最后, 修改轮流修改PD参数,调到效果无法明显改善为止.
   PS:一般经过几次修改后, 再改参数效果就不明显, 这种情况,可能的原因有两种:   1. 参数改的幅度太小.   2. 确实到极限了,这就需要从其他方面想办法.

---------------------------------------------------------------------------------------------------------
对于增量式PI,  这种方式一般用于控制大滞后的系统(如速度/温度控制), OutVal += P*(InNew-InOld) + I*(InNew-InSet) ;
注意:
   1. P后面乘的是偏差的微分(差分), I后面乘的是偏差, 这是因为这个方程本质上是实现积分(累加)功能,  偏差的微分(差分)经过积分(累加)后就是偏差(对应参数P), 而偏差经过积分(累加)后就对应I.
   2. 后续代码记得限制OutVal∈[OutMin,OutMax]
   3. 此处的InOld一般是上一次采集的数据,不必是多次前的, 用多次之前的数据反而会降低系统的实时性, 因为理论上积分可以削弱随机误差的影响.  然而控制系统实际情况难以完全用理论概括, 具体实现视情况而定!!!
参数调节:
   1. 先调I参数,  关于初始值的设置, 一般I*(InMax-InMin)能使OutVal在T内达到最大值(T为被控对象的时间常数). 则初始值可设置为I=(OutMax-OutMin)/(InMax-InMin)*dt/T=[1-(-1)]/(1-0) * 0.001/3=0.00066666666666667!
   2. 接着P参数, 类似位置式P, 初始值P=(OutMax-OutMin)/(InMax-InMin).
   最后就是以PI参数为基础, 进行调节, 而调节的各种技巧, 实在是太多, 总之一句话 "好看的就是好的".  另外调参数还得看具体指标.
   注意:对于飞思卡尔竞赛速度控制宁愿反应稍慢,也别冒险产生震荡, 震荡(即便看起来不明显)会减小车轮的摩擦力, 进而减小弯道速度.



X, 不小心写了这么多, 以上仅代表个人经验&观点, 如有雷同纯属巧合!!!


补充内容 (2015-3-18 15:23):
有朋友说我PID参数符号反了.
我确实忘了说符号问题, 对于一般的控制系统(能用PID控制的系统一般可用这个原则),举例说下:
如果OutVal(如PWM)增大会使InNew(如电机转速)增大,则P<0,因为这样一来才能形成负反馈.

补充内容 (2015-3-18 15:26):
InNew(测速)增大->P*(InNew-InSet)减小->OutVal(如PWM)减小->InNew(测速)减小
测量值得增大,通过控制后,有减小的效果.
回复

使用道具 举报

24

主题

1090

帖子

0

精华

常驻嘉宾

不会做车,只会瞎BB的毕业考研狗

Rank: 8Rank: 8

积分
5429

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

QQ
威望
3088
贡献
663
兑换币
2343
注册时间
2012-11-4
在线时间
839 小时
毕业学校
河北联合大学
推荐
发表于 2015-3-18 11:22:51 | 只看该作者
OutVal = P*(InNew-InSet) + D*(InNew-InOld);输出反了吧?OutVal = P*(InSet-InNew) + D*(E-E‘);
回复 支持 1 反对 0

使用道具 举报

162

主题

2048

帖子

5

精华

超级版主

岳麓山没有车神

Rank: 10Rank: 10Rank: 10

积分
14920

论坛元老奖章优秀会员奖章活跃会员奖章论坛骨干奖章在线王奖章优秀版主奖章资源大师奖章

QQ
威望
6285
贡献
5963
兑换币
2581
注册时间
2013-11-14
在线时间
1336 小时
3#
发表于 2015-3-17 11:18:24 | 只看该作者
单就盲调来讲,还是不错哒
回复 支持 反对

使用道具 举报

19

主题

171

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2786
威望
1410
贡献
766
兑换币
880
注册时间
2013-12-25
在线时间
305 小时
4#
发表于 2015-3-17 11:18:58 | 只看该作者
:lol:lol
回复 支持 反对

使用道具 举报

49

主题

848

帖子

1

精华

知名人物

说和做是两码事

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
32825

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章资源大师奖章

威望
29437
贡献
1934
兑换币
1870
注册时间
2013-12-10
在线时间
727 小时
5#
发表于 2015-3-17 11:56:00 | 只看该作者
我之前控制周期调得不好。。。结果一直调不出来
回复 支持 反对

使用道具 举报

19

主题

2430

帖子

0

精华

跨届大侠

这并没有什么卵用.

Rank: 10Rank: 10Rank: 10

积分
6595

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

威望
3611
贡献
1592
兑换币
1425
注册时间
2014-7-14
在线时间
696 小时
6#
发表于 2015-3-17 12:29:49 | 只看该作者
赞            
回复 支持 反对

使用道具 举报

5

主题

60

帖子

0

精华

高级会员

Rank: 4

积分
722
威望
348
贡献
220
兑换币
210
注册时间
2014-9-4
在线时间
77 小时
毕业学校
甲子中学
7#
发表于 2015-3-17 16:01:01 | 只看该作者
玩意Tc 发表于 2015-3-17 11:56
我之前控制周期调得不好。。。结果一直调不出来

请问你之前是调直立的pid吗?换了控制周期之后变好了是怎么换控制周期的?

回复 支持 反对

使用道具 举报

49

主题

848

帖子

1

精华

知名人物

说和做是两码事

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
32825

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章资源大师奖章

威望
29437
贡献
1934
兑换币
1870
注册时间
2013-12-10
在线时间
727 小时
8#
发表于 2015-3-17 16:16:12 | 只看该作者
冷技 发表于 2015-3-17 16:01
请问你之前是调直立的pid吗?换了控制周期之后变好了是怎么换控制周期的?

不是 我只是闭环而已
回复 支持 反对

使用道具 举报

3

主题

170

帖子

1

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
13366
威望
10461
贡献
2555
兑换币
649
注册时间
2012-8-25
在线时间
175 小时
9#
 楼主| 发表于 2015-3-17 17:18:18 | 只看该作者
冷技 发表于 2015-3-17 16:01
请问你之前是调直立的pid吗?换了控制周期之后变好了是怎么换控制周期的?

呵呵 这不是直立控制的PID, 直立控制PID可参考, 哥的论文   http://www.znczz.com/forum.php?mod=viewthread&tid=215037&fromuid=105521

回复 支持 反对

使用道具 举报

3

主题

170

帖子

1

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
13366
威望
10461
贡献
2555
兑换币
649
注册时间
2012-8-25
在线时间
175 小时
10#
 楼主| 发表于 2015-3-18 15:09:49 | 只看该作者
旋风麦林 发表于 2015-3-18 11:22
OutVal = P*(InNew-InSet) + D*(InNew-InOld);输出反了吧?OutVal = P*(InSet-InNew) + D*(E-E‘);

哦 my God,  我是没注意符号
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-10-1 01:28 , Processed in 0.054182 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表