国产航顺HK32F030M: 基于NTC负温度系数的温度计

news2024/11/26 9:28:37

前言:

家里的一个儿童澡盆附带的温度计坏掉了,拆解后发现这东西做的真垃圾!索性自己做一个。拆下了里面的NTC热敏电阻,但是不知道NTC的性能参数,经过测量与查资料后,采用用中位值滤波Steinhart-Hart方程法 测温。只需要测量电阻在 20℃40℃60℃时候的NTC阻值代入公式计算出ABC参数即可。

1. 元器件选型

  • 电源:TP4056

  • MCU :航顺HK32HK32F030MF4P6

  • 显示驱动:TM16244位数码管驱动

  • 传感器:NTC温度传感器


2. NTC热敏电阻温度传感器

NTC:负温度系数

NTC热敏电阻: 阻值随温度升高而减小

在这里插入图片描述

1% B3950/3470 5/10/50K 制冷空调冰箱探头

在这里插入图片描述

NTC热敏电阻的阻值与温度对照表主要关注几个方面:温度、NTC阻值、阻值公差及B值。

NTC热敏电阻随着温度的升高而降低了电阻,并提供各种基本电阻和曲线。大多数情况下即25℃时的阻值,它提供了一个方便的参考点。例如,10K的NTC热敏电阻即它在25℃时的阻值为10KΩ。

另一个重要特征是“B”值。B值是材料常数,其由制成它的陶瓷材料确定,并描述在两个温度点之间的特定温度范围内的电阻(R/T)曲线的梯度。每个热敏电阻材料将具有不同的材料常数,因此具有不同的电阻与温度曲线。然后,B值将定义第一温度或基点(通常为25℃)的热敏电阻电阻值(称为T1),以及第二温度点(例如50℃,称为T2 )的热敏电阻电阻值。因此,B值将使热敏电阻材料在T1和T2的范围内保持恒定。即B:T1/T2或B:25/85,典型的NTC热敏电阻B值在约3000和约5000之间。

2.1 NTC热敏电阻10KB3950-1%温度阻值对照表

两个重要参数:

  • 额定零功率阻值 (25摄氏度时候的阻值10KΩ)
  • B值(材料常数,又叫热敏指数)

例如:25摄氏度时候的额定零功率阻值10KΩ,热敏指数3950。

在这里插入图片描述
常用的B值也有3390、3435、3470等等。
在这里插入图片描述

3. NTC测温

3.1 经验公式法

在这里插入图片描述

#include "NTC.h"
#include "config.h"
#include <math.h>

#define     Vref     2.5

float CalculationTemperature(u16 adc)
{
    float Temper=0.0;												// 温度
    float Rt=0.0;														// NTC热敏电阻阻值
    float R25=10000.0;											// NTC热敏电阻25℃时的阻值:10K
    float T2=298.15;												// 273.15+25;
		float B=3950.0;													// 热敏指数3950
    float K=273.15;													// 绝对温度
    float RtV=0.0;													// NTC热敏电阻电压

    RtV = (adc*(Vref/4096));    						// NTC电压
    Rt = (RtV*R25)/(Vref-RtV);							// NTC阻值
    Temper = 1.0/(log(Rt/R25)/B + 1.0/T2)-K;	// 经验公式计算温度
    return Temper;													// 返回温度值
}

3.2 查表法

#include "NTC.h"
#include "config.h"

extern u16 adc_result;					//	ADC转换结果;

u16 temp_table[]={ 	//10KB3950
        3983,			//0:-40℃
				3975,			//1: -39℃
				3967,			//2:-38℃
				3958,			//3:-37℃
				3949,			//4:-36℃
				3940,			//5:-35℃
				3929,			//6:-34℃
				3919,			//7:-33℃
				3907,			//8:-32℃
				3896,			//9:-31℃
				3883,			//10:-30℃
				3870,			//11:-29℃
				3856,			//12:-28℃
				3842,			//13:-27℃
				3827,			//14:-26℃
				3811,			//15:-25℃
				3795,			//16:-24℃
				3777,			//17:-23℃
				3759,			//18:-22℃
				3740,			//19:-21℃
				3721,			//20:-20℃
				3700,			//21:-19℃
				3679,			//22:-18℃
				3656,			//23:-17℃
				3633,			//24:-16℃
				3609,			//25:-15℃
				3585,			//26:-14℃
				3559,			//27:-13℃
				3532,			//28:-12℃
				3505,			//29:-11℃
				3476,			//30:-10℃
				3447,			//31:-9℃
				3416,			//32:-8℃
				3385,			//33:-7℃
				3353,			//34:-6℃
				3320,			//35:-5℃
				3286,			//36:-4℃
				3251,			//37:-3℃
				3215,			//38:-2℃
				3179,			//39:-1℃
				3142,			//40: 0℃
				3104,			//41: 1℃
				3065,			//42: 2℃
				3025,			//43: 3℃
				2985,			//44: 4℃
				2944,			//45: 5℃
				2902,			//46: 6℃
				2860,			//47: 7℃
				2817,			//48: 8℃
				2774,			//49: 9℃
				2730,			//50: 10℃
				2686,			//51: 11℃
				2641,			//52: 12℃
				2596,			//53: 13℃
				2551,			//54: 14℃
				2505,			//55: 15℃
				2460,			//56: 16℃
				2414,			//57: 17℃
				2368,			//58: 18℃
				2322,			//59: 19℃
				2276,			//60: 20℃
				2230,			//61: 21℃
				2184,			//62: 22℃
				2139,			//63: 23℃
				2093,			//64: 24℃
				2048, 		//65: 25℃
				2003,			//66: 26℃
				1958,			//67: 27℃
				1914,			//68: 28℃
				1870,			//69: 29℃
				1826,			//70: 30℃
				1783,			//71: 31℃
				1741,			//72: 32℃
				1699,			//73: 33℃
				1657,			//74: 34℃
				1616,			//75: 35℃
				1576,			//76: 36℃
				1536,			//77: 37℃
				1497,			//78: 38℃
				1459,			//79: 39℃
				1421,			//80: 40℃
				1384,			//81: 41℃
				1347,			//82: 42℃
				1311,			//83: 43℃
				1277,			//84: 44℃
				1242,			//85: 45℃
				1209,			//86: 46℃
				1176,			//87: 47℃
				1144,			//88: 48℃
				1112,			//89: 49℃
				1082,			//90: 50℃
				1052,			//91: 51℃
				1022,			//92: 52℃
				994,			//93: 53℃
				966,			//94: 54℃
				939,			//95: 55℃
				912,			//96: 56℃
				886,			//97: 57℃
				861,			//98: 58℃
				837,			//99: 59℃
				813,			//100: 60℃
				790,			//101: 61℃
				767,			//102: 62℃
				745,			//103: 63℃
				724,			//104: 64℃
				703,			//105: 65℃
				683,			//106: 66℃
				663,			//107: 67℃
				644,			//108: 68℃
				626,			//109: 69℃
				608,			//110: 70℃
				590,			//111: 71℃
				573,			//112: 72℃
				557,			//113: 73℃
				541,			//114: 74℃
				525,			//115: 75℃
				510,			//116: 76℃
				496,			//117: 77℃
				481,			//118: 78℃
				468,			//119: 79℃
				454,			//120: 80℃
				441,			//121: 81℃
				429,			//122: 82℃
				417,			//123: 83℃
				405,			//124: 84℃
				394,			//125: 85℃
				382,			//126: 86℃
				372,			//127: 87℃
				361,			//128: 88℃
				351,			//129: 89℃
				341,			//130: 90℃
				332,			//131: 91℃
				323,			//132: 92℃
				314,			//133: 93℃
				305,			//134: 94℃
				297,			//135: 95℃
				289,			//136: 96℃
				280,			//137: 97℃
				273,			//138: 98℃
				265,			//139: 99℃
				258,			//140: 100℃
				251,			//141: 101℃
				245,			//142: 102℃
				238,			//143: 103℃
				231,			//144: 104℃
				225,			//145: 105℃
				219,			//146: 106℃
				214,			//147: 107℃
				208,			//148: 108℃
				202,			//149: 109℃
				197,			//150: 110℃
				192,			//151: 111℃
				187,			//152: 112℃
				182,			//153: 113℃
				177,			//154: 114℃
				173,			//155: 115℃
				168,			//156: 116℃
				164,			//157: 117℃
				159,			//158: 118℃
				156,			//159: 119℃
				151 			//160:120℃
};

float CalculationTemperature(u16 adc)
{
	float temper,temper_float;
  u16 min,middle,max;
	float temp1,temp2;
  min = 0;        			//-40度
  max = 160;      			//120度
	
   if(adc == temp_table[min])  temper = min - 40;
   else if(adc == temp_table[max])  temper = max - 40;
   while(min <= max)																			// 二分搜索法
   {
			middle = (min + max) / 2;
      if(adc == temp_table[middle]) temper = middle - 40;
      if(adc > temp_table[middle]) max = middle - 1;
			else min = middle + 1;
      if(min >= max)
			{
				temp1 = temp_table[max]-adc;
				temp2 = temp_table[max-1] - temp_table[max];
				temper_float = temp1 / temp2;
				temper = max + temper_float - 40;
      }
    }
   return temper;
}

3.3 Steinhart-Hart方程法

在这里插入图片描述

#include "NTC.h"
#include "config.h"
#include "math.h"

#define Vref 2.5

float CalculationTemperature(u16 adc)
{
	float A = 1.14E-3,B = 2.34E-4,C = 7.54E-8;
	float Ka = 273.15;
  float temper;
	float Rt = 0.0;
	float RtV = 0.0;
	float R25 = 10000;
	
	RtV = (adc*(Vref/4096));    						// NTC电压
  Rt = (RtV*R25)/(Vref-RtV);								// NTC阻值
	temper = 1/(A + B*log(Rt) + C*pow(log(Rt),3))-Ka; // Steinhart-Hart方程
  return temper;
}

在这里插入图片描述


4. ADC滤波算法

4.1 一阶互补滤波

4.2 中位值滤波

方法:连续采样N次(N取奇数)把N次采样值按大小排列取中间值为本次有效值
优点:能有效克服因偶然因素引起的波动干扰;对温度、液位等变化缓慢的被测参数有良好的滤波效果
缺点:对流量,速度等快速变化的参数不宜

//中值滤波算法
int middleValueFilter(int N)
{
    int value_buf[N];
    int i,j,k,temp;
    for( i = 0; i < N; ++i)
    {
        value_buf[i] = HAL_ADC_GetValue(&hadc1);	
				
    }
    for(j = 0 ; j < N-1; ++j)
    {
        for(k = 0; k < N-j-1; ++k)
        {
            //从小到大排序,冒泡法排序
            if(value_buf[k] > value_buf[k+1])
            {
                temp = value_buf[k];
                value_buf[k] = value_buf[k+1];
                value_buf[k+1] = temp;
            }
        }
    }
		
    return value_buf[(N-1)/2];
}

中值滤波对消除异常值和平稳化AD采样都具有十分有效的结果。

4.3 算术平均滤波

4.4 滑动平均滤波

4.5 限幅平均滤波

4.6 卡尔曼滤波

核心思想:根据当前的仪器"测量值" 和上一刻的 “预测量” 和 “误差”,计算得到当前的最优量,再预测下一刻的量。里面比较突出的是观点是:把误差纳入计算,而且分为预测误差和测量误差两种,通称为噪声。还有一个非常大的特点是:误差独立存在,始终不受测量数据的影响。
优点:巧妙的融合了观测数据与估计数据,对误差进行闭环管理,将误差限定在一定范围。适用性范围很广,时效性和效果都很优秀。
缺点:需要调参,参数的大小对滤波的效果影响较大。

//卡尔曼滤波
int KalmanFilter(int inData)
{
		static float prevData = 0;                                 //先前数值
		static float p = 10, q = 0.001, r = 0.001, kGain = 0;      // q控制误差  r控制响应速度 
	
		p = p + q;
		kGain = p / ( p + r );                                     //计算卡尔曼增益
		inData = prevData + ( kGain * ( inData - prevData ) );     //计算本次滤波估计值
		p = ( 1 - kGain ) * p;                                     //更新测量方差
		prevData = inData;
		return inData;                                             //返回滤波值
}

HK32F030MF4P6 用户手册
在这里插入图片描述

内部参考电压

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5. 实验效果

在这里插入图片描述


资料下载

  • [1] 源码:HK32F030M-NTC热敏电阻-1624数码管 资料(20230812)

参考资料

  • [1] 【CSDN@混分巨兽龙某某
    】基于STM32的ADC采样及各式滤波实现(HAL库,含VOFA+教程)

  • [2] 【CSDN@Q大帅】ADC滤波的10种经典算法

  • [3] 【@布丁橘长】 第62期-ADC模数转换-NTC测温-经验公式法、查表法、Steinhart-Hart

  • [4] 【STC论坛@布丁橘长】https://www.stcaimcu.com/forum.php?mod=viewthread&tid=463&highlight=%E5%B8%83%E4%B8%81%E6%A9%98%E9%95%BF


在这里插入图片描述

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

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

相关文章

期权的希腊字母计算及应用

1.前言 期权价格会受到多个因素的影响,如标的资产价格、时间、波动率等,所以引入希腊字母来衡量不同因素对期权价格的影响程度,即Delta、Gamma、Vega、Theta和Rho,从而更综合的研究期权的影响因素。对于单独希腊值的作用,Delta经常被用做计算期权交易杠杆的指标、期权和期…

Linux系统下Redis3.2集群

本节主要学习reids主从复制的概念&#xff0c;作用&#xff0c;缺点&#xff0c;流程&#xff0c;搭建&#xff0c;验证&#xff0c;reids哨兵模式的概念&#xff0c;作用&#xff0c;缺点&#xff0c;结构&#xff0c;搭建&#xff0c;验证等。 文章目录 一、redis主从复制 …

【网络编程(三)】Netty入门到实战这一篇就够了

Netty入门到实战 NettyNetty 核心组件和流程分析数据流转的底层核心ByteBuf 原理分析Netty 解决半包、粘包问题Netty 实现心跳检查机制 Netty NIO 是一种 I/O 模型&#xff0c;netty 是基于 NIO 开发出来的一款异步事件驱动框架&#xff0c;它是一个通用的网络应用程序框架。n…

Transformer(二)(VIT,TNT)(基于视觉CV)

目录 1.视觉中的Attention 2.VIT框架&#xff08;图像分类&#xff0c;不需要decoder&#xff09; 2.1整体框架 2.2.CNN和Transformer遇到的问题 2.3.1CNN 2.3.2Transformer 2.3.3二者对比 2.4.公式理解 3TNT 参考文献 1.视觉中的Attention 对于人类而言看到一幅图可以立…

面向对象编程的特征:抽象、封装、继承和多态

文章目录 1. 抽象和封装&#xff1a;揭示事物本质&#xff0c;隐藏细节抽象封装 2. 继承&#xff1a;代码复用&#xff0c;提高可维护性3. 多态&#xff1a;灵活应对不同情境总结 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种现代的…

感应电机的谐波分析 - Part2-1理论推演

金属腔体生成电磁波后&#xff0c;这些电磁波会像黑体辐射一样无论反射多少次&#xff0c;终将会被壳体吸收&#xff1f; 根据热力学的基本原理&#xff0c;当金属腔体内的电磁波频率和温度满足一定条件时&#xff0c;电磁波会像黑体辐射一样被吸收。这种现象被称为热平衡。一旦…

mybatis(上)

mybatis&#xff1a;原来是apache的一个开源项目&#xff0c;叫ibatis。2010年转移谷歌&#xff0c;从3.0开始改名为mybatis mybatis是一款优秀的持久层框架&#xff0c;是对jdbc功能进行轻量级的封装&#xff0c;提供了统一的数据库信息配置统一放在一个xml文件中&#xff0c;…

安卓改透明屏有哪些方法和步骤?壁纸、主题、软件

安卓改透明屏是指将安卓手机的屏幕背景变为透明&#xff0c;使得手机的背景图像或者壁纸能够透过屏幕显示出来。 这样的改变可以让手机的界面更加个性化&#xff0c;也能够增加手机的美观度。 要实现安卓手机的透明屏&#xff0c;可以通过以下几种方法&#xff1a; 1. 使用透…

Windows端口占用问题

Windows端口占用问题 1、检查端口是否已被占用&#xff08;端口举例&#xff1a;10000&#xff09; 【WindowsR】打开【运行】窗口 点击【确定】打开【cmd】窗口 输入【下方命令】&#xff0c;然后【回车】 netstat -aon | find "10000"可以看到端口【10000】已…

Android系统-进程-Binder

目录 引言&#xff1a; 一次拷贝 Binder一次通信过程 应用启动中的binder交互 C/S模式&#xff1a; Binder COMMAND BWR数据结构&#xff1a; 引言&#xff1a; Android的binder是从openbinder发展过来的。包括了binder驱动&#xff0c;Native层&#xff0c;Java层。用…

Linux黑客渗透测试揭秘:探索安全边界的挑战与应对

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 前言 随着信息技术的迅…

uniapp 获取 view 的宽度、高度以及上下左右左边界位置

<view class"cont-box"></view> /* 获取节点信息的对象 */ getElementRect() {const query uni.createSelectorQuery().in(this);query.select(".cont-box").boundingClientRect(res > {console.log(res);console.log(res.height); // 10…

高级进阶多线程——多任务处理、线程状态(生命周期)、三种创建多线程的方式

Java多线程 Java中的多线程是一个同时执行多个线程的进程。线程是一个轻量级的子进程&#xff0c;是最小的处理单元。多进程和多线程都用于实现多任务处理。 但是&#xff0c;一般使用多线程而不是多进程&#xff0c;这是因为线程使用共享内存区域。它们不分配单独的内存区域…

勘探开发人工智能技术:机器学习(6)

0 提纲 7.1 循环神经网络RNN 7.2 LSTM 7.3 Transformer 7.4 U-Net 1 循环神经网络RNN 把上一时刻的输出作为下一时刻的输入之一. 1.1 全连接神经网络的缺点 现在的任务是要利用如下语料来给apple打标签&#xff1a; 第一句话&#xff1a;I like eating apple!(我喜欢吃苹…

优秀的 Modbus 从站(从机、服务端)仿真器、串口调试工具

文章目录 优秀的 Modbus 从站&#xff08;从机、服务端&#xff09;仿真器、串口调试工具主要功能软件截图 优秀的 Modbus 从站&#xff08;从机、服务端&#xff09;仿真器、串口调试工具 官网下载地址&#xff1a;http://www.redisant.cn/mse 主要功能 支持多种Modbus协议…

NVIDIA TX2 NX编译及更新设备树

在NVIDIA官网下载相关文件 官网网址:https://developer.nvidia.com/embedded/jetson-linux-archive 我选择的版本为R32.7.4 需要下载3个文件,BSP、根文件系统、BSP源码: 解压 将Tegra_Linux_Sample-Root-Filesystem_R32.7.4_aarch64文件夹下的内容提取到Jetson_Linux_R32.…

【C++入门到精通】C++入门 —— vector (STL)

阅读导航 前言一、vector简介1. 概念2. 特点 二、vector的使用1.vector 构造函数2. vector 空间增长问题⭕resize 和 reserve 函数 3. vector 增删查改⭕operator[] 函数 三、迭代器失效温馨提示 前言 前面我们讲了C语言的基础知识&#xff0c;也了解了一些数据结构&#xff0…

2023年七夕情人节是什么时候? 淘宝天猫七夕节礼物优惠券怎么领取?

2023年七夕情人节是什么时候&#xff1f; 2023年七夕节时间是2023年8月22日&#xff08;农历七月初七&#xff0c;星期二&#xff09;&#xff1b; 七夕情人节&#xff0c;又称中国情人节&#xff0c;是浪漫的代名词。源自古人对牛郎织女一年一度相会的仰望&#xff0c;这一天…

Simulink仿真模块 -Scope

Scope模块的作用是显示仿真过程中生成的信号。它包含在以下库中: 库: Simulink / Commonly Used BlocksSimulink / SinksHDL Coder / Commonly Used BlocksHDL Coder / Sinks 如图所示: Simulink Scope 模块和 DSP System Toolbox™ Time Scope 模块显示时域信号。…

PAT(Advanced Level) Practice(with python)——1058 A+B in Hogwarts

Code A,B map(str,input().split()) g1,s1,k1 A.split(.) g2,s2,k2 B.split(.) g int(g1)int(g2) s int(s1)int(s2) k int(k1)int(k2) if k>29:s1k%29 if s>17:g1s%17 print(str(g).str(s).str(k))