找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2069|回复: 26
收起左侧

求问PT100如何用32单片机内部ADC直接读取温度的公式

  [复制链接]
ID:1008030 发表于 2022-12-8 16:51 | 显示全部楼层 |阅读模式
求问PT100如何用32单片机内部ADC直接读取温度的公式,我们老大画的电路图,我黔驴技穷了,求问各位大佬!

电路图是这样设计的

电路图是这样设计的
回复

使用道具 举报

ID:883242 发表于 2022-12-8 18:25 | 显示全部楼层
PT100温度与电阻的关系公式:
RT = R0(1 + AT + BT2 + C(T-100)T3)   
其中:
A = 3.9083 E-3
B = -5.775 E-7
C = -4.183 E-12 (低于0°C时)或0 (高于0°C时)。
回复

使用道具 举报

ID:190832 发表于 2022-12-8 20:46 | 显示全部楼层
画了个腿啊,找个专业点的老大吧
回复

使用道具 举报

ID:756400 发表于 2022-12-8 21:51 | 显示全部楼层
hange_v 发表于 2022-12-8 20:46
画了个腿啊,找个专业点的老大吧

PT100当NTC电阻用了
回复

使用道具 举报

ID:1008030 发表于 2022-12-9 08:09 | 显示全部楼层
hange_v 发表于 2022-12-8 20:46
画了个腿啊,找个专业点的老大吧

我也看不懂,但是,哎
回复

使用道具 举报

ID:1008030 发表于 2022-12-9 08:10 | 显示全部楼层
Hephaestus 发表于 2022-12-8 18:25
PT100温度与电阻的关系公式:
RT = R0(1 + AT + BT2 + C(T-100)T3)   
其中:

但是他得让我用采集到的电压算
回复

使用道具 举报

ID:123289 发表于 2022-12-9 09:01 | 显示全部楼层
先弄清楚测温原理,问题就解决了。与用什么单片机,一点关系也没有!
提示:温度-->电阻-->电压-->AD-->数字。其中的关系。
回复

使用道具 举报

ID:1008030 发表于 2022-12-9 10:56 | 显示全部楼层
yzwzfyz 发表于 2022-12-9 09:01
先弄清楚测温原理,问题就解决了。与用什么单片机,一点关系也没有!
提示:温度-->电阻-->电压-->AD-->数 ...

我,,明白,我就是缕不顺这个关系
回复

使用道具 举报

ID:883242 发表于 2022-12-9 11:32 | 显示全部楼层
宇智波油头 发表于 2022-12-9 08:10
但是他得让我用采集到的电压算

Pt100的阻值都告诉你了,你不会用采集到的电压推算出温度?这里面涉及到的物理数学知识都是初中的。
回复

使用道具 举报

ID:236035 发表于 2022-12-9 12:14 | 显示全部楼层
温度到电阻,查PT100的对照表。电阻到电压到AD,不会就看模电书。AD到数字,不会看单片机教材。都不会,那就真没法子。
回复

使用道具 举报

ID:1008030 发表于 2022-12-9 13:12 | 显示全部楼层
Hephaestus 发表于 2022-12-9 11:32
Pt100的阻值都告诉你了,你不会用采集到的电压推算出温度?这里面涉及到的物理数学知识都是初中的。

emmm,我真的,不是很顺,自己写了一个,感觉没办法直接用采集的电压值出温度
回复

使用道具 举报

ID:401564 发表于 2022-12-9 14:10 | 显示全部楼层
论坛里有程序呀,自己下载来看一下,应该是可以的
回复

使用道具 举报

ID:883242 发表于 2022-12-9 14:41 | 显示全部楼层
宇智波油头 发表于 2022-12-9 13:12
emmm,我真的,不是很顺,自己写了一个,感觉没办法直接用采集的电压值出温度

我想了下,用初中知识确实无法用公式算出来,要用到牛顿迭代法。
回复

使用道具 举报

ID:883242 发表于 2022-12-9 15:05 | 显示全部楼层
  1.         #include<stdio.h>
  2.         #include<math.h>
  3.         double resistance;
  4.         double func(double x) //original function
  5.         {
  6.             return -5.775e-7*x*x+3.9083e-3*x+1-resistance/100.0;
  7.         }
  8.         double func1(double x) //derivative function
  9.         {
  10.             return -5.775e-7*2.0*x+3.9083e-3;
  11.         }
  12.         int Newton(double *x,double precision,int maxcyc)
  13.         {
  14.             double x1,x0;
  15.             int k;
  16.             x0=*x;
  17.             for(k=0;k<maxcyc;k++)
  18.             {
  19.                 if(func1(x0)==0.0)
  20.                 {
  21.                     printf("derivative =0! on iterative process.\n");
  22.                     return 0;
  23.                 }
  24.                 x1=x0-func(x0)/func1(x0);
  25.                 if(fabs(x1-x0)<precision || fabs(func(x1))<precision)
  26.                 {
  27.                     *x=x1;
  28.                                 printf("root near the value.%lf\n",*x);
  29.          
  30.                     return 1;
  31.                 }
  32.                 else
  33.                 {
  34.                     x0=x1;
  35.                 }
  36.             }
  37.             printf("iterative repetition overflow.\n");
  38.             return 0;
  39.         }
  40.          
  41.         int main(int argc, char** argv)
  42.         {
  43.             double x,precision;
  44.             int maxcyc;
  45.             printf("resistance of Pt100(85~200):");
  46.             scanf("%lf",&resistance);
  47.             printf("initial iterative value x0:");
  48.             scanf("%lf",&x);
  49.             printf("max iterative repetition:");
  50.             scanf("%d",&maxcyc);
  51.             printf("iterative precision:");
  52.             scanf("%lf",&precision);
  53.             if(Newton(&x,precision,maxcyc)==1)
  54.             {
  55.             }
  56.             else
  57.             {
  58.                 printf("iteration failed!\n");
  59.             }
  60.             return 0;
  61. }
复制代码


我给你写了个牛顿迭代代码,不要害怕这么长的代码,主要目的还是展示牛顿迭代的原理和所需要的参数,核心代码就这么几行,其他的都可以在移植到单片机的时候删掉。
  1.             for(k=0;k<maxcyc;k++)
  2.             {
  3.                 x1=x0-func(x0)/func1(x0);
  4.                 if(fabs(x1-x0)<precision || fabs(func(x1))<precision)
  5.                 {
  6.                     *x=x1;
  7.                     return 1;
  8.                 }
  9.                 else x0=x1;
  10.             }
复制代码


至于如何从AD读数来推导出电阻值,我算了下,确实是初中数学问题,就不贴了。
回复

使用道具 举报

ID:195496 发表于 2022-12-9 18:21 | 显示全部楼层
这个要深入查资料研究一下,体会嘛,肯定是很深刻的
回复

使用道具 举报

ID:1008030 发表于 2022-12-10 08:16 | 显示全部楼层
Hephaestus 发表于 2022-12-9 15:05
我给你写了个牛顿迭代代码,不要害怕这么长的代码,主要目的还是展示牛顿迭代的原理和所需要的参数,核 ...

好的,谢谢您
回复

使用道具 举报

ID:1008030 发表于 2022-12-10 08:20 | 显示全部楼层
Hephaestus 发表于 2022-12-9 15:05
我给你写了个牛顿迭代代码,不要害怕这么长的代码,主要目的还是展示牛顿迭代的原理和所需要的参数,核 ...

Current_Temperature = ((V25-ADC_ConvertedValue[4])/AVG_SLOPE)-179;
我写的是这种
回复

使用道具 举报

ID:883242 发表于 2022-12-10 12:25 | 显示全部楼层
宇智波油头 发表于 2022-12-10 08:20
Current_Temperature = ((V25-ADC_ConvertedValue[4])/AVG_SLOPE)-179;
我写的是这种

牛顿迭代比查表法占用flash空间小得多,而且精度高得多,唯一缺点是运行时间比查表法长,为什么不试试?
回复

使用道具 举报

ID:123289 发表于 2022-12-12 08:18 | 显示全部楼层
认真研读“PT100”手册,记住永远的法则:要控制什么,就必须先了解什么!!!
你用10K与之分压,能得到多少的变化分量呢?
回复

使用道具 举报

ID:996773 发表于 2022-12-12 09:11 | 显示全部楼层
虽然我没自己做过温度计,但脑袋还是能想的出来的,这是模电干的事,pt100是铂电阻,变化量比较小,这事得交给运放来干,运放放大后的温度上下电压值,然后再由ad单片机处理读取显示,在这里单片机属于配角,单片机再怎么神通广大是无法替代高精度运放的,除非它能集成运放
回复

使用道具 举报

ID:996773 发表于 2022-12-12 09:15 | 显示全部楼层
另外补充一句,不要看老大画的图了,是个笑话,别当真
回复

使用道具 举报

ID:388550 发表于 2022-12-12 11:50 | 显示全部楼层
加运放比较妥当,有做过类似项目
回复

使用道具 举报

ID:1034262 发表于 2022-12-12 11:55 | 显示全部楼层
PT100我都是直接进入ADC,参考AD7705里的电路。
回复

使用道具 举报

ID:883242 发表于 2022-12-12 12:41 | 显示全部楼层
coody_sz 发表于 2022-12-12 11:55
PT100我都是直接进入ADC,参考AD7705里的电路。

只有你说的是靠谱的,说加什么运放的都是不懂装懂的货。性能靠谱的运放不贵,但是配套的电阻贵上天了,1ppm的电阻要几百块,用普通电阻加运放,电路不知道飘到哪里去了,根本没法用。
回复

使用道具 举报

ID:1008030 发表于 2022-12-12 13:20 | 显示全部楼层
Hephaestus 发表于 2022-12-10 12:25
牛顿迭代比查表法占用flash空间小得多,而且精度高得多,唯一缺点是运行时间比查表法长,为什么不试试?

可以了可以了!!太感谢了!
回复

使用道具 举报

ID:1034262 发表于 2022-12-12 21:34 | 显示全部楼层
Hephaestus 发表于 2022-12-12 12:41
只有你说的是靠谱的,说加什么运放的都是不懂装懂的货。性能靠谱的运放不贵,但是配套的电阻贵上天了,1p ...

以前(90年代以前)没有好的ADC可以用,所以就使用精密运放来做电阻-电压转换,消除引线影响,还要有高精度的恒流源,调整困难,成本非常高。运放精度、温漂(因为要直流放大),电阻精度、温漂,都影响长期精度。
后来,ADC差分输入、参考电压差分输入的芯片,比如AD7705,国产的TM7705,都可以直接连接测量,我连恒流源都不用,只需要一个高精度的标准电阻(0.01%~0.1%)。
回复

使用道具 举报

ID:883242 发表于 2022-12-12 21:52 | 显示全部楼层
coody_sz 发表于 2022-12-12 21:34
以前(90年代以前)没有好的ADC可以用,所以就使用精密运放来做电阻-电压转换,消除引线影响,还要有高精 ...

现代单片机这么便宜,电阻的初始精度并不重要,误差再大用软件标定可以轻松消除。这样温漂才是影响精度的至关重要的因素。

举例来说: 51hei图片20221212214701.png


国家级电压基准是两个约瑟夫森结,量子电压标准。省一级的电压基准是靠基于LTZ1000的万用表来传递的。

LTZ1000的电压是7.0~7.5V,初始误差高达±3.6%!但是LTZ1000非常稳定啊!初始精度用标定就可以轻松消除,但是不稳定就毫无办法了。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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