PT100, 2分法, 查表, 根据电阻值计算温度。
float code RTD_TAB_PT100 = // 表格是以5度为一步,即-200, -195, - 190.....{
18.52,20.68,22.83,24.97,27.10,29.22,31.34,33.44,35.54,37.64, // -200 ~ -155 10
39.72,41.80,43.88,45.94,48.00,50.06,52.11,54.15,56.19,58.23, // -150 ~ -105
60.26,62.28,64.30,66.31,68.33,70.33,72.33,74.33,76.33,78.32, // -100 ~ -55
80.31,82.29,84.27,86.25,88.22,90.19,92.16,94.12,96.09,98.04, // -50 ~ -5
100.00,101.95,103.90,105.85,107.79,109.73,111.67,113.61,115.54,117.47, // 0 ~ 45
119.40,121.32,123.24,125.16,127.08,128.99,130.90,132.80,134.71,136.61, // 50~ 95
138.51,140.40,142.29,144.18,146.07,147.95,149.83,151.71,153.58,155.46, // 100 ~ 145
157.33,159.19,161.05,162.91,164.77,166.63,168.48,170.33,172.17,174.02, // 150 ~ 195
175.86,177.69,179.53,181.36,183.19,185.01,186.84,188.66,190.47,192.29, // 200 ~ 245
194.10,195.91,197.71,199.51,201.31,203.11,204.90,206.70,208.48,210.27, // 250 ~ 295
212.05,213.83,215.61,217.38,219.15,220.92,222.68,224.45,226.21,227.96, // 300 ~ 345
229.72,231.47,233.21,234.96,236.70,238.44,240.18,241.91,243.64,245.37, // 350 ~ 395
247.09,248.81,250.53,252.25,253.96,255.67,257.38,259.08,260.78,262.48, // 400 ~ 445
264.18,265.87,267.56,269.25,270.93,272.61,274.29,275.97,277.64,279.31, // 450 ~ 495
280.98,282.64,284.30,285.96,287.62,289.27,290.92,292.56,294.21,295.85, // 500 ~ 545
297.49,299.12,300.75,302.38,304.01,305.63,307.25,308.87,310.49,312.10, // 550 ~ 595
313.71,315.31,316.92,318.52,320.12,321.71,323.30,324.89,326.48,328.06, // 600 ~ 645
329.64,331.22,332.79,334.36,335.93,337.50,339.06,340.62,342.18,343.73, // 650 ~ 695
345.28,346.83,348.38,349.92,351.46,353.00,354.53,356.06,357.59,359.12, // 700 ~ 745
360.64,362.16,363.67,365.19,366.70,368.21,369.71,371.21,372.71,374.21, // 750 ~ 795
375.70,377.19,378.68,380.17,381.65,383.13,384.60,386.08,387.55,389.02, // 800 ~ 845
390.48 // 850
};
/***********************************************************************
*FunName: float CalculateTemperature(float fR)
*
*In: fR -> PT100的电阻值。
*
*Out: fTem -> 测得的温度值。
*
*Discription: 将电阻值查表算出温度值。
*
*Notes: 采用2分查找法。
*
************************************************************************/
float CalculateTemperature(float fR)
{
float fTem;
float fLowRValue;
float fHighRValue;
int iTem;
uchar i;
uchar cLimite = 0xFF;
uchar cBottom, cTop;
if (fR < RTD_TAB_PT100) // 电阻值小于表格最小值,低于量程下限。
{
return BELOW_LOW_LIMITE;
}
if (fR > RTD_TAB_PT100) // 电阻值大于表格最大值,超出量程上限。
{
return EXCESS_UP_LIMITE;
}
cBottom = 0;
cTop = 210;
for (i=105; (cTop-cBottom)!=1; ) // 2分法查表。
{
if (fR < RTD_TAB_PT100)
{
cTop = i;
i = (cTop + cBottom) / 2;
}
else if (fR > RTD_TAB_PT100)
{
cBottom = i;
i = (cTop + cBottom) / 2;
}
else
{
iTem = (uint)i * 5 - 200;
fTem = (float)iTem;
return fTem;
}
}
iTem = (uint)i * 5 - 200;
fLowRValue= RTD_TAB_PT100;
fHighRValue = RTD_TAB_PT100;
fTem = ( ((fR - fLowRValue)*5) / (fHighRValue - fLowRValue) ) + iTem; // 表格是以5度为一步的。
// 两点内插进行运算。
return fTem;
}
经过测试,没有问题!
欢迎大家讨论! 点击此处下载 ourdev_564031RYADIW.pdf(文件大小:272K) (原文件名:PT100温度变送器的正温度系数补偿1.pdf)
附带一份资料。 收藏下! Mark! mark 学习 好野。记住先! mark mark 先记住再说 还可以优化 学习 mark! 好棒呀。。。 记下 标记这 顶一个,不容易啊。
这个是不是很耗资源。
要求不高的情况下,可以按不同的温度的区间段来进行线性处理,还是可以的。 mark iTem = (uint)i * 5 - 200;
这个是啥意思。我没有想明白,但是结果是OK的。这个算法不错,精度很高。
哦,想了一会,明白了,楼主很高明。在此谢谢了。 mark mark iTem = (uint)i * 5 - 200;
没明白 呵呵,我明天好好研究一下。我也要搞这个!先谢谢! mark mark mark 谁有经验的话用matlib拟合个公式更好 能否上张硬件(热电偶)接线图?电阻值是AD得到的? 参考一下!我原来也想过这套办法!但是没有实施!后来还是一边用锅煮着水,一边拿着温度表和PT100一块测温,读出值以后再建一张温度表!搞得现在测得的温度有时高几度,有时低几度! 收藏,另请问精度能达到多少? MARK 记号 mark mark!~ mark cool ! 记号 mark 标记 mark TP100 mark! 不错不错,嘿嘿 把表格放大100倍效率不是更高嘛,精度也损失的不大 不错! 不错! mark mark!! 回复【楼主位】lidongliping
-----------------------------------------------------------------------
问题倒可能没有,程序大得吓人,用浮点数建表,太恐怖了吧。5度一个表格,根本犯不着,PT100线性度很好的。 回复【47楼】wzxmcu
问题倒可能没有,程序大得吓人,用浮点数建表,太恐怖了吧。5度一个表格,根本犯不着,PT100线性度很好的。
-----------------------------------------------------------------------
呵呵,表格+查表函数一共要1.8K的样子,在通用的51内核单片机上。
我主要是想把思路表达清楚,如果系统有限制,可采用【42楼】 electricit 建议的,放大100位,用uint型数据建表。
当然还有其它一些方法,欢迎大家贴出来,一起讨论。
回复【21楼】gaohq
iTem = (uint)i * 5 - 200;
没明白
-----------------------------------------------------------------------
iTem = (uint)i * 5 - 200; // i * 5因为温度表每步为5度,-200是因为表从-200度开始建立的,如果从0度建表就不需要减 减200了。
回复【29楼】worldly_guest
收藏,另请问精度能达到多少?
-----------------------------------------------------------------------
这种算法的精度应该可以与
RT = R0(1 + AT + BT² + C(T-100)T³)
其中:
A = 3.9083 E-3
B = -5.775 E-7
C = -4.183 E-12 (低于0°C时)或0 (高于0°C时)。
得出的结果相比较,看看情况。
当然,这只是算法的误差, 具体系统的误差要看电路、PCB、ADC、参考源等等。。。。
回复【26楼】ssaweee
能否上张硬件(热电偶)接线图?电阻值是AD得到的?
-----------------------------------------------------------------------
接线图网上有很多,两线、三线、四线都可以。
电阻值是ADC采集到了,对PT100提供一个恒流就可以算出来。
本人进入这个行业不久,是新手,学到了一点东西,感觉对于准备入门的朋友们应该有用,就贴出来,分享一下。
也期待有经验的朋友,能贴出一些自己的想法和经验,大家相互交流,学习!
元旦将至,提前祝大家新年快乐,生活幸福! :) 找到一份资料,与前面上传的有些类似,可能好理解些。
高精度测试PT100的方法ourdev_608039C0MZ6P.pdf(文件大小:152K) (原文件名:高精度测量PT100的方法.pdf) 点击此处下载 ourdev_608055ENRTU1.rar(文件大小:399K) (原文件名:pt100query.rar)
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_608056F7XBQ2.jpg
(原文件名:未命名1.jpg)
Borland C++Builder 6精度不错 http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4482173&bbs_page_no=1&search_mode=3&search_text=wwwjjjwww&bbs_id=9999
我用VB做的电阻和温度互换。与楼上的估计是一个算法。呵呵。 mark mark 学习学习! mark!! mark mark 好东西,学习了。 呵呵~PT100做过的飘过~顶一下楼主 mark pt100 mark pt100 学习 不错 mark mark PT100,Mark 顶 mark mark dddddddddddddddd 正学习。记下 收了,感谢分享 很不错,mark一下 不错,不错 没看懂 先标记慢慢学习 mark MARK 做湿度控制用过 mark mark mark mark mark 研究中...... mark 学习再学习 学习,谢谢!!! MarK!! 收藏一下,嘿嘿…… 强帖,记号。 用过PT100的飘过~ mark 好办法.有机会搭个电路试一下! 新手,刚好用到,谢了! MARK mark,强人 谢谢楼主!! 记号 收藏 请问有没有电路原理图啊?