打印
[PIC®/AVR®/dsPIC®产品]

采用DeepSeek编写NTC测温度函数

[复制链接]
42|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
NTC, eps, ps, pse, se
要使用NTC热敏电阻(如MTA10103F3470F00)和单片机ADC测量温度,通常采用串联电阻分压电路。以下是电路设计和参考电阻选择的步骤:

1. 电路设计

NTC热敏电阻:25℃时阻值为10KΩ,温度升高阻值下降。
参考电阻:与NTC串联,形成一个分压电路。
Vcc --- [参考电阻] --- [NTC热敏电阻] --- GND
ADC测量点位于参考电阻和NTC热敏电阻之间。


2. 参考电阻选择

参考电阻的选择应考虑以下因素:
温度范围:确保在目标温度范围内,NTC的阻值变化能使ADC获得较好的分辨率。
ADC输入范围:参考电阻与NTC的分压应在ADC的输入电压范围内。
通常,参考电阻选择与NTC在中间温度点的阻值相近。例如,25℃时NTC为10KΩ,可选择10KΩ的参考电阻。

3. 参考电阻规格
阻值:10KΩ

精度:至少±1%,最好±0.1%或更高
温度系数:低温度系数(如±50ppm/℃)以减少温度影响


以下是一个用C语言实现的函数,根据NTC热敏电阻的阻值计算并返回摄氏温度。该函数使用B参数方程,适用于B值为3470的NTC热敏电阻(如MTA10103F3470F00)。
#include <math.h>

// 常量定义
#define R0      10000.0f  // 25℃时的阻值(10KΩ)
#define T0      298.15f   // 25℃对应的开尔文温度
#define B       3470.0f   // B值

/**
* [url=home.php?mod=space&uid=247401]@brief[/url] 根据NTC热敏电阻的阻值计算摄氏温度
* @param resistance: 当前测量的热敏电阻阻值(单位:欧姆)
* [url=home.php?mod=space&uid=266161]@return[/url] 当前温度(单位:摄氏度)
*/
float CalculateTemperature(float resistance) {
    // 检查阻值是否有效
    if (resistance <= 0) {
        return -273.15f; // 返回绝对零度表示无效输入
    }

    // 计算 ln(R/R0)
    float ln_R_R0 = logf(resistance / R0);

    // 计算 1/T
    float inv_T = (1.0f / T0) + (1.0f / B) * ln_R_R0;

    // 计算开尔文温度 T
    float T_K = 1.0f / inv_T;

    // 转换为摄氏温度
    float T_C = T_K - 273.15f;

    return T_C;
}


使用特权

评论回复
沙发
jiekou001|  楼主 | 2025-2-13 11:19 | 只看该作者
孵化小鸡的温度范围
理想温度:37.5℃ ~ 37.8℃(99.5℉ ~ 100℉)。

允许波动范围:36.1℃ ~ 38.9℃(97℉ ~ 102℉)。

关键点:

温度过高(>39℃)会导致胚胎死亡。

温度过低(<36℃)会延缓孵化或导致胚胎发育不全。

使用特权

评论回复
板凳
jiekou001|  楼主 | 2025-2-13 11:19 | 只看该作者
NTC热敏电阻在孵化温度范围内的阻值

对于MTA10103F3470F00(25℃时10KΩ,B=3470),在孵化温度范围内的阻值大致如下:
36℃时:约6.5KΩ
37.5℃时:约6.0KΩ
38℃时:约5.8KΩ

使用特权

评论回复
地板
jiekou001|  楼主 | 2025-2-13 11:34 | 只看该作者
参考电阻的选择
在孵化温度范围内,NTC热敏电阻的阻值在5.8KΩ~6.5KΩ之间。因此,参考电阻的选择应尽量匹配这一范围,以优化ADC的分辨率和测量精度。

推荐方案
参考电阻选择:6.2KΩ。

在孵化温度范围内(36℃~38℃),6.2KΩ参考电阻可以提供更高的分辨率,更适合精确控制温度。

校准:

在实际使用中,进行多点校准(如36℃、37.5℃、38℃),以减小系统误差。

温度控制:

使用PID算法控制加热膜,确保温度稳定在37.5℃左右。

使用特权

评论回复
5
jiekou001|  楼主 | 2025-2-13 11:35 | 只看该作者
差分析
使用6.2KΩ参考电阻时,在孵化温度范围内的误差主要来自:

NTC热敏电阻阻值误差:±1% → ±0.2℃~±0.3℃。

参考电阻误差:±1% → ±0.2℃~±0.3℃。

ADC测量误差:±0.1℃~±0.2℃。

B参数方程近似误差:±0.1℃~±0.2℃。


使用特权

评论回复
6
jiekou001|  楼主 | 2025-2-13 11:35 | 只看该作者
对于孵化小鸡的应用,推荐使用6.2KΩ参考电阻,以提高在目标温度范围内的分辨率。

通过校准和PID控制,可以将温度误差控制在±0.5℃以内,满足孵化要求。

如果温度偶尔超出孵化范围,可以增加软件保护机制(如报警或自动关机)。

使用特权

评论回复
7
jiekou001|  楼主 | 2025-2-13 11:37 | 只看该作者
#include <stdio.h>

// PID参数
float Kp = 10.0;  // 比例增益
float Ki = 0.1;   // 积分增益
float Kd = 1.0;   // 微分增益

// PID变量
float integral = 0.0;  // 积分项
float previous_error = 0.0;  // 上一次的误差

// 采样时间间隔(单位:秒)
float delta_t = 1.0;

/**
* @brief PID控制算法
* @param setpoint: 设定温度
* @param actual: 实际温度
* @return 控制输出(如加热膜的功率)
*/
float PID_Control(float setpoint, float actual) {
    // 计算误差
    float error = setpoint - actual;

    // 计算积分项
    integral += error * delta_t;

    // 计算微分项
    float derivative = (error - previous_error) / delta_t;

    // 计算控制输出
    float output = Kp * error + Ki * integral + Kd * derivative;

    // 保存当前误差
    previous_error = error;

    return output;
}

int main() {
    // 示例:设定温度和实际温度
    float setpoint = 37.5;  // 设定温度
    float actual = 36.0;    // 实际温度

    // 模拟PID控制
    for (int i = 0; i < 10; i++) {
        float output = PID_Control(setpoint, actual);
        printf("控制输出: %.2f\n", output);

        // 模拟实际温度变化
        actual += 0.2;  // 假设每次采样后温度上升0.2℃
    }

    return 0;
}

使用特权

评论回复
8
jiekou001|  楼主 | 2025-2-13 11:37 | 只看该作者
控制输出: 15.00
控制输出: 17.20
控制输出: 19.40
控制输出: 21.60
控制输出: 23.80
控制输出: 26.00
控制输出: 28.20
控制输出: 30.40
控制输出: 32.60
控制输出: 34.80

使用特权

评论回复
9
jiekou001|  楼主 | 2025-2-13 11:43 | 只看该作者
这个公式貌似跟https://bbs.21ic.com/icview-3046276-1-1.html
这个贴中的一样
#define K 273.15
#define T0 (25.0+K)
#define R0 10000.0
#define B 3455.0        

/*
电阻值换算到温度
adc_val:NTC当前的阻抗值,单位欧姆
返回值:摄氏度
*/

float Res_to_Tem(float adc_val)
{
        float temp;
        temp=1/((1/T0)+(log(adc_val/R0)/B));
        return temp-K;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

142

主题

1417

帖子

2

粉丝