|
楼主 |
发表于 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);
}
}
|
|