打印
[国产单片机]

闲谈PID控制

[复制链接]
8829|46
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
McuPlayer|  楼主 | 2012-9-10 09:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 McuPlayer 于 2012-9-16 18:14 编辑

最近我在做一个项目中有PID控制,就搜了些网上的**,来学习。
发现网上的**,很多公式都是错误的,有的居然连位置式和增量式都故意搞了很多区别,甚至影响控制性能。
我虽是自动化专业,但做这方面很少,于是抱着学习的想法,说说自己的认识,也和大家交流下。


PID的所谓位置式和增量式的,从控制算法上看,没有本质区别。
Out[k] = Out[k-1] + delta;
delta = P*E+I*ξE+D*de
如果看输出的Out值,就是位置式的,如果看delta就是增量式的。

实际应用中有又位置式和增量式,
有的执行有**特性,就是增量式的,如步进电机
有的执行机构,没有**性,就是位置式的,如加热


这个是我鼓捣出来的一个PID仿真程序,以电加热为仿真模型。
PID_Sim.rar (97.85 KB)

相关帖子

沙发
McuPlayer|  楼主 | 2012-9-10 09:16 | 只看该作者
本帖最后由 McuPlayer 于 2012-9-10 09:20 编辑

P = kp * e(n);
I = Ki *( e(n) + e(n-1) + e(n-2) );
D = Kd * ( e(n)-e(n-1) );

P比较简单,不再赘述
I是积分项,对应几个离散误差累计,根据需要而定,误差的累计个数本质是积分周期的体现
D是微分项,一般使用最近2次的误差之差,也有使用e(n) - e(n-2)的情况

PID = P + I + D;
输出控制信号 U(n) = U(n-1) + PID;

使用特权

评论回复
板凳
McuPlayer|  楼主 | 2012-9-10 09:16 | 只看该作者
本帖最后由 McuPlayer 于 2012-9-12 09:37 编辑

PID的变种

标准PID可能无法实现满意的控制,此时就要变种,比如模糊控制。

最简单的模糊控制,是分段式的,每一段使用不同的PID参数。

有人的加热控制,在初始阶段只是用比例环节,以提高响应速度,到离目标温度较近时再采用PID三个环节一起上,本质上也是分段PID,就是低温段Ki和Kd的值为0

但简单的分段式,对于变化较大的系统,有时仍不能满足需要,这时可以用PID动态整定
关于PID整定的话题,我们后面讨论,这里先说下动态整定。
在温度控制中,对PID的参数,进行动态调整,相当于一个控制cycle中有几千几万次的整定。这样可以随时使用最佳的PID参数,毕竟整个cycle整定出来的PID参数不一定适合于所有的控制阶段。

使用特权

评论回复
地板
McuPlayer|  楼主 | 2012-9-10 09:17 | 只看该作者
本帖最后由 McuPlayer 于 2012-9-16 18:12 编辑

     

上面2个图是炉温控制系统的仿真
仔细看一下,这2张图的区别,PID参数的Ki做了改变。
有个有趣的现象,积分环节越大,震荡的幅度越大,收敛得越慢。

在加热温度控制系统中,积分环节的增大不但无法加快收敛,反而会有想反的效果。
实际应用中,很多人遇到了此问题,很多人采用变种PID解决掉了,但追究问题的来源。

加热系统是个单向温度控制系统,也就是只能主动加热,而降温只能靠被动散热。
加热的升温是很快的,而自然散热就很慢了,否则锅炉的热效率不太低了。
所以加热的温控系统,在温度稳定后,误差也基本是正误差,而非负误差。
看上面的2张图,后面的阻尼振荡的收敛过程,是不是基本在设定温度上方摆动。

细心的你应该发现了,好像温度的超调几乎是无可避免的。
没错,我是故意把这个问题暴露出来的。
实际的控制系统中,也经常有这个现象,而这来源于一个加热热量的传递过程,还有温度测量传感器的反应速度。
这个测试的是纯粹的PID计算,无法避免超调就很正常了。

当我们找到了问题的源头,解决起来就好办多了。


PID之所以变种,是因为它不满足需求了。
如果找到了PID无法控制系统于指定的稳定范围的根源,PID变种的方法选择自然就明确了。

使用特权

评论回复
5
McuPlayer|  楼主 | 2012-9-10 09:17 | 只看该作者
本帖最后由 McuPlayer 于 2012-9-19 09:05 编辑

PID最简单的变种----分段式PID
   

上面加热过程中,使用P环节,会产生过冲,但静态误差达到要求,使用PD环节不过冲了,但静态误差却不达标了,
这时候,就可以考虑使用分段来切换PID参数。

我们在加热升温过程,使用PD环节,温度保持过程使用P环节
在仿真软件的LUA脚本框中增加修改PID参数的代码
function do_pid ( sv, pv )
        e3 = e2
        e2 = e1
        e1 = e0
        e0 = sv - pv

        if(e0>0.1) then
                kp = 1
                ki = 0
                kd = 20
        else
                kp = 10
                ki = 0
                kd = 0
        end

        pid = kp * e0
        pid = pid + ki * (e0 + e1 + e2 + e3)
        pid = pid + kd * (e0 - e1)
        out = out + pid
        if(out<0)        then out=0        end
        if(out>1)        then out=1        end

        return out
end

使用特权

评论回复
6
McuPlayer|  楼主 | 2012-9-10 09:17 | 只看该作者
-2F

使用特权

评论回复
7
McuPlayer|  楼主 | 2012-9-10 09:18 | 只看该作者
占楼结束
PID是非常常用的控制算法,算法简单,理论少,实用。
希望丢个砖头,能引来玉石,欢迎讨论

使用特权

评论回复
8
zhongfushun| | 2012-9-10 21:52 | 只看该作者
初学PID的人看过

使用特权

评论回复
9
杜专| | 2012-9-10 22:57 | 只看该作者
也发现过问题..

使用特权

评论回复
10
谈的元| | 2012-9-10 23:29 | 只看该作者
记号,PID

使用特权

评论回复
11
Cortex-M0| | 2012-9-11 02:15 | 只看该作者
PID说简单可以搞的很简单,说复杂也可以弄的很复杂,因人而异,因产品而异。

使用特权

评论回复
12
飞言走笔| | 2012-9-11 08:23 | 只看该作者
mark下

使用特权

评论回复
13
福州观沧海| | 2012-9-11 08:47 | 只看该作者
实际应用中的PID控制往往不是经典算法,都是根据具体的控制对象和控制效果修正得来的。而且PID本身的控制算法还不是最难得,最难的地方在于参数自整定。

使用特权

评论回复
14
江枫渔火| | 2012-9-11 09:44 | 只看该作者
深~

使用特权

评论回复
15
McuPlayer|  楼主 | 2012-9-16 18:36 | 只看该作者
楼主位上传了我做的PID仿真小工具,可帮助认清PID的调整过程

使用特权

评论回复
16
shaky| | 2012-9-19 22:04 | 只看该作者
:P mark

使用特权

评论回复
17
mgf006| | 2012-10-11 09:39 | 只看该作者
不错。

使用特权

评论回复
18
hjl123| | 2012-10-13 11:41 | 只看该作者
mark

使用特权

评论回复
19
程序匠人| | 2012-10-17 22:21 | 只看该作者
今天才留意到这贴,应该补一条裤子!:)

使用特权

评论回复
20
yytpy2008| | 2012-10-20 17:01 | 只看该作者
mark!!!!!!那位大侠传授一下自整定的过程!!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:善待今天就是对未来最好的策划。 博客:http://www.mcuplayer.com

338

主题

7307

帖子

26

粉丝