ALGO_Temperature_ATY.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /**
  2. * @file ALGO_Temperature_ATY.c
  3. *
  4. * @param Project ALGO_Algorithm_ATY_LIB
  5. *
  6. * @author ATY
  7. *
  8. * @copyright
  9. * - Copyright 2017 - 2023 MZ-ATY
  10. * - This code follows:
  11. * - MZ-ATY Various Contents Joint Statement -
  12. * <a href="https://mengze.top/MZ-ATY_VCJS">
  13. * https://mengze.top/MZ-ATY_VCJS</a>
  14. * - CC 4.0 BY-NC-SA -
  15. * <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
  16. * https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
  17. * - Your use will be deemed to have accepted the terms of this statement.
  18. *
  19. * @brief Familiar functions of NTC or others temperature calc
  20. *
  21. * @version
  22. * - 1_01_230107 > ATY
  23. * -# Preliminary version, first Release
  24. ********************************************************************************
  25. */
  26. #ifndef __ALGO_Temperature_ATY_C
  27. #define __ALGO_Temperature_ATY_C
  28. #include "ALGO_Temperature_ATY.h"
  29. /******************************* For user *************************************/
  30. /******************************************************************************/
  31. /**
  32. * @brief Calculate temperature from ntc resistance(Steinhart-Hart)
  33. * @param Rntc Current NTC resistance value
  34. * @param A A value of NTC
  35. * @param B B value of NTC
  36. * @param C C value of NTC
  37. * @return Current temperature in Celsius
  38. */
  39. float ALGO_ResToKelvinTempABC(float Rntc, float A, float B, float C)
  40. {
  41. float Tn = 0.0;
  42. float Cn = 0.0;
  43. Tn = (A + (B * ALGO_MATH_LogLn(Rntc)) + (C * ALGO_MATH_LogLn(Rntc) * ALGO_MATH_LogLn(Rntc) * ALGO_MATH_LogLn(Rntc)));
  44. Tn = 1 / Tn;
  45. Cn = ALGO_TEMP_TtoC(Tn);
  46. return Cn;
  47. }
  48. /**
  49. * @brief Calculate temperature from ntc resistance(Steinhart-Hart change)
  50. * @param Rntc Current NTC resistance value
  51. * @param R25 NTC standard resistance value at 25C
  52. * @param B B value of NTC
  53. * @return Current temperature in Celsius
  54. * @note T25: Kelvin temperature at 25C = 298.15 = ALGO_TEMP_CtoT(25)
  55. * R25: NTC standard resistance value at 25C like 10K,5K,100K...
  56. * B: B value of NTC like 3435,3950...
  57. * Rntc: Current NTC resistance value
  58. * Tn: Actual Kelvin temperature(Cn = Tn-273.15)
  59. * B = (lnR25 - lnRntc)/(1/T25 - 1/Tn)
  60. */
  61. float ALGO_ResToKelvinTemp(float Rntc, float R25, float B)
  62. {
  63. float Tn = 0.0;
  64. float Cn = 0.0;
  65. float temp_f[2];
  66. temp_f[0] = (ALGO_MATH_LogLn(R25) - ALGO_MATH_LogLn(Rntc)) / B;
  67. temp_f[1] = (1 / ALGO_TEMP_CtoT(25)) - temp_f[0];
  68. Tn = 1 / temp_f[1];
  69. Cn = ALGO_TEMP_TtoC(Tn);
  70. return Cn;
  71. }
  72. /**
  73. * @brief Calculate temperature from ntc resistance
  74. * @param vADC ADC voltage in mV
  75. * @param vRef NTC ref voltage in mV
  76. * @param rRefK ref resistance in kOhm
  77. * @param R25 NTC standard resistance value at 25C
  78. * @param B B value of NTC
  79. * @param rRefPos ref res psition, 1 for pull up, 0 for pull down(for ntc)
  80. * @return Current temperature in Celsius
  81. * @note T25: Kelvin temperature at 25C = 298.15 = ALGO_TEMP_CtoT(25)
  82. * R25: NTC standard resistance value at 25C like 10K,5K,100K...
  83. * B: B value of NTC like 3435,3950...
  84. * Rntc: Current NTC resistance value
  85. * Tn: Actual Kelvin temperature(Cn = Tn-273.15)
  86. * B = (lnR25 - lnRntc)/(1/T25 - 1/Tn)
  87. */
  88. float ALGO_VolToKelvinTemp(float vADC, float vRef, float rRefK, float R25, float B, uint8_t rRefPos)
  89. {
  90. if(rRefPos == 1){
  91. return ALGO_ResToKelvinTemp(ALGO_VoltageToResDown(vADC, vRef, rRefK), R25, B);
  92. }
  93. else{
  94. return ALGO_ResToKelvinTemp(ALGO_VoltageToResUp(vADC, vRef, rRefK), R25, B);
  95. }
  96. }
  97. float ALGO_Temp_RTD_Res_Fast(float rtdRes)
  98. {
  99. return (float)((rtdRes - 100.0f) / 0.385f);
  100. }
  101. // #include "math.h"
  102. #include "ALGO_AlgorithmBase_ATY.h"
  103. float ALGO_Temp_RTD_Res_Above(float rtdRes)
  104. {
  105. return (float)((-(3.9083e-3)
  106. + ALGO_Sqrt_NewtonNumber(((3.9083e-3) * (3.9083e-3))
  107. // + sqrt(((3.9083e-3) * (3.9083e-3))
  108. - 4 * (-5.775e-7) * (1 - (rtdRes / 100.0f))))
  109. / (2 * (-5.775e-7)));
  110. }
  111. float ALGO_Temp_RTD_Res_Below(float rtdRes)
  112. {
  113. return (float)(-242.02f
  114. + 2.2228f * rtdRes
  115. + (2.5859e-3) * rtdRes * rtdRes
  116. - (4.826e-6) * rtdRes * rtdRes * rtdRes
  117. - (2.8183e-8) * rtdRes * rtdRes * rtdRes * rtdRes
  118. + (1.5243e-10) * rtdRes * rtdRes * rtdRes * rtdRes * rtdRes);
  119. }
  120. /**
  121. * @brief
  122. *
  123. * @param type
  124. * @param Temp in Degrees Celsius
  125. * @return float in mV
  126. * @note https://srdata.nist.gov/
  127. */
  128. float ALGO_Temp_TC_TempToVol(uint8_t type, float Temp)
  129. {
  130. if(type == 'T'){
  131. if(Temp == 0)
  132. return 0;
  133. else if(Temp > 0){
  134. return (0
  135. + ((0.387481063640e-1) * Temp)
  136. + ((0.332922278800e-4) * Temp * Temp)
  137. + ((0.206182434040e-6) * Temp * Temp * Temp)
  138. + ((-0.218822568460e-8) * Temp * Temp * Temp * Temp)
  139. + ((0.109968809280e-10) * Temp * Temp * Temp * Temp * Temp)
  140. + ((-0.308157587720e-13) * Temp * Temp * Temp * Temp * Temp * Temp)
  141. + ((0.454791352900e-16) * Temp * Temp * Temp * Temp * Temp * Temp * Temp)
  142. + ((-0.275129016730e-19) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp));
  143. }
  144. else if(Temp < 0){
  145. return (0
  146. + ((0.387481063640e-01) * Temp)
  147. + ((0.441944343470e-04) * Temp * Temp)
  148. + ((0.118443231050e-06) * Temp * Temp * Temp)
  149. + ((0.200329735540e-07) * Temp * Temp * Temp * Temp)
  150. + ((0.901380195590e-09) * Temp * Temp * Temp * Temp * Temp)
  151. + ((0.226511565930e-10) * Temp * Temp * Temp * Temp * Temp * Temp)
  152. + ((0.360711542050e-12) * Temp * Temp * Temp * Temp * Temp * Temp * Temp)
  153. + ((0.384939398830e-14) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp)
  154. + ((0.282135219250e-16) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp)
  155. + ((0.142515947790e-18) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp)
  156. + ((0.487686622860e-21) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp)
  157. + ((0.107955392700e-23) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp)
  158. + ((0.139450270620e-26) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp)
  159. + ((0.797951539270e-30) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp));
  160. }
  161. }
  162. return 0;
  163. }
  164. /**
  165. * @brief
  166. *
  167. * @param type
  168. * @param voltage in mV
  169. * @return float in Degrees Celsius
  170. * @note https://srdata.nist.gov/
  171. */
  172. float ALGO_Temp_TC_VolToTemp(uint8_t type, float voltage)
  173. {
  174. if(type == 'T'){
  175. if(voltage == 0)
  176. return 0;
  177. else if(voltage > 0){
  178. return (0
  179. + ((2.592800e1) * voltage)
  180. + ((-7.602961e-1) * voltage * voltage)
  181. + ((4.637791e-2) * voltage * voltage * voltage)
  182. + ((-2.165394e-3) * voltage * voltage * voltage * voltage)
  183. + ((6.048144e-5) * voltage * voltage * voltage * voltage * voltage)
  184. + ((-7.293422e-7) * voltage * voltage * voltage * voltage * voltage * voltage));
  185. }
  186. else if(voltage < 0){
  187. return (0
  188. + ((2.5949192e1) * voltage)
  189. + ((-2.1316967e-1) * voltage * voltage)
  190. + ((7.9018692e-1) * voltage * voltage * voltage)
  191. + ((4.2527777e-1) * voltage * voltage * voltage * voltage)
  192. + ((1.3304473e-1) * voltage * voltage * voltage * voltage * voltage)
  193. + ((2.0241446e-2) * voltage * voltage * voltage * voltage * voltage * voltage)
  194. + ((1.2668171e-3) * voltage * voltage * voltage * voltage * voltage * voltage * voltage));
  195. }
  196. }
  197. return 0;
  198. }
  199. // resultTemp = ALGO_ResToKelvinTemp(ALGO_VoltageToResDown(resultTemp, vref_t, 10), 1, 3200);
  200. #endif /* __ALGO_Temperature_ATY_C */
  201. /******************************** End Of File *********************************/