bailangcn 发表于 2020-5-21 00:05:36

分享一个NTC测温方法说明

首先是非常感谢村长的的加分- -初来乍到,分享一下刚毕业出来的时候做的项目用到的NTC测温

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



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 …)
温度阻值表如下:


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

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


从表格中可以看到,测量到的电压为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 0VCC左对齐输入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-Vm*(temptab-temptab);//之前写的线性插值。


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











bailangcn 发表于 2020-5-21 00:06:03

自己先顶一下

kangxuebin 发表于 2020-5-21 07:18:28

感谢分享,帮顶

HSH_BB 发表于 2020-5-21 08:15:54

谢谢分享,收藏起来,平时有可能用到~~

Gioray 发表于 2020-5-21 08:40:08

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

shiang 发表于 2020-5-21 08:44:50

通常在NTC两端并上一个10n的电容

bailangcn 发表于 2020-5-21 09:08:24

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

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


哈哈 说的是方法,:$多谢指点,欢迎交流- -

hyghyg1234 发表于 2020-5-21 11:05:30

顶起来。

yygdzjs 发表于 2020-8-13 11:43:01

谢谢分享,上面的 博士 说的对,一般抗干扰接个电容滤波,或软件做一些滤波算法.
页: [1]
查看完整版本: 分享一个NTC测温方法说明