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

前言:

家里的一个儿童澡盆附带的温度计坏掉了,拆解后发现这东西做的真垃圾!索性自己做一个。拆下了里面的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


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

swagger 3.0 学习笔记

引入pom <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>配置 import io.swagger.models.auth.In; import io.swagger.v3.oas.annotati…

三级城市展示省市区树

展示效果 数据库展示 业务代码 /*** 省市区树*/VLicenseApiOperation("查询经纬度")ApiImplicitParam(name "FnCity", value "省市区树", dataType "FnCity")GetMapping("/districtlist")public AjaxResult districtlist…

strlen和sizeof的区别

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C语言中的sizeof和strlen&#xff08;仅此一篇让你明白它们两的差别&#xff09;&#xff0c;如果大家觉得我写的不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 文章目录 strlensizeof 在…

Simulink仿真模块 -Scope

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

【APITable】教程:创建并运行一个自建小程序

1.进入APITable&#xff0c;在想要创建小程序的看板页面点击右上角的【小程序】&#xff0c;进入小程序编辑页面。 2.创建一个新的小程序区。 点击【 添加小程序】 点击创建小程序&#xff0c;选择模板&#xff0c;输入名字。 3.确定后进入小程序部署引导页面。 4.打开Xshell 7…

春秋云镜 CVE-2022-0410

春秋云镜 CVE-2022-0410 WordPress plugin The WP Visitor Statistics SQLI 靶标介绍 WordPress plugin The WP Visitor Statistics (Real Time Traffic) 5.6 之前存在SQL注入漏洞&#xff0c;该漏洞源于 refUrlDetails AJAX 不会清理和转义 id 参数。 登陆账户&#xff1a;u…

LeetCode 热题 100 JavaScript -- 74. 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非递减顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 …

D* 算法完全解析(应该是全网最详细的吧)

花了几天时间学习了下 D* 算法&#xff0c;只能说熟悉了一下流程&#xff0c;远不能说掌握&#xff0c;算法实在是非常巧妙 参考 《制造车间无人搬运系统调度方法研究》 《基于D*Lite算法的移动机器人路径规划研究》 人工智能: 自动寻路算法实现(四、D、D*算法) D* 算法 D*路径…

java 文件/文件夹复制,添加压缩zip

复制文件夹,并压缩成zip 需求&#xff1a;创建A文件夹&#xff0c;把B文件夹复制到A文件夹。然后把A文件夹压缩成zip包 public static void main(String[] args) throws Exception {try {String A "D:\\dev\\program";String B "D:\\program";// 创建临…

iOS- git对单个或者多个文件权限设置,使用pre-commit hook 和shell脚本,拦截校验

前提&#xff1a;最近&#xff0c;由于团队代码规范和安全问题&#xff0c;有一些文件只能是指定用户才能修改。 对比&#xff1a;调查了一下资料&#xff0c;发现好多人都在使用pre-commit技术。于是&#xff0c;就朝着这个方向去研究。于是抽空写了脚本&#xff0c;在提交的…

写一个函数返回参数二进制中 1 的个数(c语言三种实现方法)

&#xff08;本文旨在自己做题时的总结&#xff0c;我会给出不同的解法&#xff0c;后面如果碰到新的题目还会加入其中&#xff0c;等于是我自己的题库。 1.写一个函数返回参数二进制中 1 的个数。 比如&#xff1a; 15 0000 1111 4 个 1 方法一&#xff1a; #include…

form中表单切换,导致 relus 中的事件无法触发,原因:页面切换不要一直切换DOM,会导致问题,需要都显示出来

修改前&#xff0c;因为重复渲染DOM导致绑定rules失效 修改前代码使用 computed 计算出渲染的DOM&#xff0c;影响rules事件<el-formref"form"inline:model"billDetailCopy":rules"rules"size"small"label-position"right&quo…

WebStorm

WebStorm 介绍下载安装Activation 介绍 WebStorm是由JetBrains公司开发的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要专注于前端开发和Web开发。它旨在提供一套强大的工具和功能&#xff0c;以支持开发者在前端项目中编写、调试和维护代码。 JetBrains官网: …

Java中声明,定义,分配内存,初始化,赋值,是啥?

一. 声明&#xff0c;定义和分配内存 在Java中&#xff0c;声明和定义是同一个意思&#xff0c;不做区分。下面这些都是声明&#xff08;定义&#xff09;一个变量。 栈&#xff1a;存放局部变量&#xff08;包括基本数据类型的变量和对象的引用&#xff09; 堆&#xff1a;存…

配置:Terminal和oh-my-posh

目录 命令行安装oh-my-posh查看安装情况配置PowerShell启用oh-my-posh、设置主题配色安装字体Terminal中的配置 命令行安装oh-my-posh Set-ExecutionPolicy Bypass -Scope Process -Force; Invoke-Expression ((New-Object System.Net.WebClient).DownloadString(https://ohmy…

YAPi在线接口文档简单案例(结合Vue前端Demo)

在前后端分离开发中&#xff0c;我们都是基于文档进行开发&#xff0c;那前端人员有时候无法马上拿到后端的数据&#xff0c;该怎么办&#xff1f;我们一般采用mock模拟伪造数据直接进行测试&#xff0c;本篇文章主要介绍YApi在线接口文档的简单使用&#xff0c;并结合Vue的小d…

流量,日志分析--理论

提供资料&#xff1a; Wireshark 基本语法&#xff0c;基本使用方法&#xff0c;及包过虑规则 : https://blog.csdn.net/qq_17457175/article/det ails/53019490 ctf 常见流量分析题目类型 : https://ctf-wiki.org/misc/traffic/introduction/ windows 日志 : https://jone…

IntelliJ IDEA和Android studio怎么去掉usage和作者提示

截止到目前我已经写了 600多道算法题&#xff0c;其中部分已经整理成了pdf文档&#xff0c;目前总共有1000多页&#xff08;并且还会不断的增加&#xff09;&#xff0c;大家可以免费下载 下载链接&#xff1a;https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ 提取码&#xf…

5.PyCharm基础使用及快捷键

在前几篇文章中介绍了PyCharm的安装和汉化,本篇文章一起来看一下PyCharm的基本用法和一些快捷键的使用方法。 本篇文章PyCharm的版本为PyCharm2023.2 新建项目和运行 打开工具,在菜单中——文件——新建项目 选择项目的创建位置(注意最好不要使用中文路径和中文名项目名称…

基于Gradio的GPT聊天程序

网上很多别人写的&#xff0c;要用账号也不放心。就自己写了一个基于gradio的聊天界面&#xff0c;部署后可以本地运行。 特点&#xff1a; 可以用openai的&#xff0c;也可以用api2d&#xff0c;其他api可以自己测试一下。使用了langchain的库 可以更改模型&#xff0c;会的…