IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> stm32通过NTC采集温度,二分法查表,精度0.1℃ -> 正文阅读

[嵌入式]stm32通过NTC采集温度,二分法查表,精度0.1℃

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

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

标称阻值:10kΩ @ 25℃

精度公差:±1%

B值:3435K at 25/85℃

B值公差:±1%

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

我们先看看电路

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

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

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

//-20℃~170℃ 
#define N 191
const unsigned int NTC3435_10K[N]=
{
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,
226,221,217,212,207,203,199,194,190,186,
182,179,175,171,168,164,161,157,154,151,
148,145,142,139,136,134,131,128,126,123,
121,118,116,114,112,110,107,105,103,101,
99,98,96,94,92,91,89,87,86,84,
};

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

//输入参数:ADC值表  ADC值
//返回值:查表后的索引号
unsigned int NTC_Lookup(unsigned int *list,unsigned int data)
{
    unsigned int middle=0;
    unsigned int indexL=0;
    unsigned int indexR=N-1;
	if(data>=*(list+0))
    	return 0;
	if(data<=*(list+N-1))
   		return N-1;
   	
	while(indexL<indexR)
	{
		middle=(indexL+indexR)>>1;
		if(data==*(list+middle))
			return middle;
		else if(data>*(list+middle))
        	indexR=middle-1;
    	else if(data<*(list+middle))
    		indexL=middle+1;
	}
	return indexL-1;
}
//例如我们采集到的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℃。
int Read_NTC_Temperature(unsigned int *list,unsigned int ADC,int BaseValue)
{
	unsigned int index=0;
	unsigned int deta=0;
	unsigned int t=0;
	index=NTC_Lookup(list,ADC);
	if(ADC>=list[0])
		return BaseValue;
	if(ADC<=*(list+N-1))
		return ((N-1)*10+BaseValue);
	deta=list[index]-list[index+1];
	t=10*(list[index]-ADC)/deta;
	return (BaseValue+index*10+t);
}

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℃,算法正确,大家放心使用。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:15:52  更:2022-04-01 00:16:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:47:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码