找回密码
 立即注册
查看: 1466|回复: 15

关于开天斧 热敏电阻NTC / ADC测温 案例的疑惑

[复制链接]
  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 110 天

    [LV.6]常住居民II

    5

    主题

    76

    回帖

    148

    积分

    注册会员

    积分
    148
    发表于 2022-12-13 11:33:27 | 显示全部楼层 |阅读模式
      #define Vref     2.5  



        float Temperature = 0.0;
        float R2 = 0.0;
        float R1 = 10000.0;
        float T2 = 298.15;//273.15+25;
        float B = 3435.0;  
        float K = 273.15;
        float R2V = 0.0;


    案例是挺好下载进去就能检测环境温度了,只是上面这些没有注释不太理解什么意思。热敏电阻B值是3435.0吗
    如果更换热敏电阻需要修改那些参数,
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    10 小时前
  • 签到天数: 45 天

    [LV.5]常住居民I

    5

    主题

    114

    回帖

    1116

    积分

    版主

    积分
    1116
    发表于 2022-12-13 14:50:37 | 显示全部楼层
    1.png
    2.png https://www.stcai.com/filedownload/630381   代码下载在这,我们 STC 的专家也可以及时提供支持哦!

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 110 天

    [LV.6]常住居民II

    5

    主题

    76

    回帖

    148

    积分

    注册会员

    积分
    148
     楼主| 发表于 2022-12-13 16:45:37 | 显示全部楼层
    就是这个代码,只是不明白具体的代码含义
  • TA的每日心情
    奋斗
    11 小时前
  • 签到天数: 145 天

    [LV.7]常住居民III

    27

    主题

    1362

    回帖

    4233

    积分

    论坛元老

    积分
    4233
    发表于 2022-12-13 20:25:31 | 显示全部楼层
    本帖最后由 乘风飞扬 于 2022-12-13 20:26 编辑

    NTC 热敏电阻温度计算公式:Rt = R *EXP(B*(1/T1-1/T2))

    (1) T1和T2指的是K度,即开尔文温度。
    (2) K = 273.15 (绝对温度)
    (3) Rt 是热敏电阻在T1温度下的阻值。

    (4) R1是热敏电阻在T2常温下的标称阻值。10K的热敏电阻25℃的值为10K(即R1=10K)。
    (5) T2 = (273.15+25)。
    (6) EXP(n) 是 e 的 n 次方。
    (7) B值是热敏电阻的重要参数。

    通过转换可以得到温度T1与电阻Rt的关系T1=1/(1/T2+ln(Rt/R1)/B)
    对应的摄氏温度t=T1-273.15,同时+0.5的误差矫正。

    该用户从未签到

    46

    主题

    3058

    回帖

    6895

    积分

    超级版主

    积分
    6895
    发表于 2022-12-13 20:40:31 | 显示全部楼层
    如果想减少计算时间,可以二分法查表,先建一个ADC读数表格,1度C一个数据,0.1度用线性插补。查表法不需要测量电阻的实际值,不影响精度。
  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 110 天

    [LV.6]常住居民II

    5

    主题

    76

    回帖

    148

    积分

    注册会员

    积分
    148
     楼主| 发表于 2022-12-14 13:07:27 | 显示全部楼层
    明白了,谢谢
  • TA的每日心情
    奋斗
    19 分钟前
  • 签到天数: 152 天

    [LV.7]常住居民III

    1

    主题

    46

    回帖

    963

    积分

    高级会员

    积分
    963
    发表于 2024-4-28 09:56:22 | 显示全部楼层
    梁工 发表于 2022-12-13 20:40
    如果想减少计算时间,可以二分法查表,先建一个ADC读数表格,1度C一个数据,0.1度用线性插补。查表法不需要 ...

    线性插补怎么理解,能否举例说明?谢谢,能否提供一个温度表格吗?

    点评

    由于NTC厂家给出的阻值温度曲线表是按照1℃间隔的,实际应用中1℃的分辨率显然不能满足精确测温和显示的需求,所以有了“线性插补”的方法 虽然NTC的温度曲线是非线性的,但是为了快速解算带小数的温度值,可以把两  详情 回复 发表于 2024-4-28 19:50
    请去官网下载实验箱例程参考,二分法查表。 [attachimg]42524[/attachimg] [attachimg]42525[/attachimg] [attachimg]42526[/attachimg]  详情 回复 发表于 2024-4-28 10:26
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3058

    回帖

    6895

    积分

    超级版主

    积分
    6895
    发表于 2024-4-28 10:26:20 | 显示全部楼层
    liushiming82 发表于 2024-4-28 09:56
    线性插补怎么理解,能否举例说明?谢谢,能否提供一个温度表格吗?

    请去官网下载实验箱例程参考,二分法查表。

    截图202404281022554696.jpg

    截图202404281023362231.jpg

    截图202404281024254711.jpg

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    19 分钟前
  • 签到天数: 152 天

    [LV.7]常住居民III

    1

    主题

    46

    回帖

    963

    积分

    高级会员

    积分
    963
    发表于 2024-4-28 10:50:02 | 显示全部楼层
    梁工 发表于 2024-4-28 10:26
    请去官网下载实验箱例程参考,二分法查表。

    谢谢,梁工,这个例程中怎么没有视频中那个温度查询表呀

    点评

    等等,难道说,你要的是那个EXCEL表?  详情 回复 发表于 2024-4-28 11:15
    有啊,没看到吗?在程序比较后面的位置: //======================================================================== // 函数: u16 Get_ADC12bitResult(u8 channel) // 描述: 查询法读一次ADC结果. // 参数: ch  详情 回复 发表于 2024-4-28 11:02
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3058

    回帖

    6895

    积分

    超级版主

    积分
    6895
    发表于 2024-4-28 11:02:52 | 显示全部楼层
    本帖最后由 梁工 于 2024-4-28 11:04 编辑
    liushiming82 发表于 2024-4-28 10:50
    谢谢,梁工,这个例程中怎么没有视频中那个温度查询表呀

    有啊,没看到吗?在程序比较后面的位置:

    //========================================================================
    // 函数: u16 Get_ADC12bitResult(u8 channel)
    // 描述: 查询法读一次ADC结果.
    // 参数: channel: 选择要转换的ADC.
    // 返回: 12位ADC结果.
    // 版本: V1.0, 2012-10-22
    //========================================================================
    u16 Get_ADC12bitResult(u8 channel)  //channel = 0~15
    {
        ADC_RES = 0;
        ADC_RESL = 0;

        ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel;    //启动 AD 转换
        _nop_();
        _nop_();
        _nop_();
        _nop_();

        while((ADC_CONTR & 0x20) == 0)  ;   //wait for ADC finish
        ADC_CONTR &= ~0x20;     //清除ADC结束标志
        return  (((u16)ADC_RES << 8) | ADC_RESL);
    }


    //  MF52E 10K at 25, B = 3950, ADC = 12 bits
    u16 code temp_table[]={
            140,    //;-40  0
            149,    //;-39  1
            159,    //;-38  2
            168,    //;-37  3
            178,    //;-36  4
            188,    //;-35  5
            199,    //;-34  6
            210,    //;-33  7
            222,    //;-32  8
            233,    //;-31  9
            246,    //;-30  10
            259,    //;-29  11
            272,    //;-28  12
            286,    //;-27  13
            301,    //;-26  14
            317,    //;-25  15
            333,    //;-24  16
            349,    //;-23  17
            367,    //;-22  18
            385,    //;-21  19
            403,    //;-20  20
            423,    //;-19  21
            443,    //;-18  22
            464,    //;-17  23
            486,    //;-16  24
            509,    //;-15  25
            533,    //;-14  26
            558,    //;-13  27
            583,    //;-12  28
            610,    //;-11  29
            638,    //;-10  30
            667,    //;-9   31
            696,    //;-8   32
            727,    //;-7   33
            758,    //;-6   34
            791,    //;-5   35
            824,    //;-4   36
            858,    //;-3   37
            893,    //;-2   38
            929,    //;-1   39
            965,    //;0    40
            1003,   //;1    41
            1041,   //;2    42
            1080,   //;3    43
            1119,   //;4    44
            1160,   //;5    45
            1201,   //;6    46
            1243,   //;7    47
            1285,   //;8    48
            1328,   //;9    49
            1371,   //;10   50
            1414,   //;11   51
            1459,   //;12   52
            1503,   //;13   53
            1548,   //;14   54
            1593,   //;15   55
            1638,   //;16   56
            1684,   //;17   57
            1730,   //;18   58
            1775,   //;19   59
            1821,   //;20   60
            1867,   //;21   61
            1912,   //;22   62
            1958,   //;23   63
            2003,   //;24   64
            2048,   //;25   65
            2093,   //;26   66
            2137,   //;27   67
            2182,   //;28   68
            2225,   //;29   69
            2269,   //;30   70
            2312,   //;31   71
            2354,   //;32   72
            2397,   //;33   73
            2438,   //;34   74
            2479,   //;35   75
            2519,   //;36   76
            2559,   //;37   77
            2598,   //;38   78
            2637,   //;39   79
            2675,   //;40   80
            2712,   //;41   81
            2748,   //;42   82
            2784,   //;43   83
            2819,   //;44   84
            2853,   //;45   85
            2887,   //;46   86
            2920,   //;47   87
            2952,   //;48   88
            2984,   //;49   89
            3014,   //;50   90
            3044,   //;51   91
            3073,   //;52   92
            3102,   //;53   93
            3130,   //;54   94
            3157,   //;55   95
            3183,   //;56   96
            3209,   //;57   97
            3234,   //;58   98
            3259,   //;59   99
            3283,   //;60   100
            3306,   //;61   101
            3328,   //;62   102
            3351,   //;63   103
            3372,   //;64   104
            3393,   //;65   105
            3413,   //;66   106
            3432,   //;67   107
            3452,   //;68   108
            3470,   //;69   109
            3488,   //;70   110
            3506,   //;71   111
            3523,   //;72   112
            3539,   //;73   113
            3555,   //;74   114
            3571,   //;75   115
            3586,   //;76   116
            3601,   //;77   117
            3615,   //;78   118
            3628,   //;79   119
            3642,   //;80   120
            3655,   //;81   121
            3667,   //;82   122
            3679,   //;83   123
            3691,   //;84   124
            3702,   //;85   125
            3714,   //;86   126
            3724,   //;87   127
            3735,   //;88   128
            3745,   //;89   129
            3754,   //;90   130
            3764,   //;91   131
            3773,   //;92   132
            3782,   //;93   133
            3791,   //;94   134
            3799,   //;95   135
            3807,   //;96   136
            3815,   //;97   137
            3822,   //;98   138
            3830,   //;99   139
            3837,   //;100  140
            3844,   //;101  141
            3850,   //;102  142
            3857,   //;103  143
            3863,   //;104  144
            3869,   //;105  145
            3875,   //;106  146
            3881,   //;107  147
            3887,   //;108  148
            3892,   //;109  149
            3897,   //;110  150
            3902,   //;111  151
            3907,   //;112  152
            3912,   //;113  153
            3917,   //;114  154
            3921,   //;115  155
            3926,   //;116  156
            3930,   //;117  157
            3934,   //;118  158
            3938,   //;119  159
            3942    //;120  160
    };

    /********************  计算温度 ***********************************************/
    // 计算结果: 0对应-40.0度, 400对应0度, 625对应25.0度, 最大1600对应120.0度.
    // 为了通用, ADC输入为12bit的ADC值.
    // 电路和软件算法设计: Coody
    /**********************************************/

    #define     D_SCALE     10      //结果放大倍数, 放大10倍就是保留一位小数
    u16 get_temperature(u16 adc)
    {
        u16 code *p;
        u16 i;
        u8  j,k,min,max;
       
        adc = 4096 - adc;   //Rt接地
        p = temp_table;
        if(adc < p[0])      return (0xfffe);
        if(adc > p[160])    return (0xffff);
       
        min = 0;        //-40度
        max = 160;      //120度

        for(j=0; j<5; j++)  //对分查表
        {
            k = min / 2 + max / 2;
            if(adc <= p[k]) max = k;
            else            min = k;
        }
             if(adc == p[min])  i = min * D_SCALE;
        else if(adc == p[max])  i = max * D_SCALE;
        else    // min < temp < max
        {
            while(min <= max)
            {
                min++;
                if(adc == p[min])   {i = min * D_SCALE; break;}
                else if(adc < p[min])
                {
                    min--;
                    i = p[min]; //min
                    j = (adc - i) * D_SCALE / (p[min+1] - i);     // 这句就是线性插补
                    i = min;
                    i *= D_SCALE;
                    i += j;
                    break;
                }
            }
        }
        return i;
    }
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-21 20:43 , Processed in 0.071630 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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