2.23 深大实验 -- ADC中断方式检测NTC热敏电阻测温+数码管显示
2.23.1. 实验介绍 1、熟悉ADC数据采集热敏电阻NTC方法 2、了解使用74HC595控制LED数码管 3、熟悉Ai8051U实验箱原理图与AIapp-ISP系统软件的应用 4、本项目主要熟悉如何管理多文件项目
2.23.1.1、 ADC通过采集NTC热敏电阻的电压值进行测温 NTCthermistor,即 Negative Temperature Coefficientthermistor,即“负温度系数热敏电阻”,其电阻值随温度升高而减小, ADC测温通过ADC3通道采集NTC热敏电阻的电压值来计算出温度值。 如图所示,NTC热敏电阻与10K精密电阻R165串联分压后的电压输入到ADC3脚位,而热敏电阻随温度变化,阻值会产生变化, 从而导致分压电压跟着改变,于是通过ADC采集分压电压值,再根据热敏电阻的温度与阻值变化特性关系就能计算出温度值。
本实验程序通过查表法计算温度值,使用Excel软件生成温度与ADC读数对应表,放到程序 temp_table 数组里,供查表计算使用:
表格存放从 -40~120度对应的ADC数据,分度值为1度,ADC采集到的NTC数据与表格进行比较,从表格里找到最接近的数据所对应的温度就是当前NTC感应到的温度。 为了从表格里快速查找最接近的数据,我们采用二分法查表加快查找速度。 例如 -40度数据存放在数组temp_table[0],120度数据存放在数组temp_table[160], 取中间的temp_table[80]数据跟ADC采样数据进行对比,如果ADC采样数据小于temp_table[80], 就可以排除后面一半表格的数据,从前面一半数据里面再次进行对分比较,依此类推: 160 / 2 = 80 80 / 2 = 40 40 / 2 = 20 20 / 2 = 10 10 / 2 = 5 经过5次对分查表后,剩下的数据只有temp_table[n]~temp_table[n+5] 这几个数据, 然后进行逐个比较,如果ADC采样数据跟其中一个数据正好相等的话,那么当前温度值就是这个数据所对应的温度。 如果ADC采样数据在两个表格数据之间,则进行线性插补。 例如ADC采样数据为2063,经过比较后发现在表格数据的2048(25度)与2093(26度)之间,则计算其百分比值作为温度的小数值。 为了方便计算,我们将最终数据放大10倍,这样就可以使用整数计算,提高计算速度: 1度的差值:2093 -2048 = 45 当前读数不满1度的值:2063 - 2048 = 15 计算小数部分,放大10倍:15*10 / 45 = 3 //取整 从而得出当前温度值为25.3度。 为了避免浮点计算,本实验使用整数来处理,人为规定一个0点(即定点计算),并且温度值扩大10倍(即分辨率为0.1度), 表格中0度对应的数据序号是40,扩大10倍为400,即400表示0度,大于400为正的温度,小于400为负的温度。 比如查表计算的结果是653,则实际温度为(653-400)/10 = 25.3度。 比如查表计算的结果是300,则实际温度为(300-400)/10 = -10.0度。
2.23.1.2、 操作说明和实验现象 将本项目的HEX文件下载到Ai8051U的实验箱后 1、测量NTC温度,需要短接试验箱JUP2右侧两个跳线,才能连接NTC到芯片ADC脚:
2、在LED数码管上面低4位会动态显示当前的NTC测量的温度,高4位显示NTC的ADC值补码:
3、NTC热敏电阻在实验箱背面,用手指触摸,或者向其吹气,可改变测量的温度值:
2.23.1.3、 Keil环境下多文件项目管理说明 当项目的功能比较复杂时,就需要在Keil中建立多文件项目,以方便分工合作、代码复用、模块化管理、增强可读性和可维护性。 Ø 比较好的建议是将项目功能模块化,不同模块的实现代码放在不同的.c文件中。 Ø 一般建议是一个模块对应一个.c程序文件和一个.h头文件 Ø 模块的初始化函数以及相关的数据处理函数都在.c文件中实现 Ø 与模块相关的全局变量也必须在.c文件中进行定义,一定不能在.h文件中定义变量 Ø 如果有其他模块需要使用本模块定义的变量或函数,则这些函数和变量都需要在.h文件中声明。 Ø 特别提醒:在.h文件中声明外部变量必须使用extern关键字,否则就变成变量定义了,这样会出现变量重复定义的错误 Ø 为防止头文件被多次包含而产生错误或者警告,在头文件中使用类似如下的条件编译组合语句,可避免在同一个.c文件中对同一个.h头文件进行多次包含: #ifndef XXXX #define XXXX ... #endif
|