专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
pid算法是根据什么写的 怎么应用他来控制pwm输出,有没高手弄过,请教来了
2020-01-26 12:50
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
9523
92
92
最近刚要学pwm控制输出的,求教各位大侠
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
92条回答
yao1
2020-01-29 17:47
转:
答网友问:加热系统的PID算法方案!
手心 发表于 2011-8-2 13:04:00
2
推荐收到网友的邮件,让我分析以下 关于加热系统的 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)是上上次计算时的误差值
由于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算法和整定的方案。总的思路应该是比较清晰的,实际应用的时候,需要根据自己的需求多做做修改。
加载中...
查看其它92个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
答网友问:加热系统的PID算法方案!
手心 发表于 2011-8-2 13:04:00
2
推荐收到网友的邮件,让我分析以下 关于加热系统的 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)是上上次计算时的误差值
由于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算法和整定的方案。总的思路应该是比较清晰的,实际应用的时候,需要根据自己的需求多做做修改。
一周热门 更多>