搜索
bottom↓
回复: 106

关于PT100用查表法还是计算法的讨论

[复制链接]

出0入0汤圆

发表于 2007-11-23 22:09:47 | 显示全部楼层 |阅读模式
pt100 温度传感器
其温度与电阻非绝对线性,一般都是通过查表法,但是查表法对于编程来说比较麻烦!
----测得一个值,去表中一一对照,而且大多数情况不会找到完全相同的值,
那么有只好去一一比较哪个值比较接近!

其实我看了 表中的数据,并且将数据绘制在一张图形里,看到也并非毫无规则
(类似于一个圆拱型)。所以想必有一个函数可以非常接近于此图形:



(函数逼近 这类高深的数学方法偶是不会了^_^)
不过用了个《丽景函数分析作图器 2.1》 粗略的看了一下应该有个圆函数比较能贴近这个图形
具体哪个方程我没做出来!!!

在这里把图形、表格、软件 都放上来,哪位数学好的给办个忙!

软件:  点击此处下载ourdev_182603.rar(文件大小:1.26M)


统计表:点击此处打开ourdev_182604.xls(文件大小:64K)



彩色曲线为温度数据值分布线   红色为参考直线

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2007-11-23 22:17:58 | 显示全部楼层
搞了这么多,不知道是不是已经有比较接近的计算公式了!!!

   汗!.....上google搜会先!

出10入120汤圆

发表于 2007-11-23 22:53:24 | 显示全部楼层
一般来说,通过温度计算电阻比较容易一些,所以采用查表比较方便~

出0入0汤圆

 楼主| 发表于 2007-11-26 13:58:34 | 显示全部楼层
算了半天 终于得到一个公式:
X²+Y²-7491.546X+18949.8Y-1905179.465=0




是一个圆的标准方程, X为温度  Y为电阻值。

  我自己抽取了几组算了一下,还是比较接近的!

  有兴趣的朋友帮忙验算一下

   (如果可行以后就用不着在程序里查表、比较验算了)

  若没有问题,以后我再将 解方程的C代码放上来

出0入0汤圆

 楼主| 发表于 2007-12-1 19:56:19 | 显示全部楼层
开根号函数:
unsigned int sqrt_16(unsigned long M)
{
    unsigned int N, i;
    unsigned long tmp, ttp;   // 结果、循环计数
    if (M == 0)               // 被开方数,开方结果也为0
        return 0;

    N = 0;

    tmp = (M >> 30);          // 获取最高位:B[m-1]
    M <<= 2;
    if (tmp > 1)              // 最高位为1
    {
        N ++;                 // 结果当前位为1,否则为默认的0
        tmp -= N;
    }

    for (i=15; i>0; i--)      // 求剩余的15位
    {
        N <<= 1;              // 左移一位

        tmp <<= 2;
        tmp += (M >> 30);     // 假设

        ttp = N;
        ttp = (ttp<<1)+1;

        M <<= 2;
        if (tmp >= ttp)       // 假设成立
        {
            tmp -= ttp;
            N ++;
        }

    }

    return N;
}



/*  算术平方根--圆方程求温度
zhi=0.4215686*hige;
zhi2=zhi*zhi+(zhi*18949.8)-1905179.465;
zhi2=56123321.4-4*zhi2;
zhi2=sqrt_16(zhi2);
zhi=(7491.55-zhi2)/2;
if (zhi<0) zhi=(7491.55+zhi2)/2;        */

出0入0汤圆

发表于 2007-12-5 21:00:28 | 显示全部楼层
你没有感到头大,我都被你给你闹晕了.
像你这样的问题,其实可以采用一分段计算的方法,精度也可以做得很高.就是将曲线分成若干段,每段获得一条一定斜率的直线.然后,在程序里用一个SWITCH结构,很简单地就解决了.

出0入0汤圆

发表于 2007-12-6 13:30:16 | 显示全部楼层
我觉得分段计算和编程会好些

出0入0汤圆

发表于 2007-12-15 16:59:30 | 显示全部楼层
同意五楼,最好的办法是分段线性插值.别把简单的问题复杂化.下面的程序中用的是at2热敏电阻.

flash TempAdj  TEMP_ADJ[66] =
{
{274 ,   0},{283 ,  10},{292 ,  20},{301 ,  30},{310 ,  40},{319 ,  50},
{328 ,  60},{337 ,  70},{347 ,  80},{356 ,  90},{366 , 100},{375 , 110},
{385 , 120},{395 , 130},{405 , 140},{414 , 150},{424 , 160},{434 , 170},
{444 , 180},{453 , 190},{463 , 200},{473 , 210},{483 , 220},{492 , 230},
{502 , 240},{512 , 250},{521 , 260},{531 , 270},{540 , 280},{549 , 290},
{559 , 300},{568 , 310},{577 , 320},{586 , 330},{595 , 340},{604 , 350},
{613 , 360},{621 , 370},{630 , 380},{638 , 390},{646 , 400},{655 , 410},
{663 , 420},{671 , 430},{679 , 440},{686 , 450},{694 , 460},{701 , 470},
{708 , 480},{716 , 490},{723 , 500},{730 , 510},{736 , 520},{743 , 530},
{750 , 540},{756 , 550},{762 , 560},{768 , 570},{774 , 580},{780 , 590},
{786 , 600},{792 , 610},{797 , 620},{803 , 630},{808 , 640},{813 , 650}
};
unsigned int temp_adjust(unsigned int t)
{         
    unsigned int index;
    unsigned int seg;
    unsigned int rtn;
    if(t < 274)  //0度时t=274
    {
        t = 274;
    }else if( t > 800) //65度时t=813
    {
        t = 800;
    }
    index = (t-274)/8;//(813-274)/66=8.17大致求出指针范围
    if(index > 65) //限制指针范围index = 65指最后一项
    {
        index = 65;
    }
    do{
        if(t >= TEMP_ADJ[index].value && t <= TEMP_ADJ[index+1].value)
        {
            break;
        }else if(t < TEMP_ADJ[index].value)
        {   
            if(index >0 )
            {
                index--;
                continue;
            }else{
                break;
            }
        }else if(t > TEMP_ADJ[index+1].value)
        {
            if(index < 65 )
            {
                index++;
                continue;
            }else{
                break;
            }
        }
    }while(1);
    seg = TEMP_ADJ[index+1].value - TEMP_ADJ[index].value;
    if(seg > 20 || seg == 0)
    {
        return TEMP_ADJ[index].temp;
    }else{
        rtn = TEMP_ADJ[index].temp + ((t-TEMP_ADJ[index].value)*10)/seg;
    }
    return rtn;
}

出0入0汤圆

发表于 2007-12-24 16:34:12 | 显示全部楼层
我敢肯定,查表来得更快、更简单!

出0入0汤圆

发表于 2009-5-13 08:56:39 | 显示全部楼层
此问题比较好。我也赞同分段计算。

出0入93汤圆

发表于 2009-5-13 09:04:24 | 显示全部楼层
肯定查表来的快,不过建表麻烦很多。分段线性要比方程精度高。10度一条直线好像最大偏差在0.1度左右。如果用函数四次甚至五次都不一定有这么高的精度。

出0入0汤圆

发表于 2009-5-13 10:41:42 | 显示全部楼层
To LZ
铂电阻温度计的阻值/温度曲线有专门的公式,根本不需要自己去拟合的。。。直接上网搜索一下就行了。
如果能保证铂电阻没有应力,品质有保证,测量方法对,铂电阻是可以达到很高的精度的,好像是mK的数量级。

不过那个函数比较复杂,一般应用用分段线性插值就足够了。。。

具体的文档需要找找。
等找到后,可以贴出来。来源在BIPM的网站,ITS-90温标的复现。英文的,比较麻烦。

出0入0汤圆

发表于 2009-5-13 11:35:04 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-5-23 11:17:06 | 显示全部楼层
记号,正好要用到这个

出0入0汤圆

发表于 2009-5-30 00:17:11 | 显示全部楼层
作为一个用过PT100的我说一句,本来我也打算用分段线性处理的,但是后来发现不用分段效果也很好,不信楼主你可以试一下!!不好再分段~~

出0入0汤圆

发表于 2009-5-30 00:27:39 | 显示全部楼层
PT100不是已經用到爛的東西?當然是查表+內差。
在單晶片上用浮點四則運算滿奢侈的。

更低價的話,ADI有元件直接幫你做完。連算都不用算。

出0入0汤圆

发表于 2009-5-30 09:23:12 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-5-30 21:19:58 | 显示全部楼层
我喜欢拟合算法,写的时候简单

出0入0汤圆

发表于 2009-6-25 17:12:02 | 显示全部楼层
下载----软件时 卡巴 报有木马程序 Backdoor.Win32.Way.2002.c        文件: F:\PT100\ourdev_182603.rar/丽景函数分析作图器 2.1\丽景函数分析作图器 V2.1 Keygen.exe//PE_Patch//UPX

出0入0汤圆

发表于 2009-6-25 17:37:55 | 显示全部楼层
正好用到

出0入0汤圆

发表于 2009-11-4 11:32:43 | 显示全部楼层
pt100
mark

出0入0汤圆

发表于 2009-11-8 17:21:17 | 显示全部楼层
怎么我见公司的人把PT100当成线性的来用的,汗。。。。。。

出0入0汤圆

发表于 2010-1-25 15:06:11 | 显示全部楼层
MARK!

出0入0汤圆

发表于 2010-1-25 15:12:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-25 15:54:26 | 显示全部楼层
数值分析要学好啊。。。

出0入0汤圆

发表于 2010-1-28 18:26:06 | 显示全部楼层
PT100

出0入0汤圆

发表于 2010-1-28 21:03:53 | 显示全部楼层
网上有现成的拟合公式,而且单片机一般都用查表法,简单快速

出0入0汤圆

发表于 2010-1-28 21:28:26 | 显示全部楼层
找个温度间距小的表,小范围在采用线性计算法,大范围用查表法框定,最终精度也是非常高的,何必非要搞那个什么计算公式,工程应用又不是你搞音响发烧,况且你那个计算法还不一定有查表兼计算的准确!搞什么神秘

出0入0汤圆

发表于 2010-1-28 22:29:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-28 22:43:42 | 显示全部楼层
楼主有没有看过普通物理、普通物理实验一类的课程?对测量方法、精度、拟合、插值等有说明,这种情况用查表插值是最好的了,想提高精度,可以用高次插值,搞拟合效果反而不好。

出0入0汤圆

发表于 2010-1-28 23:49:35 | 显示全部楼层
LZ,查表插值是最快的了,用2分查表,在你还没计算完一浮点就查好了

出0入0汤圆

发表于 2010-1-29 09:58:56 | 显示全部楼层
http://www.seedge.com/?p=83
我很久以前写的,有高次拟合公式,还有C写的数据表生成程序

出0入0汤圆

发表于 2010-1-31 09:15:21 | 显示全部楼层
flash TempAdj  TEMP_ADJ[66]

这个看不懂!

出0入0汤圆

发表于 2010-1-31 09:15:21 | 显示全部楼层
flash TempAdj  TEMP_ADJ[66]

这个看不懂!

出0入0汤圆

发表于 2010-2-4 15:32:18 | 显示全部楼层
回复【33楼】zhcool_521
flash TempAdj  TEMP_ADJ[66]
这个看不懂!
-----------------------------------------------------------------------

我的理解是,这个表的程序,存储在FLASH中存储器中。只读。

出0入0汤圆

发表于 2010-2-5 00:12:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-2-5 23:49:46 | 显示全部楼层
都是用线型化电路来处理的,查表麻烦了

出0入0汤圆

发表于 2010-2-6 08:50:24 | 显示全部楼层
MAK

出0入0汤圆

发表于 2010-5-20 21:19:29 | 显示全部楼层
mark~~~~~~~~~~~`

出0入0汤圆

发表于 2010-5-21 00:48:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-21 08:54:41 | 显示全部楼层
呵呵,或许能用到,顶下

出0入0汤圆

发表于 2010-5-21 09:22:34 | 显示全部楼层
直接找张表,用matlab拟合,一般三阶方程就很准确了,想再精确点就用更高阶的。
给一个我之前做过的电路

测量电路:

(原文件名:111.JPG)

-30C---110C
140个点的matlab拟合函数

ydata=[-30:110];
rdata=[116.8,110.8,105.2,99.83,94.81,90.07,85.59,81.37,77.37,73.60,70.03,66.66,63.47,60.45,57.60,54.89,52.33,49.90,47.60,45.42,43.35,41.38,39.52,37.75,36.07,34.48,32.96,31.52,30.16,28.85,27.62,26.44,25.32,24.25,23.23,22.27,21.34,20.46,19.63,18.83,18.07,17.34,16.65,15.98,15.35,14.75,14.17,13.62,13.09,12.59,12.11,11.65,11.21,10.79,10.39,10.00,9.631,9.277,8.938,8.613,8.302,8.004,7.718,7.444,7.180,6.928,6.683,6.454,6.230,6.016,5.810,5.613,5.423,5.240,5.065,4.897,4.734,4.578,4.429,4.284,4.145,4.012,3.883,3.759,3.640,3.525,3.415,3.308,3.205,3.106,3.011,2.919,2.830,2.744,2.662,2.582,2.505,2.431,2.359,2.290,2.223,2.158,2.096,2.036,1.978,1.921,1.867,1.814,1.764,1.714,1.667,1.621,1.576,1.533,1.492,1.451,1.412,1.374,1.338,1.302,1.268,1.235,1.203,1.171,1.141,1.112,1.083,1.056,1.029,1.003,0.9777,0.9533,0.9296,0.9066,0.8843,0.8626,0.8416,0.8212,0.8014,0.7821,0.7634];
xdata=5*rdata./(4.21+rdata);
a=polyfit(xdata,ydata,3)
y=polyval(a,xdata);
plot(xdata,ydata,xdata,y);


只做了三阶拟合,但是拟合出来的曲线已经很好了

(原文件名:222.JPG)


得到参数之后就可以很方便的写个转换函数了

/******************电压温度转换子程序******************/
//功能:实现将AD转换得到的电压值转换成为温度值;
//类型要求:传入数据与返回值都为float类型;
float tempchange(float adc)
{
       float ctemp,v;
           v=adc/255*5;
       ctemp=-2.5514*v*v*v+21.3556*v*v-81.7976*v+159.7719;
           if(ctemp>40)ctemp+=3;
       return ctemp;
}

如果嫌精度不够,可以加到五阶方程,就已经很精确了~

出0入0汤圆

发表于 2010-5-21 09:38:11 | 显示全部楼层
拟合对单片机来说计算工作量比较大

出0入0汤圆

发表于 2010-5-21 09:42:28 | 显示全部楼层
对精度要求不是非常高的情况下(正负0.5度)用三阶够了,这个时候不算太慢
我用PIC单片机,对两个传感器采样,分别采样十次取平均,然后两者再平均(进行传感器出错自检),再得出结果,中间还加了N个判断,倒是没多大问题~
其他的运算量比较大的情况下可以专门用一块单片机处理温度。。。这样精度和速度都能得到保证

出0入0汤圆

发表于 2010-9-3 17:47:54 | 显示全部楼层
我也来学习学习

出0入0汤圆

发表于 2010-9-3 22:59:54 | 显示全部楼层
学习了。

出0入0汤圆

发表于 2010-9-5 22:37:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-5 23:35:37 | 显示全部楼层
思路都不错

出0入0汤圆

发表于 2010-9-6 11:59:32 | 显示全部楼层
折半查找法

出0入0汤圆

发表于 2010-9-6 12:16:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-9 16:06:28 | 显示全部楼层
怎么这么复杂呢。。。

(原文件名:未命名.jpg)
从公式反推,解方程,不复杂吧。。。

出0入0汤圆

发表于 2010-9-9 17:12:28 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-9-13 22:36:51 | 显示全部楼层
小弟有2个问题请教,
1、所有的100欧铂电阻都是PT100吗?随便拿个表就可以用吗?(那个100欧铂电阻是粘在一个模块上的,没有详细资料)
2、我的测量要精确到0.1度.PT100可否实现呢?

谢过

出0入84汤圆

发表于 2010-9-13 23:04:45 | 显示全部楼层
0.01度都能做,何况你的0.1度呢

出0入0汤圆

发表于 2010-9-13 23:05:19 | 显示全部楼层
回复【52楼】Swordman
小弟有2个问题请教,
1、所有的100欧铂电阻都是pt100吗?随便拿个表就可以用吗?(那个100欧铂电阻是粘在一个模块上的,没有详细资料)
2、我的测量要精确到0.1度.pt100可否实现呢?
谢过
-----------------------------------------------------------------------

0.1度应该可以实现
每个不同厂家的参数都不尽相同,所以最好还是由厂家提供温阻表,或者直接拿实物测量,然后拟合~

出0入0汤圆

发表于 2010-9-14 15:40:34 | 显示全部楼层
回复楼上两位,

我的PT100是1/3B级的,应该是比A级的还要高的。

但是DATASHEET精度那一栏上面都写了+/-(0.1+0.0017|t|). 本身就已经有0.1的误差了,那不是没法测得了么?

出0入0汤圆

发表于 2010-9-17 12:54:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-12 09:50:41 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2010-10-12 10:07:19 | 显示全部楼层
matlab 曲线拟合。3阶拟合的精度就可以做得很高。
-200-850
3阶T=1.146e-6*R^3+5.9242e-4*R*R+2.4021*R-247.08;
5阶T=-1.2878e-11*R^5+1.5932e-8*R^4-6.1794e-6*R^3+2.1231e-3*R*R+2.2614*R-242.75;(T温度,R电阻值)
想做精度为0.1摄氏度的仪表,这两个方程都可以的。

出0入0汤圆

发表于 2010-11-9 11:47:02 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2010-11-9 13:55:21 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-11-15 16:19:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-17 11:54:51 | 显示全部楼层
跟着mark,正在查找相关资料用呢!

出0入0汤圆

发表于 2010-11-17 15:00:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-19 19:40:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-19 20:00:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-22 11:05:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-12 14:24:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-12 19:12:06 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-12-12 19:21:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-12 19:29:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-12 20:04:46 | 显示全部楼层
学习了

出0入0汤圆

发表于 2010-12-12 20:33:49 | 显示全部楼层
呵呵..PT100也这么复杂啊.

出0入0汤圆

发表于 2010-12-12 21:51:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-14 20:35:46 | 显示全部楼层
单片机资源少,用查表法又好又快,就是表要自己做好

出20入186汤圆

发表于 2011-1-17 18:58:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-20 22:46:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-30 20:34:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-17 23:00:18 | 显示全部楼层
正在学习,顶一下。

出0入0汤圆

发表于 2011-5-18 10:35:01 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-5-27 18:17:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-27 20:13:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-21 10:22:58 | 显示全部楼层
好复杂

出0入0汤圆

发表于 2011-10-28 23:00:33 | 显示全部楼层
学习!

出0入0汤圆

发表于 2011-10-28 23:46:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-29 02:58:17 | 显示全部楼层
马克一下

出0入0汤圆

发表于 2011-10-29 09:28:38 | 显示全部楼层
有个简单的方法,自己做实验测得多组数据,然后记录在Exel里面,可以借助Exel做一个多项式逼近的计算。

出0入0汤圆

发表于 2011-10-29 09:44:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-30 14:47:28 | 显示全部楼层
实际使用中你的这个好像就没用了,如果在电桥上使用PT100,由于比率是非线性的,你的公式就没用了。假如上臂是100欧姆,下臂是PT100,这时候比率是下降的(0度100/100,比率100/200=0.5,100度100/138.5,比率100/238.5=0.419),和PT100实际弧度刚好相反,你的公式会更复杂,准确性也值得怀疑,还不如用模糊逻辑法,查表更靠得住,也精确。

出0入0汤圆

发表于 2011-10-31 14:54:02 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-11-1 20:41:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-1 20:50:39 | 显示全部楼层
4年前的挖坟贴。我还奇怪楼主为什么后来没有回应?

出0入0汤圆

发表于 2011-11-3 09:37:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-5 16:33:12 | 显示全部楼层
这个贴要顶的..

出0入0汤圆

发表于 2011-11-14 15:35:09 | 显示全部楼层
很早前用51做过,直接计算的,要开一次方

出0入0汤圆

发表于 2011-11-14 16:16:45 | 显示全部楼层
如果只用pt100这一个传感器,还是查表来得快,来得准确。拟合的函数精度要求越高,函数的阶数就越大,cpu计算量也就成倍增加了。pt100的话还可以根据具体环境来查表的。可以做得很精确。

出0入0汤圆

发表于 2011-11-20 14:28:45 | 显示全部楼层
mark

出675入8汤圆

发表于 2011-11-20 20:46:19 | 显示全部楼层
先标记在看

出0入0汤圆

发表于 2012-2-1 14:16:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-1 15:31:31 | 显示全部楼层
做个表分段线性法
用函数也可以
至于得到函数的方法其实不麻烦,用matlab进行一下拟合就好了,需要精度高就拟合次数高一些,一般二次、三次的精度都完全可以接受了
具体方法百度一下“matlab 拟合”
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-13 08:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表