杰出人士
- 积分
- 13438
- 威望
- 10521
- 贡献
- 2567
- 兑换币
- 649
- 注册时间
- 2012-8-25
- 在线时间
- 175 小时
|
本帖最后由 淡定戈 于 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(测速)减小
测量值得增大,通过控制后,有减小的效果. |
|