|
发表于 2020-11-19 20:17:17
|
显示全部楼层
今天用到PT1000的,对照修改了一下。
负温度的阻值是参考网上的,正温度是参考网上公式计算的。
- #define BELOW_LOW_LIMITE -1000
- #define EXCESS_UP_LIMITE 1000
- float const RTD_TAB_PT1000[91] = // 表格是以5度为一步,即-200, -195, - 190.....
- {
- 803.06, 822.90, 542.71, 862.48, 882.22, 901.92, 921.60, 941.24, 960.86, 980.44, // -50~-5
- 1000.00 ,1019.53 ,1039.02 ,1058.49 ,1077.93 ,1097.34 ,1116.72 ,1136.07 ,1155.40 ,1174.69 , // 0~45
- 1193.96 ,1213.19 ,1232.40 ,1251.58 ,1270.73 ,1289.85 ,1308.94 ,1328.01 ,1347.04 ,1366.05 , // 50
- 1385.03 ,1403.97 ,1422.89 ,1441.78 ,1460.64 ,1479.48 ,1498.28 ,1517.06 ,1535.80 ,1554.52 , // 100
- 1573.21 ,1591.87 ,1610.50 ,1629.10 ,1647.67 ,1666.21 ,1684.73 ,1703.22 ,1721.67 ,1740.10 , // 150
- 1758.50 ,1776.87 ,1795.21 ,1813.53 ,1831.81 ,1850.06 ,1868.29 ,1886.49 ,1904.66 ,1922.80 , // 200
- 1940.91 ,1958.99 ,1977.04 ,1995.07 ,2013.06 ,2031.03 ,2048.96 ,2066.87 ,2084.75 ,2102.60 , // 250
- 2120.43 ,2138.22 ,2155.98 ,2173.72 ,2191.42 ,2209.10 ,2226.75 ,2244.37 ,2261.96 ,2279.52 , // 300
- 2297.06 ,2314.56 ,2332.04 ,2349.48 ,2366.90 ,2384.29 ,2401.65 ,2418.98 ,2436.28 ,2453.56 , // 350
- 2470.80 // 400
- };
- /***********************************************************************
- *FunName: float CalculateTemperature(float fR)
- *
- *In: fR -> PT1000的电阻值。
- *
- *Out: fTem -> 测得的温度值。
- *
- *Discription: 将电阻值查表算出温度值。
- *
- *Notes: 采用2分查找法。
- *
- ************************************************************************/
- float CalculateTemperature(float fR)
- {
- float fTem;
- float fLowRValue;
- float fHighRValue;
- int iTem;
- int8_t i;
- //int8_t cLimite = 0xFF;
- int8_t cBottom, cTop;
- if (fR < RTD_TAB_PT1000[0]) // 电阻值小于表格最小值,低于量程下限。
- {
- return BELOW_LOW_LIMITE;
- }
- if (fR > RTD_TAB_PT1000[90]) // 电阻值大于表格最大值,超出量程上限。
- {
- return EXCESS_UP_LIMITE;
- }
- cBottom = 0;
- cTop = 90;
- for (i=45; (cTop-cBottom)!=1; ) // 2分法查表。
- {
- if (fR < RTD_TAB_PT1000[i])
- {
- cTop = i;
- i = (cTop + cBottom) / 2;
- }
- else if (fR > RTD_TAB_PT1000[i])
- {
- cBottom = i;
- i = (cTop + cBottom) / 2;
- }
- else
- {
- iTem = (int32_t)i * 5 - 50; //RTD_TAB_PT1000[10]=0, 50=5*10
- fTem = (float)iTem;
-
- return fTem;
- }
- }
- iTem = (int32_t)i * 5 - 50; //RTD_TAB_PT1000[10]=0, 50=5*10
- fLowRValue = RTD_TAB_PT1000[cBottom];
- fHighRValue = RTD_TAB_PT1000[cTop];
- fTem = ( ((fR - fLowRValue)*5) / (fHighRValue - fLowRValue) ) + iTem; // 表格是以5度为一步的。
- // 两点内插进行运算。
- return fTem;
- }
复制代码 |
|