/**
* @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);
}
// 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
*
* @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 *********************************/