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

本文详细介绍了如何设计使用C语言的分压器电路来测量NTC热敏电阻的阻值,并提供了温度计算公式和C语言函数示例。涉及ADC读取、阻值转换以及两种不同方法(泰勒级数展开和查找表)来计算温度,适合IT技术人员和电子工程师参考。
摘要由CSDN通过智能技术生成

两个主要的步骤:

  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^3
    y += (2 * t) / 3;
    t *= t * t; // t^5
    y += (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;
}

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值