单片机NTC热敏电阻数据处理与查表法应用

版权申诉
0 下载量 173 浏览量 更新于2024-11-13 收藏 1KB RAR 举报
资源摘要信息:"chabiaofa.rar_NTC热敏电阻" 本文档主要介绍了基于单片机的NTC热敏电阻数据查找与处理方法。NTC热敏电阻是一种广泛应用于温度检测的电子元器件,其电阻值会随着温度的变化而变化。单片机通过特定的算法对NTC热敏电阻的电阻值进行采样和处理,可以实现对温度的精确测量。在此过程中,查表法是一种常用且有效的数据处理技术,能够快速准确地将NTC热敏电阻的电阻值转换为对应的温度值。 1. 查表法原理 查表法是一种预存储数据检索技术,通常用于将传感器输出的非线性数据转换为线性数据,或者将传感器输出的模拟量转换为数字量。在单片机系统中,查表法可以将预先计算好的温度与电阻值的对应关系存储在单片机的内存中。当需要实时测量温度时,单片机通过读取NTC热敏电阻的电阻值,通过查表法快速找到对应的温度值。 2. 查表法的实现步骤 查表法的实现通常包括以下几个步骤: - 数据准备:首先需要获取NTC热敏电阻的特性曲线,或者根据其特性方程计算出一系列温度值与电阻值的对应数据。 - 表格制作:将上述数据制作成查找表,可以是一个数组或表格形式,存储在单片机的ROM或RAM中。 - 算法设计:编写程序,根据输入的电阻值,通过查找表得到对应的温度值。 - 精度与优化:根据实际应用的精度需求,对查表法进行优化处理,比如使用插值算法来提高查找精度。 3. 单片机处理NTC热敏电阻数据 在单片机处理NTC热敏电阻数据时,需要考虑以下几点: - 模拟-数字转换:由于NTC热敏电阻的电阻值是模拟量,需要通过ADC(模拟-数字转换器)转换为单片机可以处理的数字量。 - 线性化处理:由于NTC热敏电阻的特性是非线性的,通常需要通过一定的数学变换将其线性化,以便于处理。 - 温度计算:根据线性化后的数据,通过查表法快速得到温度读数。 - 校准与修正:对系统进行校准,消除误差,确保温度读数的准确性。 4. 压缩包子文件内容概览 文档中提到的"chabiaofa.txt"、"gytr.txt"和"zxur.txt"三个文件可能包含了相关的查找表数据、算法代码以及使用说明。具体来说: - "chabiaofa.txt":可能包含NTC热敏电阻的查找表数据,以及如何在单片机程序中使用查找表的方法说明。 - "gytr.txt":可能包含NTC热敏电阻的校准和修正数据,或者具体的算法代码实现。 - "zxur.txt":可能包含应用案例或者系统的使用说明,帮助用户更好地理解和运用查表法。 综上所述,本文档提供的内容涉及了查表法在NTC热敏电阻数据处理中的应用,详细介绍了查表法的工作原理、实现步骤以及在单片机系统中的实现方法。通过对相关文件内容的分析,可以更好地理解如何利用单片机对NTC热敏电阻进行有效、精确的数据处理。

优化代码 def module_split(self, save_on=True): """ split module data :param save_on: :return: """ for ms in range(self.mod_num): m_sn = self.module_list[ms] module_path = os.path.join(self.result_path_down, m_sn) cols_obj = ChuNengPackMustCols(ms, self.mod_cell_num, self.mod_cell_num) # 传入当前的module序号(如0,1,2,3,4),电芯电压个数,温度NTC个数。 aim_cols = [i for i in cols_obj.total_cols if i in self.df.columns] print(m_sn, aim_cols) self.modules[m_sn] = rename_cols_normal(self.df.loc[:, aim_cols], ms, self.mod_cell_num) print("after change cols name:", ms, m_sn, self.modules[m_sn].columns.tolist()) self.modules[m_sn].dropna(axis=0, how='any', subset=['soc'], inplace=True) volt_col = [f'volt{i}' for i in range(self.mod_cell_num)] temp_col = [f'temp{i}' for i in range(self.mod_cell_num)] self.modules[m_sn].dropna(axis=0, how='any', subset=volt_col, inplace=True) self.modules[m_sn] = stat(self.modules[m_sn], volt_col, temp_col) self.modules[m_sn].reset_index(drop=True, inplace=True) print(self.modules[m_sn]['discharge_ah'].iloc[-1]) self.module_cap[m_sn] = [self.modules[m_sn]['discharge_ah'].iloc[-1], self.modules[m_sn]['charge_ah'].iloc[-1], self.modules[m_sn]['soh'].iloc[-1]] self.module_peaks[m_sn] = list(quick_report(self.modules[m_sn], module_path, f'quick_report_{m_sn[:8]}')) # check soc status mod_soc = self.modules[m_sn]['soc'] self.module_soc_sig[m_sn] = [np.nanmedian(mod_soc), np.max(mod_soc), np.min(mod_soc)] if save_on: single_variables_plot(mod_soc, module_path, f'{m_sn[:8]}_soc_distribution_box.png', 'box', 'SOC') single_variables_plot(mod_soc, module_path, f'{m_sn[:8]}_soc_distribution_violin.png', 'violin', 'SOC')

2023-05-25 上传

/******************************************************************************* ** 函数名称: App_PACK_TempData_Read ** 功能描述: 读取电池PACK箱内温度 ** 输  入: 无 ** 输  出: 无 ** 返  回: 无 ** 备 注:无 ** 最后修改: 2020年10月12日 *******************************************************************************/ uint8_t App_PACK_TempData_Read() { uint8_t u8_Index; uint32_t u32_DataTemp; #if 1 u32_DataTemp = 0; for(u8_Index=0; u8_Index<ADC3_DMA2_CHANNEL_BUF_LEN; u8_Index = u8_Index+1)//累加 { u32_DataTemp += u16_ADC3_DMA2_Value[u8_Index][ADC3_IN11_CHANNEL_OFFSET]; } #endif u32_DataTemp = u32_DataTemp/ADC3_DMA2_CHANNEL_BUF_LEN; //取平均值 ADC3_DMA2_CHANNEL_BUF_LEN ADC DMA采集BUFF大小 //以上操作 是为了计算DMA采集到的 ADC数据的平均值 #if 1 u32_DataTemp = App_ADCTempCorrect(u32_DataTemp);//对温度的ADC值使用KB值进行校准修正 #endif st_BMUMonitor.st_BoardTemp.st_LTC6813Data.u16_ADCValue = (uint16_t)u32_DataTemp; Dat_NTC_TempValueCalc(NTC_TABLE_ADC, st_BMUMonitor.st_BoardTemp.st_LTC6813Data.u16_ADCValue, &st_TempCalc.st_Board);//未知处理,返回p_st_TempCalc->f32_Real 温度实时计算值 有进行查表 st_TempCalc.st_Board.f32_Filter += 0.8f * (st_TempCalc.st_Board.f32_Real - st_TempCalc.st_Board.f32_Filter); f_UpDnLimit(&st_TempCalc.st_Board.f32_Filter,170,-50);//限幅函数,输出st_TempCalc.st_Board.f32_Filter 温度滤波值 st_BMUMonitor.st_BoardTemp.f32_Value = st_TempCalc.st_Board.f32_Filter; st_BMUMonitor.st_BoardTemp.s16_Value = (int16_t)(st_BMUMonitor.st_BoardTemp.f32_Value * 10); //此处得出温度后被调用发送 BMU发送PACK箱体数据1 return 0x00; }

2023-07-14 上传