【单片机笔记】详解如何用廉价NTC电阻准确高效的测量温度(附源码)
使用热敏电阻读取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电阻准确高效的测量温度(附源码)相关推荐
- 【Spring AOP】@Aspect结合案例详解(二): @Pointcut使用@within和within(已附源码)
文章目录 前言 @within 完善打印日志案例 @within深入说明 within 匹配指定类 匹配指定包(package) 源码下载 总结 前言 在微服务流行的当下,在使用Spring Clou ...
- 详解瀑布流布局的5种实现及oject-fit属性,附源码
最近项目中需要处理与图片相关的布局,不得不说图片这玩意真想要得到完美的展示效果还真是要费些力气.因为图片的尺寸或者比例各不相同.所以想要不同尺寸的图片有好的显示效果,你就需要找到适合的方式. 而且图片 ...
- 【单片机笔记】如何编写一个清晰的串口日志输出DEBUG文件(附源码)
前言: 相信大多数嵌入式开发者都会碰到对程序进行调试或者查找BUG的情况,常见的两种方法都是仿真和通过日志进行的.有条件仿真的是更好,单是在编写嵌入式软件程序过程中,并不是所有的硬件都支持仿真或者方便 ...
- 常用算法 之三 详解 SHA1 实现(基于算法的官方原文档)及源码详细注释
写在前面 在之前的工作中,用到了CRC16.MD5 和 SHA1 算法,主要用来校验下发的文件.网上关于这些算法的文章铺天盖地,以下内容仅仅是自己在学习时候的一个记录,一些套话来自于互联网.下面先 ...
- 常用算法 之一 详解 MD5 实现(基于算法的官方原文档)及源码详细注释
写在前面 在之前的工作中,用到了CRC16.MD5 和 SHA1 算法,主要用来校验下发的文件.网上关于这些算法的文章铺天盖地,以下内容仅仅是自己在学习时候的一个记录,一些套话来自于互联网.下面先 ...
- 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]
目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...
- 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] good
目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...
- ADI Blackfin DSP处理器-BF533的开发详解21:RTC实时时钟的原理及应用(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 硬件设计原理图 功能介绍 ADSP-BF53x ...
- ADI Blackfin DSP处理器-BF533的开发详解18:用触摸屏的例程来理解中断(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 硬件设计原理图 硬件实现原理 ADSP-EDU ...
最新文章
- Elasticsearch script使用详解
- 《光棍节程序员闯关秀》闯关攻略
- BZOJ3597 [Scoi2014]方伯伯运椰子 【二分 + 判负环】
- 用Python快速找到出现次数最多的数据
- Java Synchronized 关键字
- PyTorch学习—4.计算图与动态图机制以及torch.autograd(自动求导系统)
- 关于线段树套伸展树被卡常
- python 逻辑运算的短路问题
- 基于C++的采用单链表判断算术表达式的合理性
- php向mysql提交数据_PHP 如何向 MySQL 发送数据
- 版本Android型号vivo 6D版,vivox6d和x6a参数
- 介绍6款超实用的抖音数据分析工具!
- 什么是“天道左旋、地道右旋”?
- 用Python量化海龟交易法则
- kafka维护工具使用指南
- 数学建模系列-模糊综合评价FCE
- 【学习总结】Apsara Clouder云计算技能认证:云服务器基础运维与管理+思维导图
- 信息传输计算机服务和软件行业,信息传输,软件和信息技术服务业 是 什么服务业...
- Oracle 表空间 resize
- 客快物流大数据项目(八十一): Kudu原理
热门文章
- Linux安装docker及其他镜像
- ABAC基于属性的访问控制
- Golang开发入门(一)
- ASP.NET 在 Windows Azure 环境中使用基于 SQLServer 的 Session
- WinXP SP2发布以来的所有补丁集下载 0812(V1.3.0)[119M]
- npm ERR! code EINVAL npm ERR! EINVAL: invalid argument, read
- “淘宝” 开放平台接口设计思路
- oracle connectionstring 属性尚未初始化.,ConnectionString 属性尚未初始化
- 面经-Iterator_FailFast_FailSafe
- linux 的 ip 命令 和 ifconfig 命令