SKY-20210407USB\Administrator 1 年之前
父節點
當前提交
5ee2a04b8d
共有 2 個文件被更改,包括 106 次插入0 次删除
  1. 103 0
      ALGO_Temperature_ATY.c
  2. 3 0
      ALGO_Temperature_ATY.h

+ 103 - 0
ALGO_Temperature_ATY.c

@@ -131,6 +131,109 @@ float ALGO_Temp_RTD_Res_Below(float rtdRes)
         - (2.8183e-8) * rtdRes * rtdRes * rtdRes * rtdRes
         + (1.5243e-10) * rtdRes * rtdRes * rtdRes * rtdRes * rtdRes);
 }
+// PT1000
+// R(t)=R0(1+At+Bt2)
+// A=0.0038623139728
+// B=-0.00000065314932626
+
+#include "math.h"
+#define A 3.9083e-3
+#define B -5.775e-7
+#define C -4.183e-12
+//#define A2 3.9083e-2
+//#define B2 -5.775e-6
+//#define C2 -4.183e-11
+
+double ALGO_Temp_RTD_T_PT1000(double T)
+{
+    if(T >= -200 && T < 0)
+    {
+        return 100 * (1 + A * T + B * T * T + C * (T - 100) * T * T * T);
+    }
+    else if(T >= 0 && T <= 850)
+    {
+        return 100 * (1 + A * T + B * T * T);
+    }
+    return 0;
+}
+
+/**
+ * @brief ???????
+ * @param[in] resist	??
+ * @param[out] temp		???
+ * @retval  ????
+ * @note ????????,????????????,?1?3??????????????:
+ *	1. ???????????????:
+ *		t1 = (Rt / R0 - 1) / A
+ *
+ *		??t1???:
+ *			0??????:Rt1 = R0 * (1 + A * t1 + B * t1 * t1);
+ *			0??????:Rt1 = R0 * [1 + A * t1 + B * t1 * t1 + C * (t1 - 100) * t1 * t1 * t1];
+ *
+ *		?? |Rt1 - Rt| < 0.001,t1 ???????,???????????:
+ *
+ *	2.  ???????????:
+ *		?? Rt = R0
+ *			t1' = 1 / [R0 * (A + 2 * B * t1)]
+ *			t1'' =-2 * B * R0 * t1' * t1' * t1'
+ *		?? Rt < R0
+ *			t1' = 1 / [R0 * (A + 2 * B * t1 - 300 * C *  t1 *  t1 + 4 * C *  t1 *  t1 *  t1)]
+ *			t1''=- R0 * (2 * B - 600 * C *  t1 + 12 * C *  t1 *  t1) * t1' * t1' * t1'
+ *
+ *	3. ?? Rt,t1,Rt1 ?????? t2:
+ *		t2 = t1 + t1' * (Rt - Rt1) + 0.5 * t1'' * (Rt - Rt1) * (Rt - Rt1),???? t2 ????? Rt2?
+ *
+ *	4. ?? |Rt2 - Rt| < 0.001,t2 ???????,??????????? t2 ??????,???????????
+ */
+double ALGO_Temp_RTD_Res_PT100(double resist)
+{
+    double fT, fT0;
+    short i;
+
+    /* 1. use a linear formula to get a rough temperature first */
+    fT0 = (resist / 100 - 1) / A;
+    /* -200C ~ 0C */
+    if(resist >= 18.52 && resist < 100)
+    {
+        for(i = 0; i < 50; i++)
+        {
+            fT = fT0 + (resist - 100 * (1 + A * fT0 + B * fT0 * fT0 - 100 * C * fT0 * fT0 * fT0 + C * fT0 * fT0 * fT0 * fT0)) /
+                (100 * (A + 2 * B * fT0 - 300 * C * fT0 * fT0 + 4 * C * fT0 * fT0 * fT0));
+            if(fabs(fT - fT0) < 0.001) /* If | Rt1-Rt | < 0.001, t1 is the desired temperature */
+            {
+                return fT;
+            }
+            else
+            {
+                fT0 = fT;
+            }
+        }
+    }
+    /* 0C ~ 850C */
+    else if(resist >= 100 && resist <= 390.481)
+    {
+        for(i = 0; i < 50; i++)
+        {
+            fT = fT0 + (resist - 100 * (1 + A * fT0 + B * fT0 * fT0)) / (100 * (A + 2 * B * fT0));
+            if(fabs(fT - fT0) < 0.001) /* If | Rt1-Rt | < 0.001, t1 is the desired temperature */
+            {
+                return fT;
+            }
+            else
+            {
+                fT0 = fT;
+            }
+        }
+    }
+    return 0;
+}
+
+double ALGO_Temp_RTD_Res_PT1000(double resist)
+{
+    return ALGO_Temp_RTD_Res_PT100(resist / 10.0f);
+}
+
+
 
 /**
  * @brief

+ 3 - 0
ALGO_Temperature_ATY.h

@@ -70,6 +70,9 @@ float ALGO_VolToKelvinTemp(float vADC, float vRef, float rRefK, float R25, float
 float ALGO_Temp_RTD_Res_Fast(float rtdRes);
 float ALGO_Temp_RTD_Res_Above(float rtdRes);
 float ALGO_Temp_RTD_Res_Below(float rtdRes);
+double ALGO_Temp_RTD_T_PT1000(double T);
+double ALGO_Temp_RTD_Res_PT100(double resist);
+double ALGO_Temp_RTD_Res_PT1000(double resist);
 float ALGO_Temp_TC_TempToVol(uint8_t type, float Temp);
 float ALGO_Temp_TC_VolToTemp(uint8_t type, float voltage);