数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 4186|回复: 11

[STM] 制作精密NTC温度计程序

[复制链接]
发表于 2019-12-1 14:21:09 | 显示全部楼层 |阅读模式
,
1拿到厂家温度阻值对应数据,
2在Excel表格里用公式算出需要的温度表,并修改C合格的格式,
3,把温度表放在程序里,用查表的方式读出正确的温度值,
----------------------

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 3家元 +60 收起 理由
woss1001 + 10 優秀文章
家睦 + 40
ljlun + 10 謝謝分享

查看全部打赏

发表于 2019-12-4 00:34:20 | 显示全部楼层
可以直接用程序做一个曲线拟合,会更加方便,这样的查表方式效率太低了。
回复 支持 反对

使用道具 举报

发表于 2019-12-4 09:24:04 | 显示全部楼层
请教楼主,如果是不知道厂家的外形如同玻璃封装的二极管一样的NTC电阻,可以套用你的数据表吗,我曾经用过一次是在控制温度范围内用水银温度计逐度检测的数据,真心麻烦。
回复 支持 反对

使用道具 举报

发表于 2019-12-4 10:04:26 | 显示全部楼层
慕名而来 发表于 2019-12-4 09:24
请教楼主,如果是不知道厂家的外形如同玻璃封装的二极管一样的NTC电阻,可以套用你的数据表吗,我曾经用过 ...

一般的NTC电阻厂家都给的有B值,按这个B值查询列表就行了,
回复 支持 反对

使用道具 举报

发表于 2019-12-4 10:52:18 | 显示全部楼层
慕名而来 发表于 2019-12-4 09:24
请教楼主,如果是不知道厂家的外形如同玻璃封装的二极管一样的NTC电阻,可以套用你的数据表吗,我曾经用过 ...

相同的B值也会有不同的温度阻值表,用哪个型号的NTC一定要用哪个型号的温度阻值表,不能套用别人的温度阻值表。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-4 12:15:02 来自手机浏览器 | 显示全部楼层
慕名而来 发表于 2019-12-4 09:24
请教楼主,如果是不知道厂家的外形如同玻璃封装的二极管一样的NTC电阻,可以套用你的数据表吗,我曾经用过 ...

购买途径肯定要拿到原装的温度阻值表文档,如果是拆机未知元件,很难找到合适的阻值表,只有土办法一个一个校准了
回复 支持 反对

使用道具 举报

发表于 2019-12-5 15:15:21 | 显示全部楼层
mckk520 发表于 2019-12-4 12:15
购买途径肯定要拿到原装的温度阻值表文档,如果是拆机未知元件,很难找到合适的阻值表,只有土办法一个一 ...

好的明白了,谢谢!业余玩这些就是摸着啥用啥比不得正经用途的,看来业余玩NTC还是要有一个精密水银温度计的。
回复 支持 反对

使用道具 举报

发表于 2019-12-6 13:38:34 | 显示全部楼层
本帖最后由 人生之际 于 2019-12-6 14:00 编辑
深山老妖 发表于 2019-12-4 00:34
可以直接用程序做一个曲线拟合,会更加方便,这样的查表方式效率太低了。 ...

2分法查表,非常快,比拟合曲线计算要快多了贡献一个从大到小排序的表格的二分法查找函数:
//******************************************************************************
//对半查找法搜索表格,找不到的正好的值,就计算1格范围内的插值
//sSource:排序好的表格,array_size:表格单元数,array0:表格第一个数对应的值
//intvl:表格间隔,1度间隔就是1,10度间隔就是10
//zoom:作为放大倍数(1度的表格需要返回0.1度就为10,需要返回0.01度就为100
//key:需要查找和插值的实际值
//适合表格为从大到小排列的查找,如NTC
static        I32 BinSearchB(I32 sSource[], I32 array_size, I32 array0, I32 intvl, I32 zoom, I32 key)
{
        I32        l,h,m;

        if(key>sSource[0])                                //小于数组最小值,返回最小
                return        array0*zoom;
        if(key<sSource[array_size-1])        //大于数组最大值,返回最大
                return        ((array_size-1)*intvl+array0)*zoom;
       
        //对半查找法
        l = 0;
        h = array_size-1;
        while(l<=h){                                        //如果没有正好找到,退出时h<l
                m = (l+h)>>1;                                //对半
                if(sSource[m]==key)                        //正好找到
                        return (m*intvl+array0)*zoom;
                if(sSource[m]>key)                        //太靠前,查找后面
                        l = m + 1;
                else                                                //太靠后,查找前面
                        h = m - 1;
        }//key数据在[h]和[l]中间
        m = sSource[h]-key;                                //实际误差
        l = sSource[h]-sSource[l];                //1格误差
       
        h = (h*intvl+array0)*zoom;                //下沿整值
        h += m*intvl*zoom/l;                        //+1格内误差插值
        return        h;
}

用法:
        t = BinSearchB(RT_Tab,RT_TABDIM,RT_TABMIN,1,10,R);          //欧姆转换为0.1度单位温度值


RT_Tab表格如下样子:
#define        RT_TABDIM        121
#define        RT_TABMIN        -20                //表格第一组值:-20度
//10k 3950电阻值与温度值的对应表,电阻值单位 欧姆
I32 RT_Tab[RT_TABDIM]  =
{
97120, //-20
91660, //-19
86540, //-18
81720, //-17
77220, //-16
72980, //-15
69000, //-14
65260, //-13
61760, //-12
58460, //-11
55340, //-10
52420, //-9
49660, //-8
47080, //-7
44640, //-6
42340, //-5
40160, //-4
38120, //-3
36200, //-2
34380, //-1
32660, //0
31040, //1
29500, //2
28060, //3
26680, //4
25400, //5
24180, //6
23020, //7
21920, //8
20880, //9
19900, //10
18970, //11
18290, //12
17260, //13
16460, //14
15710, //15
15000, //16
14320, //17
13680, //18
13070, //19
12490, //20
11940, //21
11420, //22
10920, //23
10450, //24
10000, //25
9574 , //26
9166 , //27
8778 , //28
8480 , //29
8058 , //30
7724 , //31
7404 , //32
7098 , //33
6808 , //34
6532 , //35
6268 , //36
6015 , //37
5776 , //38
5546 , //39
5326 , //40
5118 , //41
4918 , //42
4726 , //43
4544 , //44
4368 , //45
4202 , //46
4042 , //47
3888 , //48
3742 , //49
3602 , //50
3468 ,
3340 ,
3216 ,
3098 ,
2986 , //55
2878 ,
2774 ,
2674 ,
2580 ,
2488 , //60
2400 ,
2316 ,
2234 ,
2158 ,
2082 , //65
2012 ,
1942 ,
1876 ,
1813 ,
1751 , //70
1693 ,
1637 ,
1582 ,
1530 ,
1480 , //75
1432 ,
1385 ,
1341 ,
1298 ,
1256 , //80
1216 ,
1178 ,
1141 ,
1105 ,
1071 , //85
1038 ,
1006 ,
975  ,
945  ,
916  , //90
888  ,
862  ,
836  ,
811  ,
787  , //95
764  ,
741  ,
720  ,
699  , //99
679  , //100
};


回复 支持 1 反对 0

使用道具 举报

发表于 2019-12-6 13:49:34 | 显示全部楼层
本帖最后由 人生之际 于 2019-12-6 13:54 编辑
595953427@qq 发表于 2019-12-4 10:52
相同的B值也会有不同的温度阻值表,用哪个型号的NTC一定要用哪个型号的温度阻值表,不能套用别人的温度阻 ...

NTC的精度本身也不大,说是1%的基本在2%,大部分能有5%就不错了,按照B值公式也就能算个0-50度,再往下和往上基本和公式偏差较大了。
有些厂家提供的温度阻值表根本不是厂家实验测试的值,就是B值公式算出来的(我见过-50-+200和公式丝毫不差的表,一看就是糊弄人的)。所以如果有表格,优先表格,没有表格就按B值算:
R(t) = R25*exp[B*(1/(T+273) -1/(25+273))],T为温度,R25为25度的标准温度(一般是10K,5K等)。

按照上述公式,只要知道两个温度下的阻值,就能算出未知NTC的B值,再可以算出标称电阻R25。
B= Ln(Ra/Rb) / (1/Ta-1/Tb)        Ta,Tb:绝对温度K

打赏

参与人数 1家元 +20 收起 理由
家睦 + 20

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2020-2-11 21:23:30 | 显示全部楼层
我也刚做了一个4路NTC+DHT11+18B20+电池充电的。一般用这个公式就行R(t) = R25*exp[B*(1/(T+273) -1/(25+273))]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2022-7-22 10:12:14 | 显示全部楼层
chenghelin 发表于 2020-2-11 21:23
我也刚做了一个4路NTC+DHT11+18B20+电池充电的。一般用这个公式就行R(t) = R25*exp

...

可以分享一下你的程序吗?
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-9-7 03:55 , Processed in 0.218400 second(s), 15 queries , Gzip On, Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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