首页 >> 大全

stm32通过NTC采集温度,二分法查表,精度0.1℃

2023-10-05 大全 29 作者:考证青年

NTC是指负温度系数的电阻器,电阻值会随着温度上升而减少,我们可以利用该特性,对温度进行采集和计算。

下面是NTC的规格和温度阻值表

标称阻值:10kΩ @ 25℃

精度公差:±1%

B值:3435K at 25/85℃

B值公差:±1%

我用的是查表法,所以在计算中不使用B值,B值直接忽略,只关心精度和温度阻值表。

我们先看看电路

STM32的ADC是12位的,我们根据电路图可以得到公式

我们把温度阻值表代入公式,可借助EXCEL计算,可以得到温度对应的ADC值大小,然后定义数组,用于查表计算温度。

我选取的温度范围是-20℃~120℃,生成下列数组。

#ifndef _NTC_H
#define _NTC_H
#include "user_define.h"#define NTC_HIGH_PRECISION 	1//1=0.1℃ 0=1℃#define NUM 141//-20℃~120℃ 
static sc16 NTC3435_10K[NUM]=
{3581,3559,3535,3511,3486,3461,3435,3408,3381,3353,3324,3295,3266,3234,3203,3171,3138,3105,3072,3037,3003,                                             //0                                      2968,2932,2896,2859,2823,2785,2748,2710,2672,2633,2595,2556,2517,2478,2438,2399,2360,2321,2281,2242,2203,2164,2125,2086,2048,2009,1971,1933,1896,1858,1822,1785,1749,1713,1678,1643,1896,1896,1540,1507,1475,1436,1411,1380,1349,1319,1289,1260,1231,1203,1176,1149,1122,1096,1070,1045,1021,997,974,951,928,906,885,864,843,823,803,784,766,747,729,712,695,678,662,646,631,616,601,587,573,559,546,533,520,508,496,484,473,462,451,440,430,420,410,400,391,382,373,365,356,348,340,332,325,317,310,303,296,290,283,277,271,265,259,253,247,242,237,231,
};extern s16 Read_NTC_Temperature(sc16 *list,u16 rADC,s16 BaseValue);#endif

二分法查表,可以用循环的方法或者递归函数查找,我采用的是循环的方法,查找出ADC在列表中的位置,就可以知道对应的索引号,进而计算温度值,代码如下:

温度采集与显示流程图_温度采样精度_

//输入参数:ADC值表  ADC值
//返回值:查表后的索引号
u16 NTC_Lookup(sc16 *list,u16 data)
{u16 middle=0;u16 indexL=0;u16 indexR=NUM-1;if(data>=*(list+0))return 0;if(data<=*(list+NUM-1))return NUM-1;while((indexR-indexL)>1){middle=(indexL+indexR)>>1;if(data==*(list+middle))return middle;else if(data>*(list+middle))indexR=middle;else if(data<*(list+middle))indexL=middle;}return indexL;
}//例如我们采集到的ADC值是3000,经过二分法查找到的索引号是20,我们就可以知道温度在NTC3435_10K[20](0℃)和NTC3435_10K[21](1℃)之间。

二分法查找的值是表中的索引号,我们还需要根据索引号和ADC值进一步计算温度值(精度0.1℃),代码如下:

//输入参数:ADC表  采集的ADC值   ADC表的起始温度值(-20℃=-200)
//返回值:温度值 单位0.1℃ 例如返回值是100,对应的就是100*0.1℃=10℃。
s16 Read_NTC_Temperature(sc16 *list,u16 rADC,s16 BaseValue)
{u16 index=0;u16 deta=0;u16 t=0;s16 result=0;if(rADC>=list[0])return BaseValue;if(rADC<=*(list+NUM-1)){result=((NUM-1)*10+BaseValue);return result;}index=NTC_Lookup(list,rADC);
#if NTC_HIGH_PRECISIONdeta=list[index]-list[index+1];t=10*(list[index]-rADC)/deta;
#endifresult=(BaseValue+index*10+t);return result;
}

main.c代码

int main()
{int temp;//temp=Read_NTC_Temperature(NTC3435_10K,3010,-200);//温度ADC表 ADC值 ADC表的起始温度(-20℃)printf("ntc = %d\n",temp);return 0;
}

我输入ADC值3010,输出值为-3,也就是-3*0.1℃=-0.3℃,

我用ADC换算成电阻值再去推算温度也是-0.3℃,算法正确,大家放心使用。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了