xppx1987 发表于 2013-5-31 15:32:38

顶一个,楼主牛啊!学习了!

Hz01800475 发表于 2013-6-25 11:10:44

所以对于技术人员重要的是思想,而不是一切照搬知其然而不知其所以然……

wazhiyi 发表于 2013-6-25 11:46:50

持续关注

xml2028 发表于 2013-6-25 11:52:14


顶一个,楼主牛啊!学习了!

himan 发表于 2013-8-19 23:09:07

好帖子永远是指路明灯

hewayking 发表于 2013-8-23 21:55:21

哥想问一句是怎么区分 我采用的是什么类型的偶头呢
哥想问一句是怎么区分 我采用的是什么类型的偶头呢
哥想问一句是怎么区分 我采用的是什么类型的偶头呢

hewayking 发表于 2013-8-23 21:58:08

哥想问一句是怎么区分 采用的是什么类型的偶头呢    随便接上自动辨别吗??

EysTech 发表于 2013-9-5 10:13:55

MARK            

guzhongqi 发表于 2013-9-5 11:23:02

怎么没有更新完呢?
自整定可以做到不超调吗?

slayer_ni 发表于 2013-9-12 23:13:09

dingyige!!顶一个!!!!

song77 发表于 2013-9-13 08:34:04

hewayking 发表于 2013-8-23 21:58 static/image/common/back.gif
哥想问一句是怎么区分 采用的是什么类型的偶头呢    随便接上自动辨别吗?? ...

在显示操作界面有相应的菜单项选择,目前做不到自动辨识。

song77 发表于 2013-9-13 08:38:48

经典PID算法对单一的控制对象来说,如果调整P值 I值 D值这三个参数,是可以控制的好,在实际使用的过程中,外界干扰及设定值的变动,控制效果会变差。以上个人愚见,做过的人应该是深有体会。

chenshichao541 发表于 2013-9-14 11:52:44

好定西。。。。。。。。。。。。。

199003326 发表于 2013-9-14 21:00:25

好贴,记号一个,以后用得上。

fiaanull 发表于 2013-9-15 09:46:42

mark下!有意义!{:lol:}

气球 发表于 2013-9-15 10:08:40

{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}

szmini2006 发表于 2013-9-15 10:13:01

MARK      

wildcat7261 发表于 2014-3-2 14:32:49

学习了   

tangcangeng 发表于 2014-6-2 19:37:35

ddg_int 发表于 2010-10-20 14:19
要控制温度设置的是120摄氏度。1200即温度为120.0度

楼主你好 看了您的帖子 我自己分析并写了PID恒温控制程序 但是已经调试了一个月了 很不理想 看了网上很多帖子 搞了很多个不眠夜 就是解决不了问题 能否帮帮我一下 我把程序和原理图贴出来 可否帮我分析一下问题出现在哪里?在这里先万分感谢先了 因为我已经快穷途末路不知道找谁帮助了 谢谢了~如果可以你加我为坛里好友吧 我的积分太少加不了你~

tangcangeng 发表于 2014-6-2 19:38:21

坐等楼主您的回复了~~

tangcangeng 发表于 2014-6-3 08:09:58

楼主 在的时候请加我一下交流一下 谢谢了 ~

ddg_int 发表于 2014-6-3 12:43:26

tangcangeng 发表于 2014-6-2 19:37
楼主你好 看了您的帖子 我自己分析并写了PID恒温控制程序 但是已经调试了一个月了 很不理想 看了网上很多 ...

调了一个月还没有弄好是不是要从硬件上来考虑问题了?

tangcangeng 发表于 2014-6-3 13:36:50

本帖最后由 tangcangeng 于 2014-6-3 13:43 编辑

ddg_int 发表于 2014-6-3 12:43
调了一个月还没有弄好是不是要从硬件上来考虑问题了?

楼主你好以为这个帖子是多年前的了 没想到还有回音 实在感谢 硬件应该没什么问题就一个由单片机来控制光耦触发双向可控硅驱动加热器电路,我感觉会不会是我计算完成后的u(k)对控制被控对象进行控制出了问题呢?我的PID输出控制思想是这样子的---->PID输出u(K)对被控对象是这样子控制的:PID采样周期为2S,温度实时检测, 采用过零检测触发单片机的外部中断对可控硅进行导通控制,每个交流半波的周期是10mS,因此2S中有200个交流半波,PID计算结果u(K)等于多少就让这一个PID周期2S中的200个半波导通多少个,比如u(K)=10则在2S中的200个半波中导通10个半波,其他190个半波不导通。,请楼主往我这个求助帖子看看谢谢你了~   
http://www.amobbs.com/home.php?mod=space&do=notice&view=mypost

tangcangeng 发表于 2014-6-3 14:10:40

ddg_int 发表于 2014-6-3 12:43
调了一个月还没有弄好是不是要从硬件上来考虑问题了?

楼主你好能否发一段您当年对被控对象进行控制的那段程序给我看看,就是如何用PID计算后的输出u(K)对可控硅进行控制的那段程序代码? 我看下会不会是我的控制思想转换为程序这个环节出错了~~在这里谢谢你先了~

ddg_int 发表于 2014-6-3 14:27:15

tangcangeng 发表于 2014-6-3 13:36
楼主你好以为这个帖子是多年前的了 没想到还有回音 实在感谢 硬件应该没什么问题就一个由单片机来控 ...

PID计算结果u(K)等于多少就让这一个PID周期2S中的200个半波导通多少个,比如u(K)=10则在2S中的200个半波中导通10个半波,其他190个半波不导通。

看你的调试等幅振荡的实验图表,你可以在计算出的结果再乘以一个幅度进行控制,现在 uk = 10, 2s内导通10个半波,190个不导通
可以改为 uk = 10, 2s内导通10*pararm个波形 200-10*pararm 个不导通,pararm = 0.5-1.5调整参数pararm,看能不能调试出等幅振荡

tangcangeng 发表于 2014-6-3 14:35:06

ddg_int 发表于 2014-6-3 14:27
PID计算结果u(K)等于多少就让这一个PID周期2S中的200个半波导通多少个,比如u(K)=10则在2S中的200个半波 ...

谢谢您的回复 我仔细推敲您的建议 然后修改我的代码再试试 衷心感谢你{:smile:}

tangcangeng 发表于 2014-6-3 15:34:56

ddg_int 发表于 2014-6-3 14:27
PID计算结果u(K)等于多少就让这一个PID周期2S中的200个半波导通多少个,比如u(K)=10则在2S中的200个半波 ...

你好 不知道我的PID程序是对的吗? 是我自己写的 尤其是里头的抗积分饱和那段我心里没底~~

tangcangeng 发表于 2014-6-3 15:59:59

ddg_int 发表于 2014-6-3 14:27
PID计算结果u(K)等于多少就让这一个PID周期2S中的200个半波导通多少个,比如u(K)=10则在2S中的200个半波 ...

楼主你好 又得打扰你了 实在不好意思您说的0.5-1.5 的param估计超过1的不大可能,因为我是2S钟为PID采样周期,220V的正弦交流半波是每10mS出现一个,2S钟就是200个半波周期,如果超过1的话,如果u(K)是190的话乘以1.1不是等于209超过输出上限了吗? 我不清楚楼主的用意 但是我有点疑惑 实在不好意思啊这样子怀疑请多多包涵不过我还是要试一下 谢谢您提供的思路另外我的PID位置式子是自己写的程序 有点没有底 尤其是积分抗饱和那一段 能否有请楼主有空的时候帮我看看是否正确~谢谢你先了{:smile:}

emobbs 发表于 2014-6-3 16:13:26

顶一把再说

ddg_int 发表于 2014-6-4 12:16:49

tangcangeng 发表于 2014-6-3 15:59
楼主你好 又得打扰你了 实在不好意思您说的0.5-1.5 的param估计超过1的不大可能,因为我是2S钟为PID采 ...

总共200个波形不变化。只是导通个数变化,比如pararm为1.1,那么原来是导通10个波形就改变为导通10*1.1=11个波形,不导通的就是200-11 = 189个。
上面其实已经写得很清楚了,我不知道你怎么得到190*param这个结果的。。我写的是 导通 10*param 不导通 200 - 10*param
还有积分抗饱和部分代码如果没有把握,可以先注释。以前我也是按照你那样做实验,在没有积分抗饱和代码时候,也是能够调试出pid参数的。
其中的param参数主要是为了调整你的加热的功率。因为你的pid输出可能和功率的对应关系不正确导致调试pid参数的时候总得不到等幅振荡波形。
还有进行等幅振荡的时候应该只有比例参数起作用,其他两个参数都应该屏蔽的,不知道你是否这样做的。

tangcangeng 发表于 2014-6-4 13:52:22

ddg_int 发表于 2014-6-4 12:16
总共200个波形不变化。只是导通个数变化,比如pararm为1.1,那么原来是导通10个波形就改变为导通10*1.1=1 ...

你好首先谢谢你的回复----进行等幅振荡的时候应该只有比例参数起作用,其他两个参数都应该屏蔽的,不知道你是否这样做的。 我是这样子做的 这个做法是尼克尔斯-齐格勒法提出的剩下就差按照您的说法再反复试验了衷心谢谢你的回复

雨中的风铃 发表于 2014-6-5 11:59:54

谢谢分享!!!!!!!!!!!!!!

millwood0 发表于 2014-6-5 19:29:29

The approximation for type J thermocouple is not correct.

ddg_int 发表于 2014-6-6 16:03:54

millwood0 发表于 2014-6-5 19:29
The approximation for type J thermocouple is not correct.

153楼有新的更新拟合方程参数,你说的是153楼的那些参数不对么?

kobe1217241530 发表于 2014-6-6 16:22:53

MARK 一下

enovo2468 发表于 2014-6-6 16:26:34

这个是弄温度巡检仪的吗?

millwood0 发表于 2014-6-6 19:21:23

你说的是153楼的那些参数不对么?

Both approximations are massively wrong for Type J: At the lower end, it is off by over 70 degrees; at the top end, it is off by over 1300 degrees.

You really should check yours against the NIST polynomial to be sure.

Try this instead:


//mv^5->mv^4 ... -> mv -> C
9.92407667E-07,        -1.52553786E-04,        8.30102173E-03,        -2.20102636E-01,        2.06555388E+01,        -2.92300096E+00

It is off mostly 3 - 4c over the range. At the lower end, it is off by 20c and at the high end, off by 9c.

I would also rewrite your code so that all the coefficients for one type of thermocouple are in one array. That way, if some of the arrays are not used, the linker may be able to drop them from the compiled hex file. With your approach, all the data is linked in if just one thermocouple is used.

ddg_int 发表于 2014-6-8 00:39:36

本帖最后由 ddg_int 于 2014-6-8 00:45 编辑

millwood0 发表于 2014-6-6 19:21
Both approximations are massively wrong for Type J: At the lower end, it is off by over 70 degrees ...

你说的差距这么大肯定是你使用这些参数有错误。
本来这些参数都是已经用于产品上验证过的,确认是可行的。
但是为了确认帖子中的数据正确性,附件是我根据153楼的参数写的一个测试程序,可以检测J型热电偶的拟合效果。
整体上误差都是在+-2.0摄氏度左右。没有你说的那么离谱。
你可以下载附件试试,或者看看源码,看看我有没有弄错。
里面有个屏幕截图是我自己用这个软件的测试结果。结果证明我的拟合函数比你给出的那个拟合参数性能要好的

millwood0 发表于 2014-6-8 04:33:08

Over the whole range, the root mean square error (RMSE) of my polynomial is 3.0C and yours is 10.2C.

Here is a chart of errors over the entire temperature range for type J thermocouple: The red curve (error-5) is the error (vs. NIST 9th-order polynomial) from my 5th-order polynomial. The black curve (error-amo) is the error your approximation produced.

I will also point out, as it is obvious from the chart, that the average error over the entire temperature range is 0.00C for my polynomial and 2.67C for your polynomial - ie. yourpolynomial has a positive bias - a big no-no for any approximation.

millwood0 发表于 2014-6-8 04:36:38

To just clarify, "error" here is defined as fitted temperature (using my polynomial or ddg_int's polynomial, as it may be) - true temperature (per NIST type J table).

So a positive error means our polynomial over-estimated the temperature and a negative error means our polynomial under-estimated the temperature.

ddg_int 发表于 2014-6-8 10:33:48

本帖最后由 ddg_int 于 2014-6-8 10:39 编辑

millwood0 发表于 2014-6-8 04:36
To just clarify, "error" here is defined as fitted temperature (using my polynomial or ddg_int's pol ...

我的热电偶分度表是09年从中国自动化仪器仪表网上下载的。
刚刚对比了一下,跟NIST上的分度表的确有一点不一样,所以拟合出来的曲线如果用NIST里面的标准电动势去测试会发现误差变大。
由于目前早就不再从事电子开发,所以电脑上也没有matlab等拟合环境了。不能发出最新的拟合结果,实在不好意思。目前拟合的确应该以NIST的标准重做才更加准确。

最新NIST的分度表可以在这里找到:
http://www.tkyb.com/fdb.htm

millwood0 发表于 2014-6-8 21:53:08

Not a problem.

You can also speed up the polynomial calculation significantly. Yours requires 20 floating point multiplications and 6 additions. It can be simplified to 5 multiplications and 6 additions. For a slow mcu, that's a lot.

tangcangeng 发表于 2014-6-9 08:50:08

ddg_int 发表于 2014-6-4 12:16
总共200个波形不变化。只是导通个数变化,比如pararm为1.1,那么原来是导通10个波形就改变为导通10*1.1=1 ...

你好还得打扰你一下 实在抱歉 我的190是这样子的 就是比如u(K)的计算结果是190 的话 那么按道理2S的PID周期中 应该导通190个半波如果乘以一个参数1.1 那不是190*1.1=209了吗? 原先最大输出定义为2S中200个半波,超出后是否限幅为200这样子处理就可以了呢?按照你的乘以一个参数的说法??

ddg_int 发表于 2014-6-9 09:47:42

tangcangeng 发表于 2014-6-9 08:50
你好还得打扰你一下 实在抱歉 我的190是这样子的 就是比如u(K)的计算结果是190 的话 那么按道理2S的PID ...

对的,超过了就限定为最大就ok了。如果大于200,就设置为200就好了。你还没调试出等幅振荡?

tangcangeng 发表于 2014-6-9 10:13:41

ddg_int 发表于 2014-6-9 09:47
对的,超过了就限定为最大就ok了。如果大于200,就设置为200就好了。你还没调试出等幅振荡? ...

楼主你好 除了内心发出的感谢外 还说声对不起了还得让您担心有没有调出振荡的问题哎~实在不才你的建议我还没有试我后来又改进了中断触发程序的写法 把光耦触发可控硅的死区也考虑进去了 然后再重新用ZN整定法发现当仅仅是比例从较小值到Kp=11.5时 效果好像已经可以满意了 超调量和精度好像都还可以了 尤其是精度 已经达到了最高70.5度 最低68.5度附近波动了,下面是MATLAB绘图图形,可是当我继续加大Kp后振荡是剧烈了 超调也上去了 就是还是死活都调不出有等幅振荡或者至少接近等幅振荡的效果 请看Kp=29图片~~ 我怀疑是不是我的采样周期调的太小了 因为1斤重的铁块好像散热也挺慢的~导致振荡很难出现~~   现在就差看看是否能根据楼主的意见乘以一个参数进去看看效果了~   最后末了 说声谢谢

tangcangeng 发表于 2014-6-12 15:30:13

你好 由于我无法调出等幅振荡周期曲线,因此只能靠手调,下面是两幅最终效果图以便对比,个人觉得单纯P的效果比较好第一幅是纯P图片 第二幅是加入I 和D的图片 超调量一样 但是调节时间纯P环节比较好 但是加入I和D后稳定点好像

moxue10 发表于 2014-6-13 17:01:27

mark                                                   

pdd083051 发表于 2014-6-13 19:19:54

mark有空仔细观摩一下,感谢LZ的无私分享

am_shui9jing 发表于 2014-7-2 17:51:30

mark,pt100拟合

am_shui9jing 发表于 2014-8-11 23:56:04

mark,拟合

loyal248 发表于 2014-8-12 08:18:52

看一看,,以后有时间学一下

toptrying 发表于 2014-8-12 08:41:40

学习,谢谢楼主

ddz123abcdef 发表于 2014-8-12 09:42:19

两年前DIY了个白光烙铁,转换温度的算法没弄这么高精度,是ADC*49/70,没测温的,不知误差有多大,也没PID的,显示的温度在+-30度左右;变化很快.
最近弄了个PID函数进去,显示的温度在+-1度左右吧,变化不太快,但输出的占空比,变化太大,总觉得公式有问题.
公式1:输出=P*本次误差+I*(误差和)+D*位置;误差和为把每次误累加>300就改为120;位置为当前占比;
公式2:输出=P*本次误差+I*(上次误差-本次误差)+D*(本次误差-2*上上次误差+上次误差);
输出占空比=把输出限位为0~100,没用公式,只判断的;

看了楼主的详细讲解,发现那些都得改了...

am_shui9jing 发表于 2014-8-14 00:15:36

mark,很详细的温控资料

TNTHUAHUA 发表于 2014-8-15 12:39:27

PT100满足不了要求,正在用热电偶感谢LZ分享

TNTHUAHUA 发表于 2014-8-18 12:32:22

我也想试试,正在学习PID控制

仰望无垠 发表于 2014-8-21 19:43:48

先收藏了

夜尽天明 发表于 2014-9-1 16:30:18

tangcangeng 发表于 2014-6-2 19:37
楼主你好 看了您的帖子 我自己分析并写了PID恒温控制程序 但是已经调试了一个月了 很不理想 看了网上很多 ...

你控制什么温度

夜尽天明 发表于 2014-9-1 16:33:11

前几天温控产品,本来准备用PID控制的,结果光一个比例控制就搞定了,温度很稳定。

tangcangeng 发表于 2014-9-2 10:27:31

夜尽天明 发表于 2014-9-1 16:33
前几天温控产品,本来准备用PID控制的,结果光一个比例控制就搞定了,温度很稳定。 ...

光比例可以搞定很多温度调节的,但是光比例会有个静态误差的,如果符合技术指标做到光比例即可

Hjun88 发表于 2014-10-16 10:17:40

PID调温没有过冲,楼主太牛了   好帖

wuliwb 发表于 2014-11-8 22:48:46

这个帖子必须得看!

c2937655 发表于 2014-11-9 03:42:40

很优的資料~備份一下~

linquan315 发表于 2014-11-17 15:17:17

不错,我用惯性的方式调试了一下,正打算用上,谢谢楼主。

nxc 发表于 2015-1-21 00:59:41

PID,MARK

毛毛 发表于 2016-10-31 23:09:40

楼主,你上面说过零触发是一秒钟触发一次?不是一秒有100次过零触发吗?另外,PID输出0~999和你把可控硅控制输出为0~50,PID输出是怎样转为可控硅输出的?是按SSR=pid_out*50/999?

efree 发表于 2016-11-3 14:35:55

这是好资料。顶。。。

thyewfty 发表于 2017-1-5 18:06:02

谢谢分响

chinaboy25 发表于 2017-1-6 13:16:07

ddg_int 发表于 2010-10-21 13:38
为了验证pid参数自整定的方程是不是对的,而且pid自整定也不可能一蹴而就,所以我先让系统工作在继电状态( ...

我也是这么想的还没写出来,楼主的这个程序测试的如何呢?

efree 发表于 2017-1-10 15:51:12

竟然有这么好的资料,学习一下,谢谢。

zhangguanghui82 发表于 2017-3-2 15:30:11

mark!!!

wzbwzb 发表于 2017-9-24 16:31:42

这个贴子好,我一直在找热电偶开发的事情

holdkcsxym 发表于 2017-9-24 19:29:33

还是专用的芯片好吧,不过计算方法还是要点赞。

wjb444 发表于 2017-9-24 23:17:47

实用贴!!!!

zhangzif 发表于 2018-1-3 12:55:14


这个很好

jiang887786 发表于 2018-3-16 12:42:16

楼主威武!!!!!

cxbing007 发表于 2018-7-11 16:29:30

mark,热电偶

569350810 发表于 2019-6-9 01:10:01

标记,谢谢楼主分享。

zhaoyuanxian 发表于 2019-6-9 07:59:04

学习学习

569350810 发表于 2019-7-14 01:08:13

谢谢楼主分享

fengyunyu 发表于 2021-6-26 07:03:32

pid整定,详细

涵潇舒雅 发表于 2021-11-19 18:09:22

float TCRTD(float res,unsigned char type)
/*热电偶与热电偶温度转换函数,输入:res(热电偶电压:单位mv或者热点阻电阻值:单位欧姆),type(输入0-9分别对应KJRSBETNPt100Cu50,10对应B型热电偶小于600摄氏度的方程),输出:当前温度;*/
{
      return (TC_Atab*res*res*res*res*res+TC_Btab*res*res*res*res+TC_Ctab*res*res*res+TC_Dtab*res*res+TC_Etab*res+TC_Ftab);
}
      
float TCt_v(float t,unsigned char type)
//热电偶的冷端补偿方程,输入为t(热电偶冷端温度),type(输入0-7分别对应热电偶KJRSBETN)
{
      return (TCt_vA*t*t+TCt_vB*t+TCt_vC);
}

咨询下这个冷端补偿过程
1.先通过NTC获得冷端环境温度,带入float TCt_v(float t,unsigned char type) 函数便可得到此温度对应的电压值 Vt

2.热电偶压差V = 热电偶测量值+Vt;然后将V带入float TCRTD(float res,unsigned char type) 函数便可以得到真实的温度?

不知以上过程理解的是否争取?

evgstar 发表于 2023-2-15 14:07:58

真是很不错

190805562sky 发表于 2023-2-21 16:38:26

PID标记学习
页: 1 2 [3]
查看完整版本: K,J,R,S,B,E,T,N型热电偶,PT100,cu50热电阻拟合参数方程,以及冷端补偿方程,及其pid参数