/** * @file ALGO_Temperature_ATY.c * * @param Project ALGO_Algorithm_ATY_LIB * * @author ATY * * @copyright * - Copyright 2017 - 2023 MZ-ATY * - This code follows: * - MZ-ATY Various Contents Joint Statement - * * https://mengze.top/MZ-ATY_VCJS * - CC 4.0 BY-NC-SA - * * https://creativecommons.org/licenses/by-nc-sa/4.0/ * - Your use will be deemed to have accepted the terms of this statement. * * @brief Familiar functions of NTC or others temperature calc * * @version * - 1_01_230107 > ATY * -# Preliminary version, first Release ******************************************************************************** */ #ifndef __ALGO_Temperature_ATY_C #define __ALGO_Temperature_ATY_C #include "ALGO_Temperature_ATY.h" /******************************* For user *************************************/ /******************************************************************************/ /** * @brief Calculate temperature from ntc resistance(Steinhart-Hart) * @param Rntc Current NTC resistance value * @param A A value of NTC * @param B B value of NTC * @param C C value of NTC * @return Current temperature in Celsius */ float ALGO_ResToKelvinTempABC(float Rntc, float A, float B, float C) { float Tn = 0.0; float Cn = 0.0; Tn = (A + (B * ALGO_MATH_LogLn(Rntc)) + (C * ALGO_MATH_LogLn(Rntc) * ALGO_MATH_LogLn(Rntc) * ALGO_MATH_LogLn(Rntc))); Tn = 1 / Tn; Cn = ALGO_TEMP_TtoC(Tn); return Cn; } /** * @brief Calculate temperature from ntc resistance(Steinhart-Hart change) * @param Rntc Current NTC resistance value * @param R25 NTC standard resistance value at 25C * @param B B value of NTC * @return Current temperature in Celsius * @note T25: Kelvin temperature at 25C = 298.15 = ALGO_TEMP_CtoT(25) * R25: NTC standard resistance value at 25C like 10K,5K,100K... * B: B value of NTC like 3435,3950... * Rntc: Current NTC resistance value * Tn: Actual Kelvin temperature(Cn = Tn-273.15) * B = (lnR25 - lnRntc)/(1/T25 - 1/Tn) */ float ALGO_ResToKelvinTemp(float Rntc, float R25, float B) { float Tn = 0.0; float Cn = 0.0; float temp_f[2]; temp_f[0] = (ALGO_MATH_LogLn(R25) - ALGO_MATH_LogLn(Rntc)) / B; temp_f[1] = (1 / ALGO_TEMP_CtoT(25)) - temp_f[0]; Tn = 1 / temp_f[1]; Cn = ALGO_TEMP_TtoC(Tn); return Cn; } /** * @brief Calculate temperature from ntc resistance * @param vADC ADC voltage in mV * @param vRef NTC ref voltage in mV * @param rRefK ref resistance in kOhm * @param R25 NTC standard resistance value at 25C * @param B B value of NTC * @param rRefPos ref res psition, 1 for pull up, 0 for pull down(for ntc) * @return Current temperature in Celsius * @note T25: Kelvin temperature at 25C = 298.15 = ALGO_TEMP_CtoT(25) * R25: NTC standard resistance value at 25C like 10K,5K,100K... * B: B value of NTC like 3435,3950... * Rntc: Current NTC resistance value * Tn: Actual Kelvin temperature(Cn = Tn-273.15) * B = (lnR25 - lnRntc)/(1/T25 - 1/Tn) */ float ALGO_VolToKelvinTemp(float vADC, float vRef, float rRefK, float R25, float B, uint8_t rRefPos) { if(rRefPos == 1){ return ALGO_ResToKelvinTemp(ALGO_VoltageToResDown(vADC, vRef, rRefK), R25, B); } else{ return ALGO_ResToKelvinTemp(ALGO_VoltageToResUp(vADC, vRef, rRefK), R25, B); } } float ALGO_Temp_RTD_Res_Fast(float rtdRes) { return (float)((rtdRes - 100.0f) / 0.385f); } // #include "math.h" #include "ALGO_AlgorithmBase_ATY.h" float ALGO_Temp_RTD_Res_Above(float rtdRes) { return (float)((-(3.9083e-3) + ALGO_Sqrt_NewtonNumber(((3.9083e-3) * (3.9083e-3)) // + sqrt(((3.9083e-3) * (3.9083e-3)) - 4 * (-5.775e-7) * (1 - (rtdRes / 100.0f)))) / (2 * (-5.775e-7))); } float ALGO_Temp_RTD_Res_Below(float rtdRes) { return (float)(-242.02f + 2.2228f * rtdRes + (2.5859e-3) * rtdRes * rtdRes - (4.826e-6) * rtdRes * rtdRes * rtdRes - (2.8183e-8) * rtdRes * rtdRes * rtdRes * rtdRes + (1.5243e-10) * rtdRes * rtdRes * rtdRes * rtdRes * rtdRes); } /** * @brief * * @param type * @param Temp in Degrees Celsius * @return float in mV * @note https://srdata.nist.gov/ */ float ALGO_Temp_TC_TempToVol(uint8_t type, float Temp) { if(type == 'T'){ if(Temp == 0) return 0; else if(Temp > 0){ return (0 + ((0.387481063640e-1) * Temp) + ((0.332922278800e-4) * Temp * Temp) + ((0.206182434040e-6) * Temp * Temp * Temp) + ((-0.218822568460e-8) * Temp * Temp * Temp * Temp) + ((0.109968809280e-10) * Temp * Temp * Temp * Temp * Temp) + ((-0.308157587720e-13) * Temp * Temp * Temp * Temp * Temp * Temp) + ((0.454791352900e-16) * Temp * Temp * Temp * Temp * Temp * Temp * Temp) + ((-0.275129016730e-19) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp)); } else if(Temp < 0){ return (0 + ((0.387481063640e-01) * Temp) + ((0.441944343470e-04) * Temp * Temp) + ((0.118443231050e-06) * Temp * Temp * Temp) + ((0.200329735540e-07) * Temp * Temp * Temp * Temp) + ((0.901380195590e-09) * Temp * Temp * Temp * Temp * Temp) + ((0.226511565930e-10) * Temp * Temp * Temp * Temp * Temp * Temp) + ((0.360711542050e-12) * Temp * Temp * Temp * Temp * Temp * Temp * Temp) + ((0.384939398830e-14) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp) + ((0.282135219250e-16) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp) + ((0.142515947790e-18) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp) + ((0.487686622860e-21) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp) + ((0.107955392700e-23) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp) + ((0.139450270620e-26) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp) + ((0.797951539270e-30) * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp * Temp)); } } return 0; } /** * @brief * * @param type * @param voltage in mV * @return float in Degrees Celsius * @note https://srdata.nist.gov/ */ float ALGO_Temp_TC_VolToTemp(uint8_t type, float voltage) { if(type == 'T'){ if(voltage == 0) return 0; else if(voltage > 0){ return (0 + ((2.592800e1) * voltage) + ((-7.602961e-1) * voltage * voltage) + ((4.637791e-2) * voltage * voltage * voltage) + ((-2.165394e-3) * voltage * voltage * voltage * voltage) + ((6.048144e-5) * voltage * voltage * voltage * voltage * voltage) + ((-7.293422e-7) * voltage * voltage * voltage * voltage * voltage * voltage)); } else if(voltage < 0){ return (0 + ((2.5949192e1) * voltage) + ((-2.1316967e-1) * voltage * voltage) + ((7.9018692e-1) * voltage * voltage * voltage) + ((4.2527777e-1) * voltage * voltage * voltage * voltage) + ((1.3304473e-1) * voltage * voltage * voltage * voltage * voltage) + ((2.0241446e-2) * voltage * voltage * voltage * voltage * voltage * voltage) + ((1.2668171e-3) * voltage * voltage * voltage * voltage * voltage * voltage * voltage)); } } return 0; } // resultTemp = ALGO_ResToKelvinTemp(ALGO_VoltageToResDown(resultTemp, vref_t, 10), 1, 3200); #endif /* __ALGO_Temperature_ATY_C */ /******************************** End Of File *********************************/