硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4002|回复: 9
收起左侧

[技术讨论] NTC 电阻计算方法

[复制链接]

21

主题

34

回帖

97

积分

初级会员

积分
97
发表于 2020-11-28 23:34:39 | 显示全部楼层 |阅读模式
本帖最后由 huhuolianmeng 于 2020-11-28 23:38 编辑

对于电阻计算方法:
1、利用串联电阻分压法:
这个很好理解,通过读取ADC数值,反推NTC实时电阻大小,然后查表即可得出温度值。

为什么?
**************************
        大于20欧按 参考电阻比值计算
        小于20欧按第1点和第2点进行线性计算,简单处理。   
   
        这个方案不太好,后面需要找更好的修正算法。
        问题在第2个点附近,阻值会调动3左右.
**************************
/*
*********************************************************************************************************
*    函 数 名: CalculNtcRes
*    功能说明: 计算NTC电阻值
*    形    参: ref_res : 上拉参考电阻, _adc : 当前ADC值  
*    返 回 值: 电阻值. K欧
*
*********************************************************************************************************
*/
float CalculNtcRes(float _adc)
{
    /*
        大于20欧按 参考电阻比值计算
        小于20欧按第1点和第2点进行线性计算,简单处理。   
   
        这个方案不太好,后面需要找更好的修正算法。
        问题在第2个点附近,阻值会调动3左右.
    */
    float X;
    float ref_res3;
    //    float ref_res2;

    /* 根据 (x2,y2) 校准点和 (x3,y3) 校准点,修正曲线 */

    if (_adc < g_tCalib.NtcRes.x2 + 5)
    {
        X = CaculTwoPointFloat(g_tCalib.NtcRes.x1, g_tCalib.NtcRes.y1, g_tCalib.NtcRes.x2, g_tCalib.NtcRes.y2, _adc);
   
        /* 0 ->0  9 -> 10  20->20 临时处理 */
        if (X < 9)
        {
            X = CaculTwoPointFloat(0, 0, 9, 10, X);
        }
        else
        {
            X = CaculTwoPointFloat(9, 10, 20, 20, X);
        }
    }
    else
    {
        ref_res3 = CalculRefRes(g_tCalib.NtcRes.x3, g_tCalib.NtcRes.y3); /* 计算内部上拉电阻 */
        /*
        公式  X/(R+X) = ADC/65535
        
        X = ADC * R /(65535 - ADC);
        */

        X = _adc * ref_res3 / (65535 - _adc);
    }

    if (X < 0)
    {
        X = 0;
    }

    return X;
}

2、既然硬件电路设计的就是510欧电阻分压,为何程序里面还计算这一步呢?直接赋值不就可以了吗?

3、校准参数这些是怎么得到的呢?

回复

使用道具 举报

21

主题

34

回帖

97

积分

初级会员

积分
97
 楼主| 发表于 2020-11-28 23:36:16 | 显示全部楼层
另外这个校准参数数值是怎么计算得到的呢??
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2020-11-29 02:00:50 | 显示全部楼层
分压用的上拉电阻也有误差的。5.1K并不是标准的5.1000k。
拿一个已知准确阻值的电阻(比如9.987K)测量出ADC,可以反推出内部上拉电阻的阻值。
回复

使用道具 举报

21

主题

34

回帖

97

积分

初级会员

积分
97
 楼主| 发表于 2020-11-29 10:55:09 | 显示全部楼层
armfly 发表于 2020-11-29 02:00
分压用的上拉电阻也有误差的。5.1K并不是标准的5.1000k。
拿一个已知准确阻值的电阻(比如9.987K)测量出A ...

为什么要计算内部的上拉电阻呢?是指单片机内部的上拉电阻吗?如果引脚作为ADC时候,应该是使用的模拟浮空输入模式,内部上拉电阻没用了吧?
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2020-11-29 21:06:03 | 显示全部楼层
我指的是H7-TOOL内部,CPU外接的5.1K上拉电阻,不是CPU内部上拉。
回复

使用道具 举报

21

主题

34

回帖

97

积分

初级会员

积分
97
 楼主| 发表于 2020-12-1 13:18:41 | 显示全部楼层
armfly 发表于 2020-11-29 21:06
我指的是H7-TOOL内部,CPU外接的5.1K上拉电阻,不是CPU内部上拉。

利用精密电阻当作NTC电阻,反推内部上拉电阻,作为电路本身的电阻的校准,这个方法不错
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2022-9-12 22:27:15 | 显示全部楼层
这个子函数里面,X1,Y1,X2,Y2,X3,Y3 这几个参数是如何获取的呢?谢谢!
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2022-9-12 22:28:00 | 显示全部楼层
这上面的X1,Y1,X2,Y2,X3,Y3 这些参数是如何获取的呢?谢谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2022-9-13 05:10:33 | 显示全部楼层
skylin008 发表于 2022-9-12 22:28
这上面的X1,Y1,X2,Y2,X3,Y3 这些参数是如何获取的呢?谢谢!

将已知的参考电阻接入,读ADC值并保存。
image.png
回复

使用道具 举报

5

主题

81

回帖

96

积分

初级会员

积分
96
发表于 2022-9-28 18:13:07 | 显示全部楼层
image.png
貌似发现一个小bug,嘿嘿~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 21:02 , Processed in 0.279831 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表