打印

【申精】答网友问:加热系统的PID算法方案!

[复制链接]
11825|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
emailli|  楼主 | 2011-8-2 21:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
收到网友的邮件,让我分析以下 关于加热系统的 PID算法。这里初步给了一个方案,请各位参考参考,由于很久没有做PID这一方面的工作了,有错误难免存在!若有问题,欢迎批评指正。谢谢!
***************************************************求救邮件*******************************************
emailli你好,我在维库电子市场的一个关于pid的帖子里看到你对楼主的回复,表示了自己对pid的理解,我现在也越到了一个关于pid          计算结果输出值与需要控制的量之间对应关系的问题,想了很长时间了都没有想明白,希望你能够有时间帮我指点一下。谢谢……

       我要做的是用一个温度传感器采集水温,经过一个arm芯片(stm13)控制水温。水温要求是在30-60度之间随意设定,然后能在设定温度处保持,精度要求是上下一度。。。要求用pid算法进行处理,我看了一些pid的介绍,能够理解它的两种数字pid算法的推导公式。。我用采集到的真实温度与设定温度进行比较,得出误差e,这个误差经过pid算法之后,得出输出值out,然后再根据这个out值控制加热设备(现在的初步向想法是控制加热的占空比),但是我用了好几天也没有找出这个out的变化规律和e的变化规律之间有什么关系,也就是无法得出如何用out值去调节占空比。。。比如,当out是多大的时候给大的占空比加热,当out是多大的时候就应该停止加热。
      这个问题我现在已经想了很长时间了,但是还没有想出来,可能是我在哪个方面理解有问题,请你指教。。。谢谢。
--乾坤
******************************************求救邮件*******************************************
|
|

*********************************************答复方案****************************************
这个是PID公式:
U(k+1) = U(k) + ( KP*E(k) - KI*E(k-1) + KD*E(k-2) )
对你的系统而言,U(k)就是当前占空比。我这里先假定 你的占空比对应 定时器寄存器设置范围是 0-65535.同时假定 定时器设置为0的时候,
占空比输出为0%,全部是低电平,完全不加热。65535的时候,占空比输出100%,全速加热。
E(k)是当前温度和设定温度的误差值
E(k-1)是上次计算时的误差值
E(k-2)是上上次计算时的误差值


全文请移步:
http://blog.21ic.com/user1/3407/archives/2011/85193.html
评分
参与人数 1威望 +1 收起 理由
highgear + 1

相关帖子

沙发
highgear| | 2011-8-2 22:13 | 只看该作者
顶!

我本想也写一篇关于 PID 的帖子,也是用温度控制及直流电机控制,从建模到定点运算的程序。这段时间极其懒散,就没有动手制作。所以在此,狠狠地顶楼主。

使用特权

评论回复
板凳
原野之狼| | 2011-8-3 00:32 | 只看该作者
期待各位大师侃侃PID:lol

使用特权

评论回复
地板
123jj| | 2011-8-3 06:06 | 只看该作者
转贴之,方便阅读~~~

*********************************************答复方案****************************************

这个是PID公式:
U(k+1) = U(k) + ( KP*E(k) - KI*E(k-1) + KD*E(k-2) )

对你的系统而言,U(k)就是当前占空比。我这里先假定 你的占空比对应 定时器寄存器设置范围是 0-65535.同时假定 定时器设置为0的时候,

占空比输出为0%,全部是低电平,完全不加热。65535的时候,占空比输出100%,全速加热。

E(k)是当前温度和设定温度的误差值
E(k-1)是上次计算时的误差值
E(k-2)是上上次计算时的误差值



由于KP,KI,KD三个系数现在都不知道。需要整定,有自动整定,也有手动整定。我们先采取手动整定的方案。
我们现在可以知道温度相差40℃,显然,需要比较快速的加热。水温在正常系统使用的时候,显然是0-100℃的。
而你们这里需要目标温度是 30-60℃,故 最大加热的差值可以认为是 60-0 = 60。(假定不是冰,是水开始加热)。
我们可以认为,在需要最大加热差值的时候,仅用比例控制应当是开启全速加热。所以我们可以得到一个KP的估计值。
KP = 65535/60 = 1000左右。 这个意思是 最大温差对应最快加热速度。
然后,假设 KI = 800,KD = 300;
注意,系数需要根据实际情况来整定,此为假设。


好,现在假定设置 需要温度是 60℃,而当前温度是 20℃。那么可以知道

第一次
U(k) = 0              ---最开始是没有占空比输出的。所以是占空比是0
E(k) = 60-20 = 40     ---第一次的误差
E(k-1) = 0            ---还没有上次,所以初始化为0
E(k-2) = 0            ---还没有上上次,所以初始化为0

由于KP假定是1000,所以
U(k+1) = 40*1000 = 40000

所以,现在就可以按照 占空比 40000来加热了。

由于热系统是一个缓慢变化的系统,所以,加热需要一段时间才可以看到效果,假设采用固定间隔时间来设计。这里取5秒。

5秒过后,假定温度上升了5℃,当前温度为25℃。
则计算第二次 占空比过程。

第二次
U(k) = 40000
E(k) = 60-25 = 35
E(k-1) = 40
E(k-2) = 0

U(k+1) = 40000 + 35*1000 - 40*800 + 0 = 43000 (加热加速了)

又过了5秒,假定温度上升了6℃。当前温度为29℃
第三次
U(k) = 43000
E(k) = 60-31 = 29
E(k-1) = 35
E(k-2) = 40

U(k+1) = 43000 + 29*1000 - 35*800 + 40*300 = 56000 (2个周期以后还未达到指定温度,加热继续加速)

继续计算第四次,第五次,第N次 即可。

显然,要一直到出现超调,才会出现加热速度放慢甚至不加热。

若不允许超调,则需要增加一些门限控制。那就不在标准的PID讨论范围以内了。

以上是算法部分。



以下来讨论整定部分。

看系数是否合理,需要通过实验观察。

关于系数的整定,有一些工程的方法。你可以对自己的系统来摸索摸索。

整定的时候,先用整定比例系数。先不给积分,微分系数赋值,然后看加热速度有多快。这个快慢就主要看的是几个整定周期达到目标温度。

先不考虑超调的问题。

所以,你需要先对整个系统做实验,先看全速加热需要多久才可以把温度由 0℃ 加热到 60℃。

全速加热把温度从0℃加热到60℃所需要的时间设置为T,那么我们的整定周期就可以根据T来设置了。假设整定周期为 T/10。

(事实上,整定周期还可以根据偏差值来做动态调整,显然温度越接近目标值,整定周期就需要越短,非标PID不在继续深入,仅仅做一个简单提示)

然后以此来设置不同的KP比例系数,看KP设置为多少,可以接近 10个整定周期 达到同等加热速度,这样得到的KP就是一个比较合理的KP了。



然后再来看KI的整定,看KI设置成多少,可以让超调大约在根号2左右,也就是说 最大只有超调41%,这样得到的KI就是比较合理的。

当然,如果系统温度不允许超调41%,那就需要修改KI来实现了。




最后来整定KD,看KD设置成多少,可以让 最终稳定温度和设置温度的偏差 达到要求,比如偏差在 0.5℃以内。

这个就看你的需求了。


故,你的代码需要记录 整定的时候,PID算法运行的次数,以及每次整定的时候所得到的 温度偏差。通过串口发送出来做记录。

根据这些记录来选取合适的 KP,KI,KD。



以上介绍了 关于PID算法和整定的方案。总的思路应该是比较清晰的,实际应用的时候,需要根据自己的需求多做做修改。

使用特权

评论回复
5
程序匠人| | 2011-8-3 11:25 | 只看该作者
一般来说,不完整的帖子是不加精的。不过4楼已经把完整内容补齐了,鉴于此,给予加精。

使用特权

评论回复
6
yoyobluefish| | 2011-8-4 13:21 | 只看该作者
4楼的公式U(k+1) = U(k) + ( KP*E(k) - KI*E(k-1) + KD*E(k-2) )有点问题,PID公式是U(k) = U(k-1) +  {KP*[E(k)-E(k-1)] + KI*E(k) + KD*[E(k)+E(k-2)-2*E(k-1)]}整理一下是U(k) = U(k-1)+aE(k)-bE(k-1)+cE(k-2),其中,a=KP+KI+KD ,b=KP+2KD,c=KD;大家发现和4楼的公式差不多,有木有。调整a,b,c值也就是调整KP,KI,KD值,但还是不要混为一谈,毕竟KP,KI,KD通常都是分别代表比例项,积分项,微分项系数。后面整定的思路是根据KP,KI,KD的意义来整定的,而不是a,b,c,这也是不要混淆的原因。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
反质子 + 1
7
emailli|  楼主 | 2011-8-4 14:12 | 只看该作者
6楼说的对。 abc和KP,KI,KD不要混淆

我这里是针对 单片机系统做了 公式变形处理。不过做的时间有点久远,4年前整理的,前几天答网友问的时候,没有自己去看原始资料了,直接借用了以前博客整理的部分资料。

分析有点出入,不过经过这么多天的公示,应该思路是没有问题的了。

使用特权

评论回复
8
highgear| | 2011-8-4 21:33 | 只看该作者
本帖最后由 highgear 于 2011-8-4 21:37 编辑

顶。

我把 PID 的公式稍微解释一下:

时域标准的 PID 公式为:
        y(t) = Kp * e(t) + Ki * ∫(e(t))dt + Kd*d(e(t))/dt

把上面的标准公式转换为数字形式是,一般有两种主要形式

(1)   独立积分式,这种方法把积分器独立出来,
           i(t) = Ki * ∫(e(t))dt
          转换为:
           i(k) = i(k-1) + e(k)
最后把比例,积分,微分三个部分叠加在一起
        y(k) = Kp * e(k) + Ki * i(k) + Kd*(e(k) –e(k-1))

(2)   增量式
对标准的 PID 公式微分后,可得:
         dy = Kp * de + Ki*e + Kd*dde

离散化后得:
           dy(k) = y(k) – y(k-1) = Kp * (e(k) – e(k-1) +Ki*e(k) + Kd* (e(k) -2*e(k-1) +e(k-2))

即:

          dy(k) = y(k) – y(k-1) = (Kp + Ki + Kd) * e(k) +(-Kp -2*Kd)*e(k-1) + Kd*e(k-2)

独立积分式与增量式其实是一个公式,各自表述,没有本质的区别,我们可以从独立积分式导出增量式:
           y(k) = Kp * e(k) + Ki * i(k) + Kd*(e(k) –e(k-1))
           y(k-1) = Kp * e(k-1) + Ki * i(k-1) + Kd*(e(k-1) –e(k-2))

上述两个公式相减可得:
        dy(k) = y(k) – y(k-1) = (Kp + Ki + Kd) * e(k) +(-Kp -2*Kd)*e(k-1) + Kd*e(k-2)
      
从实际应用角度来看,独立积分式略微更简单些,因为没有 e(k-2) 项。



  

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Cortex-M0 + 1
9
mybao| | 2011-8-4 21:56 | 只看该作者
PID, 很棒的帖子

使用特权

评论回复
10
Cortex-M0| | 2011-8-5 04:59 | 只看该作者
highgear老师的好贴永远值得拜读!

使用特权

评论回复
11
fskjhm| | 2011-8-5 09:00 | 只看该作者
收下了,谢谢

使用特权

评论回复
12
tangweiwu| | 2011-8-9 00:26 | 只看该作者
xxx

使用特权

评论回复
13
阿柯VS小宝| | 2011-8-18 21:49 | 只看该作者
很不错,很有帮助,想学PID

使用特权

评论回复
14
lfjwfm| | 2011-8-18 23:09 | 只看该作者
清楚!

使用特权

评论回复
15
SoScared| | 2011-8-27 08:39 | 只看该作者
谢谢了,这几天正做温度PID,真是帮了很大忙啊

使用特权

评论回复
16
xuedeyumu| | 2011-8-28 15:21 | 只看该作者
把pid算法讲的最清楚的一帖了..

使用特权

评论回复
17
陈永宾0| | 2011-8-29 08:58 | 只看该作者
MARK

使用特权

评论回复
18
yewuyi| | 2011-8-29 09:03 | 只看该作者
弄PID最好的资料就是自动控制原理。

看明白原理,问题就解决了80%

使用特权

评论回复
19
lhh827337991| | 2011-8-29 18:33 | 只看该作者
我们经常用P积分微分不常用  感觉已经很不错了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

使用特权

评论回复
20
jy6715| | 2011-8-31 14:07 | 只看该作者
好帖

使用特权

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

本版积分规则

98

主题

1172

帖子

55

粉丝