|
@@ -6,7 +6,7 @@
|
|
|
* @author ATY
|
|
* @author ATY
|
|
|
*
|
|
*
|
|
|
* @copyright
|
|
* @copyright
|
|
|
-* - Copyright 2017 - 2023 MZ-ATY
|
|
|
|
|
|
|
+* - Copyright 2017 - 2025 MZ-ATY
|
|
|
* - This code follows:
|
|
* - This code follows:
|
|
|
* - MZ-ATY Various Contents Joint Statement -
|
|
* - MZ-ATY Various Contents Joint Statement -
|
|
|
* <a href="https://mengze.top/MZ-ATY_VCJS">
|
|
* <a href="https://mengze.top/MZ-ATY_VCJS">
|
|
@@ -41,13 +41,13 @@
|
|
|
* @param C C value of NTC
|
|
* @param C C value of NTC
|
|
|
* @return Current temperature in Celsius
|
|
* @return Current temperature in Celsius
|
|
|
*/
|
|
*/
|
|
|
-float ALGO_ResToKelvinTempABC(float Rntc, float A, float B, float C)
|
|
|
|
|
|
|
+double ALGO_ResToKelvinTempABC(double Rntc, double A, double B, double C)
|
|
|
{
|
|
{
|
|
|
- float Tn = 0.0;
|
|
|
|
|
- float Cn = 0.0;
|
|
|
|
|
|
|
+ double Tn = 0.0;
|
|
|
|
|
+ double Cn = 0.0;
|
|
|
|
|
|
|
|
Tn = (A + (B * ALGO_MATH_LogLn(Rntc)) + (C * ALGO_MATH_LogLn(Rntc) * ALGO_MATH_LogLn(Rntc) * ALGO_MATH_LogLn(Rntc)));
|
|
Tn = (A + (B * ALGO_MATH_LogLn(Rntc)) + (C * ALGO_MATH_LogLn(Rntc) * ALGO_MATH_LogLn(Rntc) * ALGO_MATH_LogLn(Rntc)));
|
|
|
- Tn = 1 / Tn;
|
|
|
|
|
|
|
+ Tn = 1.0 / Tn;
|
|
|
Cn = ALGO_TEMP_TtoC(Tn);
|
|
Cn = ALGO_TEMP_TtoC(Tn);
|
|
|
|
|
|
|
|
return Cn;
|
|
return Cn;
|
|
@@ -66,16 +66,20 @@ float ALGO_ResToKelvinTempABC(float Rntc, float A, float B, float C)
|
|
|
* Tn: Actual Kelvin temperature(Cn = Tn-273.15)
|
|
* Tn: Actual Kelvin temperature(Cn = Tn-273.15)
|
|
|
* B = (lnR25 - lnRntc)/(1/T25 - 1/Tn)
|
|
* B = (lnR25 - lnRntc)/(1/T25 - 1/Tn)
|
|
|
*/
|
|
*/
|
|
|
-float ALGO_ResToKelvinTemp(float Rntc, float R25, float B)
|
|
|
|
|
|
|
+#include "math.h"
|
|
|
|
|
+double ALGO_ResToKelvinTemp(double Rntc, double R25, double B)
|
|
|
{
|
|
{
|
|
|
- float Tn = 0.0;
|
|
|
|
|
- float Cn = 0.0;
|
|
|
|
|
|
|
+ if(Rntc <= 0) return 0;
|
|
|
|
|
+ if(R25 <= 0) return 0;
|
|
|
|
|
|
|
|
- float temp_f[2];
|
|
|
|
|
|
|
+ double Tn = 0.0;
|
|
|
|
|
+ double Cn = 0.0;
|
|
|
|
|
+ double 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];
|
|
|
|
|
|
|
+ // temp_f[0] = (ALGO_MATH_LogLn(R25) - ALGO_MATH_LogLn(Rntc)) / B;
|
|
|
|
|
+ temp_f[0] = (log(R25) - log(Rntc)) / B;
|
|
|
|
|
+ temp_f[1] = (1.0 / ALGO_TEMP_CtoT(25)) - temp_f[0];
|
|
|
|
|
+ Tn = 1.0 / temp_f[1];
|
|
|
Cn = ALGO_TEMP_TtoC(Tn);
|
|
Cn = ALGO_TEMP_TtoC(Tn);
|
|
|
|
|
|
|
|
return Cn;
|
|
return Cn;
|
|
@@ -97,7 +101,7 @@ float ALGO_ResToKelvinTemp(float Rntc, float R25, float B)
|
|
|
* Tn: Actual Kelvin temperature(Cn = Tn-273.15)
|
|
* Tn: Actual Kelvin temperature(Cn = Tn-273.15)
|
|
|
* B = (lnR25 - lnRntc)/(1/T25 - 1/Tn)
|
|
* B = (lnR25 - lnRntc)/(1/T25 - 1/Tn)
|
|
|
*/
|
|
*/
|
|
|
-float ALGO_VolToKelvinTemp(float vADC, float vRef, float rRefK, float R25, float B, uint8_t rRefPos)
|
|
|
|
|
|
|
+double ALGO_VolToKelvinTemp(double vADC, double vRef, double rRefK, double R25, double B, uint8_t rRefPos)
|
|
|
{
|
|
{
|
|
|
if(rRefPos == 1){
|
|
if(rRefPos == 1){
|
|
|
return ALGO_ResToKelvinTemp(ALGO_VoltageToResDown(vADC, vRef, rRefK), R25, B);
|
|
return ALGO_ResToKelvinTemp(ALGO_VoltageToResDown(vADC, vRef, rRefK), R25, B);
|
|
@@ -108,24 +112,25 @@ float ALGO_VolToKelvinTemp(float vADC, float vRef, float rRefK, float R25, float
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
-float ALGO_Temp_RTD_Res_Fast(float rtdRes)
|
|
|
|
|
|
|
+// PT100
|
|
|
|
|
+double ALGO_Temp_RTD_Res_Fast(double rtdRes)
|
|
|
{
|
|
{
|
|
|
- return (float)((rtdRes - 100.0f) / 0.385f);
|
|
|
|
|
|
|
+ return (double)((rtdRes - 100.0) / 0.385);
|
|
|
}
|
|
}
|
|
|
// #include "math.h"
|
|
// #include "math.h"
|
|
|
#include "ALGO_AlgorithmBase_ATY.h"
|
|
#include "ALGO_AlgorithmBase_ATY.h"
|
|
|
-float ALGO_Temp_RTD_Res_Above(float rtdRes)
|
|
|
|
|
|
|
+double ALGO_Temp_RTD_Res_Above(double rtdRes)
|
|
|
{
|
|
{
|
|
|
- return (float)((-(3.9083e-3)
|
|
|
|
|
|
|
+ return (double)((-(3.9083e-3)
|
|
|
+ ALGO_Sqrt_NewtonNumber(((3.9083e-3) * (3.9083e-3))
|
|
+ ALGO_Sqrt_NewtonNumber(((3.9083e-3) * (3.9083e-3))
|
|
|
// + sqrt(((3.9083e-3) * (3.9083e-3))
|
|
// + sqrt(((3.9083e-3) * (3.9083e-3))
|
|
|
- 4 * (-5.775e-7) * (1 - (rtdRes / 100.0f))))
|
|
- 4 * (-5.775e-7) * (1 - (rtdRes / 100.0f))))
|
|
|
/ (2 * (-5.775e-7)));
|
|
/ (2 * (-5.775e-7)));
|
|
|
}
|
|
}
|
|
|
-float ALGO_Temp_RTD_Res_Below(float rtdRes)
|
|
|
|
|
|
|
+double ALGO_Temp_RTD_Res_Below(double rtdRes)
|
|
|
{
|
|
{
|
|
|
- return (float)(-242.02f
|
|
|
|
|
- + 2.2228f * rtdRes
|
|
|
|
|
|
|
+ return (double)(-242.02
|
|
|
|
|
+ + 2.2228 * rtdRes
|
|
|
+ (2.5859e-3) * rtdRes * rtdRes
|
|
+ (2.5859e-3) * rtdRes * rtdRes
|
|
|
- (4.826e-6) * rtdRes * rtdRes * rtdRes
|
|
- (4.826e-6) * rtdRes * rtdRes * rtdRes
|
|
|
- (2.8183e-8) * rtdRes * rtdRes * rtdRes * rtdRes
|
|
- (2.8183e-8) * rtdRes * rtdRes * rtdRes * rtdRes
|
|
@@ -240,10 +245,10 @@ double ALGO_Temp_RTD_Res_PT1000(double resist)
|
|
|
*
|
|
*
|
|
|
* @param type
|
|
* @param type
|
|
|
* @param Temp in Degrees Celsius
|
|
* @param Temp in Degrees Celsius
|
|
|
- * @return float in mV
|
|
|
|
|
|
|
+ * @return double in mV
|
|
|
* @note https://srdata.nist.gov/
|
|
* @note https://srdata.nist.gov/
|
|
|
*/
|
|
*/
|
|
|
-float ALGO_Temp_TC_TempToVol(uint8_t type, float Temp)
|
|
|
|
|
|
|
+double ALGO_Temp_TC_TempToVol(uint8_t type, double Temp)
|
|
|
{
|
|
{
|
|
|
if(type == 'T'){
|
|
if(type == 'T'){
|
|
|
if(Temp == 0)
|
|
if(Temp == 0)
|
|
@@ -285,10 +290,10 @@ float ALGO_Temp_TC_TempToVol(uint8_t type, float Temp)
|
|
|
*
|
|
*
|
|
|
* @param type
|
|
* @param type
|
|
|
* @param voltage in mV
|
|
* @param voltage in mV
|
|
|
- * @return float in Degrees Celsius
|
|
|
|
|
|
|
+ * @return double in Degrees Celsius
|
|
|
* @note https://srdata.nist.gov/
|
|
* @note https://srdata.nist.gov/
|
|
|
*/
|
|
*/
|
|
|
-float ALGO_Temp_TC_VolToTemp(uint8_t type, float voltage)
|
|
|
|
|
|
|
+double ALGO_Temp_TC_VolToTemp(uint8_t type, double voltage)
|
|
|
{
|
|
{
|
|
|
if(type == 'T'){
|
|
if(type == 'T'){
|
|
|
if(voltage == 0)
|
|
if(voltage == 0)
|
|
@@ -320,6 +325,69 @@ float ALGO_Temp_TC_VolToTemp(uint8_t type, float voltage)
|
|
|
// resultTemp = ALGO_ResToKelvinTemp(ALGO_VoltageToResDown(resultTemp, vref_t, 10), 1, 3200);
|
|
// resultTemp = ALGO_ResToKelvinTemp(ALGO_VoltageToResDown(resultTemp, vref_t, 10), 1, 3200);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+uint16_t binarySearch(const double* arr, uint16_t size, double target) {
|
|
|
|
|
+ for(uint16_t left = 0, right = size - 1, mid; left <= right; ) {
|
|
|
|
|
+ if((arr[mid = left + (right - left) / 2]) == target) return mid;
|
|
|
|
|
+ (arr[mid] < target) ? (left = mid + 1) : (right = mid - 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ return -1;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+double ALGO_RT_Table_R2T(double R, double* tableT, double* tableR, uint16_t tableSize)
|
|
|
|
|
+{
|
|
|
|
|
+ // check border
|
|
|
|
|
+ if(R < tableR[tableSize - 1] ||
|
|
|
|
|
+ R > tableR[0]) {
|
|
|
|
|
+ return 0.0;
|
|
|
|
|
+ }
|
|
|
|
|
+ uint16_t index = binarySearch(tableR, tableSize, R);
|
|
|
|
|
+ if(index < 0 || index >= tableSize - 1) {
|
|
|
|
|
+ return 0.0;
|
|
|
|
|
+ }
|
|
|
|
|
+ double T1 = tableT[index];
|
|
|
|
|
+ double T2 = tableT[index + 1];
|
|
|
|
|
+ double R1 = tableR[index];
|
|
|
|
|
+ double R2 = tableR[index + 1];
|
|
|
|
|
+ return T1 + (R - R1) * (T2 - T1) / (R2 - R1);
|
|
|
|
|
+
|
|
|
|
|
+ // cycle
|
|
|
|
|
+ // for(uint16_t i = 0; i < tableSize - 1; i++) {
|
|
|
|
|
+ // if(R == tableR[i]){
|
|
|
|
|
+ // return tableT[i];
|
|
|
|
|
+ // }
|
|
|
|
|
+ // if(R <= tableR[i] && R >= tableR[i + 1]) {
|
|
|
|
|
+ // double T1 = tableT[i];
|
|
|
|
|
+ // double T2 = tableT[i + 1];
|
|
|
|
|
+ // double R1 = tableR[i];
|
|
|
|
|
+ // double R2 = tableR[i + 1];
|
|
|
|
|
+ // return T1 + (R - R1) * (T2 - T1) / (R2 - R1);
|
|
|
|
|
+ // }
|
|
|
|
|
+ // }
|
|
|
|
|
+ // return 0.0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+double ALGO_RT_Table_T2R(double T, double* tableT, double* tableR, uint16_t tableSize)
|
|
|
|
|
+{
|
|
|
|
|
+ // check border
|
|
|
|
|
+ if(T < tableT[tableSize - 1] ||
|
|
|
|
|
+ T > tableT[0]) {
|
|
|
|
|
+ return 0.0;
|
|
|
|
|
+ }
|
|
|
|
|
+ uint16_t index = binarySearch(tableT, tableSize, R);
|
|
|
|
|
+ if(index < 0 || index >= tableSize - 1) {
|
|
|
|
|
+ return 0.0;
|
|
|
|
|
+ }
|
|
|
|
|
+ double T1 = tableT[index];
|
|
|
|
|
+ double T2 = tableT[index + 1];
|
|
|
|
|
+ double R1 = tableR[index];
|
|
|
|
|
+ double R2 = tableR[index + 1];
|
|
|
|
|
+
|
|
|
|
|
+ return R1 + (T - T1) * (R2 - R1) / (T2 - T1);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
#endif /* __ALGO_Temperature_ATY_C */
|
|
#endif /* __ALGO_Temperature_ATY_C */
|
|
|
|
|
|
|
|
/******************************** End Of File *********************************/
|
|
/******************************** End Of File *********************************/
|