STM32 HAL NTC(3950 10k)查表法

        NTC(Negative Temperature Coefficient)是指随温度上升电阻呈指数关系减小、具有负温度系数的热敏电阻现象和材料。该材料是利用锰、铜、硅、钴、铁、镍、锌等两种或两种以上的金属氧化物进行充分混合、成型、烧结等工艺而成的半导体陶瓷,可制成具有负温度系数(NTC)的热敏电阻。其电阻率和材料常数随材料成分比例、烧结气氛、烧结温度和结构状态不同而变化。现在还出现了以碳化硅、硒化锡、氮化钽等为代表的非氧化物系NTC热敏电阻材料。

在实际电路中,则是采用分压的方式进行,该点的电压采集,其NTC设计原理图如图所示:

而图中的下面则是接NTC的接口。

下面则是ntc程序

ntc_3950.c

#include "ntc_3950.h"#define SHORT_CIRCUIT_THRESHOLD 15
#define OPEN_CIRCUIT_THRESHOLD 4080
uint16_t DATA_BUFF1[ADC_LOOP1_MARK] = {0};
uint16_t DATA_BUFF2[ADC_LOOP2_MARK] = {0};/*定义一个结构体类型数组:(温度-阻值)表 温度按降序填*/
const NTC_10KTYPE  ntc_10k_table[] = {
125,325, 	
124,333, 	
123,342,  	
122,352, 	
121,361, 	
120,371, 		
119,381, 
118,392,
117,403,
116,414,	
115,426, 	
114,438, 	
113,450,
112,463,
111,476,
110,490,
109,504,
108,519,
107,534,
106,549,
105,566,
104,582,
103,600,
102,618,
101,636,
100,656,
99,675,
98,696,
97,718,
96,740,
95,763,
94,786,
93,811,
92,837,
91,863,
90,891,
89,919,
88,949,
87,980,
86,1011,
85,1045,
84,1079,
83,1114,
82,1151,
81,1190,
80,1230,
79,1271,
78,1314,
77,1359,
76,1406,
75,1454,
74,1504,
73,1557,
72,1611,
71,1668,
70,1726,
69,1788,
68,1851,		
67,1918, 		
66,1987,	
65,2059, 	
64,2134, 	
63,2212, 	
62,2293, 	
61,2378, 	
60,2466, 	
59,2558, 	
58,2654, 	
57,2755, 	
56,2859, 	
55,2968, 	
54,3082,  	
53,3201, 	
52,3324, 	
51,3454, 	
50,3572, 	
49,3730, 	
48,3877, 	
47,4031, 	
46,4192, 	
45,4360, 	
44,4536, 		
43,4720, 		
42,4913, 	
41,5114, 	
40,5324, 	
39,5545, 	
38,5775,
37,6017,
36,6270,	
35,6534, 	
34,6812, 	
33,7103,	
32,7407,
31,7727, 	
30,8062, 	
29,8413, 	
28,8781, 	
27,9168, 	
26,9574, 	
25,10000,	
24,10447, 	
23,10916, 	
22,11409, 	
21,11928,  	
20,12472, 	
19,13045, 	
18,13647, 	
17,14280, 	
16,14945, 	
15,15646,	
14,16383, 	
13,17160, 	
12,17977, 	
11,18838, 	
10,19788, 	
9,20700, 	
8,21707,  	
7,22769, 	
6,23889,	
5,25071, 	
4,26317, 	
3,27633, 	
2,29022, 	
1,30490, 	
0,32040, 	
-1,33677, 	
-2,35409, 		
-3,37239, 	
-4,39175, 	
-5,41223, 	 
-6,43391, 	
-7,45686,	
-8,48117, 	
-9,50692, 		
-10,53420,
-11,56313,
-12,59380,
-13,62634,
-14,66087,
-15,69753,
-16,73646,
-17,77782,
-18,82178,
-19,86852, 		
-20,91824, 	
-21,97115,
-22,102747, 
-23,108745,
-24,115136, 
-25,121950, 	
-26,129215,
-27,136968,
-28,145244,
-29,154083,
-30,163528,
-31,173626, 	
-32,184428, 	
-33,195990, 	
-34,208371,
-35,221637, 	
-36,235861, 	
-37,251120, 	
-38,267501,	
-39,285097,	
-40,304011,
-41,324356,
-42,346255,
-43,369843,
-44,395272, 	
-45,422704, 	
-46,452323, 	
-47,484327,
-48,518939, 	
-49,556404, 	
-50,596993, 	
-51,641008,	
-52,688785,	
-53,740696,
-54,797157,
-55,858631,
};uint16_t NTC_ADC(void) //ADC采集程序
{HAL_ADC_Start(&hadc);//开始ADC采集HAL_ADC_PollForConversion(&hadc,100);//等待采集结束if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc), HAL_ADC_STATE_REG_EOC))//读取ADC完成标志位{return HAL_ADC_GetValue(&hadc);//读出ADC数值}return 0;
}//[-级ADC滤波]读1次ADC值放入以往数组,去掉最大最小值后取平均值
uint16_t adc_getavg1(uint16_t adc)
{uint16_t maxA,minA;uint32_t avg=0;uint16_t jA;maxA = 0;minA = 0xffff;for(jA=0;jA<(ADC_LOOP1_MARK-1);jA++)	//将数据左移一位,空出【0】存新数据{DATA_BUFF1[(ADC_LOOP1_MARK-1)-jA] = DATA_BUFF1[(ADC_LOOP1_MARK-2)-jA];}DATA_BUFF1[0] = adc;	//存新数据for(jA=0;jA<ADC_LOOP1_MARK;jA++)	//将最大值与最小值存入maxA、minA{if(maxA<=DATA_BUFF1[jA]) maxA = DATA_BUFF1[jA];if(maxA>=DATA_BUFF1[jA]) maxA = DATA_BUFF1[jA];}for(jA=0;jA<ADC_LOOP1_MARK;jA++)	//除去最大与最小值的相加{if((DATA_BUFF1[jA] != maxA) && (DATA_BUFF1[jA] != minA)){avg+=DATA_BUFF1[jA];}if(DATA_BUFF1[jA] == maxA) maxA=0xffff;if(DATA_BUFF1[jA] == minA) maxA=0xffff;}minA = avg/(ADC_LOOP1_MARK-1);	//求取平均数return minA;
}//[第二级adc滤波]读10次一级滤波后的数据,只有10次都相同才返回最終ADC数据值
uint16_t adc_getavg2(uint16_t adc)
{uint8_t jA;uint8_t cou=0;for(jA=0;jA<(ADC_LOOP2_MARK-1);jA++){DATA_BUFF2[(ADC_LOOP2_MARK-1)-jA] = DATA_BUFF2[(ADC_LOOP2_MARK-2)-jA];}DATA_BUFF2[0] = adc;	//存新数据for(jA=0;jA<(ADC_LOOP2_MARK-2);jA++){if(DATA_BUFF2[jA] == adc){cou++;if(cou >= ADC_LOOP2_MARK-2){DATA_BUFF2[ADC_LOOP2_MARK-1] = adc;}}else{cou = 0;}}return DATA_BUFF2[ADC_LOOP2_MARK-1];
}#include "debug.h"float ntc_temp(uint16_t adc , uint8_t *ntc_state)
{float gather_now_voltage=0;float ntc_now_resistance=0;int index=0;if(adc <= SHORT_CIRCUIT_THRESHOLD)			//小于15为短路{*ntc_state = 1;}else if(adc >= OPEN_CIRCUIT_THRESHOLD)		//大于4080等于开路{*ntc_state = 2;}else{*ntc_state = 0;}/*采集得到Va点电压 Va=gather_now_voltage*/gather_now_voltage=adc * ADC_REFERENCE_VOLTAGE/4096;if(gather_now_voltage==0){gather_now_voltage=0.01;}/*求出热敏电阻的阻值 我这里Vcc电压和adc基准电压相等 r2=10k=10000*/ntc_now_resistance=gather_now_voltage/((ADC_REFERENCE_VOLTAGE-gather_now_voltage)/10000);/*r=u/i*//*根据热敏电阻阻值查表得出温度*/for(index=0; index<NTC_LIST_MAX_SIZE; index++){if(ntc_10k_table[index].resistance >= ntc_now_resistance)/*查到该温度表索引为 index*/{float min_resistance = (float)ntc_10k_table[(index>0) ? index-1 : 0].resistance;/*得出下区间电阻值*/float max_resistance = (float)ntc_10k_table[index].resistance;/*得出上区间电阻值*/float d1 = (float)(max_resistance - min_resistance) / 10;/*将该区间的阻值分为10等分*/float d2 = (float)(((ntc_now_resistance - min_resistance) / d1));/*得出n份*0.1°C*/d2 = (10 - d2);/*以上四步是求小数点温度*/return (float)(ntc_10k_table[index].temperature*10) + d2;}}return (0.0);
}

ntc_3950.h

#ifndef __NTC_3950_H
#define __NTC_3950_H#include "stm32f0xx_hal.h"
#include "main.h"#define	ADC_LOOP1_MARK 20
#define ADC_LOOP2_MARK 5/*定义一个结构体:温度,电阻阻值*/
typedef struct{int    temperature;//单位:°Cfloat  resistance;//单位:Ω
}NTC_10KTYPE;#define NTC_LIST_MAX_SIZE             (sizeof(ntc_10k_table) / sizeof(ntc_10k_table[0]))/*表的长度*/
#define ADC_REFERENCE_VOLTAGE         (float)3300 /*adc 电压基准*/extern ADC_HandleTypeDef hadc;
extern uint16_t DATA_BUFF1[ADC_LOOP1_MARK];
extern uint16_t DATA_BUFF2[ADC_LOOP2_MARK];uint16_t NTC_ADC(void);
uint16_t adc_getavg1(uint16_t adc);
uint16_t adc_getavg2(uint16_t adc);
float ntc_temp(uint16_t adc , uint8_t *ntc_state);#endif

在main.c的使用如下:

    static float temp_data=0.0;temp_data = ntc_temp(adc_getavg2(adc_getavg1(NTC_ADC())),&ntc_state);Info.temp = temp_data;	//进行整数转化switch (ntc_state){case 0:		//NTC正常工作if(Info.temp >= 0)		//单位确认{Info.temp_unit = 0;	//负号关闭}else if(Info.temp < 0){Info.temp_unit = 1;	//负号开启Info.temp = abs(Info.temp);		//转换为正数}break;case 1:		//NTC短路break;case 2:		//NTC开路break;default:break;}

最终采集温度比较理想,这章主要就贴了个代码,主要是有点难受不想写了,后面在补充吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/672463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue项目开发vscode配置

配置代码片段 步骤如下&#xff1a; 文件->首选项->配置用户代码片段新增全局代码片段起全局代码片段文件名“xxx.code-snippets” 这里以配置vue2初始代码片段为例&#xff0c;配置具体代码片段 {"name": "vue-sph","version": "…

modelsim仿真使用到vivado的IP,该如何使用!

modelsim仿真时&#xff0c;如果使用到了vivado的IP就会报错&#xff0c;本次就告诉大家如何将vivado的IP添加到modelsim中直接仿真。 一、生成ini文件以及IP打包 打开vivado&#xff0c;点击上方的Tools-->Compile Simulation Libraries得到如下界面 simulator&#xff1…

【Python基础】案例分析:泰坦尼克分析

泰坦尼克分析 1 目的&#xff1a; 熟悉数据集熟悉seaborn各种操作作 import pandas as pd import seaborn as sns import numpy as np import matplotlib.pyplot as plt %matplotlib inline home rdata df sns.load_dataset(titanic, data_homehome) df.head()survivedpcl…

mmdetection使用自己的voc数据集训练模型实战

一.自己数据集整理 将labelimg格式数据集进行整理 1.1. 更换图片后缀为jpg import os import shutilroot_path/media/ai-developer/imgfileos.listdir(root_path)for img in file:if img.endswith(jpeg) or img.endswith(JPG) or img.endswith(png):img_pathos.path.join(root…

理想汽车学华为,年终奖红包有点大(含算法原题)

理想年终奖红包 2月5日&#xff0c;有微博用户发帖称&#xff0c;脉脉上看到&#xff0c;今年理想汽车的年终奖红包有点大。 对此&#xff0c;李想转发并评论&#xff1a; ❝ 不能只学华为的流程&#xff0c;而不学华为的利益分配。奖罚不分明&#xff0c;是组织低效的最大原因…

C++ lambda [],[=] ,[],[this] 的使用

在c11标准中引入了lambda表达式&#xff0c;一般用于定义匿名函数 [],[] ,[&],[this] 都是捕获列表 [] 的作用&#xff1a; 什么也不捕获 [] 的作用&#xff1a; 按值捕获所有变量 [&] 的作用&#xff1a; 引用捕获所有外部作用域内的变量 [this]的作用&#xf…

怎么理解 Redis 事务

背景 在面试中经常会被问到&#xff0c;redis支持事务吗&#xff1f;事务是怎么实现的&#xff1f;事务会回滚吗&#xff1f;又是一键三连&#xff0c;我下面分析下&#xff0c;看看能不能吊打面试官 什么是Redis事务 事务是一个单独的隔离操作&#xff1a;事务中的所有命令…

企业为什么选择SASE?香港电讯专家给你答案!

2019年&#xff0c;Gartner发布了全新的网络安全模型&#xff1a;安全访问服务边缘&#xff08;Secure Access Service Edge, SASE&#xff09;&#xff0c;并预测到2025年80%的企业将使用SASE/SSE架构统一网络、云服务和私人应用程序的安全访问。那么企业为什么选择SASE&#…

Web课程学习笔记--CSS-Position学习

CSS Position学习 CSS Position有四个属性&#xff1a; relativeabsolutefixedstatic&#xff08;默认&#xff09; 样例 <div id"parent"><div id"sub1">sub1</div><div id"sub2">sub2</div> </div>su…

Git合并多个commit

git rebase -i commitId 假设想要合并最后3个commit&#xff0c; git log显示 commit id 1 commit id 2 commit id 3 commit id 4 则执行git rebase -i commitId4. 注意是4&#xff0c;不是3. 然后&#xff0c;pick最老的commit (commit id 3). https://blog.csdn.net/qiao…

企业计算机服务器中了mallox勒索病毒怎么办,mallox勒索病毒处理流程

由于网络技术的不断发展与应用&#xff0c;越来越多的企业开始依赖计算机技术来提高企业效率。然而&#xff0c;网络安全威胁无处不在&#xff0c;严重影响着企业计算机服务器中的数据安全。近期&#xff0c;云天数据恢复中心接到许多中大型企业的求助&#xff0c;企业的多台服…

Quicker读取浏览器的书签(包括firefox火狐)

从edge换了火狐&#xff0c;但是quicker不能读取本地的bookmarks文件了&#xff0c;就研究了一下。 方法1&#xff1a;读取本地Bookmarks文件&#xff08;仅谷歌内核浏览器&#xff09; 谷歌内核的浏览器本地会有Bookmarks文件&#xff0c;放了所有的书签数据&#xff0c;直接…

(注解配置AOP)学习Spring的第十七天

基于注解配置的AOP 来看注解式开发 : 先把目标与通知放到Spring里管理 : Service("userService") public class UserServiceImpl implements UserService {Overridepublic void show1() {System.out.println("show1......");}Overridepublic void show2…

SpringBoot 事务管理Transactional 数据回滚 数据一致性

介绍 SpringBoot当中的事物他保证了一致性&#xff0c;要么全部一起成功&#xff08;提交&#xff09;&#xff0c;要么一起失败&#xff0c;失败&#xff08;回滚&#xff09;后数据会回到当初的样子&#xff0c;是一组操作的集合。 事物类型 开启事物提交事物回滚事物 案…

安卓学习笔记之八:本地化的简单例子(kotlin版本)

本地化及多语言支持&#xff0c;是目前手机软件必须面对的问题&#xff0c;这里用一个简单的例子来说明在Android Studio下如何实现。 创建一个Empty Views Activity项目&#xff0c;语言选择Kotlin 实现一个简单的功能&#xff0c;一条欢迎&#xff0c;一个按钮&#xff0c;…

远程主机可能不符合glibc和libstdc++ VS Code服务器的先决条件

报错信息 VSCode无法连接远程服务器&#xff0c;终端一直提醒&#xff1a; [22:46:01.906] > Waiting for server log... [22:46:01.936] > Waiting for server log... [22:46:01.951] > [22:46:01.967] > Waiting for server log... [22:46:01.982] > [22:…

幻兽帕鲁怎么样?好玩? Mac版的玩《幻兽帕鲁》也很简单,只需三个步骤

幻兽帕鲁怎么样 幻兽帕鲁是一款集合了多种游戏元素的游戏&#xff0c;它巧妙地融合了《方舟:生存进化》的野外生存挑战、《荒野之息》的开放世界探索、《魔兽世界》的多元角色互动以及宝可梦的精灵捕捉与培养等经典游戏元素。游戏的核心系统是「帕鲁」捕获&#xff0c;你可以让…

【动态规划】【子序列除重】【C++算法】1987不同的好子序列数目

作者推荐 【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II 本文涉及知识点 动态规划汇总 LeetCode1987:不同的好子序列数目 给你一个二进制字符串 binary 。 binary 的一个 子序列 如果是 非空 的且没有 前导 0 &#xff08;除非数字是 “0” 本身&…

机器学习-线性回归法

线性回归算法 解决回归问题思想简单&#xff0c;实现容易许多强大的非线性模型的基础结果具有很好的可解释性蕴含机器学习中的很多重要思想 样本特征只有一个&#xff0c;称为&#xff1a;简单线性回归 通过分析问题&#xff0c;确定问题的损失函数或者效用函数 通过最优化…

Linux死机排查方法——内存日志

一般情况下&#xff0c;Linux系统在死机时会产生一些dump信息&#xff0c;例如oops&#xff0c;通过分析oops信息就可以基本定位问题所在&#xff0c;但有些特殊情况下死机时&#xff0c;没有任何的打印的信息。如果直接使用printk等打印排查问题&#xff0c;有可能会因为print…