NTC3950 100k 1%热敏电阻阻值和ADC采集值的转换

文章介绍了如何使用ADC采样值来计算NTC3950温度传感器的温度。通过电压分压原理和ADC转换公式,计算出电阻值,然后应用B参数方程将电阻转换为温度值,该过程涉及到对数运算和温度单位的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

电路图:

代码:输入adc采样值,返回温度值

解释:电阻阻值的转换


电路图:

 

代码:输入adc采样值,返回温度值

float NTC3950_Temp(uint16_t adc_value)
{
	float resistance; // 电阻值
	float temp; // 温度值
	
	resistance = (float)(100000 * adc_value) / (4096 - adc_value); // 根据电压分压原理计算电阻值
	temp = log(resistance / 100000); // 计算电阻值对数
	temp /= 3950; // 计算B值分数项
	temp += 1.0 / (25 + 273.15); // 计算开尔文温度倒数
	temp = 273.15 / temp; // 计算开尔文温度值
	temp -= 273.15; // 计算摄氏温度值
	
	return temp; // 返回温度值
}

解释:电阻阻值的转换

resistance = (float)(10000 * adc_value) / (4096 - adc_value);是根据电压分压原理和ADC的转换公式来的。假设温度传感器和一个10k欧姆的电阻串联,两端接5V电源,那么温度传感器的电阻值和输出电压之间有如下关系:

 

其中,Vout​是输出电压,Rntc​是温度传感器的电阻值,Rref​是参考电阻的电阻值,Vcc​是电源电压。假设Rref​=10000Ω,Vcc​=5V,那么可以得到:

另一方面,ADC的转换公式是:

 

 

其中,adc_value是ADC的转换值,n是ADC的位数,Vref​是ADC的参考电压。假设n=12,Vref​=5V,那么可以得到:

 

将上式代入前面的公式,可以得到:

 

化简后得到:

 

这就是代码中的公式。为了提高精度,将结果转换为浮点数。

如果Vcc等于3.3v,那么电压分压原理和ADC的转换公式不变,只是Vcc​和Vref​的值都变为3.3v。那么可以得到:

 化简后得到:

 解释:电阻值转化为温度值

根据NTC3950 100k 1%温度传感器的特性曲线,可以得到以下公式:

 其中,T是温度传感器的绝对温度(开尔文),T0​是参考温度(25摄氏度),B是传感器的B值(3950),R是温度传感器的电阻值,R0​是参考电阻(100k欧姆)。

接着,将上式变形,得到:

 

最后,将上式中的各个参数代入,并将绝对温度转换为摄氏温度,得到最终结果。

这个公式是根据NTC温度传感器的特性曲线来的。NTC温度传感器的电阻值和温度之间有一个非线性的对数关系,可以用下面的公式表示

 其中,T是绝对温度(开尔文),R是电阻值(欧姆),A、B、C是传感器的特定系数,可以通过实验测量得到。这个公式叫做Steinhart-Hart方程

如果忽略C项,那么可以得到一个简化的公式:

 其中,T0​是参考温度(一般取25摄氏度),R0​是参考电阻(一般取100k欧姆),B是传感器的B值(一般取3950)。这个公式叫做B参数方程

NTC Thermistor - Steinhart and Hart Equation | Amethermicon-default.png?t=N4N7https://www.ametherm.com/thermistor/ntc-thermistors-steinhart-and-hart-equation

NTC3950_Temp函数就是用的B参数方程来计算温度值的。

ESP8266是一种常用的微控制器,常用于物联网应用中,它的模拟输入口ADC可以用来采集电压信号。NTC热敏电阻在温度变化时其阻值会相应变化,通过测量这个电阻的电压降可以推算出温度。 以下是一个简单的示例代码,使用了Arduino IDE编写的ESP8266库,假设ADC通道0连接到NTC电阻上: ```c++ #include <ESP8266WiFi.h> #include <OneWire.h> // 如果用的是DS18B20温度传感器 #include <Adafruit_Temperature_Sensor.h> // NTC热敏电阻相关的数据,假设Rref = 100K欧姆 const int ADC_CHANNEL = 0; const float Rref = 100000.0f; // 100k欧姆 const float Vref = 3.3f; // ESP8266的供电电压 Adafruit_NeoPixel led(1, D4); // LED用于显示温度状态 void setup() { Serial.begin(9600); if (pinMode(ADC_CHANNEL, INPUT) == LOW) { // 配置ADC adc.begin(ADC_CHANNEL); } // 初始化温度传感器或者其他通信模块(如WiFi) } void loop() { // 读取ADC样本 int adcValue = analogRead(ADC_CHANNEL); // 将ADC转换为电阻值 float resistance = (float)Vref * Rref / adcValue; // 根据公式计算温度(这里假设线性关系) float temperature_Celsius = 1 / (log(resistance / Rref) * (1/Temperature::Constants::BETA)); // 显示温度并处理 led.setColor(cRGB(255 * tempToColor(temperature_Celsius), 0, 0)); // 红色表示高温 Serial.println("Temperature: " + String(temperature_Celsius) + " °C"); // 适当延时防止频繁采样 delay(1000); } // 转换温度为颜色指数 int tempToColor(float temp) { return map(temp, -273.15, 100, 0, 255); }
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值