野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11307|回复: 8

分享一个NTC测温方法说明

[复制链接]
发表于 2020-5-21 00:05:36 | 显示全部楼层 |阅读模式
首先是非常感谢村长的的加分- -初来乍到,分享一下刚毕业出来的时候做的项目用到的NTC测温

如下图所示,使用ATmega88做为主控MCU,电源电压为5.34V,上拉电阻为10K,选用B值为3950,T1为50K的NTC热敏电阻。

截图202005202321509329..png

NTC的电阻值和温度变化的关系式为:
RT = RN expB(1/T – 1/TN)
RT :在温度 T ( K )时的 NTC 热敏电阻阻值。
RN :在额定温度 TN ( K )时的 NTC 热敏电阻阻值。
T :规定温度( K )。
B : NTC 热敏电阻的材料常数,又叫热敏指数。
exp :以自然数 e 为底的指数( e = 2.71828 …)
温度阻值表如下:
截图202005202329111565..png

原理是,ADC0不停检测NTC的电压,然后计算出阻值,代入公式,计算出阻值。但是公式比较复杂不适合一直做这个运算。
因为我们的温度测量范围是确定的。所以最好的办法是是查表法,但是我们又不可能做一个把所有温度的的表格,这样子会占用很大的程序空间。
所以需要一定的技巧。

以下是我在这个项目中所使用到的,利用NTC的特定公式,直接根据上拉电阻、供电电压,计算出每个电压点的温度值,然后做成表格。程序里读到电压值之后直接查表。
下图是我所使用到的excel表格,
截图202005202343352387..png

从表格中可以看到,测量到的电压为1V则对应的是115.21度,2V对应的是81.87度。有的童鞋会说,如果我测量到1.03V,那温度值是多少呢?

这个就是本帖子的另外一个知识点了,叫做线性插值法。有想深入了解的可以搜一下,我这里大概说一下,上面图形中我们可以看到温度电阻值的关系是一条曲线,不是普通的线性关系。
但是为了方便计算,我们可以把曲线分成苦干等份,分成的每一段都可以认为是线性关系。如果测量到1.03V,那么我们可以把1V-1.1V当做一条直线,然后1.03V在这区域所占的比例跟温度所占的比例关系是对等的,
从而计算是相对准确的数值。



刚毕业写的代码,没法见人,就只附上关键点。
float temptab[]=
{
292.97, 241.17, 197.51, 174.82, 159.71, 148.46, 139.51, 132.08, 125.72, 120.16,
115.21, 110.73, 106.64, 102.86, 99.34,  96.05,  92.93,  89.98,  87.17,  84.47,
81.87,  79.36,  76.93,  74.56,  72.25,  69.99,  67.76,  65.57,  63.41,  61.27,
59.13,  57.01,  54.89,  52.76,  50.62,  48.46,  46.27,  44.05,  41.79,  39.47,
37.08,  34.61,  32.03,  29.34,  26.49,  23.46,  20.18,  16.59,  12.59,  8.01,
};  //电压对应温度表



void adc_init(void)//ADC初始化
{
         EICRA=0x00;   //低电平触发
         EIMSK=0x01;    //int0使能
         SMCR=0x04;    //掉电模式
         
         ADCSRA = 0x00; //disable adc
         ADMUX = 0x60;  //select adc input 0  VCC  左对齐  输入0
         ACSR  = 0x80;  //禁用模拟比较器
         ADCSRB = 0x00;//禁用自动触发源
         ADCSRA = 0x83;//使能ADC 8分频
}


#pragma interrupt_handler adc_isr:22
void adc_isr(void)//ADC中断
{
    //conversion complete, read value (int) using...
    //value=ADCL;            //Read 8 low bits first (important)
    //value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
    value=ADCH;//左对齐 只要高八位
}


      Vol= 53.4*value/256;
        //Rt=(unsigned int)(1000*(Vol/(5.33-Vol)));
       //CheckTem(Rt);
        //temp=V;
        //temp=CalcTemp(Rt);
        Rt=(int)Vol;
        Vm=Vol-Rt;
        temp=temptab[Rt]-Vm*(temptab[Rt]-temptab[Rt+1]);//之前写的线性插值。


附件上传有NTC计算表格、NTC计算公式。欢迎大家拍砖。


BHS-NTC温度特性计算工具.zip (6.38 KB, 下载次数: 64)


NTC计算表格.zip (76.45 KB, 下载次数: 65)





回复

使用道具 举报

 楼主| 发表于 2020-5-21 00:06:03 | 显示全部楼层
自己先顶一下
回复 支持 反对

使用道具 举报

发表于 2020-5-21 07:18:28 | 显示全部楼层
感谢分享,帮顶
回复 支持 反对

使用道具 举报

发表于 2020-5-21 08:15:54 | 显示全部楼层
谢谢分享,收藏起来,平时有可能用到~~
回复 支持 反对

使用道具 举报

发表于 2020-5-21 08:40:08 | 显示全部楼层
看楼主刚毕业的份上,随便随便说两句吧。
查表不需要搞这么麻烦,中间转换过程不要搞太多次,直接AD值对应温度值就可以了,查表再插值就完事了。
例如,ADC参考电压和NTC供电电压都用VCC,NTC电阻为Rt,串联电阻为R0,则只需用  (Rt/(R0+Rt))*1023查表计算出AD值做成表格,AD转换后查表就直接得到温度值了。
整型变量的表格比浮点数好用很多。
回复 支持 反对

使用道具 举报

发表于 2020-5-21 08:44:50 | 显示全部楼层
通常在NTC两端并上一个10n的电容
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-21 09:08:24 | 显示全部楼层
Gioray 发表于 2020-5-21 08:40
看楼主刚毕业的份上,随便随便说两句吧。
查表不需要搞这么麻烦,中间转换过程不要搞太多次,直接AD值对应 ...

这是刚毕业时候的项目了  - -


哈哈 说的是方法,多谢指点,欢迎交流- -
回复 支持 反对

使用道具 举报

发表于 2020-5-21 11:05:30 | 显示全部楼层
顶起来。
回复

使用道具 举报

发表于 2020-8-13 11:43:01 | 显示全部楼层
谢谢分享,上面的 博士 说的对,一般抗干扰接个电容滤波,或软件做一些滤波算法.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 13:02 , Processed in 0.034912 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表