使用热敏电阻读取ADC值并根据NTC参数表得到温度数据:

参考原理图:

本文介绍的程序对应的热敏电阻型号是 NTC-MF52AT 10K 5%精度 B值:3950 1%

长这样

虽然不及一些高价带协议需要驱动协议的传感器,但是价格摆在这里的,不到一毛钱就可以测温了,精度上还是能用的,而且驱动也非常简单。另外注意的是C文件里面的线性表,就是那个常量数组,需要根据所使用的探头的厂家参数去更改。拿到数据后如何快速生成线性表可以看看我之前的文章,我记得应该是有笔记的,这里就不啰嗦了。

下面是我使用的传感器参数:

H文件:

#ifndef __FY_NTC_H
#define __FY_NTC_H#include "fy_includes.h"#define NTC_UP 0    //1=在上面  0=在下面#ifndef s16
typdef signed int s16;
#endif#ifndef u16
typdef unsigned int u16;
#endifs16 NtcGetTemp(u16 adc);#endif

C文件:

#include "fy_ntc.h"#define NTC_R  10  //串联电阻 单位K#define ADC_MAX 4095.0    //12位ADC
//#define ADC_MAX 1023.0    //10位ADC#if NTC_UP    //NTC在电源端#define NTC_ADC(ntc)   (u16)(((NTC_R*ADC_MAX)/(ntc+NTC_R)))//阻值与ADC关系 NTC在上面  ADC值升序
#else   //NTC在接地端#define NTC_ADC(ntc)   (u16)(((ntc*ADC_MAX)/(ntc+NTC_R)))//阻值与ADC关系 NTC在下面  ADC值降序
#endif
//温度阻值-ADC值表 单位K(根据所选型号确定)
//温度值上升排序
const unsigned int ntcData[]= {    NTC_ADC(    190.5562    ),//-40NTC_ADC( 183.4132    ),NTC_ADC(  175.6740    ),NTC_ADC(  167.6467    ),NTC_ADC(  159.5647    ),NTC_ADC(  151.5975    ),NTC_ADC(  143.8624    ),NTC_ADC(  136.4361    ),NTC_ADC(  129.3641    ),NTC_ADC(  122.6678    ),NTC_ADC(  116.3519    ),NTC_ADC(  110.4098    ),NTC_ADC(  104.8272    ),NTC_ADC(  99.5847 ),NTC_ADC(  94.6608 ),NTC_ADC(  90.0326 ),NTC_ADC(  85.6778 ),NTC_ADC(  81.5747 ),NTC_ADC(  77.7031 ),NTC_ADC(  74.0442 ),NTC_ADC(  70.5811 ),NTC_ADC(  67.2987 ),NTC_ADC(  64.1834 ),NTC_ADC(  61.2233 ),NTC_ADC(  58.4080 ),NTC_ADC(  55.7284 ),NTC_ADC(  53.1766 ),NTC_ADC(  50.7456 ),NTC_ADC(  48.4294 ),NTC_ADC(  46.2224 ),NTC_ADC(  44.1201 ),NTC_ADC(  42.1180 ),NTC_ADC(  40.2121 ),NTC_ADC(  38.3988 ),NTC_ADC(  36.6746 ),NTC_ADC(  35.0362 ),NTC_ADC(  33.4802 ),NTC_ADC(  32.0035 ),NTC_ADC(  30.6028 ),NTC_ADC(  29.2750 ),NTC_ADC(  28.0170 ),NTC_ADC(  26.8255 ),NTC_ADC(  25.6972 ),NTC_ADC(  24.6290 ),NTC_ADC(  23.6176 ),NTC_ADC(  22.6597 ),NTC_ADC(  21.7522 ),NTC_ADC(  20.8916 ),NTC_ADC(  20.0749 ),NTC_ADC(  19.2988 ),NTC_ADC(  18.5600 ),NTC_ADC(  18.4818 ),NTC_ADC(  18.1489 ),NTC_ADC(  17.6316 ),NTC_ADC(  16.9917 ),NTC_ADC(  16.2797 ),NTC_ADC(  15.5350 ),NTC_ADC(  14.7867 ),NTC_ADC(  14.0551 ),NTC_ADC(  13.3536 ),NTC_ADC(  12.6900 ),NTC_ADC(  12.0684 ),NTC_ADC(  11.4900 ),NTC_ADC(  10.9539 ),NTC_ADC(  10.4582 ),NTC_ADC(  10.0000 ),NTC_ADC(  9.5762  ),NTC_ADC(  9.1835  ),NTC_ADC(  8.8186  ),NTC_ADC(  8.4784  ),NTC_ADC(  8.1600  ),NTC_ADC(  7.8608  ),NTC_ADC(  7.5785  ),NTC_ADC(  7.3109  ),NTC_ADC(  7.0564  ),NTC_ADC(  6.8133  ),NTC_ADC(  6.5806  ),NTC_ADC(  6.3570  ),NTC_ADC(  6.1418  ),NTC_ADC(  5.9343  ),NTC_ADC(  5.7340  ),NTC_ADC(  5.5405  ),NTC_ADC(  5.3534  ),NTC_ADC(  5.1725  ),NTC_ADC(  4.9976  ),NTC_ADC(  4.8286  ),NTC_ADC(  4.6652  ),NTC_ADC(  4.5073  ),NTC_ADC(  4.3548  ),NTC_ADC(  4.2075  ),NTC_ADC(  4.0650  ),NTC_ADC(  3.9271  ),NTC_ADC(  3.7936  ),NTC_ADC(  3.6639  ),NTC_ADC(  3.5377  ),NTC_ADC(  3.4146  ),NTC_ADC(  3.2939  ),NTC_ADC(  3.1752  ),NTC_ADC(  3.0579  ),NTC_ADC(  2.9414  ),NTC_ADC(  2.8250  ),NTC_ADC(  2.7762  ),NTC_ADC(  2.7179  ),NTC_ADC(  2.6523  ),NTC_ADC(  2.5817  ),NTC_ADC(  2.5076  ),NTC_ADC(  2.4319  ),NTC_ADC(  2.3557  ),NTC_ADC(  2.2803  ),NTC_ADC(  2.2065  ),NTC_ADC(  2.1350  ),NTC_ADC(  2.0661  ),NTC_ADC(  2.0004  ),NTC_ADC(  1.9378  ),NTC_ADC(  1.8785  ),NTC_ADC(  1.8225  ),NTC_ADC(  1.7696  ),NTC_ADC(  1.7197  ),NTC_ADC(  1.6727  ),NTC_ADC(  1.6282  ),NTC_ADC(  1.5860  ),NTC_ADC(  1.5458  ),NTC_ADC(  1.5075  ),NTC_ADC(  1.4707  ),NTC_ADC(  1.4352  ),NTC_ADC(  1.4006  ),NTC_ADC(  1.3669  ),NTC_ADC(  1.3337  ),NTC_ADC(  1.3009  ),NTC_ADC(  1.2684  ),NTC_ADC(  1.2360  ),NTC_ADC(  1.2037  ),NTC_ADC(  1.1714  ),NTC_ADC(  1.1390  ),NTC_ADC(  1.1067  ),NTC_ADC(  1.0744  ),NTC_ADC(  1.0422  ),NTC_ADC(  1.0104  ),NTC_ADC(  0.9789  ),NTC_ADC(  0.9481  ),NTC_ADC(  0.9180  ),NTC_ADC(  0.8889  ),NTC_ADC(  0.8610  ),NTC_ADC(  0.8346  ),NTC_ADC(  0.8099  ),NTC_ADC(  0.7870  ),NTC_ADC(  0.7665  ),NTC_ADC(  0.7485  ),NTC_ADC(  0.7334  ),NTC_ADC(  0.7214  ),NTC_ADC(  0.7130  ),//110
};#if NTC_UP
//NTC 温度计算,输入当前ADC电压值 0.1du
//ADC值随温度上升而上升
s16 NtcGetTemp(u16 adc)
{u16 i;s16 tp;adc+=70;for (i=0; i<151; i++){if (adc<ntcData[i]){break;}}if (i==0){tp=-4000;//最低温度}else if (i>=151){tp=1100;//最高温度}else{tp=(adc-ntcData[i-1])*10/(ntcData[i]-ntcData[i-1])+(i-40-1)*10;}return tp;}
#else
//NTC 温度计算,输入当前ADC电压值 0.1du
//ADC值随温度上升而下降
s16 NtcGetTemp(u16 adc)
{u16 i;s16 tp;adc+=70;for (i=0; i<151; i++){if (adc>ntcData[i]){break;}}if (i==0){tp=-4000;//最低温度}else if (i>=151){tp=1100;//最高温度110度}else{tp=(ntcData[i-1]-adc)*10/(ntcData[i-1]-ntcData[i])+(i-40-1)*10;}return tp;}
#endif

使用举例:

//Adc_Value :ADC采集到的值
//temp转换后的温度值xxx.x度
temp = 0.1f * NtcGetTemp(Adc_Value);

By Urien 2019年8月17日 15:48:51

【单片机笔记】详解如何用廉价NTC电阻准确高效的测量温度(附源码)相关推荐

  1. 【Spring AOP】@Aspect结合案例详解(二): @Pointcut使用@within和within(已附源码)

    文章目录 前言 @within 完善打印日志案例 @within深入说明 within 匹配指定类 匹配指定包(package) 源码下载 总结 前言 在微服务流行的当下,在使用Spring Clou ...

  2. 详解瀑布流布局的5种实现及oject-fit属性,附源码

    最近项目中需要处理与图片相关的布局,不得不说图片这玩意真想要得到完美的展示效果还真是要费些力气.因为图片的尺寸或者比例各不相同.所以想要不同尺寸的图片有好的显示效果,你就需要找到适合的方式. 而且图片 ...

  3. 【单片机笔记】如何编写一个清晰的串口日志输出DEBUG文件(附源码)

    前言: 相信大多数嵌入式开发者都会碰到对程序进行调试或者查找BUG的情况,常见的两种方法都是仿真和通过日志进行的.有条件仿真的是更好,单是在编写嵌入式软件程序过程中,并不是所有的硬件都支持仿真或者方便 ...

  4. 常用算法 之三 详解 SHA1 实现(基于算法的官方原文档)及源码详细注释

    写在前面   在之前的工作中,用到了CRC16.MD5 和 SHA1 算法,主要用来校验下发的文件.网上关于这些算法的文章铺天盖地,以下内容仅仅是自己在学习时候的一个记录,一些套话来自于互联网.下面先 ...

  5. 常用算法 之一 详解 MD5 实现(基于算法的官方原文档)及源码详细注释

    写在前面   在之前的工作中,用到了CRC16.MD5 和 SHA1 算法,主要用来校验下发的文件.网上关于这些算法的文章铺天盖地,以下内容仅仅是自己在学习时候的一个记录,一些套话来自于互联网.下面先 ...

  6. 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]

    目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...

  7. 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] good

    目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...

  8. ADI Blackfin DSP处理器-BF533的开发详解21:RTC实时时钟的原理及应用(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 硬件设计原理图 功能介绍 ADSP-BF53x ...

  9. ADI Blackfin DSP处理器-BF533的开发详解18:用触摸屏的例程来理解中断(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 硬件设计原理图 硬件实现原理 ADSP-EDU ...

最新文章

  1. Elasticsearch script使用详解
  2. 《光棍节程序员闯关秀》闯关攻略
  3. BZOJ3597 [Scoi2014]方伯伯运椰子 【二分 + 判负环】
  4. 用Python快速找到出现次数最多的数据
  5. Java Synchronized 关键字
  6. PyTorch学习—4.计算图与动态图机制以及torch.autograd(自动求导系统)
  7. 关于线段树套伸展树被卡常
  8. python 逻辑运算的短路问题
  9. 基于C++的采用单链表判断算术表达式的合理性
  10. php向mysql提交数据_PHP 如何向 MySQL 发送数据
  11. 版本Android型号vivo 6D版,vivox6d和x6a参数
  12. 介绍6款超实用的抖音数据分析工具!
  13. 什么是“天道左旋、地道右旋”?
  14. 用Python量化海龟交易法则
  15. kafka维护工具使用指南
  16. 数学建模系列-模糊综合评价FCE
  17. 【学习总结】Apsara Clouder云计算技能认证:云服务器基础运维与管理+思维导图
  18. 信息传输计算机服务和软件行业,信息传输,软件和信息技术服务业 是 什么服务业...
  19. Oracle 表空间 resize
  20. 客快物流大数据项目(八十一): Kudu原理

热门文章

  1. Linux安装docker及其他镜像
  2. ABAC基于属性的访问控制
  3. Golang开发入门(一)
  4. ASP.NET 在 Windows Azure 环境中使用基于 SQLServer 的 Session
  5. WinXP SP2发布以来的所有补丁集下载 0812(V1.3.0)[119M]
  6. npm ERR! code EINVAL npm ERR! EINVAL: invalid argument, read
  7. “淘宝” 开放平台接口设计思路
  8. oracle connectionstring 属性尚未初始化.,ConnectionString 属性尚未初始化
  9. 面经-Iterator_FailFast_FailSafe
  10. linux 的 ip 命令 和 ifconfig 命令