分享一个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计算公式。欢迎大家拍砖。
自己先顶一下 感谢分享,帮顶 谢谢分享,收藏起来,平时有可能用到~~ 看楼主刚毕业的份上,随便随便说两句吧。
查表不需要搞这么麻烦,中间转换过程不要搞太多次,直接AD值对应温度值就可以了,查表再插值就完事了。
例如,ADC参考电压和NTC供电电压都用VCC,NTC电阻为Rt,串联电阻为R0,则只需用(Rt/(R0+Rt))*1023查表计算出AD值做成表格,AD转换后查表就直接得到温度值了。
整型变量的表格比浮点数好用很多。 通常在NTC两端并上一个10n的电容 Gioray 发表于 2020-5-21 08:40
看楼主刚毕业的份上,随便随便说两句吧。
查表不需要搞这么麻烦,中间转换过程不要搞太多次,直接AD值对应 ...
这是刚毕业时候的项目了- -
哈哈 说的是方法,:$多谢指点,欢迎交流- - 顶起来。 谢谢分享,上面的 博士 说的对,一般抗干扰接个电容滤波,或软件做一些滤波算法.
页:
[1]