【输入】NTC热敏电阻B值计算程序

两个主要的步骤:

  1. 设计分压器电路来测量NTC(负温度系数热敏电阻)的阻值。
  2. 编写C语言函数来使用测量的阻值和NTC参数计算温度。

首先,让我们设计分压器电路。

分压器电路设计

您需要一个已知阻值的参考电阻,通常推荐与NTC在预期工作温度附近阻值相当的电阻,比如10KΩ。

    Vcc||Rref (10KΩ)|+---> Vout (测量的电压)|NTC (10KΩ at 25°C)|GND

在这个电路中,Vcc 可能是你的微控制器的模拟参考电压(例如3.3V或5V),Rref 是参考电阻,NTC是热敏电阻。Vout 是两个电阻之间的电压,我们将用ADC(模数转换器)读取该电压。

C语言函数设计

温度计算依据以下公式来计算:

T = 1 / ( 1 / T 25 + ( 1 / B ) ∗ l o g ( R n t c / R 25 ) ) T = 1 / (1/T_{25} + (1/B) * log(R_{ntc}/R_{25})) T=1/(1/T25+(1/B)log(Rntc/R25))

其中:

  • T 是绝对温度(Kelvin)。
  • T_{25} 是25°C时的温度(Kelvin),即 298.15K。
  • B 是热敏电阻的B值,例如3950。
  • R_{ntc} 是NTC的实际阻值。
  • R_{25} 是NTC在25°C下的阻值(10KΩ)。

要计算这个,您需要从ADC测量值转换为阻值:

R n t c = R r e f ∗ V c c − V o u t V o u t R_{ntc} = R_{ref} * \frac{V_{cc} - V_{out}}{V_{out}} Rntc=RrefVoutVccVout

然后使用以上公式计算温度。

这里是一个C语言函数的例子,假设您能够获得Vout

#include <math.h>#define Rref 10000.0f   // 参考电阻的阻值,10KΩ
#define R25  10000.0f   // NTC在25°C下的阻值,10KΩ
#define B    3950.0f    // B值
#define Vcc  5.0f       // 电源电压
#define ADC_max_value 1023.0f  // 假设您的ADC是10位的// 将ADC原始值转换为电压值的函数
float ADC_to_voltage(int ADC_value) {return (float)ADC_value * (Vcc / ADC_max_value);
}// 函数传入Vout,返回摄氏温度
float NTC_temp_C(float Vout) {// 计算NTC的阻值float Rntc = Rref * ((Vcc / Vout) - 1.0f);// 计算NTC的温度(Kelvin)float T = 1.0f / ((1.0f / 298.15f) + (1.0f / B) * logf(Rntc / R25));// 转换为摄氏温度float tempC = T - 273.15f;return tempC;
}// 然后您的代码在获取ADC的原始值并计算温度时可能如下所示:
// int ADC_value = ADC_Read(); // 假设这是您用于读取ADC原始值的函数
// float voltage = ADC_to_voltage(ADC_value);
// float temperature = NTC_temp_C(voltage);

请注意,您的微控制器需要具有模数转换器来读取Vout电压,公式中使用的数值可能需要根据您实际使用的硬件进行调整。 ADC读取到的数字可能需要转换为实际的电压值,这取决于您的微控制器的分辨率(如10位、12位等)和参考电压。这部分代码需要根据您微控制器的实际编程手册来实现。

如果您的开发环境不包含 math.h 头文件,您还可以使用泰勒级数展开或查找表来实现自然对数函数。对于热敏电阻的温度计算,精确度不需要非常高,所以您可以采用一个简化的对数函数实现。

以下是一个使用泰勒级数展开的简化对数(自然对数)近似函数:

float ln_approx(float x) {if (x <= 0.0f) {return 0.0f;  // 对数未定义或无效输入值}float y, y_old, t;y = 0;t = (x - 1) / (x + 1);// 计算前几项y = 2 * t;t = t * t * t; // t^3y += (2 * t) / 3;t *= t * t; // t^5y += (2 * t) / 5;return y;
}

请注意,上述代码的精度依赖于泰勒级数中考虑的项数。上述实现只考虑了展开的前五项,根据您的应用需求,您可能需要更多项以提高精度。

然后您可以在没有 math.h 的情况下重写 NTC_temp_C 函数:

float NTC_temp_C(float Vout) {if (Vout <= 0.0f) {return -273.15f; // 无效数据}// 计算NTC阻值float Rntc = Rref * ((Vcc / Vout) - 1.0f);// 温度计算float T = 1.0f / ((1.0f / 298.15f) + (1.0f / B) * ln_approx(Rntc / R25));// 转为摄氏度float tempC = T - 273.15f;return tempC;
}

请记住,您可能需要根据实际应用调整泰勒级数展开的项数,以平衡执行时间和计算精度。

另一种方法是使用查找表。根据您测量温度范围内的阻值和温度之间的关系,您可以创建一个对应的查找表。这种方法占用的内存会比较多,但是可以在不引入数学库的情况下达到很好的准确性和快速响应。

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

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

相关文章

关于遗传力常见的误解

大家好&#xff0c;我是邓飞&#xff0c;今天看了一篇非常好的文章&#xff0c;介绍了遗传力相关概念和计算方法&#xff0c;里面提到了常见的误解&#xff0c;这里汇总一下。 文献链接&#xff1a;https://excellenceinbreeding.org/sites/default/files/manual/EiB-M2_Herit…

STM32CubeMX学习笔记20——SD卡FATFS文件系统

1. FATFS文件系统简介 文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构&#xff08;即在存储设备上组织文件的方法&#xff09;。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统&#xff0c;简称文件系统&#xff1b;不带文件系统的SD卡仅能…

C++初阶:类和对象(四)运算符重载与日期类Date的实现

在本节&#xff0c;我将通过实现日期类Date的实现来进一步阐释运算符重载的内容。 目录 一、Date.h 二、Date.cpp 三、test.cpp 一、Date.h #include<iostream> #include<cassert> using namespace std; class Date { public:// 获取某年某月的天数// 其为内联…

seo js转码工具

js转码工具作用 用于把js加密 如果不想让别人看到自己的js 代码就可以使用这个方法 js工具网址 https://tool.chinaz.com/js.aspx 效果

【大厂AI课学习笔记NO.74】人工智能产业技术架构

包括基础层、技术层和应用层。 人工智能的产业技术架构是一个多层次、多维度的复杂系统&#xff0c;它涵盖了从基础硬件和软件设施到高级算法和应用技术的全过程。这个架构通常可以分为三个主要层次&#xff1a;基础层、技术层和应用层。下面我将详细论述这三个层次及其细分内…

基于Yolo5模型的动态口罩佩戴识别安卓Android程序设计

禁止完全抄袭&#xff0c;引用注明出处。 下载地址 前排提醒&#xff1a;文件还没过CSDN审核&#xff0c;GitHub也没上传完毕&#xff0c;目前只有模型的.pt文件可以下载。我会尽快更新。 所使用.ptl文件 基于Yolo5的动态口罩佩戴识别模型的pt文件资源-CSDN文库 项目完整文…

ES6基础4

Set 基本用法 ES6提供了新的数据结构Set。它类似于数组&#xff0c;但是成员的值都是唯一的&#xff0c;没有重复的值。Set本身是一个构造函数&#xff0c;用来生成Set数据结构。 // 例一 var set new Set([1, 2, 3, 4, 4]); [...set] // [1, 2, 3, 4]// 例二 var items new …

升级ChatGPT4.0失败的解决方案

ChatGPT 4.0科普 ChatGPT 4.0是一款具有多项出众功能的新一代AI语言模型。以下是关于ChatGPT 4.0的一些关键特点和科普内容&#xff1a; 多模态&#xff1a;ChatGPT 4.0具备处理不同类型输入和输出的能力。这意味着它不仅可以接收文字信息&#xff0c;还能处理图片、视频等多…

CNN中常见的池化操作有哪些,作用是什么?

CNN中常见的池化操作有哪些&#xff0c;作用是什么&#xff1f; CNN中常见的池化操作只要是两种&#xff0c;平均值池化和最大值池化最大值池化常用于分类任务&#xff0c;是指在输入数据的局部区域内取最大值作为输出。最大池化的作用是降低特征图的尺寸&#xff0c;减少参数…

C++17中auto作为非类型模板参数

非类型模板参数是具有固定类型的模板参数&#xff0c;用作作为模板参数传入的constexpr值的占位符。非类型模板参数可以是以下类型&#xff1a; (1).整型&#xff1b; (2).枚举类型&#xff1b; (3).std::nullptr_t&#xff1b; (4).指向对象的指针或引…

vscode中解决驱动编写的时候static int __init chrdev_init()报错的问题

目录 错误出错原因解决方法 错误 在入口函数上&#xff0c;出现 expected a ; 这样的提示 出错原因 缺少了 __KERNEL __ 宏定义 解决方法 补上__KERNEL__宏定义 具体做法&#xff1a;在vscode中按下ctrlshiftp &#xff0c;输入&#xff1a;C/C:Edit Configurations&#xff0…

AcWing 4956. 冶炼金属

对于这个题&#xff0c;V越大&#xff0c;除出来的数就越小&#xff0c;V越小&#xff0c;除出来的数就越大&#xff0c;当我们找一个最大和最小值的时候&#xff0c;就可以通过这个性质进行二分来求解。 可以通过求满足 [ A V ] [\frac{A}{V}] [VA​] 小于等于 B B B的最小的…

手把手教使用静默 搭建Oracle 19c 一主一备ADG集群

一、环境搭建 主机IPora19192.168.134.239ora19std192.168.134.240 1.配置yum源 1.配置网络yum源 1.删除redhat7.0系统自带的yum软件包&#xff1b; rpm -qa|grep yum >oldyum.pkg 备份原信息rpm -qa|grep yum|xargs rpm -e --nodeps 不检查依赖&#xff0c;直接删除…

EE5437-IOT(Lecture 07-Control Interface System)

Review&#xff1a; introduce the micro input device system&#xff08;MIDS&#xff09; • The calibration and testing has been covered • The introduction to filters with the example called Butterworth filter and the maths have been also demonstrated. …

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:CalendarPicker)

日历选择器组件&#xff0c;提供下拉日历弹窗&#xff0c;可以让用户选择日期。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 CalendarPicker(options?: CalendarOptions) …

跨境账号养号怎么做?Facebook、亚马逊运营必看

之前我们讨论过很多关于代理器的问题。它们的工作原理是什么?在不同的软件中要使用那些代理服务器?这些代理服务器之间的区别是什么?什么是反检测浏览器等等。 除了这些问题&#xff0c;相信很多人也会关心在使用不同平台的时代理器的选择问题。比如&#xff0c;为什么最好…

Mybatis操作sql报错ibatis.binding.BindingException: Parameter ‘empId‘ not found.

你们好&#xff0c;我是金金金。 场景 在使用Mybatis操作sql语句过程当中&#xff0c;更新操作&#xff0c;报错信息如下&#xff1a;Caused by: org.apache.ibatis.binding.BindingException: Parameter ‘empId’ not found. Available parameters are [arg1, arg0, param1, …

m序列生成器

function [m] mserial_generator(tap_set) % m序列产生器 % 输出为m序列&#xff0c;未进行极性变换。 L 2^(length(tap_set)-1)-1; x [zeros(1,(length(tap_set)-2)) 1]; for i 1:1:Lm(i)x(end);for j 1:1:length(tap_set)-1sum_vector(j)tap_set(j1)*x(j);endsum_x mod…

聊聊python中面向对象编程思想

面向对象编程思想 1、什么是面向过程 传统的面向过程的编程思想总结起来就八个字——自顶向下&#xff0c;逐步细化&#xff01; → 将要实现的功能描述为一个从开始到结束按部就班的连续的“步骤” → 依次逐步完成这些步骤&#xff0c;如果某一个步骤的难度较大&#xff…

2024暑期实习八股笔记

文章目录 自我介绍MySQL索引索引种类、B树聚簇索引、非聚簇索引联合索引、最左前缀匹配原则索引下推索引失效索引优化 日志、缓冲池redo log&#xff08;重做日志&#xff09;刷盘时机日志文件组 bin log&#xff08;归档日志&#xff09;记录格式写入机制 两阶段提交undo log&…