做温控器,传感器采用NTC热敏电阻,前几年做的代码,为了省事方便,直接采用查询方法,从头到尾查询一边,一个200个元素的一维数组,例如NTC_ADC_TAB[200],最多要查询200次!方法很笨!

对于强迫症的工程师来说,这是个打心眼里别扭的事情,就像穿西装,打领带这么别扭!

最近项目不忙,对温控器的代码做了优化重构,顺便把温度查表函数做了优化更改,采用二分法,效率显著提升,废话不多,SHOW THE CODE:
————————————————

以下代码采用编程平台:IAR FOR STM8
硬件平台:stm8l152
ADC分辨率:12位
已经在产品上验证并批量出货!PS:做一个靠谱的网友!/*********************** 宏定义 *********************************/
#define NTC_ADC_MAX    201/**************** NTC热敏电阻转换成ADC的值 ***********************/
const uint16_t NTC_ADC_Tab[NTC_ADC_MAX]={2559 ,2555 ,2551 ,2546 ,2542 ,2538 ,2534 ,2529 ,2525 ,2521 ,// 25.0~25.9 ℃2517 ,2513 ,2508 ,2504 ,2500 ,2496 ,2491 ,2487 ,2483 ,2479 ,// 26.0~26.9 ℃2474 ,2470 ,2466 ,2461 ,2457 ,2453 ,2449 ,2444 ,2440 ,2436 ,// 27.0~27.9 ℃2432 ,2427 ,2423 ,2419 ,2415 ,2410 ,2406 ,2402 ,2397 ,2393 ,// 28.0~28.9 ℃2389 ,2385 ,2380 ,2376 ,2372 ,2368 ,2363 ,2359 ,2355 ,2350 ,// 29.0~29.9 ℃2346 ,2342 ,2338 ,2333 ,2329 ,2325 ,2320 ,2316 ,2312 ,2308 ,// 30.0~30.9 ℃2303 ,2299 ,2295 ,2291 ,2286 ,2282 ,2278 ,2273 ,2269 ,2265 ,// 31.0~31.9 ℃2261 ,2256 ,2252 ,2248 ,2243 ,2239 ,2235 ,2231 ,2226 ,2222 ,// 32.0~32.9 ℃2218 ,2214 ,2209 ,2205 ,2201 ,2196 ,2192 ,2188 ,2184 ,2179 ,// 33.0~33.9 ℃2175 ,2171 ,2167 ,2162 ,2158 ,2154 ,2150 ,2145 ,2141 ,2137 ,// 34.0~34.9 ℃2133 ,2128 ,2124 ,2120 ,2116 ,2111 ,2107 ,2103 ,2099 ,2095 ,// 35.0~35.9 ℃2090 ,2086 ,2082 ,2078 ,2073 ,2069 ,2065 ,2061 ,2057 ,2052 ,// 36.0~36.9 ℃2048 ,2044 ,2040 ,2036 ,2031 ,2027 ,2023 ,2019 ,2015 ,2010 ,// 37.0~37.9 ℃2006 ,2002 ,1998 ,1994 ,1990 ,1985 ,1981 ,1977 ,1973 ,1969 ,// 38.0~38.9 ℃1965 ,1960 ,1956 ,1952 ,1948 ,1944 ,1940 ,1936 ,1932 ,1927 ,// 39.0~39.9 ℃1923 ,1919 ,1915 ,1911 ,1907 ,1903 ,1899 ,1895 ,1890 ,1886 ,// 40.0~40.9 ℃1882 ,1878 ,1874 ,1870 ,1866 ,1862 ,1858 ,1854 ,1850 ,1846 ,// 41.0~41.9 ℃1842 ,1838 ,1833 ,1829 ,1825 ,1821 ,1817 ,1813 ,1809 ,1805 ,// 42.0~42.9 ℃1801 ,1797 ,1793 ,1789 ,1785 ,1781 ,1777 ,1773 ,1769 ,1765 ,// 43.0~43.9 ℃1761 ,1757 ,1753 ,1750 ,1746 ,1742 ,1738 ,1734 ,1730 ,1726 ,// 44.0~44.9 ℃1722 ,// 45 ℃
};/*** @brief  二分法查表法,得出单路温度值* @param  pos* @retval TempSingleValue*/
uint16_t get_single_temp(uint8_t pos)
{uint16_t    End = NTC_ADC_MAX - 1;// 数组下标最后一个数uint16_t    Front = 0;// 数组第一个数uint8_t     half = 0;uint16_t    TempSingleADC = 0;// 单次转换的ADC值uint16_t    TempSingleValue = 0;// 单次换算成的温度值,用来函数返回值;ADC_Channel_TypeDef    ADC_Channel_X = ADC_Channel_0;switch(pos){case 0:ADC_Channel_X = ADC_Channel_0;break;case 1:ADC_Channel_X = ADC_Channel_1;break;case 2:ADC_Channel_X = ADC_Channel_2;break;default :break;}/* Enable ADC1 clock */CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);/* Initialize and configure ADC1 */ADC_Init(ADC1, ADC_ConversionMode_Continuous, ADC_Resolution_12Bit, ADC_Prescaler_2);/* ADC channel used for IDD measurement */ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_192Cycles);/* Enable ADC1 */ADC_Cmd(ADC1, ENABLE);Delay(500);/* Disable SchmittTrigger for ADC_Channel, to save power */ADC_SchmittTriggerConfig(ADC1, ADC_Channel_X, DISABLE);/* Enable ADC1 Channel used for LAD measurement */ADC_ChannelCmd(ADC1, ADC_Channel_X, ENABLE);Delay(500);ADC_SoftwareStartConv (ADC1);//开启软件转换while(!ADC_GetFlagStatus (ADC1,ADC_FLAG_EOC));//等待转换结束ADC_ClearFlag (ADC1,ADC_FLAG_EOC);//清除相关标识TempSingleADC = ADC_GetConversionValue (ADC1);//获取转换值;//TempSingleADC = 1722;// 调试二分法查表用的临时赋值,调试代码用;/* DeInitialize ADC1 */ADC_DeInit(ADC1);/* Disable ADC1 clock */CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, DISABLE);ADC_ChannelCmd(ADC1, ADC_Channel_X, DISABLE); /**********二分法查表求温度值*********/if((TempSingleADC <= NTC_ADC_Tab[0])&&(TempSingleADC >= NTC_ADC_Tab[NTC_ADC_MAX-1])){for(half=100;End-Front != 1;){if(TempSingleADC > NTC_ADC_Tab[half]){End = half;half = (End + Front)/2;}else if(TempSingleADC < NTC_ADC_Tab[half]){Front = half;half = (Front + End)/2;}else// 正好等于表格中的值{TempSingleValue = 2500+half*10+(NTC_ADC_Tab[half]-TempSingleADC)*10/(NTC_ADC_Tab[half]-NTC_ADC_Tab[half+1]);break;}}if(End-Front == 1)// 在表格两个值之间的数{TempSingleValue = 2500+half*10+(NTC_ADC_Tab[half]-TempSingleADC)*10/(NTC_ADC_Tab[half]-NTC_ADC_Tab[half+1]);}}else{TempSingleValue = 0;          // 温度超出数组范围,就返回0度}return TempSingleValue;
}

NTC查表法,采用二分法相关推荐

  1. 单片机c语言NTC温度查表程序,STM32查表法读NTC值并显示温度

    STM32查表法读NTC值并显示温度 #include "stm32f10x.h"Y'+F0IZ+ #include "delay.h"pU'`9fLi_ #i ...

  2. STM32 ADC NTC热敏电阻二分(折半)查表法实现测温功能

    本文主要描述 - STM32 ADC NTC热敏电阻二分(折半)查表法测温功能的思路和代码实现 NTC的相关属性:R25=10K±3% B25/50=4100K±3% 10K上拉 STM32 ADC实 ...

  3. HAL库教程14:查表法测量NTC热敏电阻

      STM32F4的AD采样的结果是12位的,即采样的最大值为4096.而参考电压是3.3V,所以3.3V与4096是对应的.当然3.3V只是理想状态,实际上可能略有偏差.假设单片机的AD采集引脚电压 ...

  4. FPGA之道(63)“万能”的查表法

    文章目录 前言 "万能"的查表法 正弦波发生器示例 前言 又好几天没更新了,这就是又停止了读书的节奏,终于在毕业论文可以稍微舒缓下来的时候更新了博客,完成一个系列,读完一本书等等都 ...

  5. 查表法实现反正切_关于python实现CRC32的应用和总结

    关于python实现CRC32的应用和总结 目前使用的Crc计算包含Crc32和Crc32mpeg2两种计算方式. 循环冗余检验 CRC 差错检测技术能够证明数据是完整的,是无差错的(只是非常近似的认 ...

  6. 常用crc查表法_CRC校验码简介及CRC16的计算方法

    点击上方"嵌入式从0到1",选择"置顶/星标公众号" 干货福利,第一时间送达! 什么是CRC校验? CRC即循环冗余校验码(Cyclic Redundancy ...

  7. crc16码表的使用_查表法计算CRC16校验值

    CRC16是单片机程序中常用的一种校验算法.依据所采用多项式的不同,得到的结果也不相同.常用的多项式有CRC-16/IBM和CRC-16/CCITT等.本文代码采用的多项式为CRC-16/IBM: X ...

  8. LUT查表法乘法器所犯下错误。。。。

    程序参见黑金时序篇一章实验五LUT查表法实验,不同的是LUT我用了一个ROM来实现,word depth 256,word size 16,数据用matlab生成,发现matlab确实好强大,不用操作 ...

  9. JAVA-初步认识-第五章-数组-常见操作-进制转换(查表法)

    一. 数组的常见应用 数组在开发中什么时候用? 举例说明: 需求:获取一个整数的十六进制表现形式(要明白十六进制的表现形式是什么样子,有数字有字母) 本来应该返回一个字符串,但是还没有学到返回字符串, ...

最新文章

  1. 青龙面板Nvjdc魔改前段待弹窗---仅支持2.0版本
  2. Spring Boot 2.3.0——以war方式打包失败[webxml attribute is required]解决方案
  3. 第三次学JAVA再学不好就吃翔(part47)--String类的构造方法
  4. ffmpeg库音频解码示例
  5. 虚拟DOM Diff算法解析
  6. 数据结构的堆栈与内存中堆栈的区别
  7. 迟到的tkinter---学校选课刷屏器
  8. Python学习笔记之列表(五)
  9. 我自己比较习惯的Watir自动化测试代码管理方式
  10. python文献检索工具与技巧答案_短文本分析----基于python的TF-IDF特征词标签自动化提取...
  11. Android多点触摸 与 手势识别
  12. 典型计算机控制系统的基本框图6,计算机控制系统复习题标准答案.doc
  13. 2021年中青杯 B题 港珠澳车辆通行(详细解题思路)
  14. 嵌入式系统测试教学实训平台系统情况
  15. 安信可SX1278LORA通讯试验
  16. apicloud菜鸟教程_APICloud 对象之 Method
  17. Java+Swing+MySQL机票预订和管理系统
  18. [转载]NFC功能介绍
  19. android 动态替换logo
  20. 无法访问此网站 - DNS_PROBE_FINISHED_NXDOMAIN

热门文章

  1. 免费报表工具——零基础轻松搞定Web报表
  2. IDEA和PyCharm启动时进入欢迎界面
  3. android studio 分析 hprof,移动学习 AndroidStudio内存优化分析—hprof文件分析
  4. VideoQA论文阅读笔记——TGIF-QA: Toward Spatio-Temporal Reasoning in Visual Question Answering
  5. python实现BPSK调制信号解调
  6. 红外遥控实现回充原理红外发射与调制信号
  7. 车载FM发射器的功用
  8. 实现一个小程序端的直播带货app源码
  9. Halcon之畸变标定Grid-Rectification
  10. 高通平台(8917/8937/8953...) secure boot 软件配置