搜索
bottom↓
回复: 33

热电偶的信号调理(分度号公式) 【恢复】

[复制链接]

出0入0汤圆

发表于 2008-11-5 21:40:45 | 显示全部楼层 |阅读模式
热电偶的ITS-90标准公式系数可以到美国的http://srdata.nist.gov/its90/main/上查询



但是这些动不动就是九 十次方的公式并不适合单片机运算



现在有空闲时间,想用低阶函数来分段模拟热电偶的公式,争取能够做到三到四阶多项式能够拟合。




个人磨洋工,没有事情,消磨时间而已,所以不要指望我能够很快完成——甚至,能不能够完成都不一定。

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

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

出0入0汤圆

 楼主| 发表于 2008-11-5 21:48:53 | 显示全部楼层
K分度热电偶冷端补偿



mV = C0 + C1 * T + C2 * T^2;



C0 = -0.0014194137

C1 = 0.039924664

C2 = 0.000011141194



0℃ ≤ T ≤ 85℃



误差±0.1℃



验证表格



K分度热电偶冷端补偿公式,误差图ourdev_485184.rar(文件大小:648K) (原文件名:K分度号分析.rar) 






今天的工作到此结束

出0入0汤圆

 楼主| 发表于 2008-11-6 23:10:42 | 显示全部楼层
这两天仔细用Excel分析了一下,如果不分得很密的话,根本无法使用三四阶函数模拟出来完整的热电偶信号



所以,这条路就不用考虑了。毕竟,如果有简单的参数的话,老美肯定早就公布了。




不过,路始终还是要走的三,所以抱着414的态度,我尝试使用老美的公式来计算热电偶,经过发现:



在MSP430中,如果不开硬件乘法器的话,整个运算大概不到2W步,对应8M的晶体的话,需要的时间还不到3mS



在大多数应用中,这3mS已经小到忽略的地步了(而且肯定符合各种标准所要求的响应时间)



把代码传上来,可以任意修改验证。










    在写这段文字的时候,成都有TMD发生了强烈的地震。



  我操,我在7楼,感觉强烈得很,受不了了。



    老子都有很强的地震阴影了,到现在走路,心里还随时感觉是晃的。



    以前倒还无所谓,现在想我那远在广汉的老婆,以及我尚未出生的宝宝了。














#include "msp430x42x.h"

#include "math.h"



#define K_TC_COEF_NUM         10



static const float KTc_V2T_Below0[K_TC_COEF_NUM] = {

   0.0000000E+00,    2.5173462E+01,    -1.1662878E+00,   -1.0833638E+00,

   -8.9773540E-01,   -3.7342377E-01,   -8.6632643E-02,   -1.0450598E-02,

   -5.1920577E-04,   0.0000000E+00

                                                   };

static const float KTc_V2T_Above0_Below500[K_TC_COEF_NUM] = {

   0.000000E+00,     2.508355E+01,     7.860106E-02,     -2.503131E-01,

   8.315270E-02,     -1.228034E-02,    9.804036E-04,     -4.413030E-05,

   1.057734E-06,     -1.052755E-08

                                                            };

static const float KTc_V2T_Above500[K_TC_COEF_NUM] = {

   -1.318058E+02,    4.830222E+01,     -1.646031E+00,    5.464731E-02,

   -9.650715E-04,    8.802193E-06,     -3.110810E-08,    0.000000E+00,

   0.000000E+00,     0.000000E+00

                                                     };





static const float KTc_T2V_Below0[K_TC_COEF_NUM] = {

   0.000000000000E+00,     0.394501280250E-01,     0.236223735980E-04,  

   -0.328589067840E-06,    -0.499048287770E-08,    -0.675090591730E-10,

   -0.574103274280E-12,    -0.310888728940E-14,    -0.104516093650E-16,

   -0.198892668780E-19,

                                                   };

static const float KTc_T2V_Above0[K_TC_COEF_NUM] = {

   -0.176004136860E-01,    0.389212049750E-01,     0.185587700320E-04,

   -0.994575928740E-07,    0.318409457190E-09,     -0.560728448890E-12,

   0.560750590590E-15,     -0.320207200030E-18,    0.971511471520E-22,

   -0.121047212750E-25

                                                   };

                                                   

static const float KTc_T2V_ExpA0  = 0.118597600000E+00;

static const float KTc_T2V_ExpA1  = -0.118343200000E-03;

static const float KTc_T2V_ExpA2  = 0.126968600000E+03;



float ThermocoupleCoef( float fX, const float *pArray, unsigned char n );

float TCConditionerK( float fVolt, float fTemperature );





float ThermocoupleCoef( float fX, const float *pArray, unsigned char n )

{

   float fResult;

   float temp;

   unsigned char i;

   

   temp = fX;

   fResult = pArray[0];

   for( i = 1; i < n; i++)

   {

      fResult += pArray * temp;

      temp *= fX;

   }

   return fResult;

}



float TCConditionerK( float fVolt, float fTemperature )

{

   float fTemperatureVolt;

   float fRealTemperature;

   

   if( fTemperature> 0 )

   {

      fTemperatureVolt = ThermocoupleCoef( fTemperature, KTc_T2V_Above0, K_TC_COEF_NUM) 

                       + KTc_T2V_ExpA0 * expf(     KTc_T2V_ExpA1 

                                                * (fTemperature - KTc_T2V_ExpA2 ) 

                                                * (fTemperature - KTc_T2V_ExpA2 ) );

   }

   else

   {

      fTemperatureVolt = ThermocoupleCoef(fTemperature, KTc_T2V_Below0, K_TC_COEF_NUM);

   }

   

   fVolt = fVolt + fTemperatureVolt;

   if( fVolt < 0 )

   {

      fRealTemperature = ThermocoupleCoef(fVolt, KTc_V2T_Below0, K_TC_COEF_NUM );

   }

   else if( fVolt < 20.644 )

   {

      fRealTemperature = ThermocoupleCoef(fVolt, KTc_V2T_Above0_Below500, K_TC_COEF_NUM );

   }

   else

   {

      fRealTemperature = ThermocoupleCoef(fVolt, KTc_V2T_Above500, K_TC_COEF_NUM );

   }

   

   return fRealTemperature;

}



float fVoltTest;

float fCoolTemperature;

float fTemperature;



void main( void )

{

   while( 1 )

   {

      fTemperature = TCConditionerK(fVoltTest, fCoolTemperature);

   }

}









 

出0入0汤圆

 楼主| 发表于 2008-11-6 23:19:42 | 显示全部楼层
上传IAR工程包,3.41 FOR MSP430 的



忽略了一个冷端补偿的第十阶,这样可以做到所有的运算都是9阶的



忽略第十阶,冷端在零下一百度的影响是 -1.6μV,在零下五十度的影响是 -1.6nV,



我想,应该足够了吧。



IAR FOR MSP430ourdev_486507.rar(文件大小:23K) (原文件名:热电偶K.rar) 

出0入0汤圆

发表于 2008-11-7 07:47:24 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2008-11-12 21:58:52 | 显示全部楼层












                 Type_B













#include "math.h"



#define B_TC_COEF_NUM         9



static const float BTc_V2T_Below630[B_TC_COEF_NUM] = {

   0.000000000000E+00,     -0.246508183460E-03,    0.590404211710E-05,

   -0.132579316360E-08,    0.156682919010E-11,     -0.169445292400E-14,

   0.629903470940E-18

                                                     };





static const float BTc_T2V_Below700[B_TC_COEF_NUM] = {

   9.8423321E+01,    6.9971500E+02,    -8.4765304E+02,  

   1.0052644E+03,    -8.3345952E+02,   4.5508542E+02,

   -1.5523037E+02,   2.9886750E+01,    -2.4742860E+00

                                                     };

static const float BTc_T2V_Above700[B_TC_COEF_NUM] = {

   2.1315071E+02,    2.8510504E+02,    -5.2742887E+01,

   9.9160804E+00,    -1.2965303E+00,   1.1195870E-01,

   -6.0625199E-03,   1.8661696E-04,    -2.4878585E-06

                                                     };



static const float BTc_V2T_SQRT_B = -2.1717485346E-04;

static const float BTc_V2T_SQRT_A = 5.5307087838E-06;



float ThermocoupleCoef( float fX, const float *pArray, unsigned char n );

float TCConditionerB( float fVolt, float fTemperature );



float ThermocoupleCoef( float fX, const float *pArray, unsigned char n )

{

   float fResult;

   float temp;

   unsigned char i;

   

   temp = fX;

   fResult = pArray[0];

   for( i = 1; i < n; i++)

   {

      fResult += pArray * temp;

      temp *= fX;

   }

   return fResult;

}



float TCConditionerB( float fVolt, float fTemperature )

{

   float fTemperatureVolt;

   float fRealTemperature;

   

   if( fTemperature>= 0 )

   {

      fTemperatureVolt = ThermocoupleCoef( fTemperature, BTc_V2T_Below630, B_TC_COEF_NUM);

   }

   else

   {

      fTemperatureVolt = 0;

   }

   

   fVolt = fVolt + fTemperatureVolt;

   if( fVolt < 0.291 )

   {

      fRealTemperature =   (    sqrt( BTc_V2T_SQRT_B * BTc_V2T_SQRT_B 

                                      + 4 * BTc_V2T_SQRT_A * fVolt ) 

                                - BTc_V2T_SQRT_B ) 

                         / ( 2 * BTc_V2T_SQRT_A );

   }

   else if( fVolt < 2.413 )

   {

      fRealTemperature = ThermocoupleCoef(fVolt, BTc_T2V_Below700, B_TC_COEF_NUM );

   }      

   else

   {

      fRealTemperature = ThermocoupleCoef(fVolt, BTc_T2V_Above700, B_TC_COEF_NUM );

   }

   

   return fRealTemperature;

}



float fVoltTest;

float fCoolTemperature;

float fTemperature;



void main( void )

{

   while( 1 )

   {

      fTemperature = TCConditionerB(fVoltTest, fCoolTemperature);

   }

}



本贴被 lihuyong 编辑过,最后修改时间:2008-11-12,22:00:36.

出0入0汤圆

 楼主| 发表于 2008-11-12 22:06:58 | 显示全部楼层
B分度号因为传感器本身的特性,所以250度以下我是采用自己推算出来的公式(一元二次方程)系数来计算的

static const float BTc_V2T_SQRT_B = -2.1717485346E-04; 

static const float BTc_V2T_SQRT_A = 5.5307087838E-06; 

( aT^2 + bT = mV ) 



在100度以下,计算的误差较大(大约在几度),在0.002mV(50度)以下基本上没有特别的意义




试问一下,又有哪个SB用B分度测量250度以下呐?



我非要计算出来250度以下的公式本身没有特别大的意义,主要是怕遇见大SB



误差大,总比没有的好吧。






好了,就写到这里吧,以后不再做这个的理论计算了



没有意义,去研究 1μV ~ 80mV 的信号采集了。这个,冒视难度更G8大

本贴被 lihuyong 编辑过,最后修改时间:2008-11-12,22:11:21.
头像被屏蔽

出0入0汤圆

发表于 2008-11-13 06:55:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2008-11-13 09:08:21 | 显示全部楼层
一直没有做过温度的东西,目前看到温度就有点怕,哈哈,非要找时间研究研究温度。

出0入0汤圆

发表于 2008-11-13 11:43:32 | 显示全部楼层
学习

出0入4汤圆

发表于 2008-11-13 13:06:28 | 显示全部楼层
楼主有没有搞过标准铂电阻的计算

出0入0汤圆

发表于 2008-11-13 13:16:06 | 显示全部楼层
关注

出0入0汤圆

发表于 2008-11-24 23:23:14 | 显示全部楼层
真棒!



再给个明晰的公式吧

出0入0汤圆

发表于 2008-11-25 01:09:49 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-11-25 23:00:06 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-11-28 21:16:20 | 显示全部楼层
不错,我做过重量,压力的拟合,温度很快也做。

出0入46汤圆

发表于 2008-11-28 23:47:26 | 显示全部楼层
mark!

出0入0汤圆

发表于 2008-11-29 00:22:54 | 显示全部楼层
狗日的 , 高科技嗦 ~!

出0入0汤圆

发表于 2009-4-15 22:53:22 | 显示全部楼层
强,没太看明白。

出0入0汤圆

发表于 2009-10-17 19:11:16 | 显示全部楼层
简直看不懂

出0入0汤圆

发表于 2009-12-15 16:08:33 | 显示全部楼层
楼主很猛,先下载学习,有问题请不吝赐教!

出0入0汤圆

发表于 2010-1-24 21:49:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-8 16:20:06 | 显示全部楼层
很好,Cool

出0入0汤圆

发表于 2011-1-14 01:04:51 | 显示全部楼层
高科技

出0入0汤圆

发表于 2011-1-14 07:43:46 | 显示全部楼层
看看

出0入4汤圆

发表于 2011-1-14 07:56:05 | 显示全部楼层
很强大

出0入0汤圆

发表于 2011-1-14 08:37:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-4 14:53:14 | 显示全部楼层
楼主很猛,学习

出0入0汤圆

发表于 2011-7-18 13:23:14 | 显示全部楼层
楼主做过红外测温计吗?

出0入0汤圆

发表于 2011-7-18 13:23:18 | 显示全部楼层
mark

出0入134汤圆

发表于 2011-7-18 13:27:12 | 显示全部楼层
原来热电偶没那么简单......

出0入0汤圆

发表于 2011-7-29 18:07:30 | 显示全部楼层
热电偶如果用ITS-90公式的话单片机的浮点位数不够的,我用excel计算,用ITS公式,结果发现精度没有ITs-90标识的误差,误差起码达到了5倍左右,估计就是浮点数位数不够的原因了。

出0入0汤圆

发表于 2011-8-27 15:17:40 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-16 13:20

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

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