/********************************************************************************************************* * Module : Temprature.c * Abstract : Temprature module * Version : 1.0.0 * Author : Leopul(COPYRIGHT 2025 - 2027 Leopul. All rights reserved.) * Complete : 2025-02-16 * Content : None * Note : None *********************************************************************************************************/ #include "Temprature.h" #include "Adc.h" #include "main.h" #include "math.h" /**************************************************************** * * NXFT15XH103 * * T(K) = (662.666 -45.389*ln(R)+0.069*(ln(R))^3) * T(C) = T(K) - 273.15 * *****************************************************************/ static float get_temp(void); #define GATHER_MAX 2000 #define VREF 33 #define V_HOT(ad) (((ad * 1000)>>12) * VREF / 10.0 /1000.0) #define R_HOT(ad) ((V_HOT(ad)*10000.0) / ((VREF/10.0)-(2.0*V_HOT(ad)))) #define T_TEMP(res) ((662.7481 - (45.40407 * log(res)) + (0.06895 * log(res)*log(res)*log(res))) - 273.15) //static uint32_t gather_count = 0; //static uint32_t all_get_ad = 0; static float get_temp(void) { sts_data_t *data = get_sts(); uint32_t all_get_ad = 0; float temprature = 0.0; for(uint32_t i = 0; i < GATHER_MAX ;i++) { all_get_ad += get_adc(); } all_get_ad /= GATHER_MAX; float v_hot = V_HOT(all_get_ad); if(v_hot < 3.3) { float i_current = (3.3 - v_hot) / (10000); float res = v_hot / i_current; temprature = T_TEMP(res); if(((uint32_t)res)>=598 && ((uint32_t)res) <= 197000) { data->m_data.temprature_flag = TEMP_ONLINE; data->m_data.temprature = temprature * 100; }else { data->m_data.temprature_flag = TEMP_INLINE; data->m_data.temprature =(-88.88 *100); } }else { data->m_data.temprature_flag = TEMP_INLINE; data->m_data.temprature =(-88.88 *100); } return temprature; } void temp_init(void) { adc_init(); sts_data_t *data = get_sts(); data->read_temp = get_temp; }